diff --git a/AGENT_CRITICAL_GUARDRAILS.md b/AGENT_CRITICAL_GUARDRAILS.md new file mode 100644 index 00000000..653c8983 --- /dev/null +++ b/AGENT_CRITICAL_GUARDRAILS.md @@ -0,0 +1,13 @@ +# Agent Critical Guardrails + +These are the hard rules to keep agent work predictable and safe in this repo. + +- Read `CLAUDE.md` first, then follow `docs/FEATURE_ARCHITECTURE_STANDARD.md` for new medium and large features. +- Use `pnpm` for project commands. Do not switch to `npm` or `yarn`. +- Do not run `pnpm lint:fix` unless the user explicitly asks for broad formatting changes. +- Keep main, preload, renderer, and shared responsibilities separate. +- Use `wrapAgentBlock(text)` instead of manually concatenating agent block markers. +- Preserve task/subagent filtering, structured task refs, and message parsing semantics. +- Validate IPC and other main-process inputs defensively and fail gracefully. +- Treat `docs/team-management/debugging-agent-teams.md` as the first stop for team launch hangs, bootstrap issues, or missing teammate replies. +- Do not revert unrelated user changes or other agents' edits. diff --git a/CLAUDE.md b/CLAUDE.md index bd649074..adf58968 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -28,6 +28,7 @@ Always use pnpm (not npm/yarn) for this project. Workspace membership is canonical in `pnpm-workspace.yaml`; do not re-add root `package.json.workspaces`, because npm subproject installs in Codex Cloud must treat nested packages as standalone projects. Do NOT run `pnpm lint:fix` unless the user explicitly asks for it — it interferes with agents running in parallel. When running build/typecheck/test commands, pipe through `tail -20` to avoid flooding the context window (e.g. `pnpm typecheck 2>&1 | tail -20`). +- Hard guardrails: [`AGENT_CRITICAL_GUARDRAILS.md`](AGENT_CRITICAL_GUARDRAILS.md) - `pnpm install` - Install dependencies - `pnpm dev` - Dev server with hot reload diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 1def1283..a31e368f 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -6,7 +6,72 @@ The format is based on Keep a Changelog and this project follows Semantic Versio ## [Unreleased] -## [1.0.0] - 2026-03-19 +## [1.2.0] - 2026-03-31 + +### Added + +- Agent Graph with real-time force-directed visualization, kanban task layout, animated message particles, member hexagons with avatars, and cross-team ghost nodes. +- Per-team tool approval controls with readable permission prompts and interactive AskUserQuestion buttons. +- Task comment notifications. + +### Changed + +- Team page performance with many tasks. +- Team provisioning visibility on the team screen. +- Default action mode switched to `delegate` so the lead coordinates instead of executing. +- Skip pre-flight CLI check button in launch/create dialogs. +- MCP config moved from `/tmp` to `userData` with cleanup on spawn failures. +- Task change presence tracking overhaul. +- Session label formatting and session item display improvements. +- Update dialog layout cleanup. +- Auto-approve banner softened from warning to info styling. +- macOS title bar drag area improvements. + +### Fixed + +- Tool approval sheet hooks ordering crash. +- Auto-approve reset when launching with manual approval. +- `Allow all` and Settings panel targeting the wrong team. +- AskUserQuestion Enter key bypass and edge cases. +- Updater installing non-newer versions and showing updates for unavailable platforms. +- Permission request deduplication across all entry paths. +- Renderer IPC sends during crash recovery. +- Standalone mode without Electron. +- Sanitized inline HTML in markdown rendering. + +## [1.1.0] - 2026-03-25 + +### Added + +- React 19 + Electron 40 migration. +- User-initiated task starts from the kanban board. +- Auth troubleshooting guide in the CLI status banner. +- Syntax highlighting for R, Ruby, PHP, and SQL code blocks. +- Collapsible output sections in tool results with markdown preview toggle. +- Styled `@`-mentions in task comments with colored member badges. +- Worktree-based projects detected on the dashboard. + +### Changed + +- 3x faster transcript search with optimized plain text matching. +- Single-pass message processing replaces multiple filter passes. +- Protocol noise filtering hides raw idle and teammate messages from lead thoughts. +- Improved kanban column styling with colored headers and subtle body tints. +- Teams sorted by last activity with alphabetical fallback. +- Dynamic member colors in the Add Members dialog. + +### Fixed + +- Cost overcounting from duplicate request ID tracking. +- WSL mount path translation and Windows drive letter normalization. +- Sidebar repo and branch state not syncing when switching tabs. +- CLI auth detection with non-default config paths. +- XSS vulnerability via unsanitized inline HTML in markdown. +- Standalone mode crash without Electron environment. +- Stale sessions incorrectly shown as ongoing after 5 minutes of inactivity. +- Incorrect error message when attaching files to offline team lead. + +## [1.0.0] - 2026-03-23 Initial public release. diff --git a/docs/FEATURE_ARCHITECTURE_STANDARD.md b/docs/FEATURE_ARCHITECTURE_STANDARD.md index 4154d02e..f48d0d93 100644 --- a/docs/FEATURE_ARCHITECTURE_STANDARD.md +++ b/docs/FEATURE_ARCHITECTURE_STANDARD.md @@ -16,18 +16,24 @@ This document defines the default architecture for medium and large features in ```text src/features// + index.ts contracts/ + index.ts core/ domain/ application/ main/ + index.ts composition/ + application/ adapters/ input/ output/ infrastructure/ preload/ + index.ts renderer/ + index.ts ``` Use this template by default when a feature: @@ -37,8 +43,29 @@ Use this template by default when a feature: - needs its own transport bridge or integration surface - is expected to grow with new providers, sources, or presentation flows +`index.ts` and `main/application/` are optional. Add them only when they have a +clear public or runtime-orchestration role. + ## Layer Responsibilities +### `index.ts` + +Optional root public barrel for the feature. + +Use it for: + +- stable type re-exports from `contracts/` +- small pure facades that are intentionally shared across layers +- feature factories when the root barrel is intentionally main-owned and + imported only from main-process code + +Not allowed: + +- accidental wildcard exports from implementation folders +- mixing browser-safe exports with main-only exports without making process + ownership obvious +- replacing the layer entrypoints when callers need a process-specific surface + ### `contracts/` Cross-process public API for the feature. @@ -113,6 +140,24 @@ Responsibilities: - translate transport input into use case calls - keep transport concerns out of use cases +### `main/application/` + +Optional main-process application services. + +Use this only when code is too runtime-aware for `core/application`, but is not a +transport adapter or low-level infrastructure helper. + +Examples: + +- main-only readers that orchestrate runtime services +- process-aware tracking or coordination helpers + +Not allowed: + +- IPC or HTTP handler registration +- renderer or preload dependencies +- pure domain policy that belongs in `core/domain` + ### `main/adapters/output/` Driven adapters that implement application ports. @@ -185,12 +230,16 @@ Responsibilities: Outside the feature, import only: +- `@features/` when the feature owns a deliberate root public barrel - `@features//contracts` - `@features//main` - `@features//preload` - `@features//renderer` Do not deep-import feature internals from app shell or from other features. +Layer entrypoints should be explicit `index.ts` files that export only supported +surface area. Focused tests may import internals when they are testing that unit +directly, but production integration code should not. ### Core isolation @@ -207,8 +256,11 @@ Do not deep-import feature internals from app shell or from other features. `core/application` must not import: -- `main/*` -- `renderer/*` +- `@features//main/**` +- `@features//renderer/**` +- `@main/*` +- `@renderer/*` +- `@preload/*` - Electron APIs - Fastify - child process modules @@ -266,16 +318,35 @@ If the feature still owns meaningful pure semantics or projection rules, keep `core/` and skip only the process layers you do not need. Example: + - `src/features/agent-graph` keeps `core/domain` and `renderer`, but does not add fake `main/` or `preload/` folders because the transport boundary lives elsewhere. + +## Current Feature Shape Examples + +Use these local examples before inventing a new variant: + +- `src/features/recent-projects` - full cross-process reference with + `contracts`, `core`, `main`, `preload`, and `renderer`. +- `src/features/member-work-sync` - full cross-process feature with a root + public barrel and broader main-process infrastructure. +- `src/features/member-log-stream` - full cross-process feature that uses + `main/application/` for main-only runtime orchestration. +- `src/features/agent-graph` - thin renderer integration with `core/domain` and + `renderer`, no fake process layers. +- `src/features/codex-model-catalog` and `src/features/team-runtime-lanes` - + process-limited features that omit renderer or preload layers when they do not + own that boundary. + ## Definition Of Done For A Reference Feature A feature is reference-quality when: -- structure matches the canonical template +- structure matches the full or thin template chosen for the feature - core is side-effect free - app shell imports only public entrypoints - renderer UI is dumb and presentational -- at least the main domain and application rules are tested +- at least the main domain and application rules are tested when those layers + exist - architecture is enforced by lint rules - feature has a concise standard or plan doc if it introduces a new pattern diff --git a/docs/RELEASE.md b/docs/RELEASE.md index 3fce2e34..49e262a1 100644 --- a/docs/RELEASE.md +++ b/docs/RELEASE.md @@ -8,7 +8,7 @@ Agent Graph, per-team tool approval, interactive AskUserQuestion, task comment n Minor release: React 19 + Electron 40 migration, start-task-by-user, auth troubleshooting guide, syntax highlighting for R/Ruby/PHP/SQL, search performance improvements, cost tracking accuracy, WSL/Windows path fixes. Full list: [CHANGELOG.md](./CHANGELOG.md). -## Published: v1.0.0 (2026-03-19) +## Published: v1.0.0 (2026-03-23) Initial release: Agent Teams with reliable CLI detection in packaged builds (shell PATH/HOME, `CLAUDE_CONFIG_DIR`, auth output parsing), IPC status cache handling, concurrent binary resolution, capped NDJSON diagnostics. Full list: [CHANGELOG.md](./CHANGELOG.md). @@ -37,23 +37,23 @@ First stable build: CLI/auth reliability in packaged apps, IPC hardening, and pl
- + macOS Apple Silicon
- + macOS Intel
- + Windows
May trigger SmartScreen — click "More info" → "Run anyway"
- + Linux AppImage
diff --git a/docs/claude-multimodel-integration-plan.md b/docs/claude-multimodel-integration-plan.md index e4d983bd..9cfda67d 100644 --- a/docs/claude-multimodel-integration-plan.md +++ b/docs/claude-multimodel-integration-plan.md @@ -384,38 +384,29 @@ Each row may show: ## Launch Flow Changes Current launch flow already supports a team-level `model`. -Current UI also already has a provider affordance in [TeamModelSelector.tsx](../../src/renderer/components/team/dialogs/TeamModelSelector.tsx), but its logic is still placeholder/coming-soon. That placeholder currently uses `openai`; it should be normalized or mapped to the app-level provider id `codex` during implementation. +Current UI already has a provider affordance in [TeamModelSelector.tsx](../src/renderer/components/team/dialogs/TeamModelSelector.tsx). The remaining work is to keep provider/model normalization consistent across all launch surfaces. Current code paths that must be kept in sync: -- shared types in [team.ts](../../src/shared/types/team.ts) -- HTTP launch parsing in [teams.ts](../../src/main/http/teams.ts) -- IPC launch/create validation in [teams.ts](../../src/main/ipc/teams.ts) -- persisted draft metadata in [TeamMetaStore.ts](../../src/main/services/team/TeamMetaStore.ts) -- scheduled one-shot config in [schedule.ts](../../src/shared/types/schedule.ts) -- scheduled execution in [ScheduledTaskExecutor.ts](../../src/main/services/schedule/ScheduledTaskExecutor.ts) -- provider/model UI helpers in [TeamModelSelector.tsx](../../src/renderer/components/team/dialogs/TeamModelSelector.tsx) -- model display parsing in [modelParser.ts](../../src/shared/utils/modelParser.ts) -- launch dialog state persistence in [LaunchTeamDialog.tsx](../../src/renderer/components/team/dialogs/LaunchTeamDialog.tsx) -- create dialog state persistence in [CreateTeamDialog.tsx](../../src/renderer/components/team/dialogs/CreateTeamDialog.tsx) -- saved draft restore in [teams.ts](../../src/main/ipc/teams.ts) +- shared types in [team.ts](../src/shared/types/team.ts) +- HTTP launch parsing in [teams.ts](../src/main/http/teams.ts) +- IPC launch/create validation in [teams.ts](../src/main/ipc/teams.ts) +- persisted draft metadata in [TeamMetaStore.ts](../src/main/services/team/TeamMetaStore.ts) +- scheduled one-shot config in [schedule.ts](../src/shared/types/schedule.ts) +- scheduled execution in [ScheduledTaskExecutor.ts](../src/main/services/schedule/ScheduledTaskExecutor.ts) +- provider/model UI helpers in [TeamModelSelector.tsx](../src/renderer/components/team/dialogs/TeamModelSelector.tsx) +- model display parsing in [modelParser.ts](../src/shared/utils/modelParser.ts) +- launch dialog state persistence in [LaunchTeamDialog.tsx](../src/renderer/components/team/dialogs/LaunchTeamDialog.tsx) +- create dialog state persistence in [CreateTeamDialog.tsx](../src/renderer/components/team/dialogs/CreateTeamDialog.tsx) +- saved draft restore in [teams.ts](../src/main/ipc/teams.ts) - launch param persistence in the renderer store -- slash-command metadata in [slashCommands.ts](../../src/shared/utils/slashCommands.ts) +- slash-command metadata in [slashCommands.ts](../src/shared/utils/slashCommands.ts) -Next step is to extend launch requests to include provider selection: +Launch requests already carry provider selection. The remaining work is to keep request parsing, persistence, and runtime selection consistent. Future-compatible provider options can look like this: ```ts interface TeamLaunchRequest { - providerId?: 'anthropic' | 'codex'; - model?: string; -} -``` - -Future-compatible extension for providers with internal backend preference: - -```ts -interface TeamLaunchRequest { - providerId?: 'anthropic' | 'codex' | 'gemini'; + providerId?: TeamProviderId; model?: string; providerOptions?: { geminiBackendPreference?: 'auto' | 'api' | 'cli'; @@ -444,9 +435,9 @@ Future-compatible shape: ```ts interface TeamLaunchRequest { - providerId?: 'anthropic' | 'codex'; + providerId?: TeamProviderId; model?: string; - memberProviders?: Record; + memberProviders?: Record; memberModels?: Record; } ``` @@ -793,7 +784,7 @@ This phase must explicitly define the child-process env mapping for provider sel It must also persist launch-time `providerId` alongside `model` in team/run metadata so existing runs remain inspectable after refresh. It must update both the interactive team runtime path and the scheduler one-shot path. -Phase 4 should also explicitly hide or keep disabled unsupported placeholder providers in `TeamModelSelector` until their runtime support actually exists. In Phase 1/2/3, only `Anthropic` and `Codex` should move out of placeholder behavior. +Phase 4 should also explicitly hide or keep disabled unsupported providers in `TeamModelSelector` until their runtime support actually exists. In Phase 1/2/3, only `Anthropic` and `Codex` should move out of disabled state. ### Phase 5. Future teammate-level routing diff --git a/docs/team-management/README.md b/docs/team-management/README.md index 3a8d06fb..326b7540 100644 --- a/docs/team-management/README.md +++ b/docs/team-management/README.md @@ -28,6 +28,8 @@ ⚠️ `docs/iterations/*` - это исторические planning notes. Они полезны для контекста, но не являются source-of-truth для текущего поведения продукта. Актуальный контракт review flow описан в этом файле и в [kanban-design.md](./kanban-design.md). +⚠️ `agent-attachments-*.md` (architecture plan + phase 1-5 plans) - это исторические дизайн-документы для feature attachments. Фактическая реализация в `src/features/agent-attachments/` может отличаться от описанной архитектуры. Для актуального состояния см. код в `src/features/agent-attachments/core/domain/` и тесты. + ### 1. Messaging: Inbox-файлы Единственный способ общаться с **запущенными** тиммейтами. SDK и CLI создают новые сессии, а не подключаются к существующим. Подробности: [research-messaging.md](./research-messaging.md) @@ -106,7 +108,7 @@ Kanban-позиция (REVIEW, APPROVED) хранится в `kanban-state.json` ## Открытые вопросы -- **FileWatcher расширение**: FileWatcher.ts уже 900+ строк — добавление teams/tasks watchers нетривиально, требует отдельного спайка +- **FileWatcher расширение**: FileWatcher.ts уже 1243 строк — добавление teams/tasks watchers нетривиально, требует отдельного спайка - **Windows atomic rename**: `fs.renameSync` на Windows бросает `EXDEV`/`EBUSY` при кросс-устройственном rename — нужна обёртка - **leadSessionId интеграция**: config.json содержит `leadSessionId`, но интеграция с session viewer (переход к сессии лида) — открытый вопрос - **Hard Interrupt**: сообщения доставляются между turns (1-30с задержка). В будущем нужен способ прервать mid-turn diff --git a/docs/team-management/agent-attachments-architecture-plan.md b/docs/team-management/agent-attachments-architecture-plan.md index ef868cef..429a1d95 100644 --- a/docs/team-management/agent-attachments-architecture-plan.md +++ b/docs/team-management/agent-attachments-architecture-plan.md @@ -1,5 +1,7 @@ # Agent attachments architecture plan +⚠️ **Историческая документация**: Этот файл содержит дизайн-документацию и план реализации. Фактическая реализация в `src/features/agent-attachments/` может отличаться от описанной архитектуры. Для актуального состояния см. код в `src/features/agent-attachments/core/domain/` (budgets.ts, errors.ts, capabilities.ts, types.ts и т.д.). + ## Summary Goal: support screenshots/images and later documents across Claude, Codex, and OpenCode teammates without treating base64 as a universal transport and without destabilizing team launch/runtime delivery. diff --git a/docs/team-management/agent-attachments-phase-1-normalization-and-budgets-plan.md b/docs/team-management/agent-attachments-phase-1-normalization-and-budgets-plan.md index 9614dd53..8cc41fa5 100644 --- a/docs/team-management/agent-attachments-phase-1-normalization-and-budgets-plan.md +++ b/docs/team-management/agent-attachments-phase-1-normalization-and-budgets-plan.md @@ -1,5 +1,7 @@ # Phase 1 - Attachment normalization, image optimization, budgets, and UI warnings +⚠️ **Историческая документация**: Этот файл содержит дизайн-документацию для Phase 1. Фактическая реализация в `src/features/agent-attachments/` может отличаться от описанной архитектуры. Для актуального состояния см. код в `src/features/agent-attachments/core/domain/` (budgets.ts, errors.ts, capabilities.ts, types.ts и т.д.). + ## Summary Goal: make attachment intake safe before changing provider delivery paths. diff --git a/docs/team-management/agent-attachments-phase-2-claude-stream-json-plan.md b/docs/team-management/agent-attachments-phase-2-claude-stream-json-plan.md index 8549c0ee..192c1047 100644 --- a/docs/team-management/agent-attachments-phase-2-claude-stream-json-plan.md +++ b/docs/team-management/agent-attachments-phase-2-claude-stream-json-plan.md @@ -1,4 +1,5 @@ # Phase 2 - Claude stream-json attachment delivery adapter +⚠️ **Историческая документация**: Этот файл содержит дизайн-документацию. Фактическая реализация в `src/features/agent-attachments/` может отличаться от описанной архитектуры. ## Summary diff --git a/docs/team-management/agent-attachments-phase-3-codex-native-plan.md b/docs/team-management/agent-attachments-phase-3-codex-native-plan.md index 9402c899..6be137a5 100644 --- a/docs/team-management/agent-attachments-phase-3-codex-native-plan.md +++ b/docs/team-management/agent-attachments-phase-3-codex-native-plan.md @@ -1,4 +1,5 @@ # Phase 3 - Codex native image attachment delivery +⚠️ **Историческая документация**: Этот файл содержит дизайн-документацию. Фактическая реализация в `src/features/agent-attachments/` может отличаться от описанной архитектуры. ## Summary diff --git a/docs/team-management/agent-attachments-phase-4-opencode-vision-plan.md b/docs/team-management/agent-attachments-phase-4-opencode-vision-plan.md index 4782bf65..04796a57 100644 --- a/docs/team-management/agent-attachments-phase-4-opencode-vision-plan.md +++ b/docs/team-management/agent-attachments-phase-4-opencode-vision-plan.md @@ -1,4 +1,5 @@ # Phase 4 - OpenCode file parts and model vision capability gate +⚠️ **Историческая документация**: Этот файл содержит дизайн-документацию. Фактическая реализация в `src/features/agent-attachments/` может отличаться от описанной архитектуры. ## Summary diff --git a/docs/team-management/agent-attachments-phase-5-e2e-and-polish-plan.md b/docs/team-management/agent-attachments-phase-5-e2e-and-polish-plan.md index af15e401..a784b5a2 100644 --- a/docs/team-management/agent-attachments-phase-5-e2e-and-polish-plan.md +++ b/docs/team-management/agent-attachments-phase-5-e2e-and-polish-plan.md @@ -1,4 +1,5 @@ # Phase 5 - Cross-runtime attachment E2E, diagnostics, docs, and polish +⚠️ **Историческая документация**: Этот файл содержит дизайн-документацию. Фактическая реализация в `src/features/agent-attachments/` может отличаться от описанной архитектуры. ## Summary diff --git a/docs/team-management/agent-attachments.md b/docs/team-management/agent-attachments.md index 9d5cb43d..0a732373 100644 --- a/docs/team-management/agent-attachments.md +++ b/docs/team-management/agent-attachments.md @@ -1,4 +1,5 @@ # Agent attachments +⚠️ **Историческая документация**: Этот файл содержит дизайн-документацию. Фактическая реализация в `src/features/agent-attachments/` может отличаться от описанной архитектуры. This document describes the v1 attachment path for Agent Teams. diff --git a/landing/product-docs/.vitepress/theme/custom.css b/landing/product-docs/.vitepress/theme/custom.css index 6ad21ed3..664dd17c 100644 --- a/landing/product-docs/.vitepress/theme/custom.css +++ b/landing/product-docs/.vitepress/theme/custom.css @@ -180,25 +180,11 @@ body { z-index: 2; max-width: 780px !important; padding: 30px 32px 32px; - border: 1px solid color-mix(in srgb, var(--vp-c-border) 72%, transparent); - border-radius: 28px; - background: - linear-gradient(180deg, color-mix(in srgb, var(--vp-c-bg-elv) 74%, transparent), color-mix(in srgb, var(--vp-c-bg-soft) 56%, transparent)), - color-mix(in srgb, var(--vp-c-bg-elv) 70%, transparent); - box-shadow: var(--at-shadow-cyan-lg); - backdrop-filter: blur(var(--at-blur-lg)); + text-shadow: 0 2px 22px color-mix(in srgb, var(--vp-c-bg) 82%, transparent); } .VPHero.has-image .main::before { - content: ""; - position: absolute; - inset: 0; - border-radius: inherit; - pointer-events: none; - background: - radial-gradient(circle at 20% 0%, rgba(0, 240, 255, 0.14), transparent 42%), - radial-gradient(circle at 82% 12%, rgba(255, 0, 255, 0.08), transparent 30%); - opacity: 0.9; + display: none; } .VPHero.has-image .main > * { diff --git a/landing/product-docs/index.md b/landing/product-docs/index.md index 682111df..ef1de8c3 100644 --- a/landing/product-docs/index.md +++ b/landing/product-docs/index.md @@ -24,7 +24,7 @@ features: linkText: Create a team - icon: "02" title: Live kanban board - details: Watch tasks move through todo, progress, review, blocked, and done as agents work. + details: Watch tasks move through todo, in progress, review, done, and approved as agents work. link: /guide/agent-workflow linkText: Understand workflow - icon: "03" diff --git a/landing/product-docs/ru/index.md b/landing/product-docs/ru/index.md index 019555b9..88b84ee8 100644 --- a/landing/product-docs/ru/index.md +++ b/landing/product-docs/ru/index.md @@ -24,7 +24,7 @@ features: linkText: Создать команду - icon: "02" title: Живая канбан-доска - details: Видно, как задачи проходят todo, progress, review, blocked и done во время работы агентов. + details: Видно, как задачи проходят todo, in progress, review, done и approved во время работы агентов. link: /ru/guide/agent-workflow linkText: Разобрать workflow - icon: "03" diff --git a/src/features/CLAUDE.md b/src/features/CLAUDE.md new file mode 100644 index 00000000..ec1c1b6e --- /dev/null +++ b/src/features/CLAUDE.md @@ -0,0 +1,31 @@ +# Feature-Local Guidance + +This file is a navigation layer for feature slices under `src/features/`. + +Before changing a feature slice, read: + +- [Project instructions](../../CLAUDE.md) +- [Feature Architecture Standard](../../docs/FEATURE_ARCHITECTURE_STANDARD.md) +- [Feature root guide](./README.md) + +Use local references: + +- `src/features/recent-projects` - full cross-process reference +- `src/features/member-work-sync` - full feature with a root public barrel +- `src/features/member-log-stream` - full feature with `main/application/` +- `src/features/agent-graph` - thin `core/domain` plus `renderer` reference + +Default location for new feature work: + +- `src/features//` + +Before adding or moving code: + +- decide whether the feature is full, thin, or process-limited +- add only the layers the feature actually owns +- expose production callers through public entrypoints only +- keep tests close to the layer they verify under `test/features//` or + feature-local `__tests__` when that is the established local pattern + +Do not duplicate architecture rules here. Keep architecture rules centralized in +[../../docs/FEATURE_ARCHITECTURE_STANDARD.md](../../docs/FEATURE_ARCHITECTURE_STANDARD.md). diff --git a/src/renderer/components/layout/MoreMenu.tsx b/src/renderer/components/layout/MoreMenu.tsx index cba228ba..c1bbb2c7 100644 --- a/src/renderer/components/layout/MoreMenu.tsx +++ b/src/renderer/components/layout/MoreMenu.tsx @@ -1,18 +1,20 @@ /** * MoreMenu - Dropdown menu behind a "..." icon for less-frequent toolbar actions. * - * Groups: Teams, Settings, Extensions, Search, Schedules, Export (session-only), Analyze (session-only). + * Groups: Teams, Settings, Extensions, Search, Schedules, Docs, Export (session-only), Analyze (session-only). * Closes on outside click or Escape. */ import React, { useCallback, useEffect, useRef, useState } from 'react'; +import { isElectronMode } from '@renderer/api'; import { Tooltip, TooltipContent, TooltipTrigger } from '@renderer/components/ui/tooltip'; import { useStore } from '@renderer/store'; import { triggerDownload } from '@renderer/utils/sessionExporter'; import { formatShortcut } from '@renderer/utils/stringUtils'; import { Activity, + BookOpen, Braces, Calendar, FileText, @@ -29,6 +31,8 @@ import type { SessionDetail } from '@renderer/types/data'; import type { Tab } from '@renderer/types/tabs'; import type { ExportFormat } from '@renderer/utils/sessionExporter'; +const DOCS_URL = 'https://777genius.github.io/agent-teams-ai/docs/'; + interface MoreMenuProps { activeTab: Tab | undefined; activeTabSessionDetail: SessionDetail | null; @@ -109,6 +113,15 @@ export const MoreMenu = ({ [activeTabSessionDetail] ); + const handleOpenDocs = useCallback(async () => { + if (isElectronMode()) { + await window.electronAPI.openExternal(DOCS_URL); + } else { + window.open(DOCS_URL, '_blank', 'noopener,noreferrer'); + } + setIsOpen(false); + }, []); + const isSessionWithData = activeTab?.type === 'session' && activeTabSessionDetail != null; // Build menu sections @@ -159,6 +172,14 @@ export const MoreMenu = ({ setIsOpen(false); }, }, + { + id: 'docs', + label: 'Docs', + icon: BookOpen, + onClick: () => { + void handleOpenDocs(); + }, + }, ]; const sessionItems: MenuItem[] = isSessionWithData diff --git a/src/renderer/components/layout/TabBarActions.tsx b/src/renderer/components/layout/TabBarActions.tsx index 0789f35c..7a017892 100644 --- a/src/renderer/components/layout/TabBarActions.tsx +++ b/src/renderer/components/layout/TabBarActions.tsx @@ -174,7 +174,7 @@ export const TabBarActions = (): React.JSX.Element => { Discord - {/* More menu (Teams, Settings, Extensions, Search, Export, Analyze, Schedules) */} + {/* More menu (Teams, Settings, Extensions, Search, Schedules, Docs, Export, Analyze) */} /` Reference implementation: + - `src/features/recent-projects` Keep `src/renderer/features/*` for: + - existing legacy slices - renderer-only thin integrations - work that does not introduce a new use case, transport boundary, or cross-process architecture