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:
parent
020aaab1c6
commit
7c9631c1b9
4 changed files with 21 additions and 8 deletions
|
|
@ -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.
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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'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>
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in a new issue