| feat: a workspace delivers what the repos inside it select (#1107) | 1 天前 |
| docs: reorganize documentation (#1009) - Add docs/README.md index by audience; move CI maintainer notes to docs/dev/; give every design document a status line and index row - Open Getting Started with three ten-minute paths (set up, join, share) - Split the usage guide into pages: docs/guide/<page>.md (English) and docs/guide/zh-CN/<page>.md (Chinese); usage-guide.* stay as index pages - Fold providers (new English translation) and Windows pages into the guide; move provider internals to docs/dev/adding-a-provider.md - Make docs/designs/ and docs/dev/ English only; translate the Chinese-only pages - Replace copied command and flag tables with links to --help and the generated commands.md; drop the stale Windows workaround - Align agent, hook, picker and path claims with the code - Plainer wording across guide pages, index pages and READMEs - Record the doc layout and link-to-help rule in AGENTS.md Claude-Session: https://claude.ai/code/session_01LjCjoz1mXZG1dR7p1iuVr7 Co-authored-by: Claude <noreply@anthropic.com> | 6 天前 |
| feat(scope): rename the project install scope to workspace (#1106) * feat(scope): accept workspace as the install scope and write it on save The install scope rooted at a directory is now named workspace (#1099). A config with scope: workspace or the older scope: project reads as the same scope; a save writes scope: workspace. Loading never rewrites the file, so read-only commands and --dry-run stay write-free. The legacy role migration now writes through the same serializer, which also stops it from persisting the runtime dataHome. init, contribute and session save read --scope through one parser that accepts workspace, project and user and rejects anything else; contribute and session save used to fall back to auto-detection on an unknown value. A config whose scope this CLI does not know says to run teamai update. * feat(scope): name the workspace scope in output and help Messages, the Scope line of init, status and doctor, the scope tag of pull, and the scope tag of recall now say workspace for the scope rooted at a directory. The vote parser reads the new [workspace] tag and the [project] tag that older recalls printed. Values that scripts and older CLIs read keep project: TEAMAI_SCOPE, doctor --json, the manifest keys, the scope passed to claude plugin, and the deprecated scope field of teamai.yaml. * docs: call the directory install scope the workspace scope Rename project scope to workspace scope in the guide (English and Chinese), the bundled skills and CONTRIBUTING. TEAMAI_SCOPE keeps project, and the docs say so. The data layout note says workspaceRoot is an internal name for the checkout root, not the install scope. * test(e2e): cover init --scope workspace and configs written as scope: project * feat(scope): label a workspace as Workspace in the dashboard * docs: use a workspace path in the init examples | 1 天前 |
| feat: a workspace delivers what the repos inside it select (#1107) | 1 天前 |
| docs: reorganize documentation (#1009) - Add docs/README.md index by audience; move CI maintainer notes to docs/dev/; give every design document a status line and index row - Open Getting Started with three ten-minute paths (set up, join, share) - Split the usage guide into pages: docs/guide/<page>.md (English) and docs/guide/zh-CN/<page>.md (Chinese); usage-guide.* stay as index pages - Fold providers (new English translation) and Windows pages into the guide; move provider internals to docs/dev/adding-a-provider.md - Make docs/designs/ and docs/dev/ English only; translate the Chinese-only pages - Replace copied command and flag tables with links to --help and the generated commands.md; drop the stale Windows workaround - Align agent, hook, picker and path claims with the code - Plainer wording across guide pages, index pages and READMEs - Record the doc layout and link-to-help rule in AGENTS.md Claude-Session: https://claude.ai/code/session_01LjCjoz1mXZG1dR7p1iuVr7 Co-authored-by: Claude <noreply@anthropic.com> | 6 天前 |
| fix(github): keep the token out of the clone's remote URL (#994) * fix(github): keep the token out of the clone's remote URL ghRepoClone embedded the OAuth token in the clone URL, so `git remote -v`, `git config --list` and any copy of `.git/config` exposed it in plain text. Inject it for the clone via `-c http.extraHeader` (the pattern clone.ts already uses) and persist a credential helper for the push/pull that follow, matching cnbRepoClone. Fixes #978. * fix(github): scope the persisted credential helper and reset inherited ones `ghRepoClone` persisted its helper under the unscoped `credential.helper` key with a plain `--local` write, which only appends. Because git consults system -> global -> local helpers and the first one to answer wins, a globally configured helper (Git Credential Manager, say) answered before ours and the push that `init` runs right after cloning authenticated as the wrong account. Persist under `credential.https://github.com.helper` instead, after clearing the inherited list with `--replace-all ... ''` - the two steps `gh auth setup-git` performs, scoped so helpers for other hosts are untouched. Pick the helper from the same source as the clone token: when an env token is set, use the inline env helper rather than `gh auth git-credential`, because gh reads GH_TOKEN first while `ghGetOAuthToken()` reads GITHUB_TOKEN first - with both set, clone and push could resolve different tokens. Docs: providers.md records the new clone/push auth split; the GitCode design doc no longer describes GitHub as embedding the token in the remote URL. * docs: stop describing GitHub as embedding the token in the remote URL Two places still presented the URL-embedded token as GitHub's current approach: - `docs/providers.md` called GitCode's in-URL credential "consistent with GitHub / TGit". After #978 GitHub is no longer that shape, so the sentence contradicted the section directly above it. - `gitcode-api.ts`'s `cloneUrl` docstring said it "mirrors the GitHub (`x-access-token:<token>@`) provider" - the same stale claim. Both now name TGit as the remaining precedent and record what GitHub does instead, so the docs and the code agree. * fix: persist the absolute gh path in the GitHub credential helper `ghRepoClone` persisted the bare command `!gh auth git-credential`. That only works when `gh` is on the PATH of the shell git uses to run `!` helpers - a NON-login `sh -c`. `resolveCliPath`, however, resolves `gh` through `bash -lc` / `zsh -lc`, a LOGIN shell that sources profiles. A `gh` installed under, say, nvm or `~/.local/bin` is therefore visible at detection time but absent when the helper finally runs: the clone succeeds and the first push fails with `gh: command not found`. Persist the absolute path `resolveCliPath` returned instead, quoted so paths containing spaces (the common Windows case) survive. When no `gh` can be resolved there is nothing to call back, so that branch keeps the env helper. * fix: redact the injected credential before putting git output in an error `ghRepoClone` folds git's combined stdout/stderr into its exception message, guarding it with a pattern that only catches a token embedded in a URL (`x-access-token:<token>@...`). Since #978 the token no longer travels in the URL: it goes into `-c http.extraHeader=Authorization: Basic <base64>`, and that argument is echoed verbatim when a trace2 sink is on. `GIT_TRACE2`, `GIT_TRACE2_EVENT` and `GIT_TRACE2_PERF` all print git's own argv at start-up, so a failed clone carries the base64 into the thrown error. Base64 is reversible, i.e. it is the token in disguise. Redact by VALUE instead of by pattern: blank the exact `Authorization: Basic <base64>` value we injected, plus the raw token, so the argv dump, the JSON `argv` array and anything else git decides to print are all covered without having to enumerate those shapes. (Plain `GIT_TRACE` does not print argv, and git redacts the header it puts on the wire - verified on git 2.55; the trace2 sinks do not.) * docs: drop the stale "GitHub embeds the token in the clone URL" note in cnb-cli `cnbRepoClone`'s docstring contrasted CNB's persisted credential helper with "GitHub/TGit solve this by embedding the token in the clone URL". #978 took GitHub out of that group, so the sentence now names the wrong precedent. Keep TGit as the example and record what GitHub does instead - the same helper shape CNB already uses. | 6 天前 |
| docs: split long paragraphs and fix repo naming examples (#1013) * docs: split long paragraphs and fix repo naming examples Suggested team repo names use a <team>-teamai suffix, sample URLs use your-org/your-repo, and the HTTP contract sits at the end of the advanced guide. Long paragraphs are broken up so each stays around 120 words. * docs: drop repeated rules from the usage guide State the shared push rule once. Point subscription ownership and MCP exclude edge cases at the design docs instead of repeating them. | 6 天前 |
| docs: split long paragraphs and fix repo naming examples (#1013) * docs: split long paragraphs and fix repo naming examples Suggested team repo names use a <team>-teamai suffix, sample URLs use your-org/your-repo, and the HTTP contract sits at the end of the advanced guide. Long paragraphs are broken up so each stays around 120 words. * docs: drop repeated rules from the usage guide State the shared push rule once. Point subscription ownership and MCP exclude edge cases at the design docs instead of repeating them. | 6 天前 |
| feat: a workspace delivers what the repos inside it select (#1107) | 1 天前 |
| feat(session): cross-platform session migration and team session archive (#593) | 1 天前 |
| docs: split long paragraphs and fix repo naming examples (#1013) * docs: split long paragraphs and fix repo naming examples Suggested team repo names use a <team>-teamai suffix, sample URLs use your-org/your-repo, and the HTTP contract sits at the end of the advanced guide. Long paragraphs are broken up so each stays around 120 words. * docs: drop repeated rules from the usage guide State the shared push rule once. Point subscription ownership and MCP exclude edge cases at the design docs instead of repeating them. | 6 天前 |
| docs: split long paragraphs and fix repo naming examples (#1013) * docs: split long paragraphs and fix repo naming examples Suggested team repo names use a <team>-teamai suffix, sample URLs use your-org/your-repo, and the HTTP contract sits at the end of the advanced guide. Long paragraphs are broken up so each stays around 120 words. * docs: drop repeated rules from the usage guide State the shared push rule once. Point subscription ownership and MCP exclude edge cases at the design docs instead of repeating them. | 6 天前 |
| fix(env): give each directory its own team env (#1018) (#1023) * fix(env): load each directory's team env through one loader block Closes #1018 * fix(env): keep a variable exported when it has other attributes too bash prints `declare -ix PORT=...` and zsh `export -i PORT=...`, so a member's exported integer came back unexported after leaving a project. * fix(doctor): check a directory's env with the member's own PATH and GIT_* A tool started from a project shell inherits the project's values; the check now puts back the member's ones before it runs the loader, so a project PATH without git no longer reports broken routing. * docs(env): shorten the env-by-directory docs to what a member needs Keep the per-directory rules and the limits a member runs into; drop the loader internals and the profile-file selection details, and leave the README matrix as main has it. * docs(readme): mark env for Pi, DeepSeek Harness and ZCode through teamai env exec * fix(env): keep a scope's shell env while its env.yaml cannot resolve * fix(env): keep a variable's other attributes when leaving a project * docs(readme): shorten the env exec footnote * test(mcp): keep one spelling of a secret's name in a server's table on Windows * fix(env): keep a key now declared a secret out of shells while env.yaml cannot resolve * fix(env): deliver a team value as written to a variable with an integer or case attribute * fix(doctor): compare env names as Windows does when checking env.sh * docs(env): note how a variable's attributes survive a project * docs(readme): mark Muse Code's rules with the renamed always-on marker * fix(models): find Muse Code's key block in the zsh startup file the env loader uses * test(env): expect bash before 4.2 to leave the integer attribute off after a project * fix(env): deliver a team value as written in env exec when the member's BASH_ENV gives the key an integer or case attribute | 2 天前 |
| feat: a workspace delivers what the repos inside it select (#1107) | 1 天前 |