improvement(i18n): Improve Simplified Chinese localization quality Merge pull request #200 from CharAznable98/main
Improve Simplified Chinese localization quality
This commit is contained in:
commit
3b933058c6
52 changed files with 4192 additions and 3132 deletions
15
.github/codeql/codeql-config.yml
vendored
Normal file
15
.github/codeql/codeql-config.yml
vendored
Normal 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
67
.github/workflows/codeql.yml
vendored
Normal 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 }}
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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
1
landing/.gitignore
vendored
|
|
@ -5,6 +5,7 @@ node_modules
|
|||
.env
|
||||
--host/
|
||||
product-docs/.vitepress/dist/
|
||||
product-docs/.vitepress/cache/
|
||||
|
||||
# Large video files
|
||||
public/video/*.mp4
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
@media (max-width: 360px) {
|
||||
.cyber-hero__title {
|
||||
font-size: 2.1rem;
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
"private": true,
|
||||
"type": "module",
|
||||
"engines": {
|
||||
"node": ">=24.16.0 <25"
|
||||
"node": ">=24.15.0 <25"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "nuxt dev",
|
||||
|
|
|
|||
|
|
@ -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/" },
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
108
landing/product-docs/guide/beginner-workflow.md
Normal file
108
landing/product-docs/guide/beginner-workflow.md
Normal 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).
|
||||
111
landing/product-docs/guide/create-first-team.md
Normal file
111
landing/product-docs/guide/create-first-team.md
Normal 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).
|
||||
88
landing/product-docs/guide/review-and-approve.md
Normal file
88
landing/product-docs/guide/review-and-approve.md
Normal 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.
|
||||
100
landing/product-docs/guide/run-and-monitor-work.md
Normal file
100
landing/product-docs/guide/run-and-monitor-work.md
Normal 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).
|
||||
|
|
@ -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." />
|
||||
|
|
|
|||
109
landing/product-docs/ru/guide/beginner-workflow.md
Normal file
109
landing/product-docs/ru/guide/beginner-workflow.md
Normal 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).
|
||||
112
landing/product-docs/ru/guide/create-first-team.md
Normal file
112
landing/product-docs/ru/guide/create-first-team.md
Normal 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).
|
||||
89
landing/product-docs/ru/guide/review-and-approve.md
Normal file
89
landing/product-docs/ru/guide/review-and-approve.md
Normal 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.
|
||||
101
landing/product-docs/ru/guide/run-and-monitor-work.md
Normal file
101
landing/product-docs/ru/guide/run-and-monitor-work.md
Normal 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).
|
||||
|
|
@ -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 видны в одном рабочем пространстве." />
|
||||
|
|
|
|||
15
landing/product-docs/tsconfig.json
Normal file
15
landing/product-docs/tsconfig.json
Normal 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"]
|
||||
}
|
||||
12
landing/public/docs/index.html
Normal file
12
landing/public/docs/index.html
Normal 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>
|
||||
12
landing/public/docs/ru/index.html
Normal file
12
landing/public/docs/ru/index.html
Normal 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>
|
||||
BIN
landing/public/screenshots/guides/code-review-annotated.png
Normal file
BIN
landing/public/screenshots/guides/code-review-annotated.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 378 KiB |
BIN
landing/public/screenshots/guides/create-team-annotated.png
Normal file
BIN
landing/public/screenshots/guides/create-team-annotated.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 422 KiB |
BIN
landing/public/screenshots/guides/task-board-annotated.png
Normal file
BIN
landing/public/screenshots/guides/task-board-annotated.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.2 MiB |
BIN
landing/public/screenshots/guides/task-detail-annotated.png
Normal file
BIN
landing/public/screenshots/guides/task-detail-annotated.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 448 KiB |
BIN
landing/public/screenshots/product-preview.jpg
Normal file
BIN
landing/public/screenshots/product-preview.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 322 KiB |
|
|
@ -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")}
|
||||
|
|
|
|||
|
|
@ -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
29
landing/utils/docsUrl.ts
Normal 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/'}`;
|
||||
}
|
||||
|
|
@ -48,6 +48,6 @@
|
|||
"vitest": "^3.1.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=24.16.0 <25"
|
||||
"node": ">=24.15.0 <25"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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": {
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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}} 失败启动健康检查.",
|
||||
"configuredNotFound": "未找到配置的 {{runtime}} 。",
|
||||
"foundButFailed": "发现 {{runtime}} 失败启动",
|
||||
"healthCheckFailedDescription": "该应用程序发现了配置的{{runtime}},但其启动健康检查失败. 修理或重新安装,然后重试。",
|
||||
"configuredHealthCheckFailed": "配置的 {{runtime}} 启动运行状况检查失败。",
|
||||
"configuredNotFound": "未找到配置的 {{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": "查看详情"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
{
|
||||
"fallback": "出了点问题"
|
||||
"fallback": "出了点问题。"
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -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}})",
|
||||
"questionsAsked": "提出的问题({{count}})",
|
||||
"outOfScopeFindings": "超出范围的调查结果 ({{count}})",
|
||||
"questionsAsked": "提出的问题 ({{count}})",
|
||||
"repeated": "重复",
|
||||
"skillsInvoked": "被举报技能({{count}})",
|
||||
"taskDispatches": "任务调度({{count}})",
|
||||
"tasksCreated": "创建的任务( {{count}})",
|
||||
"skillsInvoked": "调用的技能 ({{count}})",
|
||||
"taskDispatches": "任务调度 ({{count}})",
|
||||
"tasksCreated": "已创建任务 ({{count}})",
|
||||
"teamMode": "团队模式",
|
||||
"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}})",
|
||||
"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": "关键外卖"
|
||||
"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}})",
|
||||
"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": "要点"
|
||||
},
|
||||
"quality": {
|
||||
"chars": "字符",
|
||||
"corrections": "惩戒",
|
||||
"corrections": "修正",
|
||||
"failed": "失败",
|
||||
"fileReadRedundancy": "文件读取冗余",
|
||||
"firstMessage": "第一个消息",
|
||||
"firstRun": "第一个运行",
|
||||
"firstMessage": "第一条消息",
|
||||
"firstRun": "第一次运行",
|
||||
"frictionRate": "摩擦率",
|
||||
"lastRun": "上次运行",
|
||||
"messagesBeforeWork": "工作前的信件",
|
||||
"lastRun": "最后一次运行",
|
||||
"messagesBeforeWork": "开始工作前消息",
|
||||
"passed": "通过",
|
||||
"promptQuality": "提示质量",
|
||||
"readsPerUniqueFile": "读取/ 唯一文件",
|
||||
"snapshot": "简介",
|
||||
"promptQuality": "提示词质量",
|
||||
"readsPerUniqueFile": "读取/唯一文件",
|
||||
"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": "{{count}} 错误",
|
||||
"count_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": "{{count}} 权限拒绝次数",
|
||||
"permissionDenialCount_one": "{{count}} 权限拒绝次数",
|
||||
"count_few": "{{count}} 错误",
|
||||
"count_many": "{{count}} 错误",
|
||||
"count_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
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue