[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6JZ4BV5NJ2Z0DNX968774FR":3,"skill-same:01M6JZ4BV5NJ2Z0DNX968774FR":77},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":51,"repositoryHtmlUrl":52,"repositoryHomepageUrl":53,"ownerHtmlUrl":54,"ownerBlogUrl":55,"ownerDescription":6,"updatedAt":56,"install":57,"resources":70},"01M6JZ4BV5NJ2Z0DNX968774FR","council-hub-setup",null,"Stand up a Council Hub server and connect MCP clients to it — pick stdio vs HTTP transport, run the container with the right volume and ports, register the endpoint with Claude Code \u002F Claude Desktop \u002F Gemini CLI \u002F any MCP client, verify the connection end to end, and turn on the optional extras (semantic search via Ollama, multi-node clustering, low-memory mode). Use when asked to install \u002F set up \u002F configure Council Hub, connect an agent to council-hub, add the council-hub MCP server, or when council-hub tools are missing, unreachable, or returning ConnectionRefused. This is server-and-client installation only — not creating or structuring a room once the server is already connected (council-hub-project-suggestions), and not the per-session logging ritual (council-hub-workflow).","iksnerd\u002Fcouncil-hub","iksnerd","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F32894415?v=4","01M6JZ35V8YHVB56ED2A3CNPFX","01M6JZ35ZVND50GAT9KDW6VH5P",4,"MIT","https:\u002F\u002Fgithub.com\u002Fiksnerd\u002Fcouncil-hub\u002Fblob\u002Fmain\u002Fplugins\u002Fcouncil-hub\u002Fskills\u002Fcouncil-hub-setup\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"council hub setup","setup","council","hub","ports","mode","end","project","volume","up","only","pick","MCP","configure","SET","search","connect","workflow","mcp server","memory","2026-11-10 10:12:30",false,"---\nname: council-hub-setup\ndescription: Stand up a Council Hub server and connect MCP clients to it — pick stdio vs HTTP transport, run the container with the right volume and ports, register the endpoint with Claude Code \u002F Claude Desktop \u002F Gemini CLI \u002F any MCP client, verify the connection end to end, and turn on the optional extras (semantic search via Ollama, multi-node clustering, low-memory mode). Use when asked to install \u002F set up \u002F configure Council Hub, connect an agent to council-hub, add the council-hub MCP server, or when council-hub tools are missing, unreachable, or returning ConnectionRefused. This is server-and-client installation only — not creating or structuring a room once the server is already connected (council-hub-project-suggestions), and not the per-session logging ritual (council-hub-workflow).\n---\n\n# Setting up Council Hub\n\nCouncil Hub is one server that many MCP clients share. Set the server up **once\nper machine**, then register its endpoint with each client. The most common\nsetup mistake is treating it like a per-project stdio server and ending up with\nseveral servers on separate databases that cannot see each other.\n\n## 1. Pick a transport first\n\nThis choice determines everything downstream, so make it before running anything.\n\n| | **HTTP** (recommended) | **stdio** |\n|---|---|---|\n| Server lifetime | Long-running container | Spawned per client, dies with it |\n| Clients | Many, sharing one database | One |\n| Web dashboard | Yes, on `:4000` | No |\n| Clustering | Yes | No |\n| Config | `\"type\": \"http\"` + URL | `\"command\": \"docker\"` + args |\n\nUse HTTP unless the client cannot speak it. **Claude Desktop is stdio-only**;\nClaude Code, Gemini CLI, Warp and most others do HTTP.\n\nIf a user wants both Claude Desktop and Claude Code on the *same* rooms, run the\nHTTP server and give Claude Desktop a stdio container that mounts the **same\nnamed volume** (`council-data`), not a separate database.\n\n## 2. Run the server\n\n```bash\ndocker run -d --name council-hub \\\n  -p 4000:4000 -p 3001:3001 \\\n  -v council-data:\u002Fdata \\\n  iksnerd\u002Fcouncil-hub:latest\n```\n\n- Dashboard → `http:\u002F\u002Flocalhost:4000`\n- MCP endpoint → `http:\u002F\u002Flocalhost:3001\u002Fmcp`\n\nTwo things to get right in that command:\n\n- **The volume is the database.** Without `-v`, every `docker rm` destroys all\n  rooms. Prefer a named volume (`council-data`, as `docker-compose.yml` does).\n- **A host bind mount (`-v ~\u002F.council-hub:\u002Fdata`) is the hazard.** On Docker\n  Desktop it crosses a VM boundary, and SQLite's WAL shared memory is not\n  coherent across it. A host-side `sqlite3`, a sync tool or a second server on\n  the same file can read stale pages or corrupt the database. The server logs a\n  warning at startup when it detects a shared filesystem. If you must bind\n  mount on macOS, keep it out of `~\u002FDocuments`, `~\u002FDesktop` and `~\u002FDownloads`\n  (Docker Desktop's TCC sandbox blocks those and the failure looks like a\n  corrupt or empty database).\n- **Back up from inside the container, never with `cp`:**\n  `docker exec council-hub council-hub -backup \u002Fdata\u002Fcouncil-backup.db` writes a\n  consistent snapshot (SQLite `VACUUM INTO`) and refuses to overwrite a file.\n  Copy it out with `docker cp`. To restore, stop the server, replace `council.db`\n  and delete the stale `-wal`\u002F`-shm` files.\n\nFor a checked-in setup, `docker-compose.yml` in the repo does the same thing.\nIt uses `restart: always` deliberately: Docker Desktop records its own shutdown\nas a manual stop, so `unless-stopped` leaves the server down after a host\nreboot until someone starts it by hand.\n\n## 3. Register the endpoint with each client\n\n**Claude Code** — one command, no file editing:\n\n```bash\nclaude mcp add --transport http council-hub http:\u002F\u002Flocalhost:3001\u002Fmcp\n```\n\nChoose the scope deliberately. Council Hub rooms span projects, which is the\npoint of it, so `--scope user` is usually right. Register in **one scope only**\n— a project `.mcp.json` entry silently wins inside that repo, and the two\nconfigs then drift apart unnoticed.\n\n**Any HTTP client** (Gemini CLI `~\u002F.gemini\u002Fsettings.json`, Warp, Cursor, …):\n\n```json\n{\n  \"mcpServers\": {\n    \"council-hub\": {\n      \"type\": \"http\",\n      \"url\": \"http:\u002F\u002Flocalhost:3001\u002Fmcp\"\n    }\n  }\n}\n```\n\n**Claude Desktop** (stdio only) — point it at a container that mounts the same\nvolume as the HTTP server, so both see one database:\n\n```json\n{\n  \"mcpServers\": {\n    \"council-hub\": {\n      \"command\": \"docker\",\n      \"args\": [\"run\", \"-i\", \"--rm\",\n               \"-v\", \"council-data:\u002Fdata\",\n               \"iksnerd\u002Fcouncil-hub:latest\"]\n    }\n  }\n}\n```\n\nUse the same volume name as the server. A different name, or a `~` path (the\nclient does not expand it), quietly gives the container a fresh empty database.\n\n## 4. Verify, in this order\n\nStop at the first step that fails; each one rules out the layer below it.\n\n```bash\ncurl -s localhost:3001\u002Fhealth   # Go MCP server — JSON, includes embedding_coverage\ncurl -s -o \u002Fdev\u002Fnull -w '%{http_code}\\n' localhost:4000   # dashboard, expect 200\ndocker port council-hub          # ports are actually published (see below)\n```\n\nThen check the client: in Claude Code, `\u002Fmcp` should list `council-hub` as\nconnected. Finish with a real write — `get_or_create_room` then `post_to_room`\n— and confirm the message appears in the dashboard. A server that answers\n`\u002Fhealth` but has no working client registration is the usual half-configured\nstate.\n\n**After changing the server, reconnect the client.** A running Claude Code\nsession pins its MCP client to whatever is on `:3001` at connect time. New\ntools and new parameters are not callable until you run `\u002Fmcp` to reconnect.\nThe `:4000` dashboard needs no reconnect — just refresh.\n\n## 5. Optional extras\n\nAdd these only when asked; each one is a separate failure surface.\n\n**Semantic search** needs Ollama reachable *from inside the container*:\n\n```bash\n-e COUNCIL_OLLAMA_URL=http:\u002F\u002Fhost.docker.internal:11434\n```\n\n`host.docker.internal` resolves on Docker Desktop (macOS\u002FWindows). On Linux add\n`--add-host=host.docker.internal:host-gateway` or pass the host IP. Pointing it\nat `localhost` is the classic mistake — that is the container's own loopback,\nand embeddings then silently never populate. Confirm with the\n`embedding_coverage` field on `\u002Fhealth`.\n\n**Low memory** — `-e COUNCIL_UI=off` drops the idle footprint from ~180 MiB to\n~12 MiB by skipping the Phoenix dashboard. The BEAM is ~90% of the image's\nmemory. Local reads and writes are unaffected; only `cluster_wide` reads, which\nfan out through Phoenix, become unavailable.\n\n**Clustering** publishes two more ports (`4369`, `9000`) and needs a shared\n`RELEASE_COOKIE` plus a `RELEASE_NODE` carrying a reachable IP. Read\n`docs\u002Fclustering-tailscale.md` before setting it up. Change the cookie: the\nimage default is published in the docs, and the cookie is all that stands\nbetween an exposed distribution port and code execution on that machine.\n\n## 6. When it does not connect\n\n**`ConnectionRefused` from every client, container reports healthy.** Run\n`docker port council-hub` before anything else. If it prints nothing, Docker\nis publishing no ports at all, and `docker ps` will still say `healthy`.\n\nThis happens to a **long-running** container whose pinned bind address\ndisappears underneath it — `-p 192.168.0.6:4369:4369` when DHCP moves the host\noff `.6`. Docker does not silently drop bindings in general: starting a\ncontainer against a missing address fails loudly with\n`ports are not available: ... bind: can't assign requested address`. A\ncontainer under `restart: always` that never actually restarts never gets that\nerror, so it sits in the broken state indefinitely. Restarting it by hand is\nthe right instinct — it converts the silence into that message.\n\n`docker ps` is the wrong check because the healthcheck runs *inside* the\ncontainer (`wget http:\u002F\u002Flocalhost:4000`), where host-side publishing is\ninvisible. \"Healthy\" and \"unreachable from every client\" are fully compatible\nstates, which is the whole reason to reach for `docker port` first.\n\nFix the pinned address and recreate the container. Reserve the address on the\nrouter so it cannot move again.\n\n**Tools missing but the server is up.** The session connected before the tool\nexisted. Run `\u002Fmcp`.\n\n**Two servers, two databases.** If rooms created by one agent are invisible to\nanother, check whether a second registration spawned its own stdio container.\n`docker ps` shows the extras. Consolidate onto one endpoint and one volume.\n\n**Room exists but a tool says it does not, in a cluster.** The room lives on\nanother node. Room-scoped writes auto-route to the owning node, and discovery\nreads (`list_rooms`, `search_messages`, `read_room`, `get_digest`,\n`get_mentions`) go cluster-wide by default when a peer is connected\n(`COUNCIL_CLUSTER_READS=local` turns that off; `cluster_wide=false` forces one\ncall local). `council-hub-cluster` has the full map. Do not recreate the room locally —\nthat makes a shadow copy that never merges.\n","# Setting up Council Hub\n\nCouncil Hub is one server that many MCP clients share. Set the server up **once\nper machine**, then register its endpoint with each client. The most common\nsetup mistake is treating it like a per-project stdio server and ending up with\nseveral servers on separate databases that cannot see each other.\n\n## 1. Pick a transport first\n\nThis choice determines everything downstream, so make it before running anything.\n\n| | **HTTP** (recommended) | **stdio** |\n|---|---|---|\n| Server lifetime | Long-running container | Spawned per client, dies with it |\n| Clients | Many, sharing one database | One |\n| Web dashboard | Yes, on `:4000` | No |\n| Clustering | Yes | No |\n| Config | `\"type\": \"http\"` + URL | `\"command\": \"docker\"` + args |\n\nUse HTTP unless the client cannot speak it. **Claude Desktop is stdio-only**;\nClaude Code, Gemini CLI, Warp and most others do HTTP.\n\nIf a user wants both Claude Desktop and Claude Code on the *same* rooms, run the\nHTTP server and give Claude Desktop a stdio container that mounts the **same\nnamed volume** (`council-data`), not a separate database.\n\n## 2. Run the server\n\n```bash\ndocker run -d --name council-hub \\\n  -p 4000:4000 -p 3001:3001 \\\n  -v council-data:\u002Fdata \\\n  iksnerd\u002Fcouncil-hub:latest\n```\n\n- Dashboard → `http:\u002F\u002Flocalhost:4000`\n- MCP endpoint → `http:\u002F\u002Flocalhost:3001\u002Fmcp`\n\nTwo things to get right in that command:\n\n- **The volume is the database.** Without `-v`, every `docker rm` destroys all\n  rooms. Prefer a named volume (`council-data`, as `docker-compose.yml` does).\n- **A host bind mount (`-v ~\u002F.council-hub:\u002Fdata`) is the hazard.** On Docker\n  Desktop it crosses a VM boundary, and SQLite's WAL shared memory is not\n  coherent across it. A host-side `sqlite3`, a sync tool or a second server on\n  the same file can read stale pages or corrupt the database. The server logs a\n  warning at startup when it detects a shared filesystem. If you must bind\n  mount on macOS, keep it out of `~\u002FDocuments`, `~\u002FDesktop` and `~\u002FDownloads`\n  (Docker Desktop's TCC sandbox blocks those and the failure looks like a\n  corrupt or empty database).\n- **Back up from inside the container, never with `cp`:**\n  `docker exec council-hub council-hub -backup \u002Fdata\u002Fcouncil-backup.db` writes a\n  consistent snapshot (SQLite `VACUUM INTO`) and refuses to overwrite a file.\n  Copy it out with `docker cp`. To restore, stop the server, replace `council.db`\n  and delete the stale `-wal`\u002F`-shm` files.\n\nFor a checked-in setup, `docker-compose.yml` in the repo does the same thing.\nIt uses `restart: always` deliberately: Docker Desktop records its own shutdown\nas a manual stop, so `unless-stopped` leaves the server down after a host\nreboot until someone starts it by hand.\n\n## 3. Register the endpoint with each client\n\n**Claude Code** — one command, no file editing:\n\n```bash\nclaude mcp add --transport http council-hub http:\u002F\u002Flocalhost:3001\u002Fmcp\n```\n\nChoose the scope deliberately. Council Hub rooms span projects, which is the\npoint of it, so `--scope user` is usually right. Register in **one scope only**\n— a project `.mcp.json` entry silently wins inside that repo, and the two\nconfigs then drift apart unnoticed.\n\n**Any HTTP client** (Gemini CLI `~\u002F.gemini\u002Fsettings.json`, Warp, Cursor, …):\n\n```json\n{\n  \"mcpServers\": {\n    \"council-hub\": {\n      \"type\": \"http\",\n      \"url\": \"http:\u002F\u002Flocalhost:3001\u002Fmcp\"\n    }\n  }\n}\n```\n\n**Claude Desktop** (stdio only) — point it at a container that mounts the same\nvolume as the HTTP server, so both see one database:\n\n```json\n{\n  \"mcpServers\": {\n    \"council-hub\": {\n      \"command\": \"docker\",\n      \"args\": [\"run\", \"-i\", \"--rm\",\n               \"-v\", \"council-data:\u002Fdata\",\n               \"iksnerd\u002Fcouncil-hub:latest\"]\n    }\n  }\n}\n```\n\nUse the same volume name as the server. A different name, or a `~` path (the\nclient does not expand it), quietly gives the container a fresh empty database.\n\n## 4. Verify, in this order\n\nStop at the first step that fails; each one rules out the layer below it.\n\n```bash\ncurl -s localhost:3001\u002Fhealth   # Go MCP server — JSON, includes embedding_coverage\ncurl -s -o \u002Fdev\u002Fnull -w '%{http_code}\\n' localhost:4000   # dashboard, expect 200\ndocker port council-hub          # ports are actually published (see below)\n```\n\nThen check the client: in Claude Code, `\u002Fmcp` should list `council-hub` as\nconnected. Finish with a real write — `get_or_create_room` then `post_to_room`\n— and confirm the message appears in the dashboard. A server that answers\n`\u002Fhealth` but has no working client registration is the usual half-configured\nstate.\n\n**After changing the server, reconnect the client.** A running Claude Code\nsession pins its MCP client to whatever is on `:3001` at connect time. New\ntools and new parameters are not callable until you run `\u002Fmcp` to reconnect.\nThe `:4000` dashboard needs no reconnect — just refresh.\n\n## 5. Optional extras\n\nAdd these only when asked; each one is a separate failure surface.\n\n**Semantic search** needs Ollama reachable *from inside the container*:\n\n```bash\n-e COUNCIL_OLLAMA_URL=http:\u002F\u002Fhost.docker.internal:11434\n```\n\n`host.docker.internal` resolves on Docker Desktop (macOS\u002FWindows). On Linux add\n`--add-host=host.docker.internal:host-gateway` or pass the host IP. Pointing it\nat `localhost` is the classic mistake — that is the container's own loopback,\nand embeddings then silently never populate. Confirm with the\n`embedding_coverage` field on `\u002Fhealth`.\n\n**Low memory** — `-e COUNCIL_UI=off` drops the idle footprint from ~180 MiB to\n~12 MiB by skipping the Phoenix dashboard. The BEAM is ~90% of the image's\nmemory. Local reads and writes are unaffected; only `cluster_wide` reads, which\nfan out through Phoenix, become unavailable.\n\n**Clustering** publishes two more ports (`4369`, `9000`) and needs a shared\n`RELEASE_COOKIE` plus a `RELEASE_NODE` carrying a reachable IP. Read\n`docs\u002Fclustering-tailscale.md` before setting it up. Change the cookie: the\nimage default is published in the docs, and the cookie is all that stands\nbetween an exposed distribution port and code execution on that machine.\n\n## 6. When it does not connect\n\n**`ConnectionRefused` from every client, container reports healthy.** Run\n`docker port council-hub` before anything else. If it prints nothing, Docker\nis publishing no ports at all, and `docker ps` will still say `healthy`.\n\nThis happens to a **long-running** container whose pinned bind address\ndisappears underneath it — `-p 192.168.0.6:4369:4369` when DHCP moves the host\noff `.6`. Docker does not silently drop bindings in general: starting a\ncontainer against a missing address fails loudly with\n`ports are not available: ... bind: can't assign requested address`. A\ncontainer under `restart: always` that never actually restarts never gets that\nerror, so it sits in the broken state indefinitely. Restarting it by hand is\nthe right instinct — it converts the silence into that message.\n\n`docker ps` is the wrong check because the healthcheck runs *inside* the\ncontainer (`wget http:\u002F\u002Flocalhost:4000`), where host-side publishing is\ninvisible. \"Healthy\" and \"unreachable from every client\" are fully compatible\nstates, which is the whole reason to reach for `docker port` first.\n\nFix the pinned address and recreate the container. Reserve the address on the\nrouter so it cannot move again.\n\n**Tools missing but the server is up.** The session connected before the tool\nexisted. Run `\u002Fmcp`.\n\n**Two servers, two databases.** If rooms created by one agent are invisible to\nanother, check whether a second registration spawned its own stdio container.\n`docker ps` shows the extras. Consolidate onto one endpoint and one volume.\n\n**Room exists but a tool says it does not, in a cluster.** The room lives on\nanother node. Room-scoped writes auto-route to the owning node, and discovery\nreads (`list_rooms`, `search_messages`, `read_room`, `get_digest`,\n`get_mentions`) go cluster-wide by default when a peer is connected\n(`COUNCIL_CLUSTER_READS=local` turns that off; `cluster_wide=false` forces one\ncall local). `council-hub-cluster` has the full map. Do not recreate the room locally —\nthat makes a shadow copy that never merges.\n",{"name":5,"description":7},"main","fc3268697ecdf9b61dc55568936a7e07bf55b3d4","plugins\u002Fcouncil-hub\u002Fskills\u002Fcouncil-hub-setup",0,"https:\u002F\u002Fgithub.com\u002Fiksnerd\u002Fcouncil-hub","https:\u002F\u002Fhub.docker.com\u002Fr\u002Fiksnerd\u002Fcouncil-hub","https:\u002F\u002Fgithub.com\u002Fiksnerd","iksnerd.xyz","2026-11-08 10:43:20",{"source":8,"skillName":5,"commands":58,"prompt":68,"zipAvailable":69},[59,62,65],{"tool":60,"command":61},"npx","npx skills add iksnerd\u002Fcouncil-hub --skill council-hub-setup",{"tool":63,"command":64},"bunx","bunx skills add iksnerd\u002Fcouncil-hub --skill council-hub-setup",{"tool":66,"command":67},"pnpm","pnpm dlx skills add iksnerd\u002Fcouncil-hub --skill council-hub-setup","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fiksnerd\u002Fcouncil-hub\u002Fblob\u002Fmain\u002Fplugins\u002Fcouncil-hub\u002Fskills\u002Fcouncil-hub-setup\u002FSKILL.md",true,[71],{"path":72,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":75,"sourceHtmlUrl":76},"EVOLUTION.md","REFERENCE","参考文档",3197,"https:\u002F\u002Fgithub.com\u002Fiksnerd\u002Fcouncil-hub\u002Fblob\u002Fmain\u002Fplugins\u002Fcouncil-hub\u002Fskills\u002Fcouncil-hub-setup\u002FEVOLUTION.md",[78,97,116,135,156,177],{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":85,"publishedAt":43},"01M6JZ4H1GH8JP7T9ATMXV6XN1","council-hub-workflow","Make Council Hub the actual source of truth for dev work, not an afterthought — check mentions\u002Fdigest\u002Fnotebook before starting substantive work, log decisions and actions to a room as you go (not just at the end), and close out with a pinned synthesis + resolved\u002Fpaused status. Use at the start of any coding\u002Fproject session where a council-hub MCP server is connected, at natural checkpoints mid-session (a decision made, a milestone shipped, a blocker hit), and before wrapping up. Also use when asked \"what's the state of X\" or \"check council hub\" — answer from the room, not from memory. Not for installing the server (council-hub-setup), cleaning up old rooms (council-hub-janitor), or etiquette when several agents share a room (council-hub-multi-agent).","https:\u002F\u002Fgithub.com\u002Fiksnerd\u002Fcouncil-hub\u002Fblob\u002Fmain\u002Fplugins\u002Fcouncil-hub\u002Fskills\u002Fcouncil-hub-workflow\u002FSKILL.md",[84],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[40,25,26,86,35,42,41,87,88,89,90,32,91,92,93,94,30,29,95,96],"council hub workflow","server","actions","decision","work","log","notebook","milestone","digest","close","you",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":104,"publishedAt":43},"01M6JZ46CM9JHVJ0N2Z5MKHAJE","council-hub-project-suggestions","Set up a Council Hub room for a software project AND capture tool\u002Fplatform feedback as you work. Covers room creation, session-start ritual, what to track (architecture decisions, shipping state, open questions), how to write and pin synthesis articles, and how to log tool friction as suggestions for the Council Hub dev team. Use when starting work on a new project, picking up a project across sessions, or when asked to \"set up a council hub room\" \u002F \"log this to council hub\" \u002F \"post suggestions to council hub\" \u002F \"check what we've done on this project\". Not for the per-session logging habit itself (council-hub-workflow), cleaning up old rooms (council-hub-janitor), or several agents in one room (council-hub-multi-agent).","https:\u002F\u002Fgithub.com\u002Fiksnerd\u002Fcouncil-hub\u002Fblob\u002Fmain\u002Fplugins\u002Fcouncil-hub\u002Fskills\u002Fcouncil-hub-project-suggestions\u002FSKILL.md",[103],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[25,26,30,105,40,106,107,37,108,109,110,90,32,91,111,112,113,114,115,96],"council hub project suggestions","architecture","shipping","open","team","work on","done","across","creation","dev team","how to",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":123,"publishedAt":43},"01M6JZ3Z88FC6XERD4PZRSTBD7","council-hub-notebook","Drive dev work from Council Hub's notebooks, above all the global `current-work` cockpit. Covers choosing a `room_ref` versus a `task`, closing a task with `check` instead of appending \"DONE\", reading a big notebook without overflowing the client (`status`, `level`, `project`, `limit`, `entry_id`), and the confirmed soft delete (`delete`\u002F`restore`\u002F`purge`) that replaced a silent whole-notebook delete. Use when adding, finishing, reordering or removing work items in a notebook, when a `read_notebook` result is too large or unreadable, when `edit_notebook` returns an error, or when asked to \"track this in current-work\", \"mark that done\", \"delete that task\" or \"what's open across projects\". Not for the session-start ritual as a whole (council-hub-workflow), room synthesis and cleanup (council-hub-janitor), or the timeline of decisions in one project, which is plain `read_notebook(project=...)` with no `notebook_id`.","https:\u002F\u002Fgithub.com\u002Fiksnerd\u002Fcouncil-hub\u002Fblob\u002Fmain\u002Fplugins\u002Fcouncil-hub\u002Fskills\u002Fcouncil-hub-notebook\u002FSKILL.md",[122],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[25,26,92,124,40,125,126,127,108,128,90,129,130,111,112,30,131,132,133,134],"council hub notebook","status","cleanup","delete","projects","read","edit","error","reading","closing","which",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":142,"publishedAt":43},"01M6JZ3Q1H210N7N97WKF0P0FF","council-hub-multi-agent","Share a Council Hub room with other agents without producing parallel monologues, duplicated work, or two live conclusions. Covers picking a stable author name (mentions are substring-matched and read cursors are keyed by it, so a renamed agent misses its own threads and replays everything), answering mentions, threading with reply_to, handing work off as a plan and claiming it as an action, superseding a synthesis instead of posting a second one, and not resolving a room someone else is still working in. Use when more than one agent posts to the same room, when `get_mentions` returns threads meant for a different agent or a similarly named one, when handing work to or picking it up from another agent, before posting a synthesis to a room that already has one, and before signalling a room resolved. Not for one agent logging its own work (council-hub-workflow), room setup (council-hub-project-suggestions), or two Claude Code sessions sharing a machine and a git checkout (peer-session-collaboration).","https:\u002F\u002Fgithub.com\u002Fiksnerd\u002Fcouncil-hub\u002Fblob\u002Fmain\u002Fplugins\u002Fcouncil-hub\u002Fskills\u002Fcouncil-hub-multi-agent\u002FSKILL.md",[141],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[143,25,26,144,145,40,146,147,148,149,90,129,32,30,150,151,152,153,154,155],"multi agent","multi","council hub multi agent","code","git","claude code sessions","plan","get","live","checkout","posts","threads","action",{"skillNo":157,"name":158,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":163,"publishedAt":43},"01M6JZ3FW5YVXC3RSNK1SVN6QY","council-hub-janitor","Run a hygiene pass over a project's Council Hub rooms — triage stale and unsynthesized rooms, write and pin the missing synthesis, resolve or archive what's done, fix metadata (tags, related-room links, project grouping), and post short status updates where a room is still live. Use when asked to clean up \u002F tidy \u002F groom council-hub rooms, do a knowledge-linting pass, wrap up a project's rooms, or \"run the janitor\". Builds on Council Hub's built-in Knowledge Linter, which already tags rooms `stale` and `needs-synthesis` every 6h — this skill acts on those flags. Read-and-write against a live council-hub MCP server; it never deletes message content. Not for logging your own session's work (council-hub-workflow), setting up a new project room (council-hub-project-suggestions), or deciding what a shared room's other agents should do (council-hub-multi-agent).","https:\u002F\u002Fgithub.com\u002Fiksnerd\u002Fcouncil-hub\u002Fblob\u002Fmain\u002Fplugins\u002Fcouncil-hub\u002Fskills\u002Fcouncil-hub-janitor\u002FSKILL.md",[162],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[25,26,164,165,35,40,166,167,168,169,170,171,32,172,173,174,175,30,134,176],"janitor","council hub janitor","tidy","knowledge","linter","short","fix","never","status updates","clean","grouping","shared","updates",{"skillNo":178,"name":179,"nameZh":6,"description":180,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":181,"categories":182,"keywords":184,"publishedAt":43},"01M6JZ38ZAW8ZJJGQ30NXYWKCV","council-hub-cluster","Work correctly on a multi-node Council Hub cluster. Covers which tools read cluster-wide by default (v0.63.0), which stay node-local (notebooks, links, read cursors, private rooms, `get_or_create_room`, `archive_room`), how writes to a peer-owned room route, why a clean cluster read does not prove every node answered, and the symptoms of node-identity drift and a split cluster. Use when a room \"does not exist\" but should, when two nodes hold same-named rooms, before `get_or_create_room` in a project that spans machines, when a result ends with \"local node only\", when `\u002Fhealth` shows fewer `cluster_nodes` than expected, or when asked to cluster or debug clustering. Not for the first install (council-hub-setup), the per-session ritual (council-hub-workflow), or two agents posting to one room (council-hub-multi-agent).","https:\u002F\u002Fgithub.com\u002Fiksnerd\u002Fcouncil-hub\u002Fblob\u002Fmain\u002Fplugins\u002Fcouncil-hub\u002Fskills\u002Fcouncil-hub-cluster\u002FSKILL.md",[183],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[25,26,185,186,40,187,188,189,90,190,129,33,191,173,192,193,194,30,150,134],"cluster","council hub cluster","create","how","why","node","default","route","drift","local"]