improvement(i18n): Improve Simplified Chinese localization quality Merge pull request #200 from CharAznable98/main

Improve Simplified Chinese localization quality
This commit is contained in:
Илия 2026-06-03 20:25:29 +03:00 committed by GitHub
commit 3b933058c6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
52 changed files with 4192 additions and 3132 deletions

15
.github/codeql/codeql-config.yml vendored Normal file
View file

@ -0,0 +1,15 @@
name: agent-teams-codeql
paths:
- src
- packages
- agent-teams-controller
- mcp-server
- scripts
- .github/workflows
paths-ignore:
- '**/node_modules/**'
- 'test/**'
- 'landing/**'
- 'build/**'

67
.github/workflows/codeql.yml vendored Normal file
View file

@ -0,0 +1,67 @@
name: CodeQL
on:
push:
branches: [main, dev]
paths:
- 'src/**'
- 'packages/**'
- 'agent-teams-controller/**'
- 'mcp-server/**'
- 'scripts/**'
- '.github/workflows/**'
- '.github/codeql/**'
- 'package.json'
- 'pnpm-lock.yaml'
- 'pnpm-workspace.yaml'
- 'tsconfig*.json'
pull_request:
paths:
- 'src/**'
- 'packages/**'
- 'agent-teams-controller/**'
- 'mcp-server/**'
- 'scripts/**'
- '.github/workflows/**'
- '.github/codeql/**'
- 'package.json'
- 'pnpm-lock.yaml'
- 'pnpm-workspace.yaml'
- 'tsconfig*.json'
schedule:
- cron: '34 3 * * 1'
permissions:
contents: read
jobs:
analyze:
name: Analyze (${{ matrix.language }})
runs-on: ubuntu-latest
timeout-minutes: 45
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language:
- actions
- javascript-typescript
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Initialize CodeQL
uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
config-file: ./.github/codeql/codeql-config.yml
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4
with:
category: /language:${{ matrix.language }}

View file

@ -21,7 +21,7 @@ jobs:
if: ${{ github.event_name == 'workflow_dispatch' || ((github.event_name != 'issue_comment' || github.event.issue.pull_request) && github.event.comment.user.type != 'Bot') }}
env:
REVIEWROUTER_API_URL: "https://api.reviewrouter.site"
REVIEWROUTER_ACTION_VERSION: "c23ae97660c3674a2ebc9076bb5cd4f1bbd85657"
REVIEWROUTER_ACTION_VERSION: "1603215454b4c5cf3387b40ae674a46eeb7ee96b"
REVIEWROUTER_OIDC_AUDIENCE: "reviewrouter"
REVIEWROUTER_RUNTIME_CONFIG_MODE: "oidc"
REVIEWROUTER_STATIC_CONFIG_FALLBACK: "true"
@ -42,7 +42,7 @@ jobs:
- name: Preflight ReviewRouter interaction
id: preflight
uses: 777genius/review-router@c23ae97660c3674a2ebc9076bb5cd4f1bbd85657
uses: 777genius/review-router@1603215454b4c5cf3387b40ae674a46eeb7ee96b
env:
GITHUB_TOKEN: ${{ github.token }}
REVIEW_ROUTER_MODE: "interaction-preflight"
@ -78,7 +78,7 @@ jobs:
- name: Run ReviewRouter interaction
if: ${{ steps.preflight.outputs.should_run == 'true' }}
uses: 777genius/review-router@c23ae97660c3674a2ebc9076bb5cd4f1bbd85657
uses: 777genius/review-router@1603215454b4c5cf3387b40ae674a46eeb7ee96b
env:
GITHUB_TOKEN: ${{ github.token }}
REVIEW_ROUTER_MODE: "interaction"

View file

@ -14,7 +14,7 @@
<h1 align="center"><a href="https://agentteams.live/">Agent Teams</a></h1>
<p align="center">
<strong><code>You're the CTO, agents are your team. They handle tasks themselves, message each other, review each other. You just look at the kanban board and drink coffee.</code></strong>
<strong><code>You're the boss, agents are your team. They handle tasks themselves, message each other, review each other. You just look at the kanban board and drink coffee.</code></strong>
</p>
<p align="center">

View file

@ -14,6 +14,6 @@
"test:watch": "vitest --config vitest.config.js"
},
"engines": {
"node": ">=24.16.0 <25"
"node": ">=24.15.0 <25"
}
}

1
landing/.gitignore vendored
View file

@ -5,6 +5,7 @@ node_modules
.env
--host/
product-docs/.vitepress/dist/
product-docs/.vitepress/cache/
# Large video files
public/video/*.mp4

View file

@ -14,9 +14,35 @@ pnpm generate
pnpm preview
```
## Render static sites
Landing and docs are deployed as separate Render Static Sites from the `main` branch.
Landing:
```bash
corepack enable && pnpm install --frozen-lockfile --ignore-scripts && NUXT_PUBLIC_SITE_URL=$RENDER_EXTERNAL_URL NUXT_PUBLIC_DOCS_SITE_URL=https://agent-teams-ai-docs.onrender.com NUXT_PUBLIC_ROBOTS="index, follow" pnpm --filter agent-teams-landing generate
```
Publish path: `landing/.output/public`
Docs:
```bash
corepack enable && pnpm install --frozen-lockfile --ignore-scripts && VITEPRESS_BASE=/ VITEPRESS_SITE_URL=$RENDER_EXTERNAL_URL VITEPRESS_LANDING_SITE_URL=https://agent-teams-ai-landing.onrender.com pnpm --filter agent-teams-landing docs:build
```
Publish path: `landing/product-docs/.vitepress/dist`
Both sites set `NODE_VERSION=24.16.0` and `SKIP_INSTALL_DEPS=true`; the build command runs the pnpm install step explicitly with `--ignore-scripts`.
When a custom landing domain is attached, update `VITEPRESS_LANDING_SITE_URL` on the docs site. When a custom docs domain is attached, `VITEPRESS_SITE_URL=$RENDER_EXTERNAL_URL` can stay unchanged for the Render preview URL or be replaced with the custom domain for canonical SEO.
## Notes
- Static-first (SSG) by design.
- Locale auto-detection: cookie -> browser settings -> fallback `en`.
- Theme auto-detection: localStorage -> system preference -> fallback `light`.
- Hero video uses the Mux Player embed. Set `NUXT_PUBLIC_MUX_PLAYBACK_ID` to override the default playback id without changing the code.
- Hero background can use a separate Mux asset via `NUXT_PUBLIC_MUX_BACKGROUND_PLAYBACK_ID`; otherwise it reuses `NUXT_PUBLIC_MUX_PLAYBACK_ID`.
- Set `NUXT_PUBLIC_DOCS_SITE_URL` when the docs are deployed as a separate static site.

View file

@ -1943,8 +1943,12 @@
}
@media (max-width: 767px) {
#hero.cyber-hero {
padding-top: 64px;
}
.cyber-hero {
padding: 84px 0 36px;
padding: 64px 0 8px;
}
.cyber-hero__background {
@ -1962,19 +1966,21 @@
}
.cyber-hero__container {
width: min(100% - 32px, 680px);
width: min(100% - 24px, 680px);
max-width: min(100% - 24px, 680px) !important;
padding-inline: 0 !important;
}
.cyber-hero__layout {
min-width: 0;
gap: 0;
overflow: hidden;
gap: 8px;
overflow: visible;
}
.cyber-hero__copy {
width: 100%;
max-width: 100%;
padding-bottom: 0;
padding: 8px 0 0;
}
.cyber-hero__brand-lockup {
@ -1988,28 +1994,40 @@
}
.cyber-hero__title {
gap: 0.12em;
font-size: clamp(2rem, 9.4vw, 3.1rem);
flex-wrap: wrap;
gap: 0.06em 0.12em;
margin-bottom: 16px;
max-width: 9.4em;
font-size: 2.35rem;
line-height: 0.96;
white-space: normal;
}
.cyber-hero__slogan {
display: flex;
width: 100%;
padding: 10px 14px;
letter-spacing: 0.04em;
margin-bottom: 16px;
padding: 9px 13px;
flex-wrap: wrap;
font-size: 0.72rem;
letter-spacing: 0.03em;
overflow-wrap: anywhere;
}
.cyber-hero__description {
font-size: 1rem;
line-height: 1.62;
margin-bottom: 18px;
max-width: 100%;
font-size: 0.95rem;
line-height: 1.5;
overflow-wrap: break-word;
}
.cyber-hero__providers {
margin-bottom: 22px;
margin-bottom: 18px;
}
.cyber-hero__provider-list {
gap: 12px 18px;
gap: 10px 14px;
}
.cyber-hero__provider {
@ -2033,31 +2051,49 @@
.cyber-hero__actions {
display: grid;
grid-template-columns: 1fr;
gap: 12px;
margin-bottom: 12px;
}
.cyber-action-button.v-btn {
width: 100%;
min-height: 72px !important;
min-height: 60px !important;
min-width: 0 !important;
padding-inline: 20px !important;
padding-inline: 16px !important;
}
.cyber-action-button.v-btn .v-btn__content {
gap: 12px;
}
.cyber-action-button__icon {
width: 30px;
height: 30px;
}
.cyber-action-button__label {
font-size: 0.92rem;
}
.cyber-action-button__subtitle {
font-size: 0.62rem;
}
.cyber-hero__terminal-note {
display: inline-flex;
font-size: 0.68rem;
display: none;
}
.cyber-scene {
min-height: auto;
aspect-ratio: auto;
padding: 96px 0 14px;
padding: 86px 0 2px;
transform: none;
}
.cyber-hero__scene {
width: 100%;
max-width: 100%;
margin-top: 8px;
margin-top: 14px;
overflow: hidden;
}
@ -2070,17 +2106,20 @@
position: relative;
left: auto;
top: auto;
width: 100%;
width: min(100%, 320px);
margin-inline: auto;
transform: none;
}
.cyber-scene__robots {
inset: 0 0 auto;
height: 96px;
z-index: 7;
height: 76px;
display: flex;
align-items: flex-end;
justify-content: center;
gap: clamp(18px, 6vw, 34px);
gap: 18px;
overflow: visible;
}
.cyber-agent {
@ -2089,7 +2128,7 @@
display: none;
left: auto;
top: auto;
width: clamp(58px, 18vw, 74px);
width: 54px;
transform: none;
}
@ -2099,7 +2138,7 @@
.cyber-agent[data-agent="planner"] {
z-index: auto;
width: clamp(58px, 18vw, 74px);
width: 54px;
transform: none;
}
@ -2145,93 +2184,18 @@
display: none;
}
.cyber-feature-rail {
grid-template-columns: 1fr;
gap: 20px;
padding: 0 4px;
}
.cyber-feature-rail-shell {
margin-top: clamp(104px, 24vw, 128px);
}
.cyber-feature-rail__collaboration {
left: 31%;
bottom: calc(100% + 8px);
width: clamp(96px, 30vw, 124px);
}
.cyber-feature-rail__reviewer {
--reviewer-robot-width: clamp(58px, 18vw, 72px);
right: clamp(6px, 3vw, 16px);
bottom: calc(100% + 8px);
gap: 0;
}
.cyber-feature-rail__reviewer-card,
.cyber-feature-rail__reviewer-bubble {
display: none;
}
.cyber-feature-rail__robot {
top: 4px;
}
.cyber-feature-rail__item {
grid-template-columns: 48px 44px minmax(0, 1fr);
grid-template-rows: auto;
align-items: center;
justify-items: start;
gap: 10px;
padding: 0;
text-align: left;
@media (max-width: 360px) {
.cyber-hero__title {
font-size: 2.1rem;
}
.cyber-feature-rail__icon {
width: 44px;
height: 44px;
}
.cyber-feature-rail__icon::before,
.cyber-feature-rail__icon::after {
width: 12px;
height: 12px;
}
.cyber-feature-rail__icon .v-icon {
font-size: 26px !important;
}
.cyber-feature-rail__node {
width: 40px;
height: 40px;
font-size: 0.8rem;
}
.cyber-feature-rail__node::before {
display: none;
}
.cyber-feature-rail__copy {
max-width: none;
padding: 8px 10px 9px;
}
.cyber-feature-rail__copy::before {
inset: 0 -6px;
border-radius: 14px;
backdrop-filter: blur(9px) saturate(1.06);
}
.cyber-feature-rail__title {
margin-bottom: 5px;
font-size: 0.92rem;
}
.cyber-feature-rail__text {
font-size: 0.78rem;
line-height: 1.42;
.cyber-hero__provider-list {
gap: 9px 12px;
}
}

View file

@ -1,15 +1,18 @@
<script setup lang="ts">
import robotLeadLounge from "~/assets/images/footer/robot-lead-lounge-v1.webp";
import { buildDocsHref } from "~/utils/docsUrl";
const { t, locale } = useI18n();
const { repoUrl } = useGithubRepo();
const { baseURL } = useRuntimeConfig().app;
const runtimeConfig = useRuntimeConfig();
const { baseURL } = runtimeConfig.app;
const year = new Date().getFullYear();
const authorLabel = computed(() => locale.value === 'ru' ? 'Автор' : 'Author');
const docsHref = computed(() => {
const base = baseURL.replace(/\/?$/, '/');
return `${base}${locale.value === 'ru' ? 'docs/ru/' : 'docs/'}`;
});
const docsHref = computed(() => buildDocsHref({
locale: locale.value,
docsSiteUrl: runtimeConfig.public.docsSiteUrl,
embeddedBaseURL: baseURL,
}));
</script>
<template>

View file

@ -1,13 +1,18 @@
<script setup lang="ts">
import { mdiMenu, mdiClose, mdiGithub } from '@mdi/js';
import { buildDocsHref } from '~/utils/docsUrl';
const { t, locale } = useI18n();
const { repoUrl } = useGithubRepo();
const { baseURL } = useRuntimeConfig().app;
const runtimeConfig = useRuntimeConfig();
const { baseURL } = runtimeConfig.app;
const menuOpen = ref(false);
const withBase = (path: string) => `${baseURL.replace(/\/?$/, '/')}${path.replace(/^\/+/, '')}`;
const docsHref = computed(() => withBase(locale.value === 'ru' ? 'docs/ru/' : 'docs/'));
const docsHref = computed(() => buildDocsHref({
locale: locale.value,
docsSiteUrl: runtimeConfig.public.docsSiteUrl,
embeddedBaseURL: baseURL,
}));
const isRu = computed(() => locale.value === 'ru');
const openMenuLabel = computed(() => (isRu.value ? 'Открыть меню' : 'Open menu'));
const closeMenuLabel = computed(() => (isRu.value ? 'Закрыть меню' : 'Close menu'));
@ -811,6 +816,29 @@ const navItems = computed(() => [
}
}
@media (max-width: 360px) {
.app-header__inner {
width: min(100% - 24px, 680px);
}
.app-header__brand-frame {
padding-left: 10px;
padding-right: 34px;
}
.app-header__brand-frame :deep(.app-logo) {
gap: 8px;
}
.app-header__brand-frame :deep(.app-logo__text) {
font-size: 10px;
}
.app-header__mobile-actions {
margin-left: 8px;
}
}
@media (prefers-reduced-motion: reduce) {
.app-header__hud-energy path {
animation: none;

View file

@ -974,9 +974,13 @@ const linuxRobotBubble = computed(() => locale.value === 'ru' ? 'Готов на
}
.download-section__card {
display: grid;
grid-template-columns: 52px minmax(0, 1fr);
align-items: center;
padding: 20px 22px;
gap: 16px;
border-radius: 16px;
text-align: left;
}
.download-section__card-robot-seat {
@ -989,13 +993,28 @@ const linuxRobotBubble = computed(() => locale.value === 'ru' ? 'Готов на
border-radius: 14px;
}
.download-section__card-info {
min-width: 0;
}
.download-section__card-label {
font-size: 1.05rem;
}
.download-section__btn {
padding: 8px 20px;
grid-column: 1 / -1;
justify-content: center;
width: 100%;
min-width: 0;
padding: 9px 18px;
font-size: 0.85rem;
box-sizing: border-box;
}
.download-section__card-indicator {
grid-column: 1 / -1;
justify-content: center;
margin-top: -4px;
}
}
</style>

View file

@ -4,10 +4,12 @@ import {
mdiDownload,
} from "@mdi/js";
import { getLocalizedHeroMessages, type HeroMessagePhase } from "~/data/heroScene";
import { buildDocsHref } from "~/utils/docsUrl";
const { content } = useLandingContent();
const { t, locale } = useI18n();
const { baseURL } = useRuntimeConfig().app;
const runtimeConfig = useRuntimeConfig();
const { baseURL } = runtimeConfig.app;
const heroRef = ref<HTMLElement | null>(null);
const activeHeroMessageIndex = ref(0);
const heroMessagePhase = ref<HeroMessagePhase>("cooldown");
@ -21,7 +23,6 @@ const downloadStore = useDownloadStore();
const { resolve, data: releaseData } = useReleaseDownloads();
const { latestReleaseUrl, releaseDownloadUrl } = useGithubRepo();
const { selectedDownloadAsset } = useDownloadAssetPresentation();
const withBase = (path: string) => `${baseURL.replace(/\/?$/, "/")}${path.replace(/^\/+/, "")}`;
useCyberHeroParallax(heroRef);
@ -71,7 +72,11 @@ const heroDownloadUrl = computed(() => {
return resolve(asset.os, arch)?.url || releaseDownloadUrl(asset.fileName);
});
const docsHref = computed(() => withBase(locale.value === "ru" ? "docs/ru/" : "docs/"));
const docsHref = computed(() => buildDocsHref({
locale: locale.value,
docsSiteUrl: runtimeConfig.public.docsSiteUrl,
embeddedBaseURL: baseURL,
}));
const downloadActionSubtitle = computed(() => {
if (!selectedDownloadAsset.value) {
return locale.value === "ru"

View file

@ -7,17 +7,30 @@ declare const process: {
env: Record<string, string | undefined>;
};
const siteUrl = process.env.NUXT_PUBLIC_SITE_URL || "https://777genius.github.io/agent-teams-ai";
const siteUrl =
process.env.NUXT_PUBLIC_LANDING_SITE_URL ||
process.env.AGENT_TEAMS_LANDING_SITE_URL ||
process.env.NUXT_PUBLIC_SITE_URL ||
"https://777genius.github.io/agent-teams-ai";
const githubRepo = process.env.NUXT_PUBLIC_GITHUB_REPO || "777genius/agent-teams-ai";
const githubReleasesUrl = `https://github.com/${githubRepo}/releases`;
const muxPlaybackId = process.env.NUXT_PUBLIC_MUX_PLAYBACK_ID || "qyeNuDjFqoDALK8eB02jMTOWUz006BdIhiqiAip3U00x7I";
const muxBackgroundPlaybackId = process.env.NUXT_PUBLIC_MUX_BACKGROUND_PLAYBACK_ID || muxPlaybackId;
const docsSiteUrl =
process.env.AGENT_TEAMS_DOCS_SITE_URL || process.env.NUXT_PUBLIC_DOCS_SITE_URL || "";
process.env.NUXT_PUBLIC_SITE_URL = siteUrl;
if (docsSiteUrl) {
process.env.NUXT_PUBLIC_DOCS_SITE_URL = docsSiteUrl;
}
const baseURL = process.env.NUXT_APP_BASE_URL || "/";
const basePrefixedDocsPath = `${baseURL.replace(/\/?$/, "/")}docs`;
const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
const defaultSeoTitle = "Agent Teams - AI Agent Orchestration for Developers";
const defaultSeoDescription = "Free, open-source desktop app for AI agent teams. Start with a free model with no auth, then connect Claude, Codex, or OpenCode when you need more models.";
const defaultSeoImage = `${siteUrl.replace(/\/+$/, "")}/og-image-agent-teams-v6.png`;
const robots = process.env.NUXT_PUBLIC_ROBOTS || "noindex, nofollow";
export default defineNuxtConfig({
compatibilityDate: "2026-01-19",
@ -29,7 +42,7 @@ export default defineNuxtConfig({
title: defaultSeoTitle,
meta: [
{ name: "description", content: defaultSeoDescription },
{ name: "robots", content: "noindex, nofollow" },
{ name: "robots", content: robots },
{ property: "og:title", content: defaultSeoTitle },
{ property: "og:description", content: defaultSeoDescription },
{ property: "og:type", content: "website" },
@ -143,6 +156,7 @@ export default defineNuxtConfig({
siteUrl,
githubRepo,
githubReleasesUrl,
docsSiteUrl,
muxPlaybackId,
muxBackgroundPlaybackId
}

View file

@ -3,7 +3,7 @@
"private": true,
"type": "module",
"engines": {
"node": ">=24.16.0 <25"
"node": ">=24.15.0 <25"
},
"scripts": {
"dev": "nuxt dev",

View file

@ -21,15 +21,21 @@ const normalizeBase = (value: string) => {
const withTrailingSlash = (value: string) => `${trimTrailingSlash(value)}/`;
const appBase = normalizeBase(process.env.NUXT_APP_BASE_URL || "/");
const base = appBase === "/" ? "/docs/" : `${appBase}docs/`;
const siteUrl = trimTrailingSlash(
process.env.NUXT_PUBLIC_SITE_URL || "https://777genius.github.io/agent-teams-ai"
const embeddedDocsBase = appBase === "/" ? "/docs/" : `${appBase}docs/`;
const base = process.env.VITEPRESS_BASE ? normalizeBase(process.env.VITEPRESS_BASE) : embeddedDocsBase;
const landingSiteUrl = trimTrailingSlash(
process.env.AGENT_TEAMS_LANDING_SITE_URL ||
process.env.NUXT_PUBLIC_LANDING_SITE_URL ||
process.env.VITEPRESS_LANDING_SITE_URL ||
process.env.NUXT_PUBLIC_SITE_URL ||
"https://777genius.github.io/agent-teams-ai"
);
const configuredDocsSiteUrl = process.env.AGENT_TEAMS_DOCS_SITE_URL || process.env.VITEPRESS_SITE_URL;
const publicBaseUrl =
appBase === "/" || siteUrl.endsWith(trimTrailingSlash(appBase))
? withTrailingSlash(siteUrl)
: `${withTrailingSlash(siteUrl)}${appBase.replace(/^\/+/, "")}`;
const docsUrl = `${publicBaseUrl}docs/`;
appBase === "/" || landingSiteUrl.endsWith(trimTrailingSlash(appBase))
? withTrailingSlash(landingSiteUrl)
: `${withTrailingSlash(landingSiteUrl)}${appBase.replace(/^\/+/, "")}`;
const docsUrl = configuredDocsSiteUrl ? withTrailingSlash(configuredDocsSiteUrl) : `${publicBaseUrl}docs/`;
const downloadUrl = `${publicBaseUrl}download/`;
const ruDownloadUrl = `${publicBaseUrl}ru/download/`;
const ogImageUrl = `${publicBaseUrl}og-image-agent-teams-v6.png`;
@ -40,6 +46,7 @@ const rootGuide: DefaultTheme.SidebarItem[] = [
text: "Start",
items: [
{ text: "Installation", link: "/guide/installation" },
{ text: "Beginner workflow", link: "/guide/beginner-workflow" },
{ text: "Quickstart", link: "/guide/quickstart" },
{ text: "Runtime setup", link: "/guide/runtime-setup" }
]
@ -47,7 +54,10 @@ const rootGuide: DefaultTheme.SidebarItem[] = [
{
text: "Guide",
items: [
{ text: "Create a team", link: "/guide/create-team" },
{ text: "Create your first team", link: "/guide/create-first-team" },
{ text: "Run and monitor work", link: "/guide/run-and-monitor-work" },
{ text: "Review and approve", link: "/guide/review-and-approve" },
{ text: "Team configuration", link: "/guide/create-team" },
{ text: "Agent workflow", link: "/guide/agent-workflow" },
{ text: "Code review", link: "/guide/code-review" },
{ text: "MCP integration", link: "/guide/mcp-integration" },
@ -83,6 +93,7 @@ const ruGuide: DefaultTheme.SidebarItem[] = [
text: "Старт",
items: [
{ text: "Установка", link: "/ru/guide/installation" },
{ text: "Путь новичка", link: "/ru/guide/beginner-workflow" },
{ text: "Быстрый старт", link: "/ru/guide/quickstart" },
{ text: "Настройка рантайма", link: "/ru/guide/runtime-setup" }
]
@ -90,7 +101,10 @@ const ruGuide: DefaultTheme.SidebarItem[] = [
{
text: "Руководство",
items: [
{ text: "Создание команды", link: "/ru/guide/create-team" },
{ text: "Создать первую команду", link: "/ru/guide/create-first-team" },
{ text: "Запуск и мониторинг", link: "/ru/guide/run-and-monitor-work" },
{ text: "Проверка и approval", link: "/ru/guide/review-and-approve" },
{ text: "Настройка команды", link: "/ru/guide/create-team" },
{ text: "Работа агентов", link: "/ru/guide/agent-workflow" },
{ text: "Код-ревью", link: "/ru/guide/code-review" },
{ text: "Интеграция MCP", link: "/ru/guide/mcp-integration" },
@ -122,7 +136,11 @@ const ruGuide: DefaultTheme.SidebarItem[] = [
];
const rootNav: DefaultTheme.NavItem[] = [
{ text: "Guide", link: "/guide/quickstart", activeMatch: "^/guide/(?!troubleshooting(?:/|$))" },
{
text: "Guide",
link: "/guide/beginner-workflow",
activeMatch: "^/guide/(?!troubleshooting(?:/|$))"
},
{ text: "Developers", link: "/developers/", activeMatch: "^/developers/" },
{ text: "Reference", link: "/reference/concepts", activeMatch: "^/reference/" },
{
@ -136,7 +154,7 @@ const rootNav: DefaultTheme.NavItem[] = [
const ruNav: DefaultTheme.NavItem[] = [
{
text: "Руководство",
link: "/ru/guide/quickstart",
link: "/ru/guide/beginner-workflow",
activeMatch: "^/ru/guide/(?!troubleshooting(?:/|$))"
},
{ text: "Разработчикам", link: "/ru/developers/", activeMatch: "^/ru/developers/" },

View file

@ -6,7 +6,7 @@ const props = withDefaults(defineProps<{ type?: "start" | "reference" }>(), {
type: "start"
});
type CardText = { title: string; desc: string };
type CardText = { title: string; desc: string; icon?: string; link?: string };
// Locales that have their own translated card copy. Anything else falls back to English (root).
const KNOWN_LOCALES = ["ru", "zh", "es", "ja", "fr", "de"] as const;
@ -26,10 +26,12 @@ const REFERENCE_ICONS = ["◈", "⌁", "▦", "⌘", "?"];
const CARD_TEXT: Record<string, { start: CardText[]; reference: CardText[] }> = {
"": {
start: [
{ title: "Quickstart", desc: "Install the app and create your first team." },
{ title: "Installation", desc: "Platforms, releases, and running from source." },
{ title: "Create a team", desc: "Roles, lead prompt, and task boundaries." },
{ title: "Code review", desc: "Review task changes with hunk-level decisions." }
{ icon: "01", title: "Beginner workflow", desc: "Understand the first run from project to approval.", link: "/guide/beginner-workflow" },
{ icon: "02", title: "Quickstart", desc: "Install the app and validate the base launch.", link: "/guide/quickstart" },
{ icon: "03", title: "First team", desc: "Lead, builder, reviewer, roles, models, and Worktree.", link: "/guide/create-first-team" },
{ icon: "04", title: "Run work", desc: "Lead brief, task board, comments, and monitoring.", link: "/guide/run-and-monitor-work" },
{ icon: "05", title: "Review and approve", desc: "Task detail, logs, diff, and hunk-level decisions.", link: "/guide/review-and-approve" },
{ icon: "06", title: "Runtime setup", desc: "Claude, Codex, OpenCode, and multimodel setup.", link: "/guide/runtime-setup" }
],
reference: [
{ title: "Concepts", desc: "Teams, tasks, roles, and autonomy levels." },
@ -41,10 +43,12 @@ const CARD_TEXT: Record<string, { start: CardText[]; reference: CardText[] }> =
},
ru: {
start: [
{ title: "Быстрый старт", desc: "Поставить приложение и создать первую команду." },
{ title: "Установка", desc: "Платформы, релизы и запуск из исходников." },
{ title: "Создание команды", desc: "Роли, lead prompt и границы работы." },
{ title: "Код-ревью", desc: "Проверка изменений по задачам и hunk-level decisions." }
{ icon: "01", title: "Путь новичка", desc: "Понять весь первый запуск от проекта до approval.", link: "/ru/guide/beginner-workflow" },
{ icon: "02", title: "Быстрый старт", desc: "Поставить приложение и проверить базовый запуск.", link: "/ru/guide/quickstart" },
{ icon: "03", title: "Первая команда", desc: "Lead, builder, reviewer, роли, модели и Worktree.", link: "/ru/guide/create-first-team" },
{ icon: "04", title: "Запуск работы", desc: "Brief для lead, task board, comments и monitoring.", link: "/ru/guide/run-and-monitor-work" },
{ icon: "05", title: "Review и approval", desc: "Task detail, logs, diff и hunk-level decisions.", link: "/ru/guide/review-and-approve" },
{ icon: "06", title: "Рантаймы", desc: "Claude, Codex, OpenCode и multimodel setup.", link: "/ru/guide/runtime-setup" }
],
reference: [
{ title: "Концепции", desc: "Команды, задачи, роли и уровни автономности." },
@ -147,10 +151,10 @@ const cards = computed(() => {
const prefix = locale.value ? `/${locale.value}` : "";
return entries.map((entry, index) => ({
icon: icons[index],
icon: entry.icon ?? icons[index] ?? String(index + 1).padStart(2, "0"),
title: entry.title,
desc: entry.desc,
link: `${prefix}${links[index]}`
link: entry.link ?? `${prefix}${links[index]}`
}));
});
</script>

View file

@ -0,0 +1,108 @@
---
title: "Beginner Workflow - Agent Teams Docs"
description: "A structured first-run path for new users. Learn the project, team, task board, task detail, and review surfaces before launching larger teams."
---
# Beginner Workflow
Use this path when you are new to Agent Teams and want a clear sequence from "open the app" to "approve useful work".
The first run should prove four things:
1. The app can open your project.
2. A small team can launch with the selected runtime.
3. Tasks move through the board in a visible way.
4. You can review and approve changes before they are treated as done.
## The basic model
Agent Teams has four working surfaces:
| Surface | What you do there |
| --- | --- |
| Project and team selector | Pick the project and the team that will work on it. |
| Team editor | Name the team, add members, choose roles, models, and worktree settings. |
| Task board | Watch work move through Todo, In Progress, Review, Done, and Approved. |
| Task detail and review | Read the task, inspect logs, check changes, and approve or request fixes. |
<ZoomImage src="/screenshots/guides/task-board-annotated.png" alt="Annotated Agent Teams task board" caption="The board is the main operating surface after launch: messages, columns, review cards, and the task list stay visible together." />
## Recommended guide order
Follow these guides in order for the first successful run:
1. [Create your first team](/guide/create-first-team) - set up a small lead-builder-reviewer team.
2. [Run and monitor work](/guide/run-and-monitor-work) - give the lead a concrete goal and watch the task board.
3. [Review and approve](/guide/review-and-approve) - inspect task details, logs, and code changes.
4. [Troubleshooting](/guide/troubleshooting) - use this if launch, messages, or task logs do not look healthy.
## Before you launch
Start with a Git-tracked project and a known baseline:
```bash
git status --short
```
You do not need a perfectly clean tree, but you should know which files are already changed. That makes review safer after agents start editing.
For the first run, keep the team small:
| Member | Good first responsibility |
| --- | --- |
| Lead | Split the goal into tasks and coordinate status. |
| Builder | Implement scoped tasks. |
| Reviewer | Review completed tasks and ask for fixes. |
Avoid launching many teammates at once. More agents increase logs, concurrent edits, provider usage, and review load.
## First goal template
Use a goal that has clear scope, boundaries, and verification:
```text
Improve the documentation quickstart. Keep edits inside landing/product-docs, add practical examples, preserve existing VitePress syntax, and run `pnpm --dir landing docs:build` before marking tasks done.
```
Good first goals are specific, testable, and limited to a known area. Avoid prompts like "make the app better" until you understand the workflow.
## What healthy progress looks like
During a healthy run:
- The lead creates small tasks rather than one huge task.
- Each teammate posts a plan or progress comment.
- Work moves from Todo to In Progress.
- Finished work moves to Review before approval.
- The task detail shows the description, attachments, changes, and execution logs.
- The final comment includes the verification command and result.
## When to intervene
Intervene when a task is vague, too broad, blocked, or missing verification. Use a task comment when the message belongs to one task. Use a direct message when you need to redirect a teammate or the lead.
Common intervention prompts:
```text
Split this into smaller tasks. Each task should have a narrow file scope and a clear verification step.
```
```text
Before continuing, post the files you plan to change and the command you will run to verify the result.
```
```text
This task is too broad. Keep the change inside the docs guide pages and avoid touching app runtime code.
```
## Completion checklist
Before you call the first run successful, verify:
- The team launched without runtime errors.
- At least one task moved through Review.
- You inspected the task diff.
- The result comment includes a verification result.
- You understand which files changed and why.
Then continue to [Create your first team](/guide/create-first-team).

View file

@ -0,0 +1,111 @@
---
title: "Create Your First Team - Agent Teams Docs"
description: "Step-by-step setup for a first Agent Teams team with lead, builder, reviewer, roles, models, worktree isolation, and a clear launch brief."
---
# Create Your First Team
This guide walks through the first team setup. The goal is not to build the biggest team possible. The goal is to create a small team that launches reliably and produces reviewable tasks.
## 1. Open the target project
Open the project you want agents to work in. Prefer a Git-tracked project so Agent Teams can show diffs, task-linked changes, and review state.
Before launching, check the baseline:
```bash
git status --short
```
If there are existing user changes, keep them in mind during review. Agent Teams can work in a dirty tree, but review is clearer when you know what existed before launch.
## 2. Create the team
Use the team selector, then create a new team for the current project. Give it a short operational name, such as `docs-onboarding`, `landing-fixes`, or `runtime-audit`.
<ZoomImage src="/screenshots/guides/create-team-annotated.png" alt="Annotated Create Team dialog" caption="Create Team: name the team, add members, choose roles and models, then enable Worktree only when you want isolated Git worktrees." />
## 3. Start with three roles
Use this first-team shape:
| Role | Responsibility | Why it helps |
| --- | --- | --- |
| Lead | Splits the goal into tasks, assigns owners, tracks blockers. | Keeps work coordinated. |
| Builder | Implements scoped tasks. | Produces the actual change. |
| Reviewer | Reviews completed tasks and asks for fixes. | Prevents unreviewed output from being treated as complete. |
You can add specialists later. For the first run, a small team is easier to debug and review.
## 4. Choose provider and model per member
Each member needs a provider and model. Use the most reliable runtime for the lead, because the lead controls task breakdown and coordination.
Common first setup:
| Member | Suggested provider style |
| --- | --- |
| Lead | The most reliable model you have available. |
| Builder | A fast model that can handle scoped implementation. |
| Reviewer | A careful model with stronger reasoning. |
If a provider is missing, fix runtime setup before launching. See [Runtime setup](/guide/runtime-setup).
## 5. Decide on Worktree
Enable **Worktree** when teammates may edit the same repository in parallel and you want Git isolation. Keep it off for a very small first run if you want the simplest setup.
Use Worktree when:
- multiple teammates can edit code at the same time
- you want cleaner diffs per member
- the project is already Git-tracked
Avoid Worktree when:
- the project is not a Git repo
- you are only testing the UI flow
- you want the fewest moving parts for the first launch
## 6. Write member instructions
Give each member a short workflow. The member prompt should describe responsibility, not the whole project.
Lead example:
```text
Split the user goal into small tasks. Assign clear owners, avoid broad refactors, keep task comments updated, and request review before approval.
```
Builder example:
```text
Implement only the assigned task. Keep changes scoped, post the files you changed, and include the verification command and result before marking work complete.
```
Reviewer example:
```text
Review completed tasks for correctness, regressions, missing tests, and scope creep. Ask for fixes with specific comments before approving.
```
## 7. Launch with a narrow goal
Use a launch brief with outcome, scope, boundaries, and verification:
```text
Improve the docs onboarding path. Keep changes inside landing/product-docs. Create a beginner-friendly guide sequence, add practical examples, preserve VitePress syntax, and run `pnpm --dir landing docs:build`.
```
## 8. Confirm the launch is healthy
After launch:
- The lead should create tasks.
- At least one teammate should start a task.
- The board should show movement into In Progress.
- Task comments or logs should show what the teammate is doing.
If launch hangs or no tasks appear, go to [Troubleshooting](/guide/troubleshooting#team-does-not-launch).
Next: [Run and monitor work](/guide/run-and-monitor-work).

View file

@ -0,0 +1,88 @@
---
title: "Review and Approve - Agent Teams Docs"
description: "A beginner-friendly review workflow for task details, execution logs, code changes, hunk decisions, approvals, and fix requests."
---
# Review and Approve
Do not treat agent work as finished until you have checked the task result, logs, and changes. Review is where you keep quality and scope under control.
## 1. Open the task
Start from a task in Review or Done. Read the title, owner, status, and description first.
<ZoomImage src="/screenshots/guides/task-detail-annotated.png" alt="Annotated task detail view for review" caption="Start with the task description, then check attachments, changes, and execution logs before approving anything." />
Look for:
- a clear task goal
- files or areas that match the requested scope
- a final comment from the teammate
- a verification command and result
## 2. Check execution evidence
Execution Logs answer the basic trust questions:
| Question | What to look for |
| --- | --- |
| Did the agent actually work on this task? | Tool calls, comments, and status changes inside the task timeline. |
| Did it run verification? | Build, test, lint, or docs commands with visible results. |
| Did it coordinate with others? | Messages or comments that explain handoffs and blockers. |
| Did it touch unexpected files? | Changes that do not match the task description. |
If logs and final comment disagree, ask for clarification before approving.
## 3. Review the diff
Open **Changes** and inspect each changed file.
<ZoomImage src="/screenshots/guides/code-review-annotated.png" alt="Annotated code review screen with changed files, Accept All, and hunk actions" caption="Review each file first. Use Accept All only after you understand the diff. Keep or undo individual hunks when only part of a change is correct." />
Use this order:
1. Read the file list.
2. Open each changed file.
3. Check whether the changes match the task.
4. Keep correct hunks.
5. Undo or reject risky hunks.
6. Approve only after all important files are reviewed.
## 4. Request fixes clearly
When something is wrong, do not just reject the task. Leave a specific fix request:
```text
Please keep the copy improvements, but revert the unrelated runtime wording in the provider table. Add the `pnpm --dir landing docs:build` result before resubmitting.
```
Good fix requests name:
- what to keep
- what to change
- what to avoid
- what verification is required
## 5. Approve only when the result is complete
Approve when:
- the task scope is satisfied
- the diff matches the task
- verification passed or the missing verification is explicitly justified
- no unrelated changes are mixed in
- comments explain important decisions
If the task changed docs or UI, also open the relevant page or app screen before approval.
## 6. Final checklist
Before closing the review:
- Files changed are expected.
- The task has a final result comment.
- Verification result is present.
- Risky hunks were checked individually.
- The lead or reviewer marked the task approved.
If anything is unclear, request changes instead of approving.

View file

@ -0,0 +1,100 @@
---
title: "Run and Monitor Work - Agent Teams Docs"
description: "Learn how to brief the lead, read the task board, use messages and comments, open task details, and keep agent work moving."
---
# Run and Monitor Work
After the team launches, your job is to keep the work visible, scoped, and reviewable. The board is the main operating surface.
## 1. Brief the lead clearly
The lead needs a goal that can be split into tasks. Include:
- the outcome
- the allowed files or product area
- what not to touch
- verification commands
- when to ask for review
Good brief:
```text
Create a beginner docs path. Keep edits inside landing/product-docs. Add screenshots where they clarify actions. Do not touch runtime code. Run `pnpm --dir landing docs:build` before marking tasks complete.
```
Weak brief:
```text
Improve docs.
```
The weak brief can work, but it gives the lead too much freedom and makes review harder.
## 2. Read the board by lane
<ZoomImage src="/screenshots/guides/task-board-annotated.png" alt="Annotated task board with messages, kanban lanes, review cards, and task list" caption="Use the board to scan messages, task state, review-ready work, and the right-side task list without opening raw files." />
| Lane | What it means | What you should do |
| --- | --- | --- |
| Todo | Tasks exist but are not active yet. | Check whether task titles are specific enough. |
| In Progress | A teammate is actively working. | Watch for updates and avoid assigning duplicate work. |
| Review | Work needs inspection. | Open the task and review changes. |
| Done | Work is completed but may still need review flow. | Confirm review state before trusting it. |
| Approved | Review passed. | Treat as completed output. |
## 3. Use messages and comments deliberately
Use task comments for task-specific context:
```text
Please keep this task scoped to the quickstart page. Do not change runtime setup wording in this pass.
```
Use direct messages for coordination:
```text
Lead, pause new task creation until the current review queue is cleared.
```
Prefer task comments when possible. They stay attached to the work and make review easier.
## 4. Open task detail when a card needs attention
Open the task detail when:
- the title is too vague
- the task has been in progress too long
- the task is ready for review
- the output mentions files you did not expect
- you need to inspect attachments, changes, or logs
<ZoomImage src="/screenshots/guides/task-detail-annotated.png" alt="Annotated task detail view with description, attachments, changes, and execution logs" caption="Task detail is where you confirm the task scope, attached context, changed files, and runtime evidence." />
## 5. Keep work unblocked
If a teammate is blocked, ask for the smallest next step:
```text
Post the blocker, the file or command involved, and the next action you need from the lead or user.
```
If the task is too large, ask the lead to split it:
```text
Split this into separate tasks for copy edits, screenshot assets, and navigation updates. Keep each task independently reviewable.
```
## 6. Decide when to stop the team
Stop or pause when:
- the review queue is larger than you can inspect
- the lead creates vague tasks repeatedly
- runtime errors appear in multiple tasks
- agents start editing unrelated files
- verification is missing from completed work
You can always relaunch after tightening the brief.
Next: [Review and approve](/guide/review-and-approve).

View file

@ -8,8 +8,8 @@ hero:
tagline: Create teams, watch work move across a kanban board, review code changes, and coordinate Claude, Codex, OpenCode, and multimodel workflows without giving up local control.
actions:
- theme: brand
text: Quickstart
link: /guide/quickstart
text: Beginner workflow
link: /guide/beginner-workflow
- theme: alt
text: Install
link: /guide/installation
@ -62,6 +62,10 @@ Agent Teams is a free desktop app for orchestrating AI agent teams. You are not
After creating your first team, explore these guides to go further:
- **Runtime setup** - configure Claude, Codex, OpenCode, or multimodel providers: [Configure runtimes](/guide/runtime-setup)
- **Beginner workflow** - follow the complete first-run path from project to approval: [Start the walkthrough](/guide/beginner-workflow)
- **Create your first team** - set up lead, builder, reviewer, roles, models, and Worktree: [Create the team](/guide/create-first-team)
- **Run and monitor work** - read the board, comments, task detail, and logs: [Run the team](/guide/run-and-monitor-work)
- **Review and approve** - inspect task results and code changes before approval: [Review work](/guide/review-and-approve)
- **Agent workflow** - understand how agents coordinate through the task board: [Understand workflow](/guide/agent-workflow)
- **Team brief examples** - learn prompt patterns from real-world briefs: [See examples](/guide/team-brief-examples)
- **Code review** - inspect diffs, accept or reject changes: [Review changes](/guide/code-review)
@ -77,4 +81,4 @@ Use the reference pages when you need exact terminology, provider behavior, cont
## Product preview
<ZoomImage src="/screenshots/1.jpg" alt="Agent Teams kanban board" caption="Task status, teammate activity, and review workflow stay visible in one workspace." />
<ZoomImage src="/screenshots/product-preview.jpg" alt="Agent Teams kanban board" caption="Task status, teammate activity, and review workflow stay visible in one workspace." />

View file

@ -0,0 +1,109 @@
---
title: "Путь новичка - Документация Agent Teams"
description: "Структурированный первый запуск для новых пользователей: проект, команда, доска задач, карточка задачи и ревью."
lang: ru-RU
---
# Путь новичка
Этот маршрут нужен, если вы впервые открыли Agent Teams и хотите пройти путь от запуска приложения до безопасного approval результата.
Первый запуск должен доказать четыре вещи:
1. Приложение открывает ваш проект.
2. Небольшая команда запускается с выбранным runtime.
3. Задачи двигаются по доске и их состояние видно.
4. Вы можете проверить изменения до approval.
## Базовая модель
В Agent Teams есть четыре основные рабочие поверхности:
| Поверхность | Что там делать |
| --- | --- |
| Project и team selector | Выбрать проект и команду, которая будет в нём работать. |
| Team editor | Назвать команду, добавить участников, выбрать роли, модели и worktree-настройки. |
| Task board | Смотреть, как задачи проходят Todo, In Progress, Review, Done и Approved. |
| Task detail и review | Читать задачу, проверять логи, смотреть изменения и approve/request fixes. |
<ZoomImage src="/screenshots/guides/task-board-annotated.png" alt="Аннотированная доска задач Agent Teams" caption="Доска - главная рабочая поверхность после запуска: сообщения, колонки, review-карточки и список задач видны вместе." />
## Рекомендуемый порядок гайдов
Для первого успешного запуска идите в таком порядке:
1. [Создать первую команду](/ru/guide/create-first-team) - собрать небольшую команду lead-builder-reviewer.
2. [Запустить и отслеживать работу](/ru/guide/run-and-monitor-work) - дать lead конкретную цель и следить за task board.
3. [Проверить и approve](/ru/guide/review-and-approve) - проверить task detail, logs и code changes.
4. [Диагностика](/ru/guide/troubleshooting) - если запуск, сообщения или task logs выглядят неправильно.
## Перед запуском
Начинайте с Git-проекта и понятного baseline:
```bash
git status --short
```
Чистое дерево не обязательно, но важно понимать, какие изменения уже были до запуска агентов.
Для первого запуска держите команду маленькой:
| Участник | Первая ответственность |
| --- | --- |
| Lead | Разбивает цель на задачи и координирует статус. |
| Builder | Делает ограниченные implementation tasks. |
| Reviewer | Проверяет завершённые задачи и просит исправления. |
Не запускайте сразу много участников. Больше агентов - больше логов, параллельных правок, provider usage и review-нагрузки.
## Шаблон первой цели
Цель должна иметь scope, границы и verification:
```text
Improve the documentation quickstart. Keep edits inside landing/product-docs, add practical examples, preserve existing VitePress syntax, and run `pnpm --dir landing docs:build` before marking tasks done.
```
Хорошая первая цель конкретная, проверяемая и ограничена известной областью.
## Как выглядит здоровый прогресс
В здоровом запуске:
- lead создаёт маленькие задачи, а не одну огромную
- каждый teammate пишет план или progress comment
- работа двигается из Todo в In Progress
- завершённая работа попадает в Review до approval
- task detail показывает description, attachments, changes и execution logs
- финальный comment содержит verification command и result
## Когда вмешиваться
Вмешивайтесь, если задача слишком широкая, размытая, заблокирована или без verification. Пишите task comment, если сообщение относится к конкретной задаче. Пишите direct message, если надо перенаправить teammate или lead.
Примеры:
```text
Split this into smaller tasks. Each task should have a narrow file scope and a clear verification step.
```
```text
Before continuing, post the files you plan to change and the command you will run to verify the result.
```
```text
This task is too broad. Keep the change inside the docs guide pages and avoid touching app runtime code.
```
## Checklist завершения
Первый запуск можно считать успешным, если:
- команда запустилась без runtime errors
- хотя бы одна задача прошла через Review
- вы открыли и проверили diff
- result comment содержит verification result
- понятно, какие файлы изменились и почему
Дальше: [Создать первую команду](/ru/guide/create-first-team).

View file

@ -0,0 +1,112 @@
---
title: "Создать первую команду - Документация Agent Teams"
description: "Пошаговая настройка первой команды: lead, builder, reviewer, роли, модели, worktree isolation и launch brief."
lang: ru-RU
---
# Создать первую команду
Цель первого setup - не собрать самую большую команду, а создать маленькую команду, которая стабильно запускается и делает reviewable tasks.
## 1. Откройте проект
Откройте проект, в котором агенты будут работать. Лучше использовать Git-проект, чтобы Agent Teams мог показывать diff, task-linked changes и review state.
Перед запуском проверьте baseline:
```bash
git status --short
```
Если уже есть ваши изменения, учитывайте их при review.
## 2. Создайте команду
Через team selector создайте новую команду для текущего проекта. Название держите коротким и рабочим: `docs-onboarding`, `landing-fixes`, `runtime-audit`.
<ZoomImage src="/screenshots/guides/create-team-annotated.png" alt="Аннотированный диалог Create Team" caption="Create Team: назовите команду, добавьте участников, выберите роли и модели, затем включайте Worktree только если нужна Git-изоляция." />
## 3. Начните с трёх ролей
Рекомендуемая первая форма команды:
| Роль | Ответственность | Зачем |
| --- | --- | --- |
| Lead | Делит цель на задачи, назначает owners, отслеживает blockers. | Держит работу скоординированной. |
| Builder | Делает scoped implementation tasks. | Создаёт основное изменение. |
| Reviewer | Проверяет completed tasks и просит fixes. | Не даёт непроверенному результату стать финальным. |
Специалистов можно добавить позже. Для первого запуска маленькую команду легче диагностировать и ревьюить.
## 4. Выберите provider и model для каждого
Каждому участнику нужен provider и model. Для lead выбирайте самый надёжный runtime, потому что lead управляет decomposition и coordination.
Обычная первая настройка:
| Участник | Какой provider выбрать |
| --- | --- |
| Lead | Самую надёжную модель из доступных. |
| Builder | Быструю модель для scoped implementation. |
| Reviewer | Более аккуратную модель с сильным reasoning. |
Если provider отсутствует, сначала исправьте runtime setup: [Настройка рантайма](/ru/guide/runtime-setup).
## 5. Решите, нужен ли Worktree
Включайте **Worktree**, когда участники могут параллельно менять один репозиторий и нужна Git-изоляция. Для самого простого первого запуска можно оставить выключенным.
Worktree полезен, когда:
- несколько teammates могут одновременно менять код
- нужны более чистые diffs по участникам
- проект уже является Git-репозиторием
Не включайте Worktree, если:
- проект не в Git
- вы только проверяете UI flow
- хотите минимум движущихся частей в первом запуске
## 6. Напишите инструкции участникам
Member prompt должен описывать ответственность участника, а не весь проект.
Lead:
```text
Split the user goal into small tasks. Assign clear owners, avoid broad refactors, keep task comments updated, and request review before approval.
```
Builder:
```text
Implement only the assigned task. Keep changes scoped, post the files you changed, and include the verification command and result before marking work complete.
```
Reviewer:
```text
Review completed tasks for correctness, regressions, missing tests, and scope creep. Ask for fixes with specific comments before approving.
```
## 7. Запустите с узкой целью
Launch brief должен содержать outcome, scope, boundaries и verification:
```text
Improve the docs onboarding path. Keep changes inside landing/product-docs. Create a beginner-friendly guide sequence, add practical examples, preserve VitePress syntax, and run `pnpm --dir landing docs:build`.
```
## 8. Проверьте, что запуск здоровый
После запуска:
- lead создаёт задачи
- хотя бы один teammate начинает задачу
- board показывает движение в In Progress
- task comments или logs показывают, что делает teammate
Если запуск завис или задач нет, откройте [Диагностику](/ru/guide/troubleshooting#team-does-not-launch).
Дальше: [Запустить и отслеживать работу](/ru/guide/run-and-monitor-work).

View file

@ -0,0 +1,89 @@
---
title: "Проверить и approve - Документация Agent Teams"
description: "Понятный workflow ревью: task detail, execution logs, code changes, hunk decisions, approvals и fix requests."
lang: ru-RU
---
# Проверить и approve
Не считайте работу агента завершённой, пока не проверили результат задачи, logs и changes. Review удерживает качество и scope.
## 1. Откройте задачу
Начните с задачи в Review или Done. Сначала прочитайте title, owner, status и description.
<ZoomImage src="/screenshots/guides/task-detail-annotated.png" alt="Аннотированный task detail для review" caption="Начните с task description, затем проверьте attachments, changes и execution logs до approval." />
Проверьте:
- понятная ли цель задачи
- совпадают ли файлы с ожидаемым scope
- есть ли final comment от teammate
- есть ли verification command и result
## 2. Проверьте execution evidence
Execution Logs отвечают на базовые вопросы доверия:
| Вопрос | Что искать |
| --- | --- |
| Агент реально работал над этой задачей? | Tool calls, comments и status changes внутри task timeline. |
| Он запускал verification? | Build, test, lint или docs commands с результатом. |
| Он координировался с другими? | Messages или comments с handoffs и blockers. |
| Он трогал неожиданные файлы? | Changes, которые не совпадают с task description. |
Если logs и final comment расходятся, попросите уточнение до approval.
## 3. Проверьте diff
Откройте **Changes** и просмотрите каждый changed file.
<ZoomImage src="/screenshots/guides/code-review-annotated.png" alt="Аннотированный code review screen с changed files, Accept All и hunk actions" caption="Сначала проверьте каждый file. Accept All используйте только после понимания diff. Keep или undo применяйте для отдельных hunks." />
Порядок:
1. Прочитать file list.
2. Открыть каждый changed file.
3. Проверить, что изменения совпадают с задачей.
4. Keep для правильных hunks.
5. Undo или reject для рискованных hunks.
6. Approve только после проверки важных files.
## 4. Просите fixes конкретно
Если что-то не так, не ограничивайтесь reject. Оставьте конкретный fix request:
```text
Please keep the copy improvements, but revert the unrelated runtime wording in the provider table. Add the `pnpm --dir landing docs:build` result before resubmitting.
```
Хороший fix request называет:
- что оставить
- что изменить
- чего избегать
- какая verification обязательна
## 5. Approve только полный результат
Approve уместен, когда:
- task scope закрыт
- diff совпадает с задачей
- verification прошёл или отсутствие verification объяснено
- нет unrelated changes
- comments объясняют важные решения
Если task менял docs или UI, перед approval откройте соответствующую страницу или экран приложения.
## 6. Финальный checklist
Перед закрытием review:
- изменённые files ожидаемые
- есть final result comment
- есть verification result
- risky hunks проверены отдельно
- lead или reviewer поставил approved
Если что-то непонятно, request changes лучше, чем approve.

View file

@ -0,0 +1,101 @@
---
title: "Запустить и отслеживать работу - Документация Agent Teams"
description: "Как дать lead понятный brief, читать task board, использовать messages и comments, открывать task detail и удерживать работу в движении."
lang: ru-RU
---
# Запустить и отслеживать работу
После запуска команды ваша задача - держать работу видимой, ограниченной и готовой к review. Главная поверхность - board.
## 1. Дайте lead понятный brief
Lead нужна цель, которую можно разбить на задачи. Укажите:
- outcome
- разрешённые файлы или область продукта
- что не трогать
- verification commands
- когда просить review
Хороший brief:
```text
Create a beginner docs path. Keep edits inside landing/product-docs. Add screenshots where they clarify actions. Do not touch runtime code. Run `pnpm --dir landing docs:build` before marking tasks complete.
```
Слабый brief:
```text
Improve docs.
```
Слабый brief даёт lead слишком много свободы и усложняет review.
## 2. Читайте board по колонкам
<ZoomImage src="/screenshots/guides/task-board-annotated.png" alt="Аннотированная доска с messages, kanban lanes, review cards и task list" caption="Board помогает одновременно видеть messages, task state, review-ready work и правый task list без чтения raw-файлов." />
| Колонка | Что значит | Что делать |
| --- | --- | --- |
| Todo | Задачи есть, но ещё не активны. | Проверить, достаточно ли конкретные titles. |
| In Progress | Teammate активно работает. | Смотреть updates и не назначать duplicate work. |
| Review | Работу нужно проверить. | Открыть task и review changes. |
| Done | Работа завершена, но может требовать review flow. | Проверить review state перед доверием результату. |
| Approved | Review прошёл. | Считать результат завершённым. |
## 3. Используйте messages и comments осознанно
Task comments подходят для контекста конкретной задачи:
```text
Please keep this task scoped to the quickstart page. Do not change runtime setup wording in this pass.
```
Direct messages подходят для координации:
```text
Lead, pause new task creation until the current review queue is cleared.
```
Если возможно, предпочитайте task comments. Они остаются привязанными к работе.
## 4. Открывайте task detail, когда карточке нужно внимание
Открывайте task detail, если:
- title слишком размытый
- задача слишком долго in progress
- задача готова к review
- output упоминает неожиданные файлы
- нужно проверить attachments, changes или logs
<ZoomImage src="/screenshots/guides/task-detail-annotated.png" alt="Аннотированная карточка задачи с description, attachments, changes и execution logs" caption="Task detail помогает подтвердить scope, attached context, changed files и runtime evidence." />
## 5. Разблокируйте работу
Если teammate заблокирован, попросите минимальный следующий шаг:
```text
Post the blocker, the file or command involved, and the next action you need from the lead or user.
```
Если задача слишком большая, попросите lead разделить её:
```text
Split this into separate tasks for copy edits, screenshot assets, and navigation updates. Keep each task independently reviewable.
```
## 6. Когда остановить команду
Остановите или поставьте на паузу, если:
- review queue больше, чем вы можете проверить
- lead повторно создаёт размытые задачи
- runtime errors появляются в нескольких задачах
- агенты начали менять unrelated files
- completed work не содержит verification
Команду можно перезапустить после уточнения brief.
Дальше: [Проверить и approve](/ru/guide/review-and-approve).

View file

@ -9,8 +9,8 @@ hero:
tagline: Создавайте команды, наблюдайте за канбан-доской, ревьюйте изменения и координируйте Claude, Codex, OpenCode и multimodel workflows без потери локального контроля.
actions:
- theme: brand
text: Быстрый старт
link: /ru/guide/quickstart
text: Путь новичка
link: /ru/guide/beginner-workflow
- theme: alt
text: Установка
link: /ru/guide/installation
@ -63,6 +63,10 @@ Agent Teams - бесплатное desktop-приложение для орке
После создания первой команды изучите эти руководства:
- **Настройка рантайма** - настройте Claude, Codex, OpenCode или multimodel-провайдеров: [Настроить рантаймы](/ru/guide/runtime-setup)
- **Путь новичка** - полный первый маршрут от проекта до approval: [Начать walkthrough](/ru/guide/beginner-workflow)
- **Создать первую команду** - lead, builder, reviewer, роли, модели и Worktree: [Создать команду](/ru/guide/create-first-team)
- **Запустить и отслеживать работу** - board, comments, task detail и logs: [Запустить работу](/ru/guide/run-and-monitor-work)
- **Проверить и approve** - task results и code changes до approval: [Проверить работу](/ru/guide/review-and-approve)
- **Workflow агентов** - как агенты координируются через task board: [Разобрать workflow](/ru/guide/agent-workflow)
- **Примеры team briefs** - паттерны промптов из реальных примеров: [Примеры](/ru/guide/team-brief-examples)
- **Код-ревью** - проверяйте diff, принимайте или отклоняйте изменения: [Ревью изменений](/ru/guide/code-review)
@ -78,4 +82,4 @@ Agent Teams - бесплатное desktop-приложение для орке
## Превью продукта
<ZoomImage src="/screenshots/1.jpg" alt="Канбан-доска Agent Teams" caption="Статусы задач, активность агентов и review workflow видны в одном рабочем пространстве." />
<ZoomImage src="/screenshots/product-preview.jpg" alt="Канбан-доска Agent Teams" caption="Статусы задач, активность агентов и review workflow видны в одном рабочем пространстве." />

View file

@ -0,0 +1,15 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "Bundler",
"lib": ["ES2022", "DOM", "DOM.Iterable"],
"types": ["vitepress/client"],
"strict": true,
"skipLibCheck": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true
},
"include": [".vitepress/**/*.ts", ".vitepress/**/*.vue"]
}

View file

@ -0,0 +1,12 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=https://agent-teams-ai-docs.onrender.com/">
<link rel="canonical" href="https://agent-teams-ai-docs.onrender.com/">
<title>Redirecting to Agent Teams Docs</title>
</head>
<body>
<a href="https://agent-teams-ai-docs.onrender.com/">Agent Teams Docs</a>
</body>
</html>

View file

@ -0,0 +1,12 @@
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=https://agent-teams-ai-docs.onrender.com/ru/">
<link rel="canonical" href="https://agent-teams-ai-docs.onrender.com/ru/">
<title>Redirecting to Agent Teams Docs</title>
</head>
<body>
<a href="https://agent-teams-ai-docs.onrender.com/ru/">Agent Teams Docs</a>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 KiB

View file

@ -1,4 +1,5 @@
import { defaultLocale, getLocalizedPagePath, sitemapPages, supportedLocales } from "~/data/i18n";
import { normalizeDocsSiteUrl } from "~/utils/docsUrl";
const trimTrailingSlash = (value: string) => value.replace(/\/+$/, "");
@ -11,6 +12,7 @@ export default defineEventHandler((event) => {
const githubUrl = `https://github.com/${githubRepo}`;
const releasesUrl = `${githubUrl}/releases`;
const toSiteUrl = (path: string) => `${siteUrl}${path === "/" ? "/" : `/${path.replace(/^\/+/, "")}`}`;
const docsSiteUrl = normalizeDocsSiteUrl(config.public.docsSiteUrl) || toSiteUrl("/docs/");
setHeader(event, "content-type", "text/plain; charset=utf-8");
@ -32,8 +34,8 @@ export default defineEventHandler((event) => {
- Homepage (${defaultLocale}): ${toSiteUrl("/")}
- Download: ${toSiteUrl("/download")}
- Documentation: ${toSiteUrl("/docs/")}
- Documentation llms.txt: ${toSiteUrl("/docs/llms.txt")}
- Documentation: ${docsSiteUrl}
- Documentation llms.txt: ${docsSiteUrl}llms.txt
- GitHub repository: ${githubUrl}
- Releases: ${releasesUrl}
- Sitemap: ${toSiteUrl("/sitemap.xml")}

View file

@ -1,12 +1,15 @@
import { normalizeDocsSiteUrl } from "~/utils/docsUrl";
export default defineEventHandler((event) => {
const config = useRuntimeConfig();
const siteUrl = ((config.public.siteUrl as string) || "https://777genius.github.io/agent-teams-ai").replace(/\/+$/, "");
const docsSiteUrl = normalizeDocsSiteUrl(config.public.docsSiteUrl) || `${siteUrl}/docs/`;
setHeader(event, "content-type", "text/plain; charset=utf-8");
return `User-agent: *
Allow: /
Sitemap: ${siteUrl}/sitemap.xml
Sitemap: ${siteUrl}/docs/sitemap.xml
Sitemap: ${docsSiteUrl}sitemap.xml
`;
});

29
landing/utils/docsUrl.ts Normal file
View file

@ -0,0 +1,29 @@
type DocsLocale = string | undefined;
const trimTrailingSlash = (value: string) => value.replace(/\/+$/, '');
const withTrailingSlash = (value: string) => `${trimTrailingSlash(value)}/`;
export function normalizeDocsSiteUrl(value: unknown): string | null {
if (typeof value !== 'string') return null;
const trimmed = value.trim();
if (!trimmed) return null;
return withTrailingSlash(trimmed);
}
export function buildDocsHref(args: {
locale?: DocsLocale;
docsSiteUrl?: unknown;
embeddedBaseURL: string;
}): string {
const localizedPath = args.locale === 'ru' ? 'ru/' : '';
const externalDocsUrl = normalizeDocsSiteUrl(args.docsSiteUrl);
if (externalDocsUrl) {
return `${externalDocsUrl}${localizedPath}`;
}
const base = args.embeddedBaseURL.replace(/\/?$/, '/');
return `${base}${args.locale === 'ru' ? 'docs/ru/' : 'docs/'}`;
}

View file

@ -48,6 +48,6 @@
"vitest": "^3.1.4"
},
"engines": {
"node": ">=24.16.0 <25"
"node": ">=24.15.0 <25"
}
}

View file

@ -17,7 +17,7 @@
"url": "https://github.com/777genius/agent-teams-ai/issues"
},
"engines": {
"node": ">=24.16.0 <25"
"node": ">=24.15.0 <25"
},
"main": "dist-electron/main/index.cjs",
"scripts": {

View file

@ -4,7 +4,7 @@
"private": true,
"type": "module",
"engines": {
"node": ">=24.16.0 <25"
"node": ">=24.15.0 <25"
},
"main": "src/index.ts",
"types": "src/index.ts",

File diff suppressed because it is too large Load diff

View file

@ -1,17 +1,17 @@
{
"cliStatus": {
"actions": {
"alreadyLoggedIn": "已经登录了吗?",
"becomeSponsor": "成为提案国",
"alreadyLoggedIn": "已经登录",
"becomeSponsor": "成为赞助商",
"cancel": "取消",
"checkNow": "现在检查",
"checkNow": "立即查看",
"checkUpdates": "检查更新",
"checking": "正在检查...",
"checking": "检查…",
"connect": "连接",
"extensions": "扩展",
"login": "登录",
"manage": "管理",
"manageProviders": "管理商",
"manageProviders": "管理供商",
"plan": "计划",
"recheck": "重新检查",
"recheckProvider": "重新检查 {{provider}}",
@ -20,161 +20,161 @@
"useCode": "使用代码"
},
"atlas": {
"alt": "地图集云",
"description": "Atlas Cloud是一个全模式的AI推论平台,它让开发者获得一个单一的AI API来访问视频生成,图像生成,以及LLM API. 与其管理多个供应商集成,不如连接一次,并获得所有模式300+全方位模型的统一访问. 请检查access-date=中的日期值 (帮助) Atlas Cloud新编码计划推广 更方便预算 API访问.",
"openCodeProvider": "打开代码提供者",
"plan": "阿特拉斯云编码计划",
"sponsor": "发起人"
"alt": "Atlas Cloud",
"description": "Atlas Cloud 是一个全模态 AI 推理平台,为开发者提供单一 AI API 来访问视频生成、图像生成和 LLM API。您无需管理多个提供商集成只需连接一次即可统一访问跨所有模态的 300 多个精选模型。查看 Atlas Cloud 的新编码计划促销活动,以获取更实惠的 API 访问权限。",
"openCodeProvider": "OpenCode 提供商",
"plan": "Atlas Cloud 编码计划",
"sponsor": "赞助"
},
"errors": {
"checkStatusFailed": "检查 CLI 状态失败",
"checkStatusFailed": "无法检查 CLI 状态",
"installationFailed": "安装失败",
"refreshFailed": "检查更新失败 。 检查您的网络连接并再次尝试 。",
"runtimeUpdatedRefreshFailed": "运行时间已更新, 但无法刷新提供者状态 。"
"refreshFailed": "无法检查更新。检查您的网络连接并重试。",
"runtimeUpdatedRefreshFailed": "运行时已更新,但无法刷新提供商状态。"
},
"hints": {
"backgroundStatus": "{{runtime}}状态将在背景中检查.",
"codexApiKeyFallback": "{{hint}} ZXCV 1ZXCV 如果您切换了认证模式,则可以使用密钥倒置。",
"codexAutoApiKey": "{{hint}} 苏维埃社会主义共和国 自动会继续使用API密钥,直到ChatGPT连接.",
"codexFinishLogin": "在浏览器中完成 ChatGPT 登录 。 如果提示, 请输入显示的代码 。",
"codexNoActiveLogin": "用法限制仅在Codex CLI看到一个活动中的ChatGPT账户后出现. 现在它没有报告ChatGPT的登录。",
"codexNoActiveManagedSession": "用法限制仅在Codex CLI看到一个活动中的ChatGPT账户后出现. 本地 Codex 账户数据已存在, 但目前没有选择活动管理会话 。",
"codexReconnectNeeded": "用法限制仅在 Codex 刷新当前选中的 ChatGPT 会话后才会出现 。 现在本地会议需要重新连接。",
"firstCheckSlow": "第一次检查可能要30秒",
"loginRequiredForTeams": "浏览会话和项目在不登录的情况下工作. 只需要登录即可运行代理团队.",
"troubleshootTitle": "如果你确定你登录, 尝试这些步骤:"
"backgroundStatus": "{{runtime}} 状态将在后台检查。",
"codexApiKeyFallback": "如果您切换认证模式,{{hint}} API 密钥备用选项可用。",
"codexAutoApiKey": "{{hint}} Auto 将继续使用 API 密钥,直到连接 ChatGPT。",
"codexFinishLogin": "在浏览器中完成 ChatGPT 登录。如有提示,请输入显示的代码。",
"codexNoActiveLogin": "仅当 Codex CLI 看到有效的 ChatGPT 帐户后,才会出现用量限制。目前,它报告没有有效的 ChatGPT 登录。",
"codexNoActiveManagedSession": "仅当 Codex CLI 看到有效的 ChatGPT 帐户后,才会出现用量限制。本地 Codex 帐户数据存在,但目前未选择有效的托管会话。",
"codexReconnectNeeded": "仅在 Codex 刷新当前选定的 ChatGPT 会话后才会出现用量限制。现在本地会话需要重新连接。",
"firstCheckSlow": "第一次检查最多可能 30 秒",
"loginRequiredForTeams": "无需登录即可浏览会话和项目。仅需要登录才能运行 Agent Team。",
"troubleshootTitle": "如果您确定已登录,请尝试以下步骤:"
},
"installer": {
"checkingLatest": "正在检查最新版本...",
"downloading": "正在下载 {{runtime}}...",
"installing": "正在安装 {{runtime}}...",
"checkingLatest": "正在检查最新版本",
"downloading": "正在下载 {{runtime}}",
"installing": "正在安装 {{runtime}}",
"success": "成功安装 {{runtime}} v{{version}}",
"verifying": "正在验证校验和..."
"verifying": "正在验证校验和"
},
"labels": {
"apiKeyRequired": "需要 API 密钥",
"comingSoon": "马上就来",
"collapseProviderDetails": "折叠提供者细节",
"expandProviderDetails": "扩展提供者细节",
"apiKeyRequired": "需要 API 密钥",
"comingSoon": "即将推出",
"collapseProviderDetails": "折叠提供商详细信息",
"expandProviderDetails": "展开提供商详细信息",
"generateLink": "生成链接",
"loadingRateLimits": "速率限制加载",
"loggedOut": "供应商已登录",
"loggedOut": "提供商已注销",
"loginAuthFailed": "认证失败",
"loginAuthUpdated": "更新认证",
"loginAuthUpdated": "认证已更新",
"loginComplete": "登录完成",
"loginFailed": "登录失败",
"loginTitle": "登录",
"logoutFailed": "注销失败",
"logoutTitle": "注销",
"logoutTitle": "退出",
"notLoggedIn": "未登录",
"openLogin": "打开登录",
"providerActionRequired": "需要提供者采取的行动",
"resets": "重新发送 {{time}}",
"runtimeLoginTitle": "{{runtime}} 苏维埃社会主义共和国 登录"
"providerActionRequired": "需要提供商采取行动",
"resets": "复位 {{time}}",
"runtimeLoginTitle": "{{runtime}} 登录"
},
"loading": {
"aiProviders": "正在检查 AI 提供者...",
"claudeCli": "正在检查克劳德CLI..."
"aiProviders": "检查 AI 提供商…",
"claudeCli": "检查 Claude CLI…"
},
"provider": {
"authenticated": "已认证",
"backend": "后端: {{backend}}",
"checkingAuthentication": "正在检查认证...",
"checkingProviders": "正在检查提供者...",
"configuredLocalCount": "{{count}} 本地配置",
"configuredLocalCount_few": "{{count}} 本地配置",
"configuredLocalCount_many": "{{count}} 本地配置",
"configuredLocalCount_one": "{{count}} 本地配置",
"configuredLocalCount_other": "{{count}} 本地配置",
"configuredLocalTitle": "从您的 OpenCode 配置导入本地 OpenCode 路由 。",
"connectedCount": "供应商:{{connected}}/{{denominator}}连接",
"freeModels": "免费模",
"freeModelsTitle": "OpenCode 包含一些免费的模型选项, 如在您的设置中可用时的 Big Pickle 。 通过OpenCode的OpenRouter也可以曝光自由模型,但并不是每个OpenCode/OpenRouter模型都是免费的. 可用性和限制可能会改变。",
"loadingModels": "正在装入模型...",
"modelsUnavailable": "此运行时构建无法使用的模型",
"runtime": "运行时间: {{runtime}}",
"verifiedCount": "{{count}} 经核查",
"verifiedCount_few": "{{count}} 经核查",
"verifiedCount_many": "{{count}} 经核查",
"verifiedCount_one": "{{count}} 经核查",
"verifiedCount_other": "{{count}} 经核查",
"verifiedTitle": "带有成功执行证明的 OpenCode 路由 。"
"backend": "后端{{backend}}",
"checkingAuthentication": "正在检查认证",
"checkingProviders": "正在检查提供商…",
"configuredLocalCount": "{{count}} 配置本地",
"configuredLocalCount_few": "{{count}} 配置本地",
"configuredLocalCount_many": "{{count}} 配置本地",
"configuredLocalCount_one": "{{count}} 配置本地",
"configuredLocalCount_other": "{{count}} 配置本地",
"configuredLocalTitle": "从 OpenCode 配置导入本地 OpenCode 路由。",
"connectedCount": "提供商:{{connected}}/{{denominator}} 连接",
"freeModels": "免费模",
"freeModelsTitle": "OpenCode 包含免费模型选项,例如您的设置中可用的 Big Pickle。 OpenRouter 通过 OpenCode 也可以公开免费模型,但并非每个 OpenCode/OpenRouter 模型都是免费的。可用性和限制可能会发生变化。",
"loadingModels": "正在加载模型…",
"modelsUnavailable": "模型不适用于此运行时构建",
"runtime": "运行时{{runtime}}",
"verifiedCount": "{{count}} 已验证",
"verifiedCount_few": "{{count}} 已验证",
"verifiedCount_many": "{{count}} 已验证",
"verifiedCount_one": "{{count}} 已验证",
"verifiedCount_other": "{{count}} 已验证",
"verifiedTitle": "OpenCode 路由具有成功的执行证明。"
},
"runtime": {
"configuredHealthCheckFailed": "配置的 {{runtime}} 失败启动健康检查.",
"configuredHealthCheckFailed": "配置的 {{runtime}} 启动运行状况检查失败。",
"configuredNotFound": "未找到配置的 {{runtime}}。",
"foundButFailed": "发现 {{runtime}} 失败启动",
"healthCheckFailedDescription": "该应用程序发现了配置的{{runtime}},但其启动健康检查失败. 修理或重新安装,然后重试。",
"foundButFailed": "找到 {{runtime}} 但启动失败",
"healthCheckFailedDescription": "应用找到配置的 {{runtime}},但其启动健康检查失败。修复或重新安装,然后重试。",
"install": "安装 {{runtime}}",
"installRequiredDescription": "{{runtime}}是团队提供和会话管理所需的. 安装开始 。",
"isRequired": "需要{{runtime}}",
"reinstall": "莱因斯托尔 {{runtime}}"
"installRequiredDescription": "团队配置和会话管理需要 {{runtime}}。安装它即可开始。",
"isRequired": "{{runtime}} 为必填项",
"reinstall": "重新安装 {{runtime}}"
},
"runtimeInstall": {
"checking": "检查",
"codexTitle": "在应用数据中安装代码CLI",
"downloading": "下载",
"downloadingPercent": "下载 {{percent}}%",
"checking": "检查",
"codexTitle": "将 Codex CLI 安装到应用数据中",
"downloading": "正在下载",
"downloadingPercent": "正在下载 {{percent}}%",
"install": "安装",
"installing": "安装",
"openCodeTitle": "安装 OpenCode 运行时间到应用数据",
"installing": "安装",
"openCodeTitle": "将 OpenCode 运行时安装到应用数据中",
"retryInstall": "重试安装"
},
"troubleshoot": {
"again": "再来一次",
"authStatusCommand": "您配置的 CLI 认证状态命令",
"checkLoggedIn": "- 检查它是否显示\"Logged in\"",
"click": "击",
"loginCommand": "运行时登录命令",
"logoutCommand": "运行时间登录命令",
"openTerminal": "打开终端并运行:",
"reloginPrefix": "如果上面写着登录但应用程序看不到的话,请试试:",
"sameRuntime": "确保您的终端中的 CLI 与应用程序使用的运行时相同",
"again": "再次",
"authStatusCommand": "您配置的 CLI 认证状态命令",
"checkLoggedIn": "- 检查是否显示“已登录”",
"click": "击",
"loginCommand": "运行时登录命令",
"logoutCommand": "运行时注销命令",
"openTerminal": "打开终端并运行",
"reloginPrefix": "如果显示已登录,但应用看不到它,请尝试:",
"sameRuntime": "确保终端中的 CLI 与应用使用的运行时相同",
"statusCacheHint": "- 有时状态会缓存几秒钟",
"then": "接下来"
"then": "然后"
},
"warnings": {
"multipleApiKeysMissing": "一个或多个提供者被设定为API密钥模式,但没有配置API密钥. 打开管理供应商以添加密钥或切换连接模式.",
"multipleApiKeysNeedAttention": "一个或多个提供者被设定为API密钥模式,需要关注. 打开管理供应商来审查保存的密钥或切换连接模式 。",
"notAuthenticated": "{{runtime}}已经安装,但您没有认证 。 团队提供和AI功能需要登录.",
"singleApiKeyMissing": "{{provider}}被设定为API密钥模式,但没有配置API密钥. 打开管理供应商以添加密钥或切换连接模式 。",
"singleApiKeyNeedsAttention": "{{provider}}设定为API密钥模式,但没有连接. 打开管理提供者来审查保存的密钥或切换连接模式 。"
"multipleApiKeysMissing": "一个或多个提供商设置为 API 密钥模式,但未配置 API 密钥。打开管理提供商以添加密钥或切换连接模式。",
"multipleApiKeysNeedAttention": "一个或多个提供商已设置为 API 密钥模式,需要引起注意。打开管理提供商以查看保存的密钥或切换连接模式。",
"notAuthenticated": "{{runtime}} 已安装,但您未经过认证。团队配置和 AI 功能需要登录。",
"singleApiKeyMissing": "{{provider}} 设置为 API 密钥模式,但未配置 API 密钥。打开管理提供商以添加密钥或切换连接模式。",
"singleApiKeyNeedsAttention": "{{provider}} 设置为 API 密钥模式,但未连接。打开管理提供商以查看保存的密钥或切换连接模式。"
}
},
"recentProjects": {
"selectFolderTitle": "选择工程文件夹",
"selectFolderTitle": "选择项目文件夹",
"selectFolder": "选择文件夹",
"failedToLoad": "装入工程失败",
"failedToLoad": "无法加载项目",
"retry": "重试",
"noProjects": "未找到工程",
"noMatches": "没有 {{query}}” 的匹配",
"noProjects": "未找到项目",
"noMatches": "没有匹配“{{query}}”",
"noRecentProjects": "未找到最近的项目",
"emptyDescription": "最近Claude和Codex的活动会在这里出现.",
"loadMore": "装入更多",
"emptyDescription": "最近的 Claude 和 Codex 活动将出现在这里。",
"loadMore": "加载更多",
"card": {
"deleted": "删除",
"projectFolderMissing": "项目文件夹不存在",
"deleted": "删除",
"projectFolderMissing": "项目文件夹存在",
"taskCounts": {
"active": "{{count}}活动",
"active_one": "{{count}}活动",
"active_other": "{{count}}活动",
"active_few": "{{count}}活动",
"active_many": "{{count}}活动",
"pending": "{{count}}待处理",
"pending_one": "{{count}}待处理",
"pending_other": "{{count}}待处理",
"pending_few": "{{count}}待处理",
"pending_many": "{{count}}待处理",
"done": "{{count}}已执行",
"done_one": "{{count}}已执行",
"done_other": "{{count}}已执行",
"done_few": "{{count}}已执行",
"done_many": "{{count}}已执行"
"active": "{{count}} 活跃",
"active_one": "{{count}} 活跃",
"active_other": "{{count}} 活跃",
"active_few": "{{count}} 活跃",
"active_many": "{{count}} 活跃",
"pending": "{{count}} 待定",
"pending_one": "{{count}} 待定",
"pending_other": "{{count}} 待定",
"pending_few": "{{count}} 待定",
"pending_many": "{{count}} 待定",
"done": "{{count}} 完成",
"done_one": "{{count}} 完成",
"done_other": "{{count}} 完成",
"done_few": "{{count}} 完成",
"done_many": "{{count}} 完成"
}
},
"title": "最近的项目",
"searchResults": "搜索结果",
"searchPlaceholder": "搜索项目..."
"searchPlaceholder": "搜索项目"
},
"actions": {
"selectTeam": "选择团队",
@ -182,16 +182,16 @@
"clearSearch": "清除搜索"
},
"windowsAdmin": {
"title": "建议使用 Windows 管理员模式",
"description": "OpenCode 运行时间检查可以在代理 Teams AI 没有提升时超时. 在启动 OpenCode 团队前以管理员身份重新启动应用程序 。"
"title": "推荐使用 Windows 管理员模式",
"description": "当 Agent Teams AI 未提升时OpenCode 运行时检查可能会超时。在启动 OpenCode 团队之前,使用以管理员身份运行重新启动应用。"
},
"webPreview": {
"title": "打开桌面应用程序以完整功能",
"description": "浏览器版本仍在开发中. 这里的项目行动、整合和现场状态更新可能有限。 使用桌面应用程序可靠地访问所有特性 。"
"title": "打开桌面应用获取完整功能",
"description": "浏览器版本仍在开发中。项目操作、集成和实时状态更新可能会受到限制。使用桌面应用可靠地访问所有功能。"
},
"updateBanner": {
"newVersionAvailable": "新版本可用",
"restartNow": "重新开始",
"viewDetails": "查看细节"
"restartNow": "立即重新启动",
"viewDetails": "查看详情"
}
}

View file

@ -1,3 +1,3 @@
{
"fallback": "出了点问题"
"fallback": "出了点问题"
}

View file

@ -2,62 +2,62 @@
"store": {
"actions": {
"addCustom": "添加自定义",
"openDashboard": "打开挂板",
"openDashboard": "打开控制台",
"refreshCatalog": "刷新目录"
},
"capabilities": {
"mcp": "磁共振:{{status}}",
"plugins": "插件: {{status}}",
"skills": "技能:{{status}}"
"mcp": "MCP{{status}}",
"plugins": "插件{{status}}",
"skills": "技能{{status}}"
},
"desktopOnly": "只有桌面应用程序可用 。",
"desktopOnly": "仅在桌面应用中可用。",
"provider": {
"checkingStatus": "正在检查提供者状态...",
"checkingStatus": "正在检查提供商状态…",
"connected": "已连接",
"loading": "正在装入...",
"loading": "加载中…",
"needsSetup": "需要设置",
"readyToConfigure": "准备配置",
"unsupported": "不支持"
},
"runtime": {
"checkingAvailabilityDescription": "扩展需要配置的运行时间来管理插件,MCP服务器,技能和供应商连接.",
"checkingAvailabilityTitle": "检查扩展运行时可用性",
"failedToStartDescription": "在运行时间通过启动健康检查之前,延长时间将被禁用。 打开Dash板修理或重新安装.",
"failedToStartTitle": "已找到配置的运行时间, 但启动失败",
"multimodelCapabilitiesDescription": "提供方的支持可因各节而异. 插件仅在运行时间明确宣布支持时显示 。",
"multimodelCapabilitiesTitle": "多模式运行时间能力",
"needsSignInDescription": "{{runtime}}被发现了{{version}},但插件安装被禁用,直到从Dashboard上签名.",
"checkingAvailabilityDescription": "扩展需要配置的运行时来管理插件、MCP 服务器、技能和提供商连接。",
"checkingAvailabilityTitle": "检查扩展运行时可用性",
"failedToStartDescription": "在运行时通过其启动运行状况检查之前,扩展将被禁用。打开控制台进行修复或重新安装。",
"failedToStartTitle": "已找到配置的运行时但启动失败",
"multimodelCapabilitiesDescription": "不同功能的提供商支持可能不同。仅当运行时明确声明支持时才会显示插件。",
"multimodelCapabilitiesTitle": "多模型运行时功能",
"needsSignInDescription": "找到了 {{runtime}}{{version}},但在您从控制台登录之前,插件安装将被禁用。",
"needsSignInTitle": "{{runtime}} 需要登录",
"notAvailableDescription": "扩展功能在运行时间安装之前被禁用. 打开Dash板安装并重试.",
"notAvailableTitle": "配置的运行时不可用",
"readyDescription": "插件可以从此页{{versionSuffix}}安装.",
"readyTitle": "{{runtime}}准备好",
"requiredForMutations": "安装或卸载扩展需要配置的运行时间. 从Dashboard上安装或修复."
"notAvailableDescription": "在安装运行时之前,扩展将被禁用。打开控制台进行安装并重试。",
"notAvailableTitle": "配置的运行时不可用",
"readyDescription": "可以从此页面安装插件 {{versionSuffix}}。",
"readyTitle": "{{runtime}}准备好",
"requiredForMutations": "安装或卸载扩展需要配置的运行时。从控制台安装或修复它。"
},
"sessionsRestartWarning": "运行会话在重新启动前不会接收扩展更改 。",
"sessionsRestartWarning": "正在运行的会话在重新启动之前不会获取扩展更改。",
"tabs": {
"apiKeys": {
"description": "在线服务的秘密密钥 。 在此添加它们, 这样插件, 服务器和集成可以连接和工作 。",
"label": "API 苏维埃社会主义共和国 键"
"description": "在线服务的密钥。将它们添加到此处,以便插件、服务器和集成可以连接和工作。",
"label": "API 密钥"
},
"mcpServers": {
"description": "连接到外部工具和应用程序 。 他们让运行时间读取数据或者做超过这个应用程序的行动.",
"label": "MCP 苏维埃社会主义共和国 服务器"
"description": "与外部工具和应用的连接。它们让运行时读取数据或执行此应用之外的操作。",
"label": "MCP 服务器"
},
"plugins": {
"description": "跑步时间加一点 在多模型模式中,当支持时,它们目前适用于Anthropic会话。 更广泛的提供者支助正在发展之中。",
"description": "运行时的小附加组件。在多模型模式下,它们当前适用于受支持的 Anthropic 会话。更广泛的提供商支持正在开发中。",
"label": "插件"
},
"skills": {
"description": "为普通工作准备的指令。 它们有助于运行时间更一致地处理可重复的任务.",
"description": "常见工作的现成说明。它们帮助运行时更一致地处理可重复的任务。",
"label": "技能"
}
},
"title": "扩展"
},
"pluginsPanel": {
"activeFilters": "{{count}}活动",
"browseByFit": "以适合方式浏览",
"activeFilters": "{{count}} 活跃",
"browseByFit": "按适合浏览",
"capabilities": "能力",
"categories": "类别",
"clearAllFilters": "清除所有过滤器",
@ -80,93 +80,93 @@
"plugins_other": "{{count}} 插件"
},
"empty": {
"description": "稍后检查新插件",
"filteredDescription": "尝试调整搜索或过滤标准",
"filteredTitle": "没有匹配过滤器的插件",
"description": "稍后回来查看新插件",
"filteredDescription": "尝试调整您的搜索或过滤条件",
"filteredTitle": "没有插件符合您的过滤器",
"title": "没有可用的插件"
},
"filterDescription": "按类别、或安装状态缩小目录。",
"installedOnly": "仅安装",
"providerSupportNotice": "目前只为Anthropic(克劳德)会议保证插件支持。 我们正在支持插件 跨所有代理。",
"resultsUpdateInstantly": "精炼过滤器时立即更新结果。",
"searchPlaceholder": "搜索插件...",
"selectedCount": "{{count}}选中",
"showing": "显示{{shown}}页:1{{total}}插件",
"filterDescription": "按类别、能或安装状态缩小目录范围。",
"installedOnly": "仅安装",
"providerSupportNotice": "目前仅保证 Anthropic (Claude) 会话的插件支持。我们正在努力支持所有智能体的插件。",
"resultsUpdateInstantly": "当您优化过滤器时,结果会立即更新。",
"searchPlaceholder": "搜索插件",
"selectedCount": "已选择 {{count}}",
"showing": "正在显示 {{shown}} / {{total}} 个插件",
"sort": {
"category": "类别",
"nameAsc": "名称 A-Z",
"nameDesc": "名字为Z - A级",
"popular": "大众"
"nameDesc": "名称 Z-A",
"popular": "受欢迎的"
},
"activeFilters_few": "{{count}}活动",
"activeFilters_many": "{{count}}活动",
"activeFilters_one": "{{count}}活动",
"activeFilters_other": "{{count}}活动",
"selectedCount_few": "{{count}}选中",
"selectedCount_many": "{{count}}选中",
"selectedCount_one": "{{count}}选中",
"selectedCount_other": "{{count}}选中"
"activeFilters_few": "{{count}} 活跃",
"activeFilters_many": "{{count}} 活跃",
"activeFilters_one": "{{count}} 活跃",
"activeFilters_other": "{{count}} 活跃",
"selectedCount_few": "已选择 {{count}}",
"selectedCount_many": "已选择 {{count}}",
"selectedCount_one": "已选择 {{count}}",
"selectedCount_other": "已选择 {{count}}"
},
"customMcp": {
"actions": {
"add": "添加",
"cancel": "取消",
"install": "安装",
"installing": "安装中..."
"installing": "正在安装…"
},
"description": "在没有目录的情况下手动添加服务器 。",
"description": "手动添加服务器,无需目录。",
"errors": {
"installFailed": "安装失败",
"invalidServerName": "无效的服务器名称 。 使用字母数字字符,破折号,下划线,点.",
"npmPackageRequired": "需要 npm 软件包名称",
"serverNameRequired": "需要服务器名称",
"serverUrlRequired": "需要服务器 URL"
"invalidServerName": "服务器名称无效。使用字母数字字符、破折号、下划线、点。",
"npmPackageRequired": "npm 包名是必需的",
"serverNameRequired": "服务器名称为必填项",
"serverUrlRequired": "服务器 URL 为必填项"
},
"fields": {
"environmentVariables": "环境变量",
"headers": "页眉",
"npmPackage": "npm 软件包",
"headers": "标头",
"npmPackage": "npm 包",
"scope": "范围",
"serverName": "服务器名称",
"serverUrl": "服务器 URL",
"serverUrl": "服务器地址",
"transport": "运输",
"transportType": "运输类型",
"versionOptional": "版本( 可选)"
"versionOptional": "版本(可选)"
},
"title": "添加自定义 MCP 服务器",
"transport": {
"httpSse": "ZXCVKEN0ZXCV / ZXCVTKEN1ZXCV",
"stdio": "Stdio (npm) (英语)."
"httpSse": "HTTP/SSE",
"stdio": "Stdio (npm)"
},
"placeholders": {
"headerName": "页眉 - Name",
"envVarName": "ENV_VAR_NAME 苏维埃社会主义共和国",
"headerName": "标头名称",
"envVarName": "ENV_VAR_NAME",
"serverName": "我的服务器",
"latest": "最新消息",
"latest": "最新",
"value": "价值",
"serverUrl": "https://api.example.com/mcp 苏维埃社会主义共和国"
"serverUrl": "https://api.example.com/mcp"
}
},
"mcpDetail": {
"auth": {
"remoteMayNeedHeaders": "远程 MCP服务器可能仍然需要自定义头或API密钥,即使登记册没有描述它们. 如果安装后连接失败, 请检查提供者 docs 。",
"required": "服务器需要认证"
"remoteMayNeedHeaders": "即使注册表没有描述,远程 MCP 服务器可能仍然需要自定义标头或 API 密钥。如果安装后连接失败,请检查提供商文档。",
"required": "服务器需要认证"
},
"diagnostics": {
"launchTarget": "发目标"
"launchTarget": "发目标"
},
"form": {
"autoFilled": "自动填充",
"environmentVariables": "环境变量",
"headers": "页眉",
"headers": "标头",
"scope": "范围",
"serverName": "服务器名称"
},
"install": {
"httpTransport": "HTTP: (英语).{{transport}}",
"manualSetupDescription": "此服务器需要手动设置 。 检查仓库以获取安装指令 。",
"httpTransport": "HTTP{{transport}}",
"manualSetupDescription": "该服务器需要手动设置。检查仓库以获取安装说明。",
"manualSetupRequired": "需要手动设置",
"npmPackage": "注:{{package}}",
"npmPackage": "npm: {{package}}",
"manage": "管理安装",
"install": "安装服务器"
},
@ -177,25 +177,25 @@
},
"metadata": {
"author": "作者",
"githubStars": "GitHub ",
"githubStars": "GitHub 星",
"hosting": "托管",
"installType": "安装类型",
"license": "许可证",
"published": "已出版",
"license": "执照",
"published": "已发表",
"source": "来源",
"updated": "更新",
"updated": "更新",
"version": "版本"
},
"scope": {
"local": "地",
"local": "地",
"project": "项目"
},
"tools": {
"title": "工具 ({{count}})",
"title_few": "工具 ({{count}})",
"title_many": "工具 ({{count}})",
"title_one": "工具 ({{count}})",
"title_other": "工具 ({{count}})"
"title": "工具{{count}}",
"title_few": "工具{{count}}",
"title_many": "工具{{count}}",
"title_one": "工具{{count}}",
"title_other": "工具{{count}}"
},
"placeholders": {
"serverName": "我的服务器"
@ -205,86 +205,86 @@
"actions": {
"cancel": "取消",
"createSkill": "创建技能",
"preparing": "准备...",
"reviewAndCreate": "审和创建",
"reviewAndSave": "查并保存",
"preparing": "正在准备…",
"reviewAndCreate": "审和创建",
"reviewAndSave": "并保存",
"saveSkill": "保存技能"
},
"advanced": {
"customDescription": "此技能使用自定义的标记下格式, 因此在此直接编辑 。",
"customTitle": "2. SKILL.md编辑器.",
"description": "大多数人可以跳过这个。 只有在您想要直接控制原始标记下文件时才打开 。",
"customDescription": "该技能使用自定义的 markdown 格式,所以直接在这里编辑。",
"customTitle": "2.SKILL.md 编辑器",
"description": "大多数人可以跳过这一点。仅当您想直接控制原始 Markdown 文件时才打开它。",
"hide": "隐藏高级编辑器",
"resetFromStructuredFields": "从结构化字段重置",
"show": "显示高级编辑器",
"title": "4.高级 SKILL.md 编辑器"
},
"basics": {
"description": "给这种技能一个明确的名字,选择谁可以使用它,并决定它应该住在哪里.",
"title": "1. 基本情况"
"description": "给这个技能一个清晰的名称,选择谁可以使用它,并决定它应该存在的位置。",
"title": "1. 基础知识"
},
"description": {
"create": "用简单的语言描述工作流程,审查将要创建的文件,然后保存它。",
"edit": "更新此技能, 审查由此产生的文件更改, 然后保存它 。"
"create": "用通俗易懂的语言描述工作流程,查看将创建的文件,然后保存。",
"edit": "更新此技能,查看生成的文件更改,然后保存。"
},
"extraFiles": {
"addedFiles": "添加的文件:",
"addedFiles": "添加的文件",
"assets": "资产",
"assetsDescription": "添加截图或捆绑的介质,前提是它们有助于解释工作流程.",
"description": "只有当支持文件、脚本或资产的技能确实需要时,才添加它们。",
"lockedForEdits": "根和文件夹已锁定用于编辑",
"optionalDescription": "添加将包含在审查中的启动文件,并与 `SKILL.md` 一起编写.",
"assetsDescription": "仅当屏幕截图或捆绑媒体有助于解释工作流程时才添加它们。",
"description": "仅当该技能确实需要时才添加支持文档、脚本或资产。",
"lockedForEdits": "根目录和文件夹已锁定以进行编辑",
"optionalDescription": "添加将包含在评论中并与“SKILL.md”一起编写的入门文件。",
"optionalTitle": "可选文件",
"references": "参考资料",
"referencesDescription": "添加支持文件、 链接或运行时可以查看的例。",
"references": "参考",
"referencesDescription": "添加运行时可以查看的支持文档、链接或示例。",
"scripts": "脚本",
"scriptsDescription": "添加帮助命令或设置注释. 在分享这种技能之前仔细审查。",
"scriptsDescription": "添加帮助命令或设置注释。在分享此技能之前请仔细查看。",
"title": "3. 额外文件"
},
"fields": {
"compatibility": "兼容性",
"description": "说明",
"description": "描述",
"folderName": "文件夹名称",
"folderNameHint": "我们从技能名称中自动提出这个建议,所以审查立即进行。",
"invocation": "应如何使用",
"license": "许可证",
"folderNameHint": "我们会根据技能名称自动建议此操作,以便立即进行审核。",
"invocation": "应如何使用",
"license": "执照",
"name": "技能名称",
"notes": "额外纸条或护栏",
"root": "在哪里储存",
"scope": "谁能用呢?",
"steps": "接下来的主要步骤",
"whenToUse": "什么时候才能找到这个"
"notes": "额外注释或护栏",
"root": "存放在哪里",
"scope": "谁可以使用它",
"steps": "需要遵循的主要步骤",
"whenToUse": "何时达到这个目标"
},
"instructions": {
"description": "这些章节为您生成技能文件, 因此您不需要编辑降标, 除非您想要 。",
"locked": "结构化字段被锁定,因为您切换到下面的手动`SKILL.md`编辑.",
"title": "2. 指示"
"description": "这些部分会为您生成技能文件,因此除非您愿意,否则不需要编辑 Markdown。",
"locked": "结构化字段被锁定因为您切换到下面的手动“SKILL.md”编辑。",
"title": "2. 使用说明"
},
"invocation": {
"auto": "可自动使用",
"manualOnly": "只有你要求的时候"
"auto": "可自动使用",
"manualOnly": "只有你要求的时候"
},
"placeholders": {
"description": "这种技巧能帮助什么",
"name": "写简洁的技巧名称",
"notes": "示例:列出缺失的测试,回归和风险假设.",
"steps": "1. 检查有关档案。\n2. 先解释主要风险。\n3. 提出最安全的解决办法。",
"whenToUse": "示例: 当任务为代码检讨或错误分类请求时使用此功能 。",
"license": "MIT 苏维埃社会主义共和国",
"compatibility": "圆形码,光标"
"description": "这项技能有什么帮助",
"name": "写出简洁的技能名称",
"notes": "示例:指出缺失的测试、回归和风险假设。",
"steps": "1.检查相关文件。 2、先说明主要风险。 3.提出最安全的修复建议。",
"whenToUse": "示例:当任务是代码审核或错误分类请求时使用此选项。",
"license": "麻省理工学院",
"compatibility": "Claude Code光标"
},
"review": {
"creating": "创技能",
"hint": "首先审查文件更改,然后在下一步确认保存 。",
"creating": "创技能",
"hint": "首先查看文件更改,然后在下一步中确认保存。",
"saving": "保存此技能"
},
"root": {
"codexOnly": "- 只有代码",
"codexOnly": "- 仅 Codex",
"shared": "- 共享"
},
"scope": {
"project": "项目:{{project}}",
"projectUnavailable": "无法执行的项目",
"project": "项目{{project}}",
"projectUnavailable": "项目不可用",
"user": "用户"
},
"title": {
@ -297,10 +297,10 @@
"cancel": "取消",
"delete": "删除",
"deleteSkill": "删除技能",
"deleting": "正在删除...",
"deleting": "正在删除",
"editSkill": "编辑技能",
"openFolder": "打开文件夹",
"openSkillFile": "打开 SKILL.md",
"openSkillFile": "打开技能.md",
"retry": "重试"
},
"badges": {
@ -308,75 +308,75 @@
"autoUse": "自动使用",
"hasScripts": "有脚本",
"manualUse": "手动使用",
"references": "参考资料",
"storedIn": "存放于{{root}}"
"references": "参考",
"storedIn": "存储在 {{root}} 中"
},
"deleteDialog": {
"description": "删除此技能并移动到回收站?",
"descriptionWithName": "删除\"{{name}}\"并将其移动到垃圾堆? 如果需要, 您可以稍后从回收站恢复它 。",
"title": "删除技能?"
"description": "删除该技能并将其移至垃圾箱?",
"descriptionWithName": "删除“{{name}}”并将其移至垃圾箱?如果需要,您可以稍后从“垃圾箱”中恢复它。",
"title": "删除技能"
},
"descriptionFallback": "检查发现了技能元数据和原始指令.",
"descriptionFallback": "检查发现的技能元数据和原始指令。",
"errors": {
"deleteFailed": "删除技能失败",
"loadFailed": "无法装入此技能 。"
"loadFailed": "无法加载该技能。"
},
"files": {
"advancedDetails": "高级文件细节",
"advancedDetails": "高级文件详细信息",
"assets": "资产",
"references": "参考资料",
"references": "参考",
"scripts": "脚本",
"storedAt": "存于"
"storedAt": "存于"
},
"includes": {
"assets": "资产",
"instructionsOnly": "只是技巧指导",
"references": "参考文献",
"instructionsOnly": "只是技能说明",
"references": "参考",
"scripts": "脚本"
},
"invocation": {
"auto": "匹配任务时自动运行。",
"manualOnly": "只有在你明确要求的时候才能跑"
"manualOnly": "仅当您明确要求时才运行。"
},
"issues": {
"bundledScripts": "此技能包括捆绑的脚本",
"reviewCarefully": "在使用之前仔细审查一下这个技能"
"bundledScripts": "该技能包括捆绑脚本",
"reviewCarefully": "使用此技能之前请仔细查看"
},
"loading": "正在装入技能细节...",
"loading": "正在加载技能详细信息…",
"scope": {
"personal": "你的个人",
"projectOnly": "只有这个项目"
"personal": "你的个人能",
"projectOnly": "仅此项目"
},
"summary": {
"howUsed": "如何使用",
"included": "怎么会这样",
"whoCanUse": "谁能用呢?"
"included": "附带什么",
"whoCanUse": "谁可以使用它"
},
"titleFallback": "技能细节"
"titleFallback": "技能详情"
},
"skillsPanel": {
"actions": {
"createSkill": "创建技能",
"import": "导入"
"import": "进口"
},
"badges": {
"assets": "资产",
"hasScripts": "有脚本",
"needsAttention": "需要注",
"references": "参考资料",
"storedIn": "存放于{{root}}"
"needsAttention": "需要",
"references": "参考",
"storedIn": "存储在 {{root}} 中"
},
"configuredRuntime": "配置的运行时",
"configuredRuntime": "配置的运行时",
"counts": {
"codexOnly": "{{count}} 苏维埃社会主义共和国 仅编码",
"codexOnly": "{{count}} 仅限 Codex",
"personal": "{{count}} 个人",
"project": "{{count}} 项目",
"shared": "共享 {{count}}",
"total": "{{count}}计",
"codexOnly_few": "{{count}} 苏维埃社会主义共和国 仅编码",
"codexOnly_many": "{{count}} 苏维埃社会主义共和国 仅编码",
"codexOnly_one": "{{count}} 苏维埃社会主义共和国 仅编码",
"codexOnly_other": "{{count}} 苏维埃社会主义共和国 仅编码",
"shared": "{{count}} 共享",
"total": "{{count}}计",
"codexOnly_few": "{{count}} 仅限 Codex",
"codexOnly_many": "{{count}} 仅限 Codex",
"codexOnly_one": "{{count}} 仅限 Codex",
"codexOnly_other": "{{count}} 仅限 Codex",
"personal_few": "{{count}} 个人",
"personal_many": "{{count}} 个人",
"personal_one": "{{count}} 个人",
@ -385,269 +385,269 @@
"project_many": "{{count}} 项目",
"project_one": "{{count}} 项目",
"project_other": "{{count}} 项目",
"shared_few": "共享 {{count}}",
"shared_many": "共享 {{count}}",
"shared_one": "共享 {{count}}",
"shared_other": "共享 {{count}}",
"total_few": "{{count}}计",
"total_many": "{{count}}计",
"total_one": "{{count}}计",
"total_other": "{{count}}计"
"shared_few": "{{count}} 共享",
"shared_many": "{{count}} 共享",
"shared_one": "{{count}} 共享",
"shared_other": "{{count}} 共享",
"total_few": "{{count}}计",
"total_many": "{{count}}计",
"total_one": "{{count}}计",
"total_other": "{{count}}计"
},
"empty": {
"noMatches": "没有与搜索相匹配的技能",
"noMatchesDescription": "尝试不同的搜索术语或切换过滤器 。",
"noMatches": "没有符合您搜索条件的技能",
"noMatchesDescription": "尝试不同的搜索词或切换过滤器。",
"noSkills": "还没有技能",
"noSkillsDescription": "创建您的第一个教授可重复工作流程的技能, 或者导入您已经使用的工作流程 。"
"noSkillsDescription": "创建您的第一项技能来教授可重复的工作流程,或导入您已经使用的技能。"
},
"filters": {
"all": "所有技能",
"codexOnly": "仅编码",
"codexOnly": "仅 Codex",
"hasScripts": "有脚本",
"needsAttention": "需要注",
"personal": "个人",
"needsAttention": "需要",
"personal": "个人",
"project": "项目",
"shared": "共享"
},
"hero": {
"codexAvailable": "使用 `.codex` 当一个技能应该只保留 Codex 时.",
"codexUnavailable": "现有的`.codex`技能在这里仍然可以编辑,但新的 Codex 唯一技能需要启用 Codex 运行时间.",
"description": "技能是可重复使用的指示,有助于运行时间更一致地处理同样的任务.",
"guidance": "将个人技能用于所有你想要的习惯。 将工程技能用于仅在一个代码库内讲得通的工作流程.",
"personalContext": "你现在只看到个人技能",
"projectContext": "您看到的是{{project}}的技能 加上您的个人技能。",
"codexAvailable": "当技能应仅适用于 Codex 时,请使用“.codex”。",
"codexUnavailable": "现有的“.codex”技能在此处保持可编辑状态但新的仅限 Codex 的技能需要启用 Codex 运行时。",
"description": "技能是可重用的指令,可帮助运行时更一致地处理同类任务。",
"guidance": "使用个人技能来养成你想要的随处习惯。将项目技能用于仅在一个代码库中有意义的工作流程。",
"personalContext": "您现在只能看到您的个人技能。",
"projectContext": "您正在看到 {{project}} 的技能以及您的个人技能。",
"title": "教授可重复的工作"
},
"invocation": {
"auto": "适合时自动运行",
"manualOnly": "只当您明确要求时运行"
"manualOnly": "仅在您明确要求时运行"
},
"loading": {
"loading": "正在装入技能...",
"refreshing": "刷新技能中..."
"loading": "技能加载中…",
"refreshing": "技能刷新…"
},
"runtimeAudience": "`.claude`,`.cursor`和`.agents`的共享技能可以提供给{{audience}}. 存储在`.codex`中的技能在 Codex 支持可用时只保留 Codex.",
"runtimeAudience": "{{audience}} 可以使用“.claude”、“.cursor”和“.agents”中的共享技能。当 Codex 支持可用时,存储在“.codex”中的技能仅适用于 Codex。",
"scope": {
"project": "这个项目",
"user": "个人"
"project": "项目",
"user": "个人"
},
"searchPlaceholder": "以技能名称或它能帮助什么搜索...",
"searchPlaceholder": "按技能名称或它的帮助进行搜索…",
"sections": {
"personal": {
"description": "随处可见你想要的卫生用品和指示",
"description": "您想要的习惯和说明随处可见。",
"title": "个人技能"
},
"project": {
"description": "只有这个密码库才有意义的工作流程。",
"description": "仅对此代码库有意义的工作流程。",
"title": "项目技能"
}
},
"sort": {
"label": "排序技",
"name": "",
"recent": "近期"
"label": "排序技",
"name": "名",
"recent": "最近的"
},
"status": {
"hasScripts": "包括脚本, 所以仔细审查",
"needsAttention": "依赖它之前需要注意",
"hasScripts": "包含脚本,请仔细查看",
"needsAttention": "依赖它之前需要注意",
"ready": "准备使用"
},
"success": {
"created": "技能创建成功。",
"imported": "成功导入技能 。",
"imported": "技能导入成功。",
"saved": "技能保存成功。"
}
},
"pluginDetail": {
"unknown": "未知",
"unknown": "未知",
"metadata": {
"author": "作者",
"category": "类别",
"source": "来源",
"version": "版本",
"capabilities": "能力",
"installs": "安装"
"installs": "安装"
},
"scope": {
"label": "范围:",
"label": "范围",
"options": {
"user": "用户( 全球)",
"project": "项目(分摊)",
"local": "当地( 被忽略)"
"user": "用户(全球)",
"project": "项目(共享)",
"local": "本地gitignored"
}
},
"links": {
"homepage": "主页",
"contact": "联系人"
"contact": "接触"
},
"readme": {
"loading": "正在装入 ZXCVTKEN0ZXCV...",
"empty": "没有ZXCVKEN0ZXCV。"
"loading": "正在加载自述文件…",
"empty": "没有可用的自述文件。"
}
},
"skillImport": {
"title": "导入技能",
"description": "选择一个已有的技能文件夹, 审查要复制的内容, 然后导入到您支持的技能位置 。",
"description": "选择一个现有技能文件夹,查看将复制的内容,然后将其导入到您支持的技能位置之一。",
"steps": {
"chooseFolder": {
"title": "1.选择技能文件夹",
"description": "此文件夹应该已经包含 `SKILL.md`, `Skill.md`, 或 `skill.md` 文件 。"
"description": "该文件夹应该已包含“SKILL.md”、“Skill.md”或“skill.md”文件。"
},
"location": {
"title": "2. 决定属于何处",
"description": "个人技能随处可见。 项目技能只为一个代码库出现."
"title": "2. 决定它所属的地方",
"description": "个人技能无处不在。项目技能仅针对一个代码库显示。"
}
},
"fields": {
"sourceFolder": "源文件夹",
"destinationFolderName": "目标文件夹名称",
"audience": "谁能用呢?",
"storage": "在哪里储存"
"audience": "谁可以使用它",
"storage": "存放在哪里"
},
"placeholders": {
"defaultFolderName": "源文件夹名称的默认值"
"defaultFolderName": "默认为源文件夹名称"
},
"actions": {
"browse": "浏览",
"cancel": "取消",
"preparing": "准备...",
"reviewAndImport": "审和导入",
"preparing": "正在准备…",
"reviewAndImport": "审和导入",
"importSkill": "导入技能",
"backToImport": "返回导入"
},
"scope": {
"user": "用户",
"project": "项目:{{project}}",
"projectUnavailable": "无法执行的项目"
"project": "项目{{project}}",
"projectUnavailable": "项目不可用"
},
"rootSuffix": {
"codexOnly": "- 只有代码",
"codexOnly": "- 仅 Codex",
"shared": "- 共享"
},
"reviewHint": "首先审查复制的文件,然后在下一步确认导入.",
"reviewHint": "首先检查复制的文件,然后在下一步中确认导入。",
"reviewLabel": "导入此技能",
"errors": {
"missingSkillFile": "此文件夹看起来还不是技能 。 它需要一个SKILL.md,Skill.md,或技能Md文件.",
"symbolicLinks": "此文件夹包含符号链接 。 导入真实文件而不是链接 。",
"tooManyFiles": "此技能文件夹太大, 无法同时导入 。 删除额外文件并再次尝试 。",
"tooLarge": "此技能文件夹太大, 无法安全导入 。 调整大资产,再试一次。",
"invalidFolderName": "用字母、数字、点、破折号或下划线选择一个更简单的目文件夹名称。",
"mustBeDirectory": "选择要导入的文件夹, 而不是一个文件 。",
"reviewFailed": "审查导入更改失败",
"importFailed": "导入技能失败"
"missingSkillFile": "这个文件夹看起来还不像技能。它需要 SKILL.md、Skill.md 或 skill.md 文件。",
"symbolicLinks": "该文件夹包含符号链接。导入真实文件而不是链接。",
"tooManyFiles": "该技能文件夹太大,无法一次导入。删除多余的文件并重试。",
"tooLarge": "该技能文件夹太大,无法安全导入。修剪大量资产并重试。",
"invalidFolderName": "使用字母、数字、点、破折号或下划线选择一个更简单的目文件夹名称。",
"mustBeDirectory": "选择要导入的文件夹,而不是单个文件。",
"reviewFailed": "无法审核导入更改",
"importFailed": "技能导入失败"
}
},
"mcpPanel": {
"sort": {
"nameAsc": "名称 A-Z",
"nameDesc": "名称 Z A",
"nameAsc": "名称 AZ",
"nameDesc": "名称 ZA",
"toolsDesc": "大多数工具"
},
"health": {
"title": "MCP 苏维埃社会主义共和国 健康状况",
"checkingViaRuntime": "通过{{runtime}}检查已安装的ZXVTOKEN0ZXCV服务器.",
"lastChecked": "上次选中的 {{time}}",
"description": "从此页面运行诊断,以验证已安装的MCP连接.",
"checking": "正在检查...",
"title": "MCP 健康状况",
"checkingViaRuntime": "通过 {{runtime}} 检查已安装的 MCP 服务器…",
"lastChecked": "最后检查 {{time}}",
"description": "从此页面运行诊断以验证已安装的 MCP 连接。",
"checking": "检查…",
"checkStatus": "检查状态"
},
"diagnostics": {
"title": "运行时 MCP 诊断",
"title": "运行时 MCP 诊断",
"serversCount": "{{count}} 服务器",
"serversCount_one": "{{count}} 服务器",
"serversCount_other": "{{count}} 服务器",
"waiting": "等待诊断结果...",
"waiting": "等待诊断结果",
"disableReasons": {
"checkingRuntimeStatus": "正在检查运行时间状态...",
"checkingRuntimeAvailability": "正在检查运行时间可用性...",
"runtimeFailedToStart": "已找到配置的运行时间, 但启动失败 。 打开Dash板进行修理或重新安装.",
"runtimeRequired": "需要配置的运行时间 。 从Dashboard上安装或修复."
"checkingRuntimeStatus": "正在检查运行时状态…",
"checkingRuntimeAvailability": "检查运行时可用性…",
"runtimeFailedToStart": "已找到配置的运行时,但启动失败。打开控制台进行修复或重新安装。",
"runtimeRequired": "需要配置的运行时。从控制台安装或修复它。"
},
"serversCount_few": "{{count}} 服务器",
"serversCount_many": "{{count}} 服务器"
},
"searchPlaceholder": "搜索 MCP 服务器...",
"searchPlaceholder": "搜索 MCP 服务器",
"runtime": {
"notAvailable": "{{runtime}}不详",
"notAvailable": "{{runtime}} 不可用",
"notInstalled": "{{runtime}} 未安装",
"requiredDescription": "MCP 健康检查要求{{runtime}}。去Dashboard安装或修复它。"
"requiredDescription": "MCP 运行状况检查需要 {{runtime}}。转至控制台进行安装或修复。"
},
"empty": {
"searchTitle": "未找到服务器",
"title": "没有可用的 MCP 服务器",
"searchDescription": "尝试不同的搜索词",
"description": "稍后检查新服务器"
"searchDescription": "尝试不同的搜索词",
"description": "稍后回来查看新服务器"
},
"loadMore": "装入更多"
"loadMore": "加载更多"
},
"apiKeys": {
"description": "安全存储 API 键,用于安装 MCP 服务器时自动填充.",
"description": "安全存储 API 密钥,以便在安装 MCP 服务器时自动填充。",
"storage": {
"osKeychain": "密钥通过{{backend}}加密,并以限制文件权限存储(只有所有者).",
"localEncryption": "OS 密钥链不可用 - 密钥在本地用 AES-256加密. 为了加强保护,安装密钥环服务(gnome-keyring,kwallet)."
"osKeychain": "密钥通过 {{backend}} 加密并以受限文件权限存储(仅限所有者)。",
"localEncryption": "操作系统钥匙串不可用 - 密钥使用 AES-256 在本地加密。为了获得更强的保护请安装密钥环服务gnome-keyring、kwallet"
},
"actions": {
"add": "添加 API 密钥",
"addFirst": "添加您的第一个密钥",
"addFirst": "添加您的第一把钥匙",
"edit": "编辑",
"copied": "复制!",
"copyEnvVarName": "复制环境变量名",
"copied": "复制",
"copyEnvVarName": "复制环境变量名",
"confirmDelete": "再次点击确认",
"delete": "删除"
},
"empty": {
"title": "没有保存 ZXCVKEN0ZXCV 密钥",
"description": "在安装 MCP 服务器时将密钥添加到自动填充环境变量中."
"title": "未保存 API 密钥",
"description": "安装 MCP 服务器时添加密钥以自动填充环境变量。"
},
"form": {
"addTitle": "添加 API 密钥",
"editTitle": "编辑 API 密钥",
"addDescription": "在MCP服务器安装中存储用于自动填充的API密钥.",
"editDescription": "更新关键细节 您必须重新输入值 。",
"keychainUnavailable": "OS 键链不可用 - 用 AES-256 本地加密的键. 为OS级保护安装 gnome- keyring 。",
"name": "",
"namePlaceholder": "例如,OpenAI生产",
"addDescription": "存储 API 密钥以便在 MCP 服务器安装中自动填充。",
"editDescription": "更新关键细节。您必须重新输入值。",
"keychainUnavailable": "操作系统钥匙串不可用 - 使用 AES-256 在本地加密的密钥。安装 gnome-keyring 以实现操作系统级别的保护。",
"name": "名",
"namePlaceholder": "例如 OpenAI 制作",
"environmentVariableName": "环境变量名称",
"envVarPlaceholder": "例如,OPENAI_API_KEY",
"value": "值",
"reenterValue": "重新输入密钥值",
"valuePlaceholder": "嘘...",
"envVarPlaceholder": "例如 OPENAI_API_KEY",
"value": "值",
"reenterValue": "重新输入值",
"valuePlaceholder": "sk-…",
"scope": "范围",
"userScopeLabel": "用户( 全球)",
"projectScopeLabel": "项目:{{project}}",
"projectUnavailable": "无法执行的项目",
"boundTo": "界于{{path}}",
"userScopeLabel": "用户(全球)",
"projectScopeLabel": "项目{{project}}",
"projectUnavailable": "项目不可用",
"boundTo": "绑定到 {{path}}",
"cancel": "取消",
"saving": "正在保存...",
"saving": "保存…",
"update": "更新",
"save": "保存",
"errors": {
"invalidEnvVarFormat": "用字母,数字,下划线 必须以字母或下划线开头 。",
"nameRequired": "需要名称",
"envVarRequired": "需要环境变量名称",
"invalidEnvVar": "无效的环境变量名称",
"valueRequired": "需要关键值",
"projectScopeRequiresProject": "工程范围 API 密钥需要运行中的项目",
"invalidEnvVarFormat": "使用字母、数字、下划线。必须以字母或下划线开头。",
"nameRequired": "姓名为必填项",
"envVarRequired": "环境变量名称为必填项",
"invalidEnvVar": "环境变量名称无效",
"valueRequired": "键值必填",
"projectScopeRequiresProject": "项目范围的 API 密钥需要一个活动项目",
"saveFailed": "保存失败"
}
}
},
"skillReview": {
"title": "审查技能变化",
"description": "{{reviewLabel}}先预览文件系统更改. 在下文确认之前,没有文字。",
"title": "查看技能变更",
"description": "{{reviewLabel}} 首先预览文件系统更改。在您确认以下内容之前,不会写入任何内容。",
"noPreview": "没有可用的预览。",
"confirmPromptPrefix": "查看下面的 diff, 然后使用",
"confirmPromptSuffix": "应用这些改。",
"confirmPromptPrefix": "查看下面的差异,然后使用",
"confirmPromptSuffix": "应用这些改。",
"noChanges": "尚未检测到文件更改。",
"binaryBadge": "二进制",
"binaryPreviewHidden": "未显示二进制文件预览 。 文件将被复制为-is 。",
"binaryPreviewHidden": "不显示二进制文件预览。文件将按原样复制。",
"summary": {
"fileChanges": "{{count}} 文件更改",
"fileChanges_one": "{{count}} 文件更改",
"fileChanges_other": "{{count}} 文件更改",
"new": "{{count}}",
"updated": "更新 {{count}}",
"removed": "{{count}}删除",
"new": "{{count}} 新",
"updated": "{{count}} 已更新",
"removed": "{{count}}删除",
"binary": "{{count}} 二进制",
"fileChanges_few": "{{count}} 文件更改",
"fileChanges_many": "{{count}} 文件更改"
@ -657,32 +657,32 @@
"toolsCount": "{{count}} 工具",
"toolsCount_one": "{{count}} 工具",
"toolsCount_other": "{{count}} 工具",
"envCount": "{{count}}内存",
"envCount_one": "{{count}} 掩体",
"envCount_other": "{{count}}内存",
"auth": "自动",
"byAuthor": "由{{author}}公司制作",
"envCount": "{{count}} 环境",
"envCount_one": "{{count}} 环境",
"envCount_other": "{{count}} 环境",
"auth": "授权",
"byAuthor": "通过 {{author}}",
"hosting": {
"remote": "远程",
"local": "地",
"both": "两"
"remote": "偏僻的",
"local": "地",
"both": "两个都"
},
"toolsCount_few": "{{count}} 工具",
"toolsCount_many": "{{count}} 工具",
"envCount_few": "{{count}}内存",
"envCount_many": "{{count}}内存",
"envCount_few": "{{count}} 环境",
"envCount_many": "{{count}} 环境",
"repository": "仓库",
"website": "网站"
},
"installButton": {
"installing": "安装中...",
"removing": "删除...",
"done": "写好了",
"installing": "正在安装…",
"removing": "正在删除…",
"done": "完毕",
"retry": "重试",
"uninstall": "卸载",
"install": "安装"
},
"pluginCard": {
"official": "官方"
"official": "官方"
}
}

View file

@ -1,31 +1,31 @@
{
"cost": {
"breakdownTitle": "成本细目(每100个令牌)",
"cacheRead": "缓存读",
"cacheWrite": "快取写入",
"cost": "费用",
"input": "入",
"noCommits": "无承诺",
"noLinesChanged": "无行更改",
"output": "出",
"parent": "父母:{{cost}}",
"parentCost": "父母费用",
"perCommit": "提交",
"perCommitFormula": "{{count}}总费用",
"perCommitFormula_few": "{{count}}总费用",
"perCommitFormula_many": "{{count}}总费用",
"perCommitFormula_one": "{{count}}总费用",
"perCommitFormula_other": "{{count}}总费用",
"perLineChanged": "每行变化",
"perLineFormula": "{{count}}项目",
"perLineFormula_few": "{{count}}线路",
"perLineFormula_many": "{{count}}线路",
"perLineFormula_one": "{{count}}项目",
"perLineFormula_other": "{{count}}线路",
"subagent": "副剂: {{cost}}",
"subagentCost": "亚剂费用",
"breakdownTitle": "成本明细(每 100 万个 Token",
"cacheRead": "缓存",
"cacheWrite": "缓存写入",
"cost": "成本",
"input": "入",
"noCommits": "没有提交",
"noLinesChanged": "没有改变行",
"output": "出",
"parent": "父级:{{cost}}",
"parentCost": "父级成本",
"perCommit": "每次提交",
"perCommitFormula": "总成本 ÷ {{count}} 提交",
"perCommitFormula_few": "总成本 ÷ {{count}} 提交",
"perCommitFormula_many": "总成本 ÷ {{count}} 提交",
"perCommitFormula_one": "总成本 ÷ {{count}} 提交",
"perCommitFormula_other": "总成本 ÷ {{count}} 提交",
"perLineChanged": "每行更改",
"perLineFormula": "总成本 ÷ {{count}} 行",
"perLineFormula_few": "总成本 ÷ {{count}} 行",
"perLineFormula_many": "总成本 ÷ {{count}} 行",
"perLineFormula_one": "总成本 ÷ {{count}} 行",
"perLineFormula_other": "总成本 ÷ {{count}} 行",
"subagent": "子智能体:{{cost}}",
"subagentCost": "子智能体成本",
"title": "成本分析",
"total": "计"
"total": "计"
},
"insights": {
"agent": "代理人",
@ -33,185 +33,185 @@
"agent_many": "代理人",
"agent_one": "代理人",
"agent_other": "代理人",
"agentTree": "代理树 ({{count}}) 代理树 ({{unit}})",
"background": "(背景情况)",
"agentTree": "智能体树 ({{count}} {{unit}})",
"background": "(后台)",
"bashCommands": "Bash 命令",
"outOfScopeFindings": "范围外调查结果({{count}})",
"outOfScopeFindings": "超出范围的调查结果 ({{count}})",
"questionsAsked": "提出的问题 ({{count}})",
"repeated": "重复",
"skillsInvoked": "被举报技能({{count}})",
"skillsInvoked": "调用的技能 ({{count}})",
"taskDispatches": "任务调度 ({{count}})",
"tasksCreated": "创建任务( {{count}})",
"tasksCreated": "创建任务 ({{count}})",
"teamMode": "团队模式",
"teams": "团队:{{teams}}",
"title": "会话透视",
"total": "计",
"unique": "独一无二",
"skillsInvoked_few": "被举报技能({{count}})",
"skillsInvoked_many": "被举报技能({{count}})",
"skillsInvoked_one": "被举报技能({{count}})",
"skillsInvoked_other": "被举报技能({{count}})",
"teams": "队伍:{{teams}}",
"title": "会话见解",
"total": "计",
"unique": "唯一",
"skillsInvoked_few": "调用的技能 ({{count}})",
"skillsInvoked_many": "调用的技能 ({{count}})",
"skillsInvoked_one": "调用的技能 ({{count}})",
"skillsInvoked_other": "调用的技能 ({{count}})",
"taskDispatches_few": "任务调度 ({{count}})",
"taskDispatches_many": "任务调度 ({{count}})",
"taskDispatches_one": "任务调度 ({{count}})",
"taskDispatches_other": "任务调度 ({{count}})",
"tasksCreated_few": "创建任务( {{count}})",
"tasksCreated_many": "创建任务( {{count}})",
"tasksCreated_one": "创建任务( {{count}})",
"tasksCreated_other": "创建任务( {{count}})",
"tasksCreated_few": "创建任务 ({{count}})",
"tasksCreated_many": "创建任务 ({{count}})",
"tasksCreated_one": "创建任务 ({{count}})",
"tasksCreated_other": "创建任务 ({{count}})",
"questionsAsked_few": "提出的问题 ({{count}})",
"questionsAsked_many": "提出的问题 ({{count}})",
"questionsAsked_one": "提出的问题 ({{count}})",
"questionsAsked_other": "提出的问题 ({{count}})",
"agentTree_few": "代理树 ({{count}}) 代理树 ({{unit}})",
"agentTree_many": "代理树 ({{count}}) 代理树 ({{unit}})",
"agentTree_one": "代理树 ({{count}}) 代理树 ({{unit}})",
"agentTree_other": "代理树 ({{count}}) 代理树 ({{unit}})",
"outOfScopeFindings_few": "范围外调查结果({{count}})",
"outOfScopeFindings_many": "范围外调查结果({{count}})",
"outOfScopeFindings_one": "范围外调查结果({{count}})",
"outOfScopeFindings_other": "范围外调查结果({{count}})",
"keyTakeaways": "关键外卖"
"agentTree_few": "智能体树 ({{count}} {{unit}})",
"agentTree_many": "智能体树 ({{count}} {{unit}})",
"agentTree_one": "智能体树 ({{count}} {{unit}})",
"agentTree_other": "智能体树 ({{count}} {{unit}})",
"outOfScopeFindings_few": "超出范围的调查结果 ({{count}})",
"outOfScopeFindings_many": "超出范围的调查结果 ({{count}})",
"outOfScopeFindings_one": "超出范围的调查结果 ({{count}})",
"outOfScopeFindings_other": "超出范围的调查结果 ({{count}})",
"keyTakeaways": "要点"
},
"quality": {
"chars": "字符",
"corrections": "惩戒",
"corrections": "修正",
"failed": "失败",
"fileReadRedundancy": "文件读取冗余",
"firstMessage": "第一消息",
"firstRun": "第一运行",
"firstMessage": "第一消息",
"firstRun": "第一运行",
"frictionRate": "摩擦率",
"lastRun": "次运行",
"messagesBeforeWork": "工作前的信件",
"lastRun": "最后一次运行",
"messagesBeforeWork": "开始工作前消息",
"passed": "通过",
"promptQuality": "提示质量",
"promptQuality": "提示质量",
"readsPerUniqueFile": "读取/唯一文件",
"snapshot": "简介",
"snapshot": "快照",
"snapshot_few": "快照",
"snapshot_many": "快照",
"snapshot_one": "简介",
"snapshot_one": "快照",
"snapshot_other": "快照",
"startupOverhead": "启动间接费用",
"testProgression": "测试进",
"startupOverhead": "启动开销",
"testProgression": "测试进",
"title": "质量信号",
"tokensBeforeWork": "工作前托肯斯语Name",
"totalReads": "读数共计",
"uniqueFiles": "独一无二的文件",
"userMessages": "用户信件",
"percentOfTotal": "占总数的百分比"
"tokensBeforeWork": "工作前的 Token",
"totalReads": "取次数",
"uniqueFiles": "唯一文件",
"userMessages": "用户消息",
"percentOfTotal": "占总数的%"
},
"tokens": {
"apiCalls": "API 苏维埃社会主义共和国 电话",
"apiCalls": "API 调用",
"cacheCreate": "缓存创建",
"cacheEfficiency": "缓存效率",
"cacheRead": "缓存读",
"cacheReadPct": "快取读取%",
"cacheRead": "缓存",
"cacheReadPct": "缓存读取率",
"coldStart": "冷启动",
"cost": "费用",
"input": "入",
"model": "",
"no": "没有",
"output": "出",
"readWriteRatio": "R/W比率",
"title": "用",
"total": "计",
"yes": ""
"cost": "成本",
"input": "入",
"model": "型",
"no": "",
"output": "出",
"readWriteRatio": "读/写比",
"title": "Token 使用",
"total": "计",
"yes": ""
},
"subagents": {
"title": "副剂",
"title": "子智能体",
"metrics": {
"count": "数",
"totalTokens": "共计",
"totalDuration": "期间共计",
"totalCost": "费用共计"
"count": "",
"totalTokens": "Token 总数",
"totalDuration": "总持续时间",
"totalCost": "总成本"
},
"table": {
"description": "说明",
"description": "描述",
"type": "类型",
"tokens": "",
"duration": "会期",
"cost": "费用"
"tokens": "Token",
"duration": "持续时间",
"cost": "成本"
}
},
"overview": {
"title": "概",
"yes": "",
"no": "没有",
"title": "概",
"yes": "",
"no": "",
"metrics": {
"duration": "会期",
"messages": "信件",
"contextUsage": "背景使用情况",
"duration": "持续时间",
"messages": "消息",
"contextUsage": "上下文使用",
"compactions": "压缩",
"branch": "",
"subagents": "副剂",
"branch": "分支",
"subagents": "子智能体",
"project": "项目",
"sessionId": "会话编号"
"sessionId": "会话 ID"
}
},
"timeline": {
"title": "时间线和活动( A)",
"title": "时间线与活动",
"idleAnalysis": "空闲分析",
"metrics": {
"idleGaps": "空闲差距",
"totalIdle": "闲置共计",
"activeTime": "活时间",
"idlePercent": "闲置%"
"idleGaps": "空闲间隙",
"totalIdle": "总空闲时间",
"activeTime": "活时间",
"idlePercent": "空闲率"
},
"modelSwitches": "型号开关({{count}})",
"modelSwitches_one": "型号开关({{count}})",
"modelSwitches_other": "型号开关({{count}})",
"messageNumber": "# 迈克 #{{number}}",
"keyEvents": "关键事件",
"modelSwitches_few": "型号开关({{count}})",
"modelSwitches_many": "型号开关({{count}})"
"modelSwitches": "模型切换({{count}}",
"modelSwitches_one": "模型切换({{count}}",
"modelSwitches_other": "模型切换({{count}}",
"messageNumber": "消息#{{number}}",
"keyEvents": "重要事件",
"modelSwitches_few": "模型切换({{count}}",
"modelSwitches_many": "模型切换({{count}}"
},
"tools": {
"title": "工具使用",
"summary": "{{formattedCount}} 跨越{{toolCount}}工具的总通话量",
"summary": "共 {{formattedCount}} 次调用,涵盖 {{toolCount}} 个工具",
"columns": {
"tool": "工具",
"calls": "电话",
"calls": "调用次数",
"errors": "错误",
"successPercent": "成功率(%)",
"health": "卫生"
"successPercent": "成功率",
"health": "健康状态"
}
},
"git": {
"title": "Git 活动",
"commits": "提交",
"pushes": "推",
"linesAdded": "添加的行数",
"linesRemoved": "删除行",
"branchesCreated": "创建分支"
"pushes": "推",
"linesAdded": "新增行数",
"linesRemoved": "删除",
"branchesCreated": "创建分支"
},
"friction": {
"title": "Friction 信号",
"rate": "滑动率:{{rate}}百分比(%)",
"correctionsCount": "{{count}}正",
"correctionsCount_one": "{{count}}正",
"corrections": "惩戒",
"thrashingSignals": "闪烁信号",
"repeatedBashCommands": "重复的巴什命令",
"reworkedFiles": "重修的文件( 3+编辑)",
"correctionsCount_few": "{{count}}正",
"correctionsCount_many": "{{count}}正",
"correctionsCount_other": "{{count}}正"
"title": "摩擦信号",
"rate": "摩擦率:{{rate}}%",
"correctionsCount": "{{count}}正",
"correctionsCount_one": "{{count}}正",
"corrections": "修正",
"thrashingSignals": "反复修改信号",
"repeatedBashCommands": "重复的 Bash 命令",
"reworkedFiles": "返工文件3 次以上编辑)",
"correctionsCount_few": "{{count}}正",
"correctionsCount_many": "{{count}}正",
"correctionsCount_other": "{{count}}正"
},
"errors": {
"title": "错误",
"permissionDenied": "拒绝权限",
"messageIndex": "# 迈克 #{{index}}",
"input": "入",
"permissionDenied": "权限被拒绝",
"messageIndex": "消息#{{index}}",
"input": "入",
"error": "错误",
"count": "{{count}} 错误",
"count_one": "{{count}} 错误",
"permissionDenialCount": "{{count}} 许可拒绝",
"permissionDenialCount_one": "{{count}} 许可被拒绝",
"permissionDenialCount": "{{count}} 权限拒绝次数",
"permissionDenialCount_one": "{{count}} 权限拒绝次数",
"count_few": "{{count}} 错误",
"count_many": "{{count}} 错误",
"count_other": "{{count}} 错误",
"permissionDenialCount_few": "{{count}} 许可拒绝",
"permissionDenialCount_many": "{{count}} 许可拒绝",
"permissionDenialCount_other": "{{count}} 许可拒绝"
"permissionDenialCount_few": "{{count}} 权限拒绝次数",
"permissionDenialCount_many": "{{count}} 权限拒绝次数",
"permissionDenialCount_other": "{{count}} 权限拒绝次数"
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1096,7 +1096,10 @@ export class AgentTeamsRuntimeProviderManagementCliClient implements RuntimeProv
if (process.platform === 'win32' && isOpenCodeNodeModulesSymlinkError(failure.message)) {
const profileId = extractProfileIdFromSymlinkError(failure.message);
if (profileId) {
const junctionReady = ensureOpenCodeProfileNodeModulesJunction(profileId, failure.message);
const junctionReady = ensureOpenCodeProfileNodeModulesJunction(
profileId,
failure.message
);
if (junctionReady) {
try {
const retryResult = await execCli(
@ -1116,7 +1119,8 @@ export class AgentTeamsRuntimeProviderManagementCliClient implements RuntimeProv
}
}
const retryResponse = extractJsonObjectFromError<RuntimeProviderManagementViewResponse>(error);
const retryResponse =
extractJsonObjectFromError<RuntimeProviderManagementViewResponse>(error);
if (retryResponse) {
return retryResponse;
}
@ -1176,7 +1180,10 @@ export class AgentTeamsRuntimeProviderManagementCliClient implements RuntimeProv
if (process.platform === 'win32' && isOpenCodeNodeModulesSymlinkError(failure.message)) {
const profileId = extractProfileIdFromSymlinkError(failure.message);
if (profileId) {
const junctionReady = ensureOpenCodeProfileNodeModulesJunction(profileId, failure.message);
const junctionReady = ensureOpenCodeProfileNodeModulesJunction(
profileId,
failure.message
);
if (junctionReady) {
try {
const retryResult = await execCli(

View file

@ -21,9 +21,7 @@
* - synthetic assistant messages (model='<synthetic>')
*/
import {
HARD_NOISE_TAGS,
} from '@main/constants/messageTags';
import { HARD_NOISE_TAGS } from '@main/constants/messageTags';
import { LocalFileSystemProvider } from '@main/services/infrastructure/LocalFileSystemProvider';
import { type ChatHistoryEntry, type ContentBlock } from '@main/types';
import { createLogger } from '@shared/utils/logger';

View file

@ -181,10 +181,7 @@ export class SubagentResolver {
}
private isAuthoredUserMessage(message: ParsedMessage): boolean {
return (
isHumanAuthoredParsedUserMessage(message) ||
isDisplayableTeammateProtocol(message)
);
return isHumanAuthoredParsedUserMessage(message) || isDisplayableTeammateProtocol(message);
}
private extractUserText(message: ParsedMessage): string {

View file

@ -405,7 +405,10 @@ export function buildDisplayItemsFromMessages(
// Check for teammate messages (non-meta user messages with <teammate-message> content)
// One user message may contain multiple <teammate-message> blocks
if (msg.type === 'user' && (isHumanAuthoredUserTurn(msg) || isDisplayableTeammateProtocol(msg))) {
if (
msg.type === 'user' &&
(isHumanAuthoredUserTurn(msg) || isDisplayableTeammateProtocol(msg))
) {
const rawText =
typeof msg.content === 'string'
? msg.content

View file

@ -66,9 +66,7 @@ export function classifyUserTurnProvenance(
return originKind;
}
const legacyProtocolKind = classifyLegacyProtocolText(
getTextContent(getMessageContent(message))
);
const legacyProtocolKind = classifyLegacyProtocolText(getTextContent(getMessageContent(message)));
if (legacyProtocolKind) {
return legacyProtocolKind;
}
@ -97,9 +95,7 @@ export function isSyntheticReplayNoise(message: UserTurnProvenanceInput): boolea
);
}
export function isDisplayableTeammateProtocol(
message: UserTurnProvenanceInput
): boolean {
export function isDisplayableTeammateProtocol(message: UserTurnProvenanceInput): boolean {
return (
classifyUserTurnProvenance(message) === 'teammate-protocol' &&
message.isMeta !== true &&
@ -149,9 +145,7 @@ function normalizeOriginKind(
}
}
function classifyLegacyProtocolText(
text: string | undefined
): UserTurnProvenanceKind | undefined {
function classifyLegacyProtocolText(text: string | undefined): UserTurnProvenanceKind | undefined {
if (!text) {
return undefined;
}
@ -215,9 +209,7 @@ function hasSystemOutputContent(content: unknown): boolean {
Array.isArray(content) &&
content.some(
(block) =>
isContentBlock(block) &&
block.type === 'text' &&
startsWithSystemOutputTag(block.text)
isContentBlock(block) && block.type === 'text' && startsWithSystemOutputTag(block.text)
)
);
}