Persistent Device Pairing:
- Pair once, connect forever — after initial room-code + PIN pairing, desktop issues a 256-bit pairing token (valid 90 days) that mobile stores in IndexedDB. Subsequent connections are fully automatic — no room code needed
- Relay server pairing registry — SQLite-backed pairing storage on the relay server with SHA-256 token hashing, expiry tracking, and automatic cleanup of expired records
- Desktop auto-registration — desktop registers with relay on cloud mode enable (
register_desktopprotocol), allowing paired mobiles to find it without ephemeral rooms - Waiting room pattern — if mobile reconnects while desktop is offline, relay holds the connection and sends
peer_offline/peer_onlinenotifications with automatic bridging when desktop comes back - Pairing management UI — Settings panel shows paired devices with name, last used date, expiry, and revoke button
- Revoke pairing — desktop can revoke individual or all pairings; mobile is immediately disconnected and token invalidated
Mobile PWA Enhancements:
- Saved pairing screen — when a pairing token exists, mobile shows "Connecting to [Desktop Name]..." with auto-reconnect instead of room code input
- PWA installable — service worker caches app shell (HTML, CSS, JS, icons) for offline startup; manifest enables "Add to Home Screen"
- Settings screen — mobile shows paired desktop name, connection status, pairing expiry, and "Unpair" button
- Auto-reconnect — on app open, automatically connects to relay using saved pairing token
- Offline UI — installed PWA opens without network, shows cached UI with "connecting..." status
Relay Server Protocol Extensions:
register_desktop— desktop registers for persistent connections (keyed by device ID)reconnect_paired— mobile reconnects using pairing token (relay validates SHA-256 hash)register_pairing/pairing_registered— desktop registers new pairing with relayrevoke_pairing/pairing_revoked— desktop revokes a specific pairingpeer_offline/peer_online— relay signals desktop availability to waiting mobiles- Desktop-to-mobile message forwarding in persistent mode
Desktop Tauri Commands:
register_desktop_relay— register desktop with relay for persistent pairingdisconnect_desktop_relay— disconnect persistent relay connectionissue_pairing_token— generate 256-bit token, register SHA-256 hash with relaylist_paired_devices— list locally tracked paired devicesrevoke_pairing— revoke a pairing via relay control message
QA:
- Full TypeScript compilation check (
tsc --noEmit) — zero errors - Rust compilation check (
cargo check) — bothsrc-tauri/andrelay/pass
Cloud Relay Deployment:
- Relay server deployed — cloud relay now live at
wss://atm-relay.datafying.techon Linode (Ubuntu 22.04), fronted by Caddy with automatic TLS - Domain switch — migrated from
atm-relay.datafying.com(CloudFront, broken) toatm-relay.datafying.tech(direct DNS to Linode) - systemd hardening — relay runs as dedicated
atm-relayuser with NoNewPrivileges, ProtectSystem=strict, MemoryMax=500M - Caddy reverse proxy — automatic HTTPS certificate provisioning, WebSocket upgrade handling, security headers
Bug Fixes:
- LAN mobile skeleton loading —
initRemoteSync()was never called on LAN connect; mobile clients now receive tree data immediately after PIN auth - Domain references updated — all hardcoded
.datafying.comURLs replaced with.datafying.techacross desktop, mobile client, and relay config
QA:
- Full TypeScript compilation check (
tsc --noEmit) — zero errors - Rust compilation check (
cargo check) — bothsrc-tauri/andrelay/pass - Cloud E2E verified: desktop → relay → mobile with PIN auth and encrypted sync
- LAN E2E verified: desktop → mobile on same network with real-time updates
High Priority Fixes:
- PIN auth gate for cloud mode — desktop no longer sends full_sync until mobile provides correct PIN over encrypted channel. Prevents unauthorized data access via room code guessing
- Bounded relay channels — relay server now uses bounded mpsc channels (128 capacity) with backpressure. Slow or malicious clients get disconnected instead of consuming unlimited memory
- Join rate limiting — relay limits join attempts to 10 per minute per IP (governor GCRA). Prevents room code brute-force attacks
- Command injection prevention —
create_scheduled_tasknow escapes single quotes in crontab entries and validates file extensions (.sh/.bash on Unix, .ps1 on Windows) - SSRF prevention —
fetch_urlnow requires HTTPS URLs and blocks private IP ranges (localhost, 10.x, 172.16-31.x, 192.168.x, link-local, IPv6 loopback)
Medium Priority Fixes:
- CORS hardening — relay server uses split routing:
/healthgets restrictive CORS,/wsallows WebSocket upgrades from any origin - Public key removed from QR — desktop public key no longer encoded in QR URL; exchanged securely via relay protocol only
- Key validation — relay validates all public keys are valid base64 decoding to exactly 32 bytes before storing
- Log redaction — relay redacts room codes in log output (shows only prefix)
- Room code retry limit — code generation loop bounded to 100 attempts with proper error on exhaustion
- Event listener leak fix —
connectRelay()/connectRemote()unsubscribe functions now properly stored and called on disconnect - Nonce overflow guard — both desktop and mobile throw/disconnect if nonce counter reaches MAX_SAFE_INTEGER
Other Fixes:
- Key material zeroing — crypto session
destroy()fills secret keys and shared secrets with zeros before nulling - Mobile auth screen gating — PIN entry hidden until encrypted tunnel established ("Establishing secure connection..." shown while key exchange completes)
- LAN expose default —
exposeOnNetworknow defaults totrueso LAN mode works out of the box - Better relay error messages — cloud mode shows helpful error when relay server is unavailable
- Cloud relay mode — connect to your ATM desktop from anywhere in the world, not just the same WiFi. Turn on "Cloud" mode in Settings, get a room code, enter it on your phone — it just works
- End-to-end encryption — all messages between desktop and phone are encrypted with X25519 ECDH key exchange + XSalsa20-Poly1305 authenticated encryption. The relay server never sees plaintext
- Standalone relay server — new
relay/Rust crate: a lightweight WebSocket relay that forwards opaque encrypted blobs between desktop and mobile. Runs onatm-relay.datafying.com - Room code system — 8-character base58 room codes (e.g.,
ATM-X7K3mP) with 5-minute TTL for joining and 30-minute idle timeout - QR code for instant pairing — Settings panel shows a scannable QR code encoding the relay URL, room code, and desktop public key. Scan on phone to connect instantly
- LAN/Cloud mode toggle — new mode selector in Settings panel. LAN mode unchanged; Cloud mode uses the encrypted relay. Switch freely between modes
- Custom relay URL — advanced option to point at a self-hosted relay server instead of the default
- E2E encryption using tweetnacl-js (X25519 + XSalsa20-Poly1305, audited library)
- Nonce space partitioned by role (desktop=0x01, mobile=0x02) to prevent nonce collisions
- Relay server rate limiting: per-IP connection limits, room creation throttling, message rate limiting
- Room codes use cryptographically random base58 characters
- Relay never stores data to disk, never logs message content
- New Rust crate:
relay/with axum 0.8, dashmap, governor rate limiting - New Rust module:
src-tauri/src/remote/relay_client.rs— outbound WSS client to relay - New Tauri commands:
connect_to_relay,disconnect_from_relay,get_relay_status,send_to_relay - New TypeScript class:
CryptoSessioninremote-sync.tsfor E2E encryption - Updated
remote-sync.tswithinitRelay(), dual-mode broadcasting, encrypted message handling - Updated
ui-store.tswithrelayStatus,connectRelay(),disconnectRelay() - Updated
SettingsPanel.tsxwith LAN/Cloud toggle, room code display, QR code - Updated mobile client
app.jswith room code entry, relay WebSocket, E2E crypto - Added
tweetnaclandtweetnacl-utilnpm dependencies - Added
tokio-tungsteniteCargo dependency for outbound WSS - Deployment files: Dockerfile, systemd service, Caddyfile for relay server
- Remote control from any phone — access and manage your agent teams from iPhone or Android using your phone's browser. No app install required
- Embedded HTTPS server — a secure web server runs inside ATM with auto-generated TLS certificates. Scan a QR code from the Settings panel to connect your phone
- PIN-based authentication — 6-digit server-generated PIN displayed on desktop, entered on phone. Rate limited with lockout after 5 failed attempts
- Real-time sync via WebSocket — changes on desktop instantly appear on mobile and vice versa. Full bidirectional state synchronization
- Mobile-optimized tree view — collapsible card-based hierarchy with color-coded nodes, search, kind filters, breadcrumb navigation, and pull-to-refresh
- Remote editing — edit agent names, prompts, tags, and variables directly from your phone
- Pipeline deployment — trigger pipeline deploys from mobile with real-time status updates
- Optimistic locking — conflict detection with version numbers prevents silent data loss when editing from multiple devices simultaneously
- Secret redaction — API keys and passwords are automatically masked (****xxxx) in remote responses to prevent leaking secrets over the network
- Session management — up to 2 concurrent remote sessions with 30-minute idle timeout. Sessions auto-expire and PINs regenerate after each successful auth
- Settings panel integration — new Remote Access section in Settings with enable/disable toggle, QR code display, PIN code, port configuration, and network exposure control
- Auto-generated self-signed TLS certificates (HTTPS only, no plaintext)
- CORS origin validation on all endpoints
- Bearer token authentication for API endpoints
- WebSocket origin checking
- Default bind to 127.0.0.1 (localhost only) — explicit opt-in required for LAN exposure
- Server OFF by default — only starts when user enables it
- New Rust modules:
server/with auth.rs, bridge.rs, server.rs, state.rs, ws.rs, qr.rs - Cargo dependencies: axum 0.8, axum-server 0.7 (TLS), tokio, tower-http, rcgen, qrcode, image
- New TypeScript types:
src/types/remote.tswith full Zod schema validation - New service:
src/services/remote-sync.ts— WebSocket sync service with echo loop prevention - Tree store integration:
initRemoteSync()with node diff broadcasting and remote command handling - UI store integration:
remoteConfig,connectRemote(),disconnectRemote() - Mobile web client: vanilla HTML/CSS/JS SPA served as static files from
remote-ui/ - Mobile tree visualization:
src/components/remote/MobileTreeView.tsx - Settings panel: new Remote Access section with QR code, PIN display, and configuration
- Multi-node drag works correctly — selecting 4+ nodes with Ctrl+Click then dragging now moves all selected nodes together. Previously only the clicked node moved because React Flow's internal
selectedstate wasn't synced with ATM's multi-select tracking - Selection state sync —
multiSelectedNodeIdsfrom ui-store is now synced to React Flow'snode.selectedproperty, enabling built-in multi-drag behavior - Filtered selection changes — React Flow's automatic selection changes are filtered out to prevent conflicts with manual Ctrl+Click selection
- Proximity reparenting skipped for multi-drag — drag-drop reparenting is disabled when dragging multiple nodes to prevent accidental reparenting
- Position undo — pressing Ctrl+Z restores nodes to their previous positions after a drag move
- Undo stack — up to 20 moves are tracked, including multi-select drags and group drags with children
- Escape clears selection — pressing Escape now also clears multi-select (previously only cleared single select)
- Step handoff summaries — each step in a pipeline now writes a handoff file (
step-{N}-output.md) summarizing what was accomplished, key decisions, and outputs. The next step's primer automatically instructs Claude to read the previous step's handoff, so team 2 knows exactly what team 1 did - Previous/Next step context — each step's primer now includes a "Previous Steps" section (with objectives of all completed steps) and a "Next Steps" section (what comes after), giving each team full pipeline awareness
- Error handling — deploy scripts now check exit codes after each step. If a step fails, subsequent steps are skipped and the pipeline reports which step failed
- Status tracking — a
status.jsonfile is written to the pipeline directory, tracking each step's status (pending/running/completed/failed) with timestamps. Updated in real-time as steps execute - Better terminal output — timestamps on every step, elapsed time per step, total pipeline duration, clear pass/fail summary with visual formatting
deployPipelinemethod in tree-store.ts completely rewritten with handoff architecture- Primer template now includes
## Previous Steps,## Next Steps, and handoff read/write instructions - Deploy scripts (PS1 + bash) now track
$LASTEXITCODE/$?and skip remaining steps on failure status.jsonwritten to.aui/pipeline-{slug}/with per-step timing data
- Variable types — variables now have a type: Text, API Key, Password, or Note. Each type has distinct visual styling with color-coded left borders (orange for API keys, red for passwords, purple for notes)
- Sensitive value masking — API Key and Password variables are masked by default with
****display. An eye toggle button reveals the actual value — identical UX to the API key field in Settings - Note variables — a new "Note" type renders as a multi-line textarea instead of a single-line input, perfect for context, instructions, or documentation
- Shared VariableEditor component — all editors (Team, Agent, Pipeline, Root) now use a unified variable editing component with consistent behavior
- Quick-add buttons — instead of a generic "+ Add Variable", there are now four buttons:
+ Text,+ API Key,+ Password,+ Notefor fast type-specific creation
- Pipeline variables — Project Manager nodes now have a Variables section between Steps and Deploy. Variables are included in every step's deployment primer
- Global variables — the root "You" node now has a "Global Variables" section. These variables are passed to every team and pipeline during deployment, making them ideal for org-wide API keys, endpoints, or config
- Deploy primer enrichment — all primers (team deploy, pipeline deploy, skill exports) now include typed variable annotations like
[api-key] OPENAI_KEY: sk-...for clarity
- Settings panel now shows the current ATM version (e.g., "ATM v0.6.0") at the top of the panel, so users always know which version they're running
- New
VariableKindtype:"text" | "api-key" | "password" | "note" NodeVariableinterface now has atype: VariableKindfield- New shared component:
src/components/inspector/VariableEditor.tsx - Backwards-compatible migration: old variables without a
typefield default to"text"on load - All primer generation (team, pipeline, skill export) updated to include variable types
- SettingsPanel shows version info badge
- "Move to..." context menu — right-click any node on the canvas to see a "Move to..." submenu listing all valid parent targets (Root, teams, and pipelines). Quickly reparent nodes without drag-and-drop. Excludes the node's current parent and its own descendants to prevent circular hierarchies
- Added submenu support to
ContextMenucomponent — items with achildrenarray render as hover-expandable submenus with smooth open/close transitions - Context menu "Move to Root" replaced with dynamic "Move to..." submenu that lists all groups and pipelines as reparenting targets
- App renamed to ATM — "Agent Team Manager" replaces "Agent UI" across the entire app
- Window title — now reads "ATM — Agent Team Manager"
- Toolbar logo — shows "ATM" with "Agent Team Manager" subtitle
- Welcome screen — updated to "Welcome to ATM"
- Tauri config — product name, identifier, and description updated
- Package name —
aui→atmin package.json and Cargo.toml - Note:
.aui/config directory unchanged for backward compatibility
- New node type: Pipeline — a sequential pipeline that runs teams one after another, with each step having its own deploy prompt
- Magenta visual identity — pipeline nodes appear in magenta (#d946ef) with dashed borders and a "PROJECT MGR" badge
- Step count display — pipeline nodes show "N steps" on the canvas, similar to how teams show agent count
- PipelineEditor — full inspector panel editor with:
- Name and description fields (auto-save)
- Ordered step list with numbered badges
- Team dropdown per step (same team can appear multiple times)
- Per-step deploy prompt textarea
- Move Up/Down, Duplicate, and Delete controls per step
- "Play All" button to deploy the entire pipeline sequentially
- "Schedule" button to set up recurring pipeline runs
- Sequential deployment — "Play All" generates a primer for each step and creates a single script that runs each team's Claude session in sequence (step 1 finishes → step 2 starts → ...)
- Pipeline scheduling — pipelines appear in the Schedule panel's team selector with a "[Pipeline]" prefix; per-step prompts are used instead of a single deploy prompt
- Canvas context menu — right-click on empty canvas now shows "New Team" and "New Project Manager" (Skill option removed)
- Create dialog — root-level options are now "Team", "Agent", "Project Manager" (Skill removed from root); inside a team: "Agent" only
- New
PipelineStepinterface:{ id, teamId, prompt } - Added
pipelineSteps: PipelineStep[]field toAuiNode - New
NodeKindvalue:"pipeline" - Tree metadata groups array now stores
kindandpipelineStepsfor pipeline nodes - New store methods:
createPipelineNode,updatePipelineSteps,deployPipeline - New component:
src/components/inspector/PipelineEditor.tsx - Deploy script generation produces
.ps1(Windows) and.sh(macOS/Linux) scripts in.aui/pipeline-{slug}/
- Fixed "Failed to fetch" on Generate Teams — API fetch errors now have proper try-catch handling with distinct messages for network errors, invalid API keys (401), and rate limits (429) instead of a generic "Failed to fetch" TypeError
- Fixed collapsed group drag breaking child positions — when a collapsed team is dragged, hidden children's saved positions are now offset by the drag delta so they maintain their relative positions when expanded. Previously, children would snap back to their old absolute positions
- Fixed Generate not respecting team/agent counts — the AI prompt now uses "EXACTLY N teams" and "EXACTLY N agents" language with strict requirements instead of "Max N" which let the LLM return fewer
- Updated welcome message — new blank layouts now show "Click the You node to get started" instead of the outdated "Double-click the canvas" instruction, and auto-selects the root node so the inspector opens immediately
- README "At a Glance" table — added a compact feature summary table for quick scanning by GitHub visitors
- Node position persistence — drag nodes to custom positions and they stay. Positions are saved per-layout and survive collapse/uncollapse, app restarts, and layout switches. Group drags save all children positions too
- Removed duplicate generate button — consolidated the "Generate NxN" and "Generate from Description" buttons into a single "Generate Teams" button that uses the smarter description-aware prompt
- Removed Save buttons — all editors now rely on autosave (from v0.4.0). Save buttons removed from RootEditor, AgentEditor, SkillEditor, and GroupEditor. Validate and Discard buttons remain where applicable
- New tree store methods:
saveNodePosition,saveNodePositions,clearNodePositionfor position CRUD layout.tslayoutNodesnow acceptssavedPositionsparameter — prefers saved positions over dagre-calculated defaultsTreeCanvas.tsxuses ref pattern for saved positions to avoid re-layout loops on position savesonNodeDragStopsaves positions for single nodes and group drags, clears on reparent- Position cleanup in
removeNodeFromCanvaswhen deleting nodes - Removed
savedAtstate andsetSavedAtcalls from all autosave editors (dead code after button removal)
- Autosave across all editors — changes to any node (You, Team, Agent, Skill) now save automatically after 800ms of idle typing and on click-away. No more losing changes because you forgot to hit Save. Manual Save buttons remain for explicit saves
- Blank layout creation — the Layouts dropdown now has a "+ New Blank Layout" button that creates a fresh canvas with only the "You" node, perfect for building a new org structure from scratch without existing clutter
- Edge insert button — hover over any edge (connection line) between two nodes to reveal a "+" button. Click it to insert a new node at that position in the hierarchy, making it easy to add nodes between existing parent-child pairs
- Fixed team deletion spawning random nodes — removing a team node from the canvas (via the X button) no longer causes its child agents to appear at root level. Children are now recursively removed with the team, keeping the canvas clean
- Fixed blank layout inheriting previous description — new blank layouts now start with a truly fresh root node instead of carrying over the previous layout's "You" node description
- New
src/hooks/useAutosave.ts— reusable hook with debounce, skip-on-init, and flush-on-unmount for all editor components - New
src/components/tree/InsertEdge.tsx— custom React Flow edge component with hover-activated insert button removeNodeFromCanvasnow recursively removes all descendants when removing a group node (teams), while preserving the reparent behavior for individual nodescreateBlankLayoutadded to tree store — saves current layout, creates empty metadata, switches to blank canvas- All 4 editor components (RootEditor, AgentEditor, SkillEditor, GroupEditor) wired with
useAutosavehook
- Full QA audit — comprehensive 6-area quality audit covering canvas nodes, inspector panel, layouts system, toolbar/navigation, schedule/settings, and data/build integrity. 82/83 checks passed
- SchedulePanel toolbar overlap fixed — panel now uses
var(--toolbar-height)for top offset, consistent with Settings and Catalog panels - Consistent
@/path aliases — converted all remaining relative../imports in services and utilities to use the@/path alias for codebase consistency (agent-parser, file-scanner, file-watcher, file-writer, settings-parser, skill-parser, skill-scanner, validation)
- Canvas: all 12 visual checks pass (badges, colors, tints, sub-agent detection, hover actions, collapse/expand, glow/shadow)
- Inspector: all 11 editor checks pass (routing, deploy section, schedule button, sub-agent badges, save/discard, skills, variables)
- Layouts: all 22 CRUD + edge-case checks pass (types, service, store, dropdown UI, rename, delete guards)
- Toolbar: all 11 navigation checks pass (3-section layout, button order, panel mutual exclusivity, z-index)
- Schedule: all 23 cron/schtasks/settings checks pass (Rust commands, repeat mapping, time formats, script generation, toggle/delete)
- Data layer: all 13 store/type/build checks pass (interfaces match implementations, no circular imports, tsc + vite build clean)
- Multiple layouts — save, switch, rename, and delete named canvas layouts. Each layout preserves the full tree hierarchy, groups, and node positions independently
- Layouts dropdown in toolbar — a new dropdown in the toolbar center lets you switch between saved layouts, create new ones with a name input, rename via inline editing, and delete layouts on hover
- Layout persistence — layout data stored as individual JSON files in
.aui/layouts/with anindex.jsonmanifest tracking the active layout and metadata - Auto-default layout — on first load, the current tree state is automatically saved as a "Default" layout so the system is always initialized
- Toolbar button reorder — right-side buttons now read Catalog, Schedules, Settings (left to right) for better workflow priority. Create (+) and Layouts dropdown are centered
- New
LayoutandLayoutIndextypes insrc/types/aui-node.ts - New
src/services/layout-service.ts— full CRUD for layout files via@tauri-apps/plugin-fs - New
src/components/common/LayoutsDropdown.tsx— dropdown UI with rename, delete, and save-as-new - Tree store extended with
loadLayouts,saveCurrentAsLayout,switchLayout,deleteLayout,renameLayoutactions - Layout switching auto-saves the current layout before restoring the target layout's tree metadata
- README overhaul — rewrote the hero section with a clear value proposition emphasizing token efficiency and zero-overhead deployment
- Claude Code URL install — Quick Start now leads with a one-line paste-the-URL install option for Claude Code users, with manual clone as the alternative
- Updated feature sections — Interactive Org-Chart Canvas and Cron Job Scheduler sections rewritten with accurate details, node type table, and OS-level scheduling docs
- Sub-agent documentation — added sub-agent node type to the canvas feature section with color and badge details
- Project structure updated — added missing files (scheduler.ts, skill-scanner.ts) and reorganized to match the current codebase
- Content cleanup — removed outdated sections and polished overall structure for consistency
- Real task scheduler backend — schedule jobs now create actual OS-level scheduled tasks via Rust commands: Windows Task Scheduler (
schtasks.exe) on Windows, crontab on macOS/Linux. Three new Tauri commands:create_scheduled_task,list_scheduled_tasks,delete_scheduled_task - Repeat options for schedules — replaced raw cron expression input with a user-friendly repeat picker (Once, Hourly, Daily, Weekly, Custom cron). Time picker for selecting run time. Schedules panel shows all jobs with human-readable repeat labels
- Custom AUI app icon — replaced the default Tauri icon with a custom-designed AUI logo across all icon sizes (ICO, ICNS, PNG) for Windows, macOS, and Linux
- Root node badge shows "YOU" — the root node on the canvas now displays a "YOU" badge instead of the generic kind label, making the org tree more intuitive
- Lighter sub-agent color — sub-agent nodes now use a softer blue (
#a5d6ff) for better visual contrast against parent agents - One-command install in README — Quick Start section now leads with a four-line clone-to-running-app snippet, plus collapsible platform-specific setup guides for Windows, macOS, and Linux
- Added
create_scheduled_task,list_scheduled_tasks,delete_scheduled_taskRust commands insrc-tauri/src/lib.rs - New
src/services/scheduler.tsservice for schedule persistence and OS task management - SchedulePanel rewritten with repeat picker, time selector, and live job listing from OS
- Export/Import moved to Settings panel — the Export Tree and Import Tree buttons are now in a new "Data" section inside the Settings panel (between Preferences and Advanced), keeping the toolbar clean
- Schedule button on team editor — replaced the Export and Generate Skill Files buttons in the team Deploy section with a single "Schedule" button that opens the SchedulePanel directly
- Sub-agent visual distinction — agents nested under other agents (sub-agents) now display with a lighter blue color (
#58a6ff), "SUB-AGENT" badge, and distinct background tint on the canvas, making the hierarchy visually clear at a glance - Sub-agent badges in inspector — the agent list inside the team editor now shows "sub-agent" badges (lighter blue) for children of member-agents
- Removed standalone "Export" and "Generate Skill Files" buttons from team editor (Deploy already calls
generateTeamSkillFilesinternally) - Removed Export/Import buttons and related handlers from the Toolbar
- Toolbar reverted to clean button set: +, Settings, Schedules, Catalog
- Deploy terminal stays open — switched to
cmd /c startwithraw_argfor fully independent process detachment, so the deploy terminal no longer closes unexpectedly - Cleared CLAUDECODE env var in deploy scripts — prevents nested session detection error when deploying from within an existing Claude Code session
- Primer passed as file-read instruction — deploy primer is now read from file instead of being passed as a 9.3KB CLI argument, fixing PowerShell argument corruption from 50 unescaped double quotes shattering the primer into 94 separate arguments
- Node name single-quote escaping — deploy scripts (both PS1 and bash) now properly escape single quotes in node names
- Skill names resolve correctly in deploy primer — primer now uses skillNameCache to resolve display names instead of falling back to raw hash IDs
- Added Skill tool invocation instructions to primer — deployment primer now includes instructions for agents to invoke skills
- Richer generated skill files — skill file generation now produces thorough, opinionated content with domain-specific guidelines, quality standards, and detailed protocols (benchmarked against frontend-design quality)
- Reordered team editor — sections now flow: Name/Description, Deploy, Skills & Variables, Agents, Save
- Canvas X button soft-removes nodes — the X button on canvas nodes now removes them from the canvas without deleting files from disk (renamed to "Remove from Canvas")
- Combined Skills & Variables — Skills and Variables merged into a single collapsible section in the team editor
- Generate with AI moved inside Agents section — reduces top-level clutter in the team editor
- Deploy terminal stays open — fixed PowerShell
-Fileflag silently ignoring-NoExit, causing the deploy terminal to flash and close. Switched to-Commandinvocation so the terminal persists and shows output/errors. - Assigning skills no longer creates phantom nodes — fixed bug where assigning a skill to a team or root node created a visible orphan node on the canvas. Skills are now tracked in a lightweight name cache instead of being added as tree nodes.
- Collapsible sections on team editor — the team/agent inspector now matches the root node's collapsible organization. Deploy stays prominent at the top; Variables, Assigned Skills, Generate with AI, and Agents are each collapsible sections with disclosure triangles and item counts.
- Added
skillNameCacheto tree store for resolving skill display names without adding visible nodes - OrgNode skill name resolution now checks: tree nodes → name cache → raw ID fallback
- Rust
open_terminaluses-Commandinstead of-Fileon Windows for proper-NoExitbehavior
- Deploy now opens a visible terminal — replaced Tauri shell plugin approach (which hardcodes
CREATE_NO_WINDOW) with a Rust-sideopen_terminalcommand usingCREATE_NEW_CONSOLE. Deploy now reliably opens a visible PowerShell window on Windows, Terminal on macOS, or any available emulator on Linux. - Import from GitHub URL works — fixed "Failed to fetch" error by routing URL imports through a Rust-side
fetch_urlcommand, bypassing webview CORS/CSP restrictions. - Skill names display correctly on nodes — fixed issue where skill tags on canvas nodes showed hash IDs instead of human-readable names. Skills are now auto-added to the tree store when assigned (#7).
- Sub-agent labels — agent nodes nested inside teams now show "sub-agents" instead of "agents" in their child count label (#8)
- Restructured root node inspector — "Owner" section renamed to "Company / Project Name" with better placeholder text. Global Skills and Teams are now collapsible sections with disclosure triangles. Generate with AI moved inside the Teams section (#9)
- Removed Chat panel — the non-functional Chat feature has been removed from the toolbar and app since CLI-based chat cannot run inside Tauri's webview (#10)
- Removed AI gradients — all purple-to-blue and orange gradient buttons replaced with flat solid colors (
var(--accent-purple),var(--accent-orange)) per the frontend-design skill's guidance against generic AI aesthetics - 39 skills installed — downloaded and installed the full Anthropic skills pack plus community skills (algorithmic-art, canvas-design, frontend-design, mcp-builder, skill-creator, ios-simulator, playwright, d3js, web-asset-generator, and more)
- Added
open_terminalRust command with platform-specific terminal launching (CREATE_NEW_CONSOLE on Windows) - Added
fetch_urlRust command for server-side HTTP fetching (bypasses webview restrictions) - Overlay panels (Settings, Schedules, Catalog) are now mutually exclusive — opening one closes the others
- Toolbar reorganized: Settings, Schedules, Catalog now directly accessible (Chat removed)
- Refined color palette — blue-tinted dark backgrounds (#0d1117, #151b23, #1c2333) replace the old purplish tones for a more professional, modern look
- Desaturated accents — orange (#f0883e), green (#3fb950), purple (#8b5cf6), gold (#d29922), red (#f85149) are all slightly desaturated for less visual noise
- Unified AI gradient — all AI-powered buttons now use a consistent purple-to-blue gradient (
#8b5cf6 → #4a9eff) instead of the old purple-only gradient - Consistent input styling — all input fields now use CSS variables with
border-radius: 6pxand smoothtransition: border-color 0.15s - Toolbar subtitle — "Agent UI" subtitle appears next to the AUI logo for clarity
- Better welcome screen — improved empty state with keyboard shortcut hints and a subtitle
- Deploy moved to top — the Deploy section now appears at the top of the team inspector panel for faster access (was buried at the bottom)
- Renamed "Auto-Fill" to "Generate with AI" across all editors for clearer intent
- Export button redesigned as an outlined secondary button (was a filled gradient) to reduce visual competition with Deploy
- Refined button hierarchy — primary actions (Deploy, Save) are filled, secondary actions (Export, Discard) are outlined, tertiary actions (Generate Skill Files) are dashed
- Chat, Settings, Schedules promoted to toolbar — direct 1-click access from the toolbar instead of buried in the Menu (now renamed "Catalog")
- "Menu" renamed to "Catalog" — the ContextHub overlay now opens via a "Catalog" button, better reflecting its purpose as a skill/agent/team browser
- Mutual-exclusive overlays — opening Chat, Settings, Schedules, or Catalog automatically closes any other open overlay to prevent stacking
- Cleaner Catalog header — removed redundant Chat/Settings/Schedules buttons from the Catalog utility row; only Refresh and Save Plan remain
- Inspector panel widened to 480px (was 420px) for more comfortable editing
Ctrl+Shift+D— deploy the currently selected teamCtrl+Enter— deploy from the deploy prompt textareaCtrl+I— toggle the inspector panel- Shortcuts are suppressed when typing in input fields
- Added new CSS variables:
--bg-elevated,--text-tertiary,--border-hover,--accent-danger, and radius tokens (--radius-sm/md/lg/xl) - Updated team colors in grouping utility to match the new desaturated palette
- All hardcoded color values replaced with CSS variables where applicable
- Fixed deploy failing with "Make sure 'claude' is in your PATH" — root cause was Tauri v2's shell plugin hardcoding
CREATE_NO_WINDOWon all spawned processes, making every terminal invisible. Deploy now usesShellExecuteExWvia the shellopen()API with a.batlauncher, which correctly opens a visible PowerShell window. - Fixed Windows path handling in deploy scripts — paths now use backslashes in generated
.ps1and.batfiles for proper PowerShell and cmd.exe compatibility.
- Moved Collapse/Expand toggle from the toolbar to the floating search bar for a cleaner, more subtle placement.
- Improved deploy error messages — errors now show actual failure details instead of generic "Failed" text.
- Added "Collapse All" / "Expand All" button in the toolbar for quick team management
- Made the entire agent count row on team nodes clickable for expand/collapse (not just the tiny arrow)
- Moved "Open Settings File" from the main menu into the Settings panel under a new "Advanced" section
- Fixed deploy to open a visible terminal window (was spawning invisible child processes)
- Cleaned up leftover references to removed features
- Added comprehensive USAGE.md user guide (479 lines)
- Added CONTRIBUTING.md for open-source contributors
- Added MIT LICENSE
- Enhanced README with badges, "Why AUI?" section, and contributing link
- Created 6 roadmap issues on GitHub
- Added 15 GitHub topics for search discoverability
- Added key-value variable pairs (API keys, URLs, configs) to both teams and agents
- Variables are saved with your project data and persist across sessions
- Full editing UI in both team and agent editors with name/value fields
- Variables are included in skill exports and deployment primers
- Connects to the Anthropic Messages API for AI-powered features
- API key is configured via the Settings panel
- Powers: Generate Description, Auto-Fill Teams, and Auto-Fill Agents
- Uses Claude Haiku for fast, cost-effective generation
- Purple "Generate" button on every agent and team description field
- Uses Claude API to generate a contextual description based on the node's name
- Understands whether it's a team or an agent within a team
- Root node: Select number of teams and agents-per-team, click "Auto-Fill" to have Claude generate the entire org structure
- Team nodes: "Auto-Fill Agents" button with count selector generates agents for that specific team
- AI generates contextually appropriate names and descriptions
- Deploy prompt textarea alongside the deploy button — tell the team what to accomplish
- Deploy generates missing skill files (skips existing) and builds a comprehensive primer with all skill file contents included
- Auto-opens an external terminal (PowerShell on Windows, Terminal on Mac/Linux) and launches Claude with the full primer already submitted
- Primer includes company context, team overview, global skills, sibling teams, and every agent's full skill file content
- API costs are only for generating descriptions and skill files — deployed team sessions run on the user's own Claude subscription
- Team node gets a "senior manager" skill file; each agent gets their own specialist skill file
- "Generate Individual Skill Files" button for on-demand skill file creation
- Primer saved to
.aui/deploy-primer.mdfor reference
- Completely rewritten skill export — now generates fully-detailed SKILL.md files
- Includes: company context, global skills, team skills (with inline content), team variables table, detailed agent profiles (model, tools, permissions, skills, variables, sub-agents), coordination rules, deployment instructions, and success criteria
- Proper Claude Code team mode deployment instructions
- API key input with show/hide toggle
- Color pickers for Team, Agent, and Accent colors
- Auto-save preference toggle
- Settings persist across sessions; accent color applies to the UI in real time
- Subtle gray X button on every node (team, agent, skill, etc.)
- Appears on hover, opens delete confirmation dialog
- The root (Human) node cannot be deleted
- Schedule teams for recurring deployment
- Cron expression editor with prompt field
- View/delete scheduled jobs
- Schedules persist across sessions
- Hold Ctrl and click multiple nodes to select them
- "Generate All Descriptions" button appears when multiple nodes selected
- Generates descriptions for all selected nodes in parallel
- Fill in your root node description with your company/project goals
- Set global skills and team/agent counts
- "Generate Teams to Meet Goals" creates teams specifically designed to achieve your described objectives
- Toolbar now shows only: AUI logo, + button, Menu button, node count
- Chat, Refresh, Save Plan, and Settings buttons moved into the Menu
- Added utility row: Refresh, Save Plan, Settings, Schedules buttons
- Added Chat button to open Claude CLI chat
- Added "Open Settings File" option
- Ctrl+click nodes to multi-select (purple border highlight)
- Floating action bar shows selected count with "Generate All Descriptions" button
- Clear selection with X button or click empty canvas
- Teams are blue (#4a9eff), Agents are orange (#ff9800)
- Consistent across all views: canvas nodes, editors, menu, and mini-map
- "Member" renamed to "Agent" everywhere
- "Context Hub" renamed to "Menu" in toolbar
src/services/claude-api.ts— Anthropic Messages API clientsrc/components/schedule/SchedulePanel.tsx— Cron job manager UI
generateTeamSkillFiles(teamId)— creates individual SKILL.md for team manager + each agenttoggleMultiSelect(nodeId)/clearMultiSelect()— multi-select state managementtoggleSchedule()— schedule panel toggle
AuiNodenow hasvariables: NodeVariable[]TreeMetadata.groupsnow persistsvariables- New
NodeVariableinterface:{ name: string; value: string } UiStatenow hasmultiSelectedNodeIds: Set<string>andscheduleOpen: boolean
- Tauri shell permissions scoped to:
claude,powershell,cmd,bash,open - Deploy opens an external terminal automatically (PowerShell on Windows, Terminal on Mac/Linux)
- Note: Deploy and CLI features require the Tauri runtime (not browser-only mode)
- Settings no longer appears as a node in the tree
- Fixed CLI availability detection with clearer error messages
- Fixed auto-fill not triggering correctly in certain conditions
- Inspector panel now has a close button when no node is selected
- Skill file generation skips files that already exist (no overwriting)
- Project scaffold — Tauri + React + TypeScript application structure with Vite bundling
- Type system — Core data types for teams, agents, skills, and organizational trees
- Services layer — File I/O and tree persistence services for loading and saving project data
- State management — Zustand-based stores for application state, tree data, and UI state
- Tree canvas — Interactive node-based canvas for visualizing and arranging teams and agents
- Inspector panel — Side panel for viewing and editing properties of the selected node
- Menu — Centralized hub for accessing project context, global skills, and navigation
- Basic file parsing — Read and parse skill files from the local filesystem