[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71RXNFF3JPCCQYRH48YJZAH":3,"skill-same:01M71RXNFF3JPCCQYRH48YJZAH":69},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":14,"repositoryHtmlUrl":52,"repositoryHomepageUrl":6,"ownerHtmlUrl":53,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":54,"install":55,"resources":68},"01M71RXNFF3JPCCQYRH48YJZAH","root-wiring",null,"Understand and modify the wiring of main.go (root) — how tools, sub-agents, plugins and toolsets are assembled into the lead agent. Use when adding a sub-agent, swapping a plugin, changing the toolset list, or debugging why a feature isn't reaching the agent. Mention triggers - root binary, main.go, wiring, lead agent, agenttool, NewMultiLoader, plugins.","blouargant\u002Fomnis","blouargant","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F5691896?v=4","01M71RWETBTYXSMT6FFC4Q7HPW","Bertrand Louargant","01M71RWEV3G47S696JYH8EA7W2",0,"MIT","https:\u002F\u002Fgithub.com\u002Fblouargant\u002Fomnis\u002Fblob\u002Fdevelop\u002F.agents\u002Fskills\u002Froot-wiring\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"root wiring","wiring","root","triggers","modify","lead","when","sub-agent","understand","binary","go","feature","main","use","list","why","how","plugins","debugging","plugin","2026-11-10 13:02:02",false,"---\nname: root-wiring\ndescription: Understand and modify the wiring of main.go (root) — how tools, sub-agents, plugins and toolsets are assembled into the lead agent. Use when adding a sub-agent, swapping a plugin, changing the toolset list, or debugging why a feature isn't reaching the agent. Mention triggers - root binary, main.go, wiring, lead agent, agenttool, NewMultiLoader, plugins.\n---\n\n# `main.go (root)` wiring\n\nThis is the only file in the project that **assembles** components.\nIt contains no logic of its own — every change here is \"I want\ncomponent X to be part of the running agent\".\n\n## Mental model\n\n```\n            ┌──────────────┐\n            │ agentkit.NewModel(ctx)  ← reads OMNIS_PROVIDER\n            └──────┬───────┘\n                   │ llm\n                   ▼\n   ┌────────────────────────────────────────────────────────┐\n   │ leadTools = []tool.Tool{                                │\n   │   fstools.New()...,           \u002F\u002F file\u002Fbash\u002Fgrep\u002Fglob   │\n   │   store.Tools()...,            \u002F\u002F todo                  │\n   │   g.Tools()...,                \u002F\u002F tasks                 │\n   │   worktree.Tools(repo)...,     \u002F\u002F git worktrees         │\n   │   q.Tool(),                    \u002F\u002F bash_background       │\n   │   leadMailbox.Tools()...,      \u002F\u002F teammate comms        │\n   │   agenttool.New(investigator), \u002F\u002F sub-agent as tool     │\n   │   agenttool.New(summariser),   \u002F\u002F sub-agent as tool     │\n   │ }                                                       │\n   │                                                         │\n   │ toolsets = [skills.Toolset, mcp.Toolsets...]            │\n   └────────────────────────────────────────────────────────┘\n                   │\n                   ▼\n            agentkit.New({Tools, Toolsets}) ──► lead\n                   │\n                   ▼\n            adkagent.NewMultiLoader(lead, investigator, summariser)\n                   │\n                   ▼\n            full.NewLauncher().Execute(ctx, cfg, args)\n```\n\n## Common changes\n\n### Add a new tool\n\n```go\nleadTools = append(leadTools, mypkg.New()...)\n```\n\nPlace it **before** the lead's `agentkit.New(...)` call.\n\n### Add a sub-agent\n\n> **Important:** do NOT pass sub-agents to `SubAgents` in the lead's\n> `agentkit.AgentConfig`. When `SubAgents` is non-empty, ADK injects a\n> `transfer_to_agent` function into the lead. That function permanently\n> hands off control — the lead never resumes after the call. Use\n> `agenttool.New` instead: it wraps the sub-agent as a regular tool that\n> returns its output to the caller. In the root agent, also wrap the\n> AgentTool with `newNonConcurrentTool` so duplicate calls to the same\n> sub-agent in one model turn fail fast instead of blocking the turn.\n\n```go\ncritic, err := agentkit.New(agentkit.AgentConfig{\n    Name:        \"critic\",\n    Description: \"Pokes holes in a proposed plan.\",\n    Model:       llm,\n    Instruction: \"You are an adversarial reviewer. ...\",   \u002F\u002F role, not domain\n})\nif err != nil { return err }\n\n\u002F\u002F Register as a tool so control always returns to the leader.\nwrappedCritic, ok := agenttool.New(critic, &agenttool.Config{}).(runnableTool)\nif !ok { return fmt.Errorf(\"agenttool for critic is not runnable\") }\nleadTools = append(leadTools, newNonConcurrentTool(wrappedCritic))\n\n\u002F\u002F Add to the multi-loader so the launcher can address it:\nloader, err := adkagent.NewMultiLoader(lead, investigator, summariser, critic)\n```\n\n### Add a plugin\n\n```go\nif p, err := mypkg.NewPlugin(\"mine\"); err == nil {\n    plugins = append(plugins, p)\n}\n```\n\nConvention: never `return err` from a plugin constructor inside `run()`\n— treat plugin failure as best-effort (log via the events plugin if\nneeded). Permission plugin is the exception (it's safety-critical).\n\n### Add an MCP server\n\nDon't touch this file. Edit `config\u002Fmcp_config.json` instead — it's\nalready loaded via `mcpcfg.Load(\"config\u002Fmcp_config.json\")`.\n\n### Add a skill\n\nDon't touch this file. Drop a `skills\u002F\u003Cname>\u002FSKILL.md` — the\n`skills.Toolset(ctx, \"skills\")` call already discovers it.\n\n## Things to leave alone\n\n- The `SystemPrompt` \u002F lead `Instruction` text. They are intentionally\n  domain-neutral. If you want to change agent behaviour by domain, do\n  it via a skill, not here.\n- The investigator \u002F summariser sub-agents. They are the harness's\n  generic \"roles\". Add new sub-agents alongside; don't repurpose these.\n- The mailbox backend choice (`teammates.ChooseBackend()` reads\n  `REDIS_URL`). Don't hard-code a backend.\n\n## Order matters\n\n1. `agentkit.NewModel` — fails fast on missing API key.\n2. Toolsets (skills, MCP) — loaded best-effort; failures are logged.\n3. Mailbox backend — `defer be.Close()` must come before the lead is\n   built so it survives the function.\n4. Sub-agents — built before the lead, then added to `leadTools` via\n   `agenttool.New`.\n5. Lead — built last, with the full `leadTools` slice.\n6. `NewMultiLoader(lead, ...subAgents)` — must list every agent\n   addressable by the launcher.\n7. Plugins — assembled into `runner.PluginConfig`.\n8. `full.NewLauncher().Execute(ctx, cfg, args)` — the only blocking\n   call.\n\n## Verify after a change\n\n```bash\nPATH=$HOME\u002F.local\u002Fgo\u002Fbin:$PATH go build .\u002F... && \\\nPATH=$HOME\u002F.local\u002Fgo\u002Fbin:$PATH go vet .\u002F... && echo OK\n\nPATH=$HOME\u002F.local\u002Fgo\u002Fbin:$PATH go run . console\n> what tools and skills do you have?\n```\n\nThe agent should enumerate every tool\u002Fskill you wired.\n","# `main.go (root)` wiring\n\nThis is the only file in the project that **assembles** components.\nIt contains no logic of its own — every change here is \"I want\ncomponent X to be part of the running agent\".\n\n## Mental model\n\n```\n            ┌──────────────┐\n            │ agentkit.NewModel(ctx)  ← reads OMNIS_PROVIDER\n            └──────┬───────┘\n                   │ llm\n                   ▼\n   ┌────────────────────────────────────────────────────────┐\n   │ leadTools = []tool.Tool{                                │\n   │   fstools.New()...,           \u002F\u002F file\u002Fbash\u002Fgrep\u002Fglob   │\n   │   store.Tools()...,            \u002F\u002F todo                  │\n   │   g.Tools()...,                \u002F\u002F tasks                 │\n   │   worktree.Tools(repo)...,     \u002F\u002F git worktrees         │\n   │   q.Tool(),                    \u002F\u002F bash_background       │\n   │   leadMailbox.Tools()...,      \u002F\u002F teammate comms        │\n   │   agenttool.New(investigator), \u002F\u002F sub-agent as tool     │\n   │   agenttool.New(summariser),   \u002F\u002F sub-agent as tool     │\n   │ }                                                       │\n   │                                                         │\n   │ toolsets = [skills.Toolset, mcp.Toolsets...]            │\n   └────────────────────────────────────────────────────────┘\n                   │\n                   ▼\n            agentkit.New({Tools, Toolsets}) ──► lead\n                   │\n                   ▼\n            adkagent.NewMultiLoader(lead, investigator, summariser)\n                   │\n                   ▼\n            full.NewLauncher().Execute(ctx, cfg, args)\n```\n\n## Common changes\n\n### Add a new tool\n\n```go\nleadTools = append(leadTools, mypkg.New()...)\n```\n\nPlace it **before** the lead's `agentkit.New(...)` call.\n\n### Add a sub-agent\n\n> **Important:** do NOT pass sub-agents to `SubAgents` in the lead's\n> `agentkit.AgentConfig`. When `SubAgents` is non-empty, ADK injects a\n> `transfer_to_agent` function into the lead. That function permanently\n> hands off control — the lead never resumes after the call. Use\n> `agenttool.New` instead: it wraps the sub-agent as a regular tool that\n> returns its output to the caller. In the root agent, also wrap the\n> AgentTool with `newNonConcurrentTool` so duplicate calls to the same\n> sub-agent in one model turn fail fast instead of blocking the turn.\n\n```go\ncritic, err := agentkit.New(agentkit.AgentConfig{\n    Name:        \"critic\",\n    Description: \"Pokes holes in a proposed plan.\",\n    Model:       llm,\n    Instruction: \"You are an adversarial reviewer. ...\",   \u002F\u002F role, not domain\n})\nif err != nil { return err }\n\n\u002F\u002F Register as a tool so control always returns to the leader.\nwrappedCritic, ok := agenttool.New(critic, &agenttool.Config{}).(runnableTool)\nif !ok { return fmt.Errorf(\"agenttool for critic is not runnable\") }\nleadTools = append(leadTools, newNonConcurrentTool(wrappedCritic))\n\n\u002F\u002F Add to the multi-loader so the launcher can address it:\nloader, err := adkagent.NewMultiLoader(lead, investigator, summariser, critic)\n```\n\n### Add a plugin\n\n```go\nif p, err := mypkg.NewPlugin(\"mine\"); err == nil {\n    plugins = append(plugins, p)\n}\n```\n\nConvention: never `return err` from a plugin constructor inside `run()`\n— treat plugin failure as best-effort (log via the events plugin if\nneeded). Permission plugin is the exception (it's safety-critical).\n\n### Add an MCP server\n\nDon't touch this file. Edit `config\u002Fmcp_config.json` instead — it's\nalready loaded via `mcpcfg.Load(\"config\u002Fmcp_config.json\")`.\n\n### Add a skill\n\nDon't touch this file. Drop a `skills\u002F\u003Cname>\u002FSKILL.md` — the\n`skills.Toolset(ctx, \"skills\")` call already discovers it.\n\n## Things to leave alone\n\n- The `SystemPrompt` \u002F lead `Instruction` text. They are intentionally\n  domain-neutral. If you want to change agent behaviour by domain, do\n  it via a skill, not here.\n- The investigator \u002F summariser sub-agents. They are the harness's\n  generic \"roles\". Add new sub-agents alongside; don't repurpose these.\n- The mailbox backend choice (`teammates.ChooseBackend()` reads\n  `REDIS_URL`). Don't hard-code a backend.\n\n## Order matters\n\n1. `agentkit.NewModel` — fails fast on missing API key.\n2. Toolsets (skills, MCP) — loaded best-effort; failures are logged.\n3. Mailbox backend — `defer be.Close()` must come before the lead is\n   built so it survives the function.\n4. Sub-agents — built before the lead, then added to `leadTools` via\n   `agenttool.New`.\n5. Lead — built last, with the full `leadTools` slice.\n6. `NewMultiLoader(lead, ...subAgents)` — must list every agent\n   addressable by the launcher.\n7. Plugins — assembled into `runner.PluginConfig`.\n8. `full.NewLauncher().Execute(ctx, cfg, args)` — the only blocking\n   call.\n\n## Verify after a change\n\n```bash\nPATH=$HOME\u002F.local\u002Fgo\u002Fbin:$PATH go build .\u002F... && \\\nPATH=$HOME\u002F.local\u002Fgo\u002Fbin:$PATH go vet .\u002F... && echo OK\n\nPATH=$HOME\u002F.local\u002Fgo\u002Fbin:$PATH go run . console\n> what tools and skills do you have?\n```\n\nThe agent should enumerate every tool\u002Fskill you wired.\n",{"name":5,"description":7},"develop","c9440489468f6bbafc65e9a10811428ac0ef2619",".agents\u002Fskills\u002Froot-wiring","https:\u002F\u002Fgithub.com\u002Fblouargant\u002Fomnis","https:\u002F\u002Fgithub.com\u002Fblouargant","2026-11-10 16:30:07",{"source":8,"skillName":5,"commands":56,"prompt":66,"zipAvailable":67},[57,60,63],{"tool":58,"command":59},"npx","npx skills add blouargant\u002Fomnis --skill root-wiring",{"tool":61,"command":62},"bunx","bunx skills add blouargant\u002Fomnis --skill root-wiring",{"tool":64,"command":65},"pnpm","pnpm dlx skills add blouargant\u002Fomnis --skill root-wiring","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fblouargant\u002Fomnis\u002Fblob\u002Fdevelop\u002F.agents\u002Fskills\u002Froot-wiring\u002FSKILL.md",true,[],[70,96,116,143,165,196],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":77,"publishedAt":44},"01M71RZKQ64WTDCV48Z4Y071FA","skill-creator","Create or update a skill playbook (SKILL.md) for the agent. Use when the user wants to create a new skill, add a skill, define a new agent capability, update an existing skill, edit a skill, refine a skill playbook, or specialise the agent for a new domain.","https:\u002F\u002Fgithub.com\u002Fblouargant\u002Fomnis\u002Fblob\u002Fdevelop\u002Fregistry\u002Fskills\u002Fskill-creator\u002FSKILL.md",[76],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[78,79,80,81,82,83,84,37,85,30,86,87,88,89,90,91,92,93,94,95],"skill creator","creator","new agent","domain","for","new","define","Existing","create","update","refine","playbook","edit","a skill","new skill","add","user","existing skill",{"skillNo":97,"name":98,"nameZh":6,"description":99,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":102,"publishedAt":44},"01M71RZJ15NMV6FXBZD1AQF3K7","review","Review a body of work (source code, configuration, documents, infra manifests, …) for correctness, clarity, and obvious risks. Use this skill whenever the user asks for a review, audit or critique.","https:\u002F\u002Fgithub.com\u002Fblouargant\u002Fomnis\u002Fblob\u002Fdevelop\u002Fregistry\u002Fskills\u002Freview\u002FSKILL.md",[],[98,103,104,105,106,82,107,37,108,109,110,111,112,113,114,115,94],"infra","work","critique","audit","clarity","body","source","manifests","documents","configuration","correctness","code","source code",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":125,"publishedAt":44},"01M71RZFP8KJEANYXAH6AX68G0","pdf","Fallback PDF text extractor using pdftotext (poppler). Use ONLY when the preferred `liteparse` skill is unavailable or for a quick plain-text dump of a simple text PDF — for the best PDF parsing (scanned, multi-column, layout-heavy, or non-PDF formats) prefer the `liteparse` skill.","https:\u002F\u002Fgithub.com\u002Fblouargant\u002Fomnis\u002Fblob\u002Fdevelop\u002Fregistry\u002Fskills\u002Fpdf\u002FSKILL.md",[122],{"categoryNo":123,"categoryName":124,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理",[126,127,128,129,130,131,132,133,82,134,135,136,137,138,37,139,30,140,141,142],"PDF","text","multi","quick","simple","parsing","pdf text extractor","layout","liteparse","plain-text","column","only","formats","pdftotext","plain","pdf parsing","file",{"skillNo":144,"name":145,"nameZh":6,"description":146,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":151,"publishedAt":44},"01M71RZDAHNX7JC52P5HH5XPEG","pandoc","This skill should be used when converting documents between formats (Markdown, DOCX, PDF, HTML, LaTeX, etc.) using pandoc. Use for format conversion, document generation, and preparing markdown for Google Docs or other word processors.","https:\u002F\u002Fgithub.com\u002Fblouargant\u002Fomnis\u002Fblob\u002Fdevelop\u002Fregistry\u002Fskills\u002Fpandoc\u002FSKILL.md",[149,150],{"categoryNo":123,"categoryName":124,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[145,152,126,153,82,154,37,155,111,30,156,157,158,159,160,161,138,162,163,164],"docx","Word","document generation","document","conversion","generation","markdown","format","google","google docs","docs","html","LaTeX",{"skillNo":166,"name":134,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":182,"publishedAt":44},"01M71RZ7PSG17ES4CQWA6860F5","Preferred local parser for extracting text from PDFs, images, and scanned\u002Flayout-heavy documents (OCR, screenshots, complex PDFs) — far better than pdftotext. Use this FIRST for any PDF, image, or OCR text-extraction or conversion task. NOTE for Office documents (DOCX, PPTX, XLSX, ODT) — for plain text extraction prefer the `pandoc` skill, which needs no LibreOffice; only use LiteParse for Office docs when you need its layout\u002FOCR\u002Fscreenshot output. The `pdf` skill (pdftotext) is only a fallback for when LiteParse cannot be installed.","https:\u002F\u002Fgithub.com\u002Fblouargant\u002Fomnis\u002Fblob\u002Fdevelop\u002Fregistry\u002Fskills\u002Fliteparse\u002FSKILL.md",[170,171,174,177],{"categoryNo":123,"categoryName":124,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":172,"categoryName":173,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":175,"categoryName":176,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000004","电子表格",{"categoryNo":178,"categoryName":179,"taxonomyType":180,"taxonomyTypeDesc":181},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[134,183,184,185,152,186,126,187,188,189,190,191,192,137,139,111,30,193,194,195],"images","app","ocr","which","pptx","extracting","xlsx","managed","local","pipx","image","you","needs",{"skillNo":197,"name":198,"nameZh":6,"description":199,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":200,"categories":201,"keywords":202,"publishedAt":44},"01M71RZ2Y9KY94NRBV4WMH73G5","linux-admin","Safely make a change to a Linux workstation — install\u002Fremove packages, manage systemd services and timers, edit and validate configuration files, manage users\u002Fpermissions and networking. Detect the distro and package manager, determine whether the target is package-managed or hand-maintained, preview or simulate every change, back up configs before editing, and prefer the package manager and drop-in overrides so the host stays consistent and secure. Use whenever a change to the local Linux host is required (install, remove, enable, disable, start, stop, edit a config, add a user, change permissions or networking).","https:\u002F\u002Fgithub.com\u002Fblouargant\u002Fomnis\u002Fblob\u002Fdevelop\u002Fregistry\u002Fskills\u002Flinux-admin\u002FSKILL.md",[],[203,204,205,206,207,208,209,210,211,190,191,212,213,214,215,216,217,218,219,220],"linux","linux admin","admin","back","workstation","package manager","pacman","remove","up","systemd services","files","host","drop","preview","hand","permissions","packages","change"]