teamai-cli 0.26.0-beta.5 โ†’ 0.27.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -6,13 +6,22 @@ All notable changes to this project will be documented in this file. See [standa
6
6
 
7
7
  ### ๐Ÿ’ฅ Breaking Changes
8
8
 
9
- - An env variable, hook or MCP server with a key its schema does not know, such as a misspelled `role:` or a hand-added `notes:`, is no longer delivered to anyone: the key used to be dropped silently, so a misspelled restriction shipped the entry to every member. `teamai pull` and `teamai doctor` name the file, the entry and the key. `teamai env add`, `teamai env remove` and `teamai remove mcp` keep the key when they rewrite the file. A key that a later version adds to these entries is unknown to this one too, so an entry that uses it is not delivered to a member still on this version: upgrade every member before the team uses a new entry key, as for a new `resources:` key (for [#822](https://github.com/Tencent/teamai-cli/issues/822)).
9
+ - An env variable, hook or MCP server with a key its schema does not know, such as a misspelled `role:` or a hand-added `notes:`, is no longer delivered to anyone: the key used to be dropped silently, so a misspelled restriction shipped the entry to every member. `teamai pull`, the list commands, `teamai status` and `teamai doctor` name the file, the entry and the key. `teamai env add` also warns when it updates a variable carrying the unknown key; it, `teamai env remove` and `teamai remove mcp` keep the key when they rewrite the file. A key that a later version adds to these entries is unknown to this one too, so an entry that uses it is not delivered to a member still on this version: upgrade every member before the team uses a new entry key, as for a new `resources:` key (for [#822](https://github.com/Tencent/teamai-cli/issues/822)).
10
10
  - `manifest/projects.yaml` and `manifest/roles.yaml` now reject a resource namespace that is not a single path segment, as a project id already had to be (the id keeps its own narrower ASCII rule). A namespace becomes a directory component (`skills/<namespace>/`, `agents/<namespace>/`, `learnings/<namespace>/`), so `../evil`, `a/b`, `C:evil`, a bare `..`, any name with a trailing `.` or space โ€” which Win32 strips, making `.. ` arrive as `..` and `frontend.` as `frontend` โ€” and a Windows device name such as `CON` or `COM1` under `resources:` no longer parse; the error names the offending entry. Nothing else is rejected: a namespace that is a plain directory name still parses, non-ASCII names and names with a space included. A manifest that fails to parse now reports the offending entry on one line (`Invalid projects manifest: projects.0.resources.skills.1: ...`) instead of dumping a raw validation object. Two namespaces of one resource type that differ only by case (`frontend`, `Frontend`) are rejected too, within a manifest and between the two, since they name one directory on Windows and macOS. A manifest that ships any of these โ€” a device name, a trailing `.`, a case-only pair โ€” parsed before and fails every pull now; rename the directory and the entry together.
11
11
  - **Upgrade every member before a team declares a new axis.** `resources:` in `manifest/roles.yaml` and `manifest/projects.yaml` accepts `env`, `hooks`, `mcp`, `models` and `docs`, but teamai 0.25.0 and the 0.26.0 betas reject a `resources:` key they do not know, so a team that declares one breaks pull for every member still on those versions. From this version on, an unknown `resources:` key prints one warning naming the role or project and the key, and the scope syncs as if the key were absent; `teamai roles` and `teamai projects` keep the key when they save the manifest. `teamai roles|projects add/update --namespaces` never write the new keys, so nothing declares them until an admin does by hand (for [#707](https://github.com/Tencent/teamai-cli/issues/707)).
12
- - Per-entry scoping of env variables, hooks and MCP servers gives way to namespace files (see Features). `projects:` on an `env/env.yaml` variable, a `hooks/hooks.yaml` hook or an `mcp/mcp.yaml` server, and `roles:` on an env variable, existed only in the 0.26.0 betas and are removed: such an entry now reaches nobody, and each pull warns with the namespace file to move it to, one per listed id, so a project-only value never falls through to the whole team. `roles:` on hooks and MCP servers, which 0.25.0 shipped, is deprecated: it keeps filtering for one more minor release as 0.25.0 did, a name repeated in one file under different `roles:` included, pull warns once per run and `teamai doctor` has a check, both naming every target file. There is no automatic migration; move each entry into the file the warning names and drop the key. A member with no role in a team with `roles.yaml` received every `roles:`-scoped hook and server; once they move into `hooks/<ns>/` or `mcp/<ns>/`, that member no longer does (for [#707](https://github.com/Tencent/teamai-cli/issues/707)).
12
+ - Per-entry scoping of env variables, hooks and MCP servers gives way to namespace files (see Features). `projects:` on an `env/env.yaml` variable, a `hooks/hooks.yaml` hook or an `mcp/mcp.yaml` server, and `roles:` on an env variable, existed only in the 0.26.0 betas and are removed: such an entry now reaches nobody, and pull, the list commands and status warn with the namespace file to move it to, one per listed id, so a project-only value never falls through to the whole team. `teamai env add` also warns when it updates an existing variable carrying either removed key, and preserves the key. `roles:` on hooks and MCP servers, which 0.25.0 shipped, is deprecated: it keeps filtering for one more minor release as 0.25.0 did, a name repeated in one file under different `roles:` included, pull warns once per run and `teamai doctor` has a check, both naming every target file. There is no automatic migration; move each entry into the file the warning names and drop the key. A member with no role in a team with `roles.yaml` received every `roles:`-scoped hook and server; once they move into `hooks/<ns>/` or `mcp/<ns>/`, that member no longer does (for [#707](https://github.com/Tencent/teamai-cli/issues/707)).
13
+ - Each tool reads only its own `tool_extras.<tool>` from a YAML agent. Qoder, Qoder CN, ZCode and OMP used to receive `tool_extras.claude` and ignore their own key, which `teamai push` wrote their edits to, so an edit never reached them; a team that relied on Claude extras reaching these tools moves those fields to `tool_extras.qoder`, `tool_extras.qoder-cn`, `tool_extras.zcode` or `tool_extras.omp`. tclaude and tcodex read `tool_extras.tclaude` and `tool_extras.tcodex` and fill the fields those lack from `tool_extras.claude` and `tool_extras.codex`, and `teamai push` writes their edits to their own key instead of the Claude or Codex one. The first ordinary pull after updating re-renders a copy an older CLI wrote this way when that CLI recorded delivering it and the member has not changed it since; any other copy is left as it is until the team next changes the agent (for [#830](https://github.com/Tencent/teamai-cli/issues/830)).
14
+ - **Upgrade every member before a team introduces model aliases.** An older CLI ignores `models/aliases.yaml` and writes `model: strong` into every tool as is, a model no tool knows, and its `teamai push` reads a model changed in a deployed copy as an edit, so it can replace `model: strong` in the team's agent with a concrete model such as `opus`. Have everyone update first, then add `models/aliases.yaml` and move agents to an alias. TeamAI does not check versions; the first ordinary pull after a member updates replaces a literal `model: strong` with the resolved model (for [#830](https://github.com/Tencent/teamai-cli/issues/830)).
13
15
 
14
16
  ### โœจ Features
15
17
 
18
+ - A YAML agent can set `model: strong`, `model: fast`, or an alias the team defines in an optional `models/aliases.yaml`, which maps each alias per tool to that tool's own model value and an optional effort. `teamai pull` writes the mapped model into every tool's agent file, and the effort into that tool's own field: `effort` for Claude, claude-internal, tclaude, CodeBuddy, Qoder and Qoder CN, `model_reasoning_effort` for Codex, codex-internal and tcodex, `variant` for OpenCode. Cursor receives its model string as written, so its bracket form (`claude-opus-5[effort=high]`) carries the effort; Copilot receives the first entry as one model string. Copilot, Cursor, Kiro, WorkBuddy, JoyCode, ZCode and OMP get no effort field: an effort mapped for them is dropped, and pull warns once, naming the alias and the tool. The `-internal` and `t` variants use the `claude` or `codex` entry and Qoder CN the `qoder` entry unless the alias has their own key; no other tool inherits one. A tool the alias does not map, or any tool when the team has no aliases file, gets no `model` field and runs on its default, never a literal `strong`. `tool_extras.<tool>.model` skips the alias for that tool, and an extras effort alone overrides the alias's effort. A `model` that is not a string now makes the agent fail to parse; a legacy `.md` agent whose `model` is an alias is copied as is with a warning. While `models/aliases.yaml` cannot be read, pull holds every agent that sets a `model`, since the file may define any name, and push skips them. Pull records the model each agent copy received, so an ordinary pull applies a changed resolution even when the team repo has not moved, which fixes an agent an older CLI wrote with `model: strong` as is, and delivers a copy that is missing; a copy the member edited is kept, and that pull names it with how to take the new model. Pull warns when an alias an agent resolved through is removed, also where the alias gave a tool no model field (for [#830](https://github.com/Tencent/teamai-cli/issues/830)).
19
+ - A member overrides a team model alias on their own machine in `~/.teamai/models/aliases.yaml`, in the same `aliases:` shape. An entry replaces the team's whole entry for that tool, effort included, and `~` or `default` gives the tool no model field and no effort; only `tool_extras.<tool>.model` wins over it. Keys are `strong`, `fast` or an alias the team defines, so a member can map `strong` before the team has an aliases file, and any other name has no effect. The file applies in every scope and to every team using that alias name, and an ordinary pull applies an edit to it. While it cannot be read, pull holds the agents whose `model` is an alias, naming the file, and push skips them; since the file can make no name an alias, agents with a concrete model are delivered and pushed as usual. In the team file, `default` is written as a model value and `~` is an error. When pull keeps an edited copy whose deployed version changed, it now says `the version teamai would deploy there ... has changed since` instead of blaming the team, since the change may be the member's override (for [#830](https://github.com/Tencent/teamai-cli/issues/830)).
20
+ - On a tool switched with `teamai models switch`, an agent whose `model` is an alias no longer sends an account model to the gateway: Claude keeps a resolved `opus`, `sonnet` or `haiku`, which the switch routes to gateway models, and drops any other model; Codex, OpenCode, CodeBuddy and WorkBuddy get no `model` field, so they use their native inheritance (for Codex, `[agents].default_subagent_model` or the parent session's model), not the profile's model. No switched tool gets an effort, the alias's or one set in `tool_extras.<tool>`, unless `tool_extras.<tool>` also pins a model. `tool_extras.<tool>.model`, a concrete `model` and a member's `~`/`default` are unchanged, and claude-internal, tclaude, codex-internal and tcodex are never treated as switched. A tool counts as switched only while its live settings path matches the recorded switch and still holds what TeamAI wrote, the checks `models restore` makes, so a stale record for another `CODEX_HOME` or `CLAUDE_CONFIG_DIR` has no effect. An ordinary pull after `models switch` or `models restore` rewrites the affected agents. While the switch records or a switched tool's settings cannot be read, pull holds alias agents in the tools concerned and says why (for [#830](https://github.com/Tencent/teamai-cli/issues/830)).
21
+ - `teamai push` keeps model aliases intact. For an agent whose `model` is an alias, a copy whose model and effort match what the last pull wrote or what a pull would write now is unedited, so pushing before pulling an alias change reports nothing. Push never proposes a concrete `model` over the alias and never writes the alias's effort into `tool_extras`, so adding an unrelated field no longer pins the effort. A hand-edited model or effort is reported as drift and left out, in `--dry-run` too, with where to make the change instead: the member's override file, the team's `models/aliases.yaml`, or `teamai models restore --agent <tool>` for a switched tool; the agent's other edits still push, and editing two tools no longer skips the agent over their different models. Writing an alias name in a deployed copy proposes `model: <alias>`. A new agent pushed from a tool's directory keeps its literal model. Push's warning about a kept copy whose deployed version changed now says `The version teamai would deploy at <path> ... has changed` instead of blaming the team, and for an agent it ignores a change of the model resolution alone, which push does not replace (for [#830](https://github.com/Tencent/teamai-cli/issues/830)).
22
+ - A broken model aliases file never changes anyone's models. A structural error in `models/aliases.yaml` or `~/.teamai/models/aliases.yaml` (YAML that does not parse, a wrong type, a bad alias name, an effort without a model, `~` in the team file, top-level keys but no `aliases:`, such as a misspelled `alias:`) makes `teamai pull` keep every agent with a `model` as deployed, deploy none of them anew and leave their recorded models alone, with a warning naming the file, and once the file is fixed an ordinary pull delivers them, including ones it never deployed and team changes that arrived meanwhile (a pull that holds an agent, on an unchanged team repo too, says so and does not count the team revision as synced, so the next one syncs in full, and sends no `pull` webhook; `teamai pull --dry-run` names the agents it would hold); `teamai push` skips those agents with the reason and pushes the rest. While it lasts, inactive-namespace cleanup leaves the root agent a held namespace agent replaces in place. A tool key teamai does not know, an option field other than `model` and `effort`, and an alias named like a tool's own model alias (`opus`, `sonnet`, `haiku`, `fable`, `inherit`, `default`, `auto`, `lite`) are dropped with a warning and the rest of the file applies; `gateways` inside an alias is ignored silently. Pull now prints an aliases warning only when it delivers an agent that uses that alias, for a tool entry only to that tool, instead of on every pull (for [#830](https://github.com/Tencent/teamai-cli/issues/830)).
23
+ - Model aliases can be scoped: `models/<ns>/aliases.yaml`, read where `<ns>` is active in `resources.models`, replaces the root alias of the same name whole for members with that namespace active. The same alias in two active namespaces holds agents with a `model` field, naming both files, as a structural error does. A name defined in any aliases file of the team repo, active or not, is an alias, so an agent whose alias only an inactive namespace defines gets no `model` field instead of the name written literally, and a member's local entry for it applies. Pull warns once per such alias, naming its files, and says to activate the namespace or, if the name was meant as a concrete model such as `gpt-5-codex`, to rename the alias; a structural error in any of these files holds alias agents too. Pull records which file each agent copy's model came from, and pull warnings and push drift name that file. `teamai doctor` notes an alias that agents you receive use when a namespace not active for you defines it (for [#830](https://github.com/Tencent/teamai-cli/issues/830)).
24
+ - `teamai doctor` shows how each agent's model alias resolved: per agent that uses an alias and per installed tool, the model and effort the tool receives and the step that decided it (`extras`, `switched`, `local`, `team`, `default`) with its source file, as notes. A member's `~`/`default` reads `tool default (chosen in <path>)`, a Codex-family model without effort says the session's effort carries over, and a line names what the last pull deployed when that differs. Every aliases entry this CLI drops is a note too. A new failing check, `Agent model aliases can be resolved`, names the reason, file and held agents while a structural error in any aliases file, a namespace conflict or an unreadable switched tool's settings holds agents; it also runs after an interactive pull. `Every team agent reaches a tool` no longer counts held agents, and `Agents delivered to <tool>` lists a copy that only carries the previous resolution as `model changed since the last pull`, which a plain `teamai pull` fixes, so it does not fail the check. Pull now names the agents it holds for one reason in a single warning and leaves them out of `Synced N agents` (for [#830](https://github.com/Tencent/teamai-cli/issues/830)).
16
25
  - Env variables, hooks and MCP servers are scoped the way skills and agents are. `env/<ns>/env.yaml`, `hooks/<ns>/hooks.yaml` and `mcp/<ns>/mcp.yaml` reach only members whose role or directory's project lists `<ns>` under `resources.env`, `resources.hooks` or `resources.mcp`; the root files still reach everyone. A namespace entry replaces the root entry of the same variable `key`, hook `id` or server `name`, whole: an MCP override carries its own `command`, `args`, `env` and `tools:`, and one without `tools:` reaches every tool. When a namespace stops being active the next pull, `Already synced` included, restores the root entries it overrode and removes the ones only it had; `env.sh` is rewritten even when `env/env.yaml` is missing or declares nothing, and MCP `${VAR}` reads the same resolved variables. `teamai env add` and `teamai env remove` take `--role <ns>` / `--project <id>` to edit a namespace file (`--role` warns when no role or project declares the namespace; neither edits a file that does not parse, and `--project` changes nothing when the team repo cannot be refreshed), `teamai push` picks up a change to any `env/<ns>/env.yaml`, and `teamai remove mcp <name>` removes from the root file when it defines the name, otherwise from the one namespace file that does, asking for `--role` / `--project` only when several do, and removing nothing by a bare name the root file does not define while an MCP file does not parse; a flag that names a file that does not parse says so instead of reporting the name as not found. `teamai env list`, `teamai mcp list`, `teamai hooks list` and `teamai list <env|hooks|mcp> --source repo` show each entry's namespace and whether it overrides the root, and `teamai status` and `teamai doctor` count per namespace. A hooks or MCP file that cannot be resolved makes `teamai hooks inject` and `teamai mcp inject` exit 1 instead of reporting success, and hooks or model profiles that cannot be resolved fail `teamai doctor`'s `Team hooks can be resolved` or `Team model profiles can be resolved`, where `teamai status` points. A declared namespace matches its directory case-folded, as docs namespaces do, so `env/Checkout/` serves `env: [checkout]` on Linux too, and `--role` / `--project` write into that directory. So a checkout project can point `API_BASE` or a shared MCP server at its own backend under the same name (for [#707](https://github.com/Tencent/teamai-cli/issues/707)).
17
26
  - An item in an active namespace replaces the root item of the same name for skills, agents, rules and CLAUDE.md fragments too, so contradictory versions are no longer delivered side by side. An agent in `agents/<ns>/` replaces the root agent of the same stem instead of failing the pull, and deactivating the namespace brings the root agent back; a root file of the same stem no longer withdraws a placement record. `rules/<ns>/<name>.md` replaces `rules/<name>.md`, in Hermes' `SOUL.md` block too; deeper paths replace nothing. In the rule directories shared with a member's own rules (JoyCode, OMP, Pi, Copilot), the replaced root copy is removed while it is what teamai delivered, now or at the last pull, and an edited copy is kept and named on each pull. `claudemd/<ns>/<name>.md` replaces `claudemd/<name>.md` in the managed block. A root skill received through a tag is replaced by an active namespace skill of the same name; root skills are still not delivered by default in role or project mode, and among tag matches the root skill wins over one in an inactive namespace. Installing a skill removes the files that another team version of it has and the new one lacks, when they match that version byte for byte, so switching between versions leaves nothing of the other behind, while a file you added or edited stays; one at a path another version has is named on each pull. `teamai push` writes an edit of a replacing item back to its namespace and never to the root, and the skills push scan covers project namespaces as well as role ones. `teamai recall` indexes the skills and rules you receive rather than every one in the repo, so a replaced root rule or a rule of an inactive namespace is not returned. Two namespace rules or CLAUDE.md files of one name are both delivered, since each keeps its own place. A replacement that cannot be used replaces nothing: a skill directory without `SKILL.md` is not delivered (pull names it), and while an agent file does not parse the agent it would replace stays installed. `teamai doctor` lists every replacement as a note, in `--json` under `notes`; without roles or projects nothing changes, and the notes list each name the team repo defines more than once. Keep content a project may override at the root: a namespace item never gives way, so a rule in `rules/common/` is delivered beside a project's rule of the same name (for [#707](https://github.com/Tencent/teamai-cli/issues/707)).
18
27
  - `docs/<ns>/` can be scoped: once any role or project lists `<ns>` under `resources.docs`, those docs reach only the members who have that namespace active. A `docs/<dir>/` that no role or project lists stays shared, so existing subdirectories keep reaching everyone. When the namespace stops being active, the next pull removes the local copies that still match the team file byte for byte, now or in an earlier team commit, and keeps an edited one, naming it. The docs mirror of `sharing.docs.localDir` copies only the docs a member receives and never removes such an edited copy. `teamai recall` and `teamai doctor`'s `Team docs delivered` follow the same filter, and doctor does not report a kept copy as stale. `team-codebase` cannot be a docs namespace, since `docs/team-codebase/` is the legacy codebase output; a manifest that declares it fails to load (for [#707](https://github.com/Tencent/teamai-cli/issues/707)).
@@ -30,10 +39,16 @@ All notable changes to this project will be documented in this file. See [standa
30
39
  - Data partitions auto-migrate a legacy `.teamai`, resume interrupted migrations, smoke-check the clone, and keep a git-ignored backup ([#439](https://github.com/Tencent/teamai-cli/pull/439), for [#374](https://github.com/Tencent/teamai-cli/issues/374)).
31
40
  - Teams add their own course-correction words via `sharing.intervention.correctionKeywords` in `teamai.yaml`. The built-in list still covers only Chinese, English and Japanese, so corrections typed in other languages count only once the team configures them. The `UserPromptSubmit` hook now stores a `correction` flag on each dashboard prompt event (for [#564](https://github.com/Tencent/teamai-cli/issues/564)).
32
41
  - `teamai init <repo> --provider <name>` uses the named provider instead of detecting one, so a member of a team on self-hosted GitLab can join with `--provider git` and their existing Git authentication, without `GITLAB_TOKEN`. The choice is saved in that machine's local config and takes precedence over the team's `teamai.yaml` `provider` for PR/MR creation and for `teamai doctor`'s provider checks; an existing `teamai.yaml` is unchanged, so other members keep the team's provider, and a `teamai.yaml` that `init` creates records the provider `init` would detect without the flag rather than `git`, and stops with a `GITLAB_URL` hint on an unconfigured self-hosted GitLab. `--provider gitlab` on a host that is not the configured `GITLAB_URL` or `TEAMAI_GITLAB_HOST` stops with a hint instead of sending the token to gitlab.com. With `git`, `teamai push` pushes the branch and leaves the merge request to be opened on the Git host, exiting non-zero as it does for a `provider: git` team repo. Re-running `init` without `--provider` returns to auto-detection. The value must be one of `tgit`, `github`, `cnb`, `gitlab`, `gitcode` or `git`, and `--provider` cannot be combined with `--http` (for [#789](https://github.com/Tencent/teamai-cli/issues/789)).
42
+ - Pi Coding Agent can use team model profiles, so `teamai models switch` reaches it like every other supported agent. TeamAI writes one provider into `~/.pi/agent/models.json`, keyed by the profile ref and labelled with its `name`, holding every catalog model. Pi resolves the api and the URL per model, so that one provider covers a catalog spanning all three protocols; a model served over several protocols is registered once, preferring an OpenAI one, and declaring a model such as `claude-opus-4-8` in an `anthropic`-only group pins it to Anthropic Messages. The key is the profile ref rather than the bare `id`, which is unique only within one catalog file, so a root and a namespace profile sharing an id do not overwrite one another. A key configured from the environment is written as `$VAR`, Pi's own indirection, so no secret lands in the file, and a member's other providers in the same file are never touched โ€” a switch over one TeamAI already wrote is not a collision, while a first switch refuses a provider the member already has under that ref. Pi's `settings.json` is left alone, so the default model stays the member's choice, as Claude's `/model` pick already is, and `PI_CODING_AGENT_DIR` is honored the way `CODEX_HOME` is. `teamai models restore` puts the file back, removing the key the last switch created even when the team has since re-pointed the profile at a different ref, and restoring without `--agent` now covers Pi too.
33
43
 
34
44
  ### ๐Ÿ› Bug Fixes
35
45
 
46
+ - `teamai pull` names the skills it removes because they are no longer delivered here, in one line, instead of a `debug` line calling them excluded and a summary that says `No resources to sync`. Picking a role or project, or an admin adding `manifest/projects.yaml`, takes root skills away, since the root `skills/` is then the tag catalog; the line then says that `teamai tags subscribe <tag>` brings one back. A namespace skill removed because its namespace is no longer active is named too. The usage guide and the multi-project design no longer say a member with no project still gets `common` or every root item (for [#911](https://github.com/Tencent/teamai-cli/issues/911)).
47
+ - `teamai pull` keeps the `teamai tags subscribe <tag>` recovery line when the skill directory it removes is byte-identical to an inactive namespace copy: that copy made the namespace cleanup phase remove the directory first, and the hint was lost, because pull inferred whether a root skill had left from which phase did the removing. The hint now follows the repo โ€” it appears exactly when the team repo holds the removed skill at the root, the copy a tag delivers โ€” so a namespace-only skill removed on deactivation is still named without the hint. The usage guide no longer says a member with no role gets no skills at all, in English or Chinese: root skills still arrive through a tag (review of [#917](https://github.com/Tencent/teamai-cli/pull/917)).
48
+ - `teamai pull` keeps a skill, rule or agent you changed since teamai delivered it instead of overwriting it, and names it: `Kept <path>: you changed it since teamai delivered it`, with a warning when the team version has changed since, which `teamai push` repeats for that copy, since the SessionStart pull is silent. Pull records the sha256 of what it writes at each path in the checkout's record, and the pre-push sync records its writes too, so a copy counts as changed only against that record; a skill counts as one copy, and files only you added do not count. The copies of other tools still update. `--force` keeps these copies, `--dry-run` prints `Would keep <path>`, and a copy of an item the team removed stays when you changed it. To take the team version, delete your copy and run `teamai pull --force`. There is no record before the first full pull on this version, or in a new worktree, so that pull overwrites as before. A file you added to a skill at a path another team version of it has is no longer named on every pull, and `teamai doctor` no longer fails a rules or agents check, or points at `teamai pull --force`, for a kept copy: it lists one as `changed by you (kept by pull)` beside any other problem (for [#822](https://github.com/Tencent/teamai-cli/issues/822)).
49
+ - On macOS, the git commands behind pull, push, reports and learnings publishing no longer wait on a PATH search each time they run. teamai spawned `git` by name, and on macOS that lookup costs a few milliseconds for each PATH entry ahead of git's directory: 30-67 ms per call with a typical PATH, while git itself takes about 8 ms. teamai now runs the `git` that lookup would pick by its absolute path, found once and again whenever PATH changes or that `git` is gone or no longer executable, and only once a `git --version` by that path starts. On macOS 26 an up-to-date `teamai pull` drops from 1.3 s to 0.4 s with a 42-entry PATH, and from 2.0 s to 0.4 s with the PATH an npm script gives; macOS 27 no longer shows the lookup cost. Windows, a PATH with an empty or relative entry, a first `git` on PATH that does not start (a missing interpreter, no execute permission), and the few one-off git calls outside these paths (provider clone, version and user probes) keep the bare-name spawn (for [#868](https://github.com/Tencent/teamai-cli/issues/868)).
36
50
  - On Node 24, `teamai codebase --extract`, and the `teamai import` and CI extract paths that run it, no longer abort with `Fatal process out of memory: Zone` on a repository with `.swift` files. V8's optimizing Wasm compiler (nodejs/node#63421) ran out of memory on the tree-sitter grammars, so the AST track now keeps them on V8's baseline tier on Node 24 and later. That also cuts the TypeScript grammar's peak memory there from about 1.4 GB to about 0.1 GB, for a parse about 1.6x slower; Node 20 and 22 are unchanged (for [#860](https://github.com/Tencent/teamai-cli/issues/860)).
51
+ - `teamai remove mcp ambiguous` removes a server named `ambiguous` from `mcp/mcp.yaml`. The name matched the value `remove` used internally to mean "refused", so the command printed `Nothing was removed.`, exited 1, and gave no reason (for [#862](https://github.com/Tencent/teamai-cli/issues/862)).
37
52
  - When `TEAMAI_GITLAB_HOST` and `GITLAB_URL` name different hosts, GitLab commands stop with an error naming both, before any request. A repo on `TEAMAI_GITLAB_HOST` was detected as GitLab while every API call, the token included, went to `GITLAB_URL`. An invalid `GITLAB_URL` is now reported as such by `init` instead of as a failed GitLab login (for [#789](https://github.com/Tencent/teamai-cli/issues/789)).
38
53
  - A misspelled top-level key in `mcp/mcp.yaml` or `hooks/hooks.yaml` (`server:` for `servers:`, `hook:` for `hooks:`) no longer removes every installed team MCP server or hook: such a file read as empty. It now fails like a file that does not parse, so pull keeps what is installed, and pull and `teamai doctor` name the file, the keys found and the key expected. An extra top-level key beside `servers:` or `hooks:` is still ignored (for [#822](https://github.com/Tencent/teamai-cli/issues/822)).
39
54
  - The closing line of `teamai recall` output is in English (for [#822](https://github.com/Tencent/teamai-cli/issues/822)).
package/README.ja.md CHANGED
@@ -129,7 +129,7 @@ Git ใ‚’ๅŸบ็›คใซใ€3 ๅฑคใฎ่ƒฝๅŠ›ใ‚’ๆง‹็ฏ‰ใ—ใพใ™๏ผš
129
129
  <tr><td>CodeBuddy</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td></tr>
130
130
  <tr><td>WorkBuddy</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td></tr>
131
131
  <tr><td>OpenCode</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
132
- <tr><td>Pi Coding Agent</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
132
+ <tr><td>Pi Coding Agent</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
133
133
  <tr><td>OpenClaw</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
134
134
  <tr><td>Hermes</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
135
135
  <tr><td>DeepSeek Harness</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
package/README.ko.md CHANGED
@@ -129,7 +129,7 @@ Git์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ธ ์ธต์˜ ์—ญ๋Ÿ‰์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค:
129
129
  <tr><td>CodeBuddy</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td></tr>
130
130
  <tr><td>WorkBuddy</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td></tr>
131
131
  <tr><td>OpenCode</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
132
- <tr><td>Pi Coding Agent</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
132
+ <tr><td>Pi Coding Agent</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
133
133
  <tr><td>OpenClaw</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
134
134
  <tr><td>Hermes</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
135
135
  <tr><td>DeepSeek Harness</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
package/README.md CHANGED
@@ -129,7 +129,7 @@ Three layers of capability, built on Git:
129
129
  <tr><td>CodeBuddy</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td></tr>
130
130
  <tr><td>WorkBuddy</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td></tr>
131
131
  <tr><td>OpenCode</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
132
- <tr><td>Pi Coding Agent</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
132
+ <tr><td>Pi Coding Agent</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
133
133
  <tr><td>OpenClaw</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
134
134
  <tr><td>Hermes</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
135
135
  <tr><td>DeepSeek Harness</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
package/README.th.md CHANGED
@@ -129,7 +129,7 @@ teamai init https://github.com/your-org/your-repo --scope user
129
129
  <tr><td>CodeBuddy</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td></tr>
130
130
  <tr><td>WorkBuddy</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td></tr>
131
131
  <tr><td>OpenCode</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
132
- <tr><td>Pi Coding Agent</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
132
+ <tr><td>Pi Coding Agent</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
133
133
  <tr><td>OpenClaw</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
134
134
  <tr><td>Hermes</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
135
135
  <tr><td>DeepSeek Harness</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
package/README.zh-CN.md CHANGED
@@ -135,7 +135,7 @@ teamai init https://github.com/your-org/your-repo --scope user
135
135
  <tr><td>CodeBuddy</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td></tr>
136
136
  <tr><td>WorkBuddy</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td></tr>
137
137
  <tr><td>OpenCode</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
138
- <tr><td>Pi Coding Agent</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
138
+ <tr><td>Pi Coding Agent</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
139
139
  <tr><td>OpenClaw</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
140
140
  <tr><td>Hermes</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
141
141
  <tr><td>DeepSeek Harness</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โœ“</td><td align="center">โ€”</td><td align="center">โ€”</td><td align="center">โ€”</td></tr>
@@ -25,7 +25,7 @@ upstream API"). Treat this as your query.
25
25
  Before any classification or search, run a single lightweight precheck:
26
26
 
27
27
  ```bash
28
- teamai recall --check "<3-6 keywords from the task>"
28
+ teamai recall --caller teamai-recall --check "<3-6 keywords from the task>"
29
29
  ```
30
30
 
31
31
  - If the output starts with `NOT_RELEVANT`: the team knowledge base has no
@@ -77,7 +77,7 @@ Suggested files: <sources from --check output>
77
77
  **Stop here** โ€” skip Steps 1โ€“5 entirely.
78
78
 
79
79
  **If LOW but `--check` output lacks `sources=`**: run
80
- `teamai recall <keywords> --depth context`, take only the top-1 result's
80
+ `teamai recall --caller teamai-recall <keywords> --depth context`, take only the top-1 result's
81
81
  title + Sources, return the same short format above, and skip Steps 1โ€“5.
82
82
 
83
83
  **If not LOW**: continue to Step 1 as normal.
@@ -193,10 +193,10 @@ Execute with the appropriate depth:
193
193
 
194
194
  ```bash
195
195
  # Default: searches overview, modules, and docs (context layer)
196
- teamai recall "<keyword1> <keyword2> ..."
196
+ teamai recall --caller teamai-recall "<keyword1> <keyword2> ..."
197
197
 
198
198
  # For precise symbol/line-number lookups, use lookup depth:
199
- teamai recall --depth lookup "<keyword1> <keyword2> ..."
199
+ teamai recall --caller teamai-recall --depth lookup "<keyword1> <keyword2> ..."
200
200
  ```
201
201
 
202
202
  This searches all four knowledge categories (`skills`, `learnings`,
@@ -369,14 +369,16 @@ rather than dropping the reasoning.
369
369
  query. This tells the main conversation to stop and ask the user rather
370
370
  than hallucinating.
371
371
  - The trailing HTML comment **must** list every doc_id you returned โ€”
372
- later phases (Phase 3 Stop hook) will parse this from the conversation
373
- transcript.
374
- - **ไธ่ฆ่‡ชๅทฑ่พ“ๅ‡บๅธฆๅ†…ๅฎน็š„ `teamai:referenced-doc-ids` ๆ ‡่ฎฐ** โ€”โ€” ้‚ฃๆ˜ฏไธปๅฏน่ฏ็š„่Œ่ดฃใ€‚ไฝ ๅช้œ€ๅœจ่ฟ”ๅ›žๆœซๅฐพๅฆ่ตทไธ€่กŒๆ็คบไธปๅฏน่ฏ๏ผš`๐Ÿ‘‰ ไธปๅฏน่ฏ๏ผšๅฎŒๆˆไปปๅŠกๅŽ่ฏทๅœจๆœ€็ปˆๅ›žๅคๆœซๅฐพๅฃฐๆ˜Žๅฎž้™…ๅผ•็”จ็š„ doc-id๏ผˆไปŽไธŠ้ข recalled-doc-ids ๅˆ—่กจไธญๆŒ‘ๅ‡บ็œŸๆญฃ็”จๅˆฐ็š„๏ผ‰๏ผŒๆ–นๆ‹ฌๅทๅ†…ๅชๅกซ็”จๅˆฐ็š„ใ€ๆฒก็”จๅˆฐๅฐฑ็•™็ฉบใ€‚` ่ฟ™ๆ ทไธปๅฏน่ฏๆ˜ฏ"ๅ‰ชๆž"่€Œ้ž"ๅ‡ญ่ฎฐๅฟ†้‡ๅปบ"๏ผŒ่ƒฝๆ˜พ่‘—ๆ้ซ˜ๅฃฐๆ˜Ž็އใ€‚
372
+ the opt-in upvote judge reads it from the conversation transcript at the
373
+ Stop hook.
375
374
 
376
375
  ## Hard rules
377
376
 
378
377
  - **Do not** copy entire file contents into your response. Summarize.
379
378
  - **Do not** call `teamai recall` more than 3 times in one invocation.
379
+ - Pass `--caller teamai-recall` on every `teamai recall` call, `--check`
380
+ included, exactly as the commands above show. It marks the run as yours, so
381
+ your own reads of the docs it returns don't count as the team using them.
380
382
  - **Do not** invoke other subagents.
381
383
  - If `teamai` CLI is not on PATH, return `teamai CLI not available` and stop.
382
384
  - Output total โ‰ค ~2500 characters (โ‰ค 1500 for bugfix and diagnose tasks). This