feat: enhance README and UI for team management and review processes

- Added "Flexible autonomy" feature to README, allowing users to configure agent control levels.
- Updated task creation description for clarity in README.
- Improved team detail view messaging to better inform users about draft teams and provisioning status.
- Enhanced review function to prevent duplicate approval comments and events, ensuring idempotency.
- Expanded expected IPC signals to include 'TEAM_DRAFT' for better error handling.
This commit is contained in:
iliya 2026-03-21 14:01:24 +02:00
parent 020aaab1c6
commit 7c9631c1b9
4 changed files with 21 additions and 8 deletions

View file

@ -39,12 +39,13 @@ A new approach to task management with AI agent teams.
- **Task-specific logs and messages** — clearly see all Claude logs and messages in isolation for each individual task, making it easy to trace what happened for any assignment
- **Live process section** — see which agents are running processes and open URLs directly in the browser
- **Stay in control** — send a direct message to any agent, drop a comment on a task, or pick a quick action right on the kanban card whenever you want to clarify something or add new work
- **Flexible autonomy** — let agents run fully autonomous, or review and approve each action one by one (you'll get a notification) — configure the level of control that fits your security needs
- **Solo mode** — one-member team: a single agent that creates its own tasks and shows live progress. Saves tokens; can expand to a full team anytime
<details>
<summary><strong>More features</strong></summary>
- **Task creation with attachments**Simply send a message to the team lead with any attached images (planed all files). The lead will automatically create a fully described task and attach your files directly to the task for complete context.
- **Task creation with attachments** — send a message to the team lead with any attached images. The lead will automatically create a fully described task and attach your files directly to the task for complete context.
- **Deep session analysis** — detailed breakdown of what happened in each Claude session: bash commands, reasoning, subprocesses
@ -64,7 +65,7 @@ A new approach to task management with AI agent teams.
- **Attach code context** — reference files or snippets in messages, like in Cursor. You can also mention tasks using `#task-id`, or refer to another team with `@team-name` in your messages.
- **Notification system** — configurable alerts when tasks complete, agents need attention, or errors occur
- **Notification system** — configurable alerts when tasks complete, agents need your response, new comments arrive, or errors occur
- **MCP integration** — supports the built-in `mcp-server` (see [mcp-server folder](./mcp-server)) for integrating external tools and extensible agent plugins out of the box
@ -117,7 +118,7 @@ No prerequisites — Claude Code can be installed and configured directly from t
### Tech stack
Electron, React 18, TypeScript 5, Tailwind CSS 3, Zustand 4. Data from `~/.claude/` (session logs, todos, tasks). No cloud backend — everything runs locally.
Electron 40, React 18, TypeScript 5, Tailwind CSS 3, Zustand 4. Data from `~/.claude/` (session logs, todos, tasks). No cloud backend — everything runs locally.
---

View file

@ -153,6 +153,11 @@ function approveReview(context, taskId, flags = {}) {
const leadSessionId = resolveLeadSessionId(context, flags);
const prevReviewState = getCurrentReviewState(task);
// Idempotent: already approved → skip duplicate comment/event, only add note if new
if (prevReviewState === 'approved') {
return { ok: true, taskId: task.id, displayId: task.displayId, column: 'approved', alreadyApproved: true };
}
kanban.setKanbanColumn(context, task.id, 'approved');
// Append review_approved event

View file

@ -971,8 +971,10 @@ export const TeamDetailView = ({ teamName }: TeamDetailViewProps): React.JSX.Ele
<div className="max-w-md text-center">
<p className="text-sm font-medium text-text">Team not launched yet</p>
<p className="mt-2 text-xs text-text-secondary">
{teamSummary?.displayName || teamName} configuration has been saved. Launch to start
provisioning with CLI.
This is a draft team <strong>{teamSummary?.displayName || teamName}</strong> has
been configured with {teamSummary?.memberCount ?? 0} member
{teamSummary?.memberCount === 1 ? '' : 's'} but hasn&apos;t been provisioned by CLI
yet. Click Launch to select a model and start the team.
</p>
<div className="mt-4 flex justify-center gap-2">
<button
@ -1022,8 +1024,13 @@ export const TeamDetailView = ({ teamName }: TeamDetailViewProps): React.JSX.Ele
if (!data) {
return (
<div className="flex size-full items-center justify-center p-6 text-sm text-[var(--color-text-muted)]">
No team data available
<div className="size-full overflow-auto p-4">
<div ref={provisioningBannerRef}>
<TeamProvisioningBanner teamName={teamName} />
</div>
<div className="flex flex-1 items-center justify-center p-6 text-sm text-[var(--color-text-muted)]">
No team data available
</div>
</div>
);
}

View file

@ -14,7 +14,7 @@ export class IpcError extends Error {
}
/** Error messages that represent expected transient states, not real failures. */
const EXPECTED_IPC_SIGNALS = ['TEAM_PROVISIONING'];
const EXPECTED_IPC_SIGNALS = ['TEAM_PROVISIONING', 'TEAM_DRAFT'];
export async function unwrapIpc<T>(operation: string, fn: () => Promise<T>): Promise<T> {
try {