Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 13 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

[English](README.md) | [中文](README.zh.md)

**AI agent teams for any project.** One command. A team that grows with your code.
**Human-led AI agent teams for any project.** One command. A team that helps you move faster with your code.

[![Status](https://img.shields.io/badge/status-alpha-blueviolet)](#status)
[![Platform](https://img.shields.io/badge/platform-GitHub%20Copilot-blue)](#what-is-squad)
Expand All @@ -13,9 +13,13 @@

## What is Squad?

Squad gives you an AI development team through GitHub Copilot. Describe what you're building. Get a team of specialists — frontend, backend, tester, lead — that live in your repo as files. They persist across sessions, learn your codebase, share decisions, and get better the more you use them.
Squad gives you a human-directed AI development team through GitHub Copilot. Describe what you're building. Get a team of specialists — frontend, backend, tester, lead — that live in your repo as files. They persist across sessions, learn your codebase, share decisions, and help you move faster without giving up oversight.

It's not a chatbot wearing hats. Each team member runs in its own context, reads only its own knowledge, and writes back what it learned.
Squad is a productivity tool for humans, not a replacement for engineers, reviewers, or decision-makers. People stay accountable for priorities, approvals, and final changes; Squad helps with coordination, repetition, and parallel execution.

It's not a chatbot wearing hats. Each team member runs in its own context, reads only its own knowledge, and writes back what it learned so the work stays inspectable.

> **Responsible AI stance** — Squad is built to amplify a human operator with GitHub Copilot, not to remove humans from the loop. Use it to delegate faster, review better, and keep governance close to the code.

---

Expand Down Expand Up @@ -117,9 +121,9 @@ Use `--force` to re-apply updates even when your installed version already match

---

## Watch Mode — Ralph's Autonomous Polling
## Watch Mode — Ralph's Automated Polling

Ralph continuously polls for work and dispatches agents to handle it. Watch mode is perfect for unmanned squad operations — let agents work while you're away.
Ralph continuously polls for work and dispatches agents to handle it. Watch mode helps a human team stay responsive — Ralph automates triage, execution handoffs, and monitoring, then escalates back to people when judgment or approval is needed.

### Quick Start

Expand Down Expand Up @@ -171,7 +175,7 @@ Ralph uses an **agent-delegated selection pattern**:
5. The agent **decides which issue to work on** and **how**
6. Ralph monitors execution, logs results, updates issue status

This design gives **agents full autonomy** over issue selection while keeping the polling loop lean.
This design keeps the polling loop lean while letting agents handle issue selection automatically under the team's rules, review gates, and escalation policy.

### Issue Selection & Escalation

Expand Down Expand Up @@ -339,9 +343,9 @@ Eight working examples from beginner to advanced — casting, governance, stream

---

## Agents Work in Parallel— You Catch Up When You're Ready
## Agents Work in Parallel — You Stay in Control

Squad doesn't work on a human schedule. When you give a task, the coordinator launches every agent that can usefully start — simultaneously.
Squad helps one human coordinate more work at once. When you give a task, the coordinator launches every agent that can usefully start — simultaneously — while you keep priorities, review, and final decisions.

```
You: "Team, build the login page"
Expand All @@ -353,7 +357,7 @@ You: "Team, build the login page"
📋 Scribe — logging everything... ⎦
```

When agents finish, the coordinator immediately chains follow-up work. If you step away, a breadcrumb trail is waiting when you get back:
When agents finish, the coordinator records follow-up work and leaves a breadcrumb trail so you can review what happened with full context:

- **`decisions.md`** — every decision any agent made
- **`orchestration-log/`** — what was spawned, why, and what happened
Expand Down
22 changes: 11 additions & 11 deletions docs/src/components/Search.astro
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ const base = import.meta.env.BASE_URL;
<svg class="w-4 h-4 shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
</svg>
<span class="hidden sm:inline">Search docs…</span>
<span class="hidden sm:inline">Search docs...</span>
<kbd class="hidden sm:inline-flex ml-auto text-xs border border-surface-300 dark:border-surface-600 rounded px-1.5 py-0.5 text-surface-400" id="search-shortcut-kbd">
<span class="text-xs" id="search-modifier">Γîÿ</span>K
<span class="text-xs" id="search-modifier">Ctrl+</span>K
</kbd>
</button>
</div>
Expand All @@ -30,7 +30,7 @@ const base = import.meta.env.BASE_URL;
<input
id="search-input"
type="text"
placeholder="Search documentation…"
placeholder="Search documentation..."
class="flex-1 py-3 bg-transparent text-surface-900 dark:text-white placeholder-surface-400 outline-none text-base"
autocomplete="off"
/>
Expand All @@ -39,7 +39,7 @@ const base = import.meta.env.BASE_URL;
<div id="search-status" class="hidden px-4 py-2 text-xs text-surface-500 dark:text-surface-400 border-b border-surface-100 dark:border-surface-800"></div>
<div id="search-results" class="max-h-[60vh] overflow-y-auto p-2">
<div class="p-8 text-center text-surface-400 text-sm" id="search-empty">
Start typing to search…
Start typing to search...
</div>
</div>

Expand All @@ -48,7 +48,7 @@ const base = import.meta.env.BASE_URL;
</div>

<script define:vars={{ base }}>
// Pagefind instance persists across View Transitions ΓÇö no need to re-import
// Pagefind instance persists across View Transitions - no need to re-import
let pagefind = null;

async function loadPagefind() {
Expand Down Expand Up @@ -96,7 +96,7 @@ const base = import.meta.env.BASE_URL;
if (searchResults) searchResults.innerHTML = '';
if (searchEmpty) {
searchResults?.appendChild(searchEmpty);
searchEmpty.textContent = 'Start typing to search…';
searchEmpty.textContent = 'Start typing to search...';
}
searchStatus?.classList.add('hidden');
document.body.style.overflow = '';
Expand All @@ -107,7 +107,7 @@ const base = import.meta.env.BASE_URL;
if (!query) {
if (searchResults && searchEmpty) {
searchResults.innerHTML = '';
searchEmpty.textContent = 'Start typing to search…';
searchEmpty.textContent = 'Start typing to search...';
searchResults.appendChild(searchEmpty);
}
searchStatus?.classList.add('hidden');
Expand Down Expand Up @@ -148,18 +148,18 @@ const base = import.meta.env.BASE_URL;
</div>
<div class="text-sm text-surface-500 dark:text-surface-400 mt-0.5 line-clamp-2">${result.excerpt || ''}</div>
`;
// Close modal on click ΓÇö navigation proceeds via View Transitions
// Close modal on click - navigation proceeds via View Transitions
a.addEventListener('click', closeSearch);
searchResults.appendChild(a);
});
} catch {
if (searchResults) {
searchResults.innerHTML = '<div class="p-8 text-center text-surface-400 text-sm">Search index loading…</div>';
searchResults.innerHTML = '<div class="p-8 text-center text-surface-400 text-sm">Search index loading...</div>';
}
}
}

// Global keydown ΓÇö register exactly once, never duplicated
// Global keydown - register exactly once, never duplicated
let _globalKeydownRegistered = false;
function handleGlobalKeydown(e) {
if ((e.metaKey || e.ctrlKey) && e.key === 'k') {
Expand Down Expand Up @@ -197,7 +197,7 @@ const base = import.meta.env.BASE_URL;
const isMac = /Mac|iPhone|iPad|iPod/.test(navigator.platform);
const modifierEl = document.getElementById('search-modifier');
if (modifierEl) {
modifierEl.textContent = isMac ? 'Γîÿ' : 'Ctrl+';
modifierEl.textContent = isMac ? 'Cmd+' : 'Ctrl+';
}

// Create fresh bound handlers
Expand Down
Loading