Skip to content

release: develop to main#492

Merged
kokevidaurre merged 134 commits intomainfrom
develop
Mar 12, 2026
Merged

release: develop to main#492
kokevidaurre merged 134 commits intomainfrom
develop

Conversation

@kokevidaurre
Copy link
Contributor

Promote develop to main. 74 commits, 10 PRs merged today.

kokevidaurre and others added 30 commits February 21, 2026 12:32
Closes #342

Co-authored-by: Squads Cloud Worker <cloud@agents-squads.com>
Co-authored-by: Claude <noreply@anthropic.com>
…351)

Prevents shell injection via crafted paths in background and watch
execution modes. Applies same escaping used in foreground mode (PR #324).

Adds shellEscape() helper that replaces single quotes with '\'' to
safely interpolate variables into single-quoted shell strings. Applied to:
- Watch mode: projectRoot, worktreeDir, branchName, logFile, pidFile
- Background mode: projectRoot, worktreeDir, branchName, logFile, pidFile
- Provider background mode: workDir, logFile, pidFile, provider args
- execSync worktree calls in foreground and provider modes

Closes #340

Co-authored-by: Squads Cloud Worker <cloud@agents-squads.com>
Co-authored-by: Claude <noreply@anthropic.com>
v0.6.2 released, 3 security P1 issue-solvers dispatched,
751 tests passing, Q1 goals 2/3 achieved.

Co-authored-by: Squads Cloud Worker <cloud@agents-squads.com>
Co-authored-by: Claude <noreply@anthropic.com>
…339)

Closes #319

Added default .action(() => cmd.outputHelp()) to 7 parent commands
(env, kpi, feedback, session, trigger, approval, autonomous) so they
exit 0 instead of 1 when invoked without a subcommand. Matches the
pattern already used by memory, goal, deploy, and exec commands.

Co-Authored-By: engineering/issue-solver <engineering-issue-solver@agents-squads.com>

Agent: engineering/issue-solver
Squad: engineering
Model: claude-opus-4-6

Co-authored-by: Squads Cloud Worker <cloud@agents-squads.com>
…354)

Replace scattered console.log calls with the project's writeLine()
utility from src/lib/terminal.ts. This provides a single output
layer for consistent formatting and future output control.

- Convert 238 console.log calls to writeLine across 10 files
- Remove 8 debug/placeholder log statements from anthropic.ts
- Keep console.log only for JSON.stringify output (--json flags)
  and raw prompt piping — standard CLI patterns
- Reduction: 269 → 31 occurrences (88% decrease)
- Zero new TypeScript errors

Files: init.ts, deploy.ts, autonomous.ts, trigger.ts, approval.ts,
eval.ts, login.ts, cli.ts, anthropic.ts, update.ts

Co-authored-by: kokevidaurre <kokevidaurre@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Replace minimal README with comprehensive 331-line version covering:
- Quick start with real output examples
- Why Squads (4 differentiators)
- Provider table (7 LLM providers)
- Feature showcase (dashboard, memory, sessions, autonomous, hooks)
- Command reference (21 active commands, no removed ones)
- Project structure and configuration examples
- Development guide and tech stack
- Contributing and community links

References only current commands (memory write/read instead of learn,
env show instead of context, exec list instead of history).

🤖 Generated with [Agents Squads](https://agents-squads.com)

Co-authored-by: kokevidaurre <kokevidaurre@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Closes agents-squads/engineering#51

Removed the base64-obfuscated API key from source code and replaced
with SQUADS_TELEMETRY_KEY env var. Telemetry send is skipped when key
is not set. The exposed key must be rotated server-side separately.

Co-Authored-By: engineering/issue-solver <engineering-issue-solver@agents-squads.com>

Agent: engineering/issue-solver
Squad: engineering
Model: claude-opus-4-6

Co-authored-by: Squads Cloud Worker <cloud@agents-squads.com>
Closes #343

The daemon process was silently failing because Commander.js rejected
the unregistered --daemon CLI flag. Replace with SQUADS_DAEMON env var
to signal daemon mode, redirect child stdout/stderr to log file for
diagnosability, and show clear error when daemon fails to start.

Co-Authored-By: engineering/issue-solver <engineering-issue-solver@agents-squads.com>

Agent: engineering/issue-solver
Squad: engineering
Model: claude-opus-4-6

Co-authored-by: Squads Cloud Worker <cloud@agents-squads.com>
* feat(status): show milestones and open PRs from GitHub

squads status now queries GitHub API for real operational data:
- Milestone progress bars across product repos (cli, console, api)
- Open PRs targeting develop with repo and number

Replaces vanity-only output with actionable org health metrics.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(status): discover repos dynamically from squad definitions

Replace hardcoded PRODUCT_REPOS array with dynamic discovery:
- Read `repo` field from each SQUAD.md frontmatter
- Deduplicate and pass to fetchOperationalStatus()
- GitHub org derived from squad config, not hardcoded
- Dynamic column widths based on actual repo names
- Show all open PRs (not just develop-targeted)

Any user's squads with `repo:` in SQUAD.md will show milestones + PRs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs: rewrite CLAUDE.md as user-facing guide

Remove internal references, org names, and dev-specific content. Focus on
teaching users how to define squads, run agents, and monitor work. Git-provider
agnostic. Engineering standards now live in hq CLAUDE.md (internal only).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: kokevidaurre <kokevidaurre@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Closes #24

Converts ~50 static command imports to dynamic import() inside action
handlers. Only the invoked command's dependencies (pg, supabase, inquirer,
ora) are loaded, saving ~300ms+ on cold start.

Changes:
- All command handlers use dynamic import() in their .action() callbacks
- autoUpdateOnStartup skipped for --help/--version (instant response)
- register*Command imports kept static (needed for subcommand structure)
- Type-only import for SessionSummaryData (zero runtime cost)

Co-Authored-By: engineering/issue-solver <engineering-issue-solver@agents-squads.com>

Agent: engineering/issue-solver
Squad: engineering
Trigger: manual
Model: claude-opus-4-6

Co-authored-by: Squads Cloud Worker <cloud@agents-squads.com>
)

Closes #297

Show "squads dash" hints at key touchpoints:
- After successful foreground/background agent execution
- After lead session completion
- After parallel agent launch
- In squad detail status commands section

Co-Authored-By: engineering/issue-solver <engineering-issue-solver@agents-squads.com>

Agent: engineering/issue-solver
Squad: engineering
Trigger: manual
Model: claude-opus-4-6

Co-authored-by: Squads Cloud Worker <cloud@agents-squads.com>
Breaks down the 350-line executeWithClaude into 6 focused functions:
- buildAgentEnv: consolidates 3x duplicated env construction
- logVerboseExecution: DRYs up verbose config logging (was 2x identical)
- createAgentWorktree: isolates Node.js worktree creation
- buildDetachedShellScript: shared shell script for watch/background
- prepareLogFiles: shared log directory setup
- executeForeground: foreground spawn + status tracking
- executeWatch: watch mode (background + tail)

executeWithClaude is now a ~80-line coordinator that delegates to
the appropriate mode function.

Closes #158

Co-Authored-By: engineering/issue-solver <engineering-issue-solver@agents-squads.com>

Agent: engineering/issue-solver
Squad: engineering
Model: claude-opus-4-6

Co-authored-by: Squads Cloud Worker <cloud@agents-squads.com>
…dless flags

Closes #371

Two fixes for Google/Gemini provider execution:

1. Add --yolo flag to Gemini CLI args for headless auto-approval.
   Without this, Gemini denies all tool calls when running in background
   because it can't prompt for interactive confirmation.

2. Copy .agents directory into worktree and rewrite prompt paths.
   Gemini CLI sandboxes file access to its workspace directory.
   The prompt references agent definitions at the original project root,
   which Gemini blocks as "Path not in workspace". Now we copy .agents
   into the worktree and rewrite absolute paths so Gemini can resolve them.

Co-Authored-By: engineering/issue-solver <engineering-issue-solver@agents-squads.com>

Agent: engineering/issue-solver
Squad: engineering
Model: claude-opus-4-6

Co-authored-by: Squads Cloud Worker <cloud@agents-squads.com>
Closes #280

Implements `squads create <name>` that creates:
- .agents/squads/<name>/SQUAD.md (from template)
- .agents/squads/<name>/lead.md (starter agent)
- .agents/memory/<name>/lead/ (memory directory)

Supports --description, --goal, --model flags for non-interactive use,
and interactive prompts via inquirer when flags are omitted.
Includes --force for overwriting and --yes for CI/scripting.

Note: organization.yaml is not used — squads are discovered dynamically
via filesystem (squad-parser.ts findSquadsDir + listSquads).

11 tests covering directory creation, content, naming, overwrite
protection, and squad discoverability.

Co-Authored-By: engineering/issue-solver <engineering-issue-solver@agents-squads.com>

Agent: engineering/issue-solver
Squad: engineering
Trigger: manual
Model: claude-opus-4-6

Co-authored-by: Squads Cloud Worker <cloud@agents-squads.com>
Closes #366

When --cloud is set, the CLI dispatches agent execution to the platform
API instead of running locally. Requires `squads login` session and
SQUADS_API_URL environment variable.

Flow:
- POST /agent-dispatch to create dispatch request
- Poll /agent-executions for status updates
- Display execution summary on completion

Co-Authored-By: engineering/issue-solver <engineering-issue-solver@agents-squads.com>

Agent: engineering/issue-solver
Squad: engineering
Trigger: smart
Model: claude-opus-4-6

Co-authored-by: Squads Cloud Worker <cloud@agents-squads.com>
Closes #316

Added 63 tests covering 2 of the 6 lib modules listed in the issue:
- setup-checks.ts (48 tests): providers registry, commandExists,
  isDockerRunning, checkDockerPrereqs, checkGhCli, checkGhPermissions,
  checkClaudeCli, checkProviderAuth, runPrereqChecks, runAuthChecks,
  displayCheckResults, attemptFix, waitForService
- local.ts (15 tests): getLocalEnvVars, formatLocalStatus,
  isLangfuseLocal, getLocalStackStatus

Co-authored-by: Squads Cloud Worker <cloud@agents-squads.com>
Co-authored-by: Claude <noreply@anthropic.com>
…urces (#382)

Closes #314. Adds 115 tests across 4 test files achieving 92% statement
coverage and 80% branch coverage on the dashboard module:

- dashboard-loader.test.ts: 16 tests for findDashboardsDir, listDashboards,
  loadDashboard, clearDashboardCache, loadAllDashboards, findDashboard
- dashboard-renderers.test.ts: 49 tests for formatValue (all formats),
  getThresholdColor, calculateColumnWidths, and renderView (all view types)
- dashboard-sources.test.ts: 31 tests for buildQuery, buildWhereClause,
  parseDateRange, and postgresSource stub
- dashboard-engine.test.ts: 19 tests for executeDashboard, renderDashboard,
  and showAvailableDashboards with mocked dependencies

Co-authored-by: kokevidaurre <kokevidaurre@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
…381)

Closes #51

Changes:
- db.test.ts: Enable 4 previously skipped baseline tests (saveBaseline,
  getLatestBaseline, getBaselineByName, listBaselines) — stubs are
  implemented, tests were incorrectly marked as not-yet-implemented
- sessions.test.ts: Add 30 new tests covering file-system operations:
  findAgentsDir, getSessionsDir, getHistoryFilePath, getActiveSessions,
  getSessionSummary, startSession, stopSession, updateHeartbeat,
  cleanupStaleSessions — all use temp dirs to avoid test pollution
  Also expanded detectSquad, detectAIProcessesFast, getLiveSessionSummaryFast

Total: 63 → 104 tests passing, 0 skipped

Co-authored-by: kokevidaurre <kokevidaurre@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: kokevidaurre <kokevidaurre@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Post-execution instructions (branch, commit, PR workflow) now loaded from
.agents/config/post-execution.md instead of inline template string in run.ts.
Separates prompt content from code. Same pattern as approval-instructions.md.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This reverts commit 9999f92700c02af522e15cae29097a60f249cf15.
…eck (#389)

* fix(ci): run CI on PRs to develop — quality gate for agent PRs

Agents create PRs targeting develop. Without CI on develop PRs,
broken code gets merged undetected. This is the #1 quality gap.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(quality): pre-commit hook runs build + tests on source changes

Agents were committing broken code (e.g. #384: tests that fail on
import). Now any commit touching .ts/.tsx/.js files must pass both
`npm run build` and `npm run test` before the commit goes through.

This is the #1 quality gate — prevents slop at the source.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(tests): align failing tests with implementation

- deploy.test: capture process.stdout.write instead of console.log
  (deployCommand uses writeLine which writes to stdout)
- eval.test: same stdout capture fix for JSON output test
- infra.test: use POSTGRES_PORT env var (default 5433) to match
  docker-compose pattern
- local.test: expect port 5432 in DATABASE_URL matching getLocalEnvVars()
- setup-checks.test: expect 'warning' (not 'missing') when Docker
  is not installed, matching checkDockerPrereqs() implementation
- Deleted verify-token.test.ts (tested nonexistent verifyToken export)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(agents): proper PR workflow — target develop, daemon env, auth check

- Post-execution: agents now open PRs targeting `develop` with structured body
- Daemon (autonomous.ts): unset CLAUDECODE env to allow nested claude sessions
- Auth check: downgrade missing credentials from block to warn (keychain auth)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor(run): extract post-execution prompt to template file

Post-execution instructions (branch, commit, PR workflow) now loaded from
.agents/config/post-execution.md instead of inline template string.
Separates prompt content from code. Same pattern as approval-instructions.md.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: kokevidaurre <kokevidaurre@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
- Add missing env-config.ts (imported by run.ts but never committed)
- Fix Commander action spread types with @ts-expect-error directives
- Add inquirer type declaration for create command

Co-authored-by: kokevidaurre <kokevidaurre@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…tines' (#392)

Regex only matched '## Routines' exactly, missing Engineering squad's
'## Growth Routines' header. Now matches any word before 'Routines'.

Co-authored-by: kokevidaurre <kokevidaurre@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Multi-agent conversation orchestration for squad runs:
- Lead briefs → scanners discover → workers execute → lead reviews → verifiers check
- Shared transcript between agents for context continuity
- Convergence detection (continuation signals beat convergence signals)
- Cost ceiling ($25 default) and max turns (20 default) safety limits
- --task flag for founder directives (replaces lead briefing)
- Transcript persistence to .agents/conversations/{squad}/

New files:
- src/lib/conversation.ts — types, transcript, agent classification, convergence
- src/lib/workflow.ts — turn execution, orchestration loop, transcript persistence

`squads run <squad>` now runs a full conversation instead of just the lead agent.
`squads run <squad> -a <agent>` still runs individual agents (unchanged).

Co-authored-by: kokevidaurre <kokevidaurre@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* fix(auth): add verifyToken function and passing test suite

Closes #384

Adds verifyToken(token, apiUrl) to src/lib/auth.ts:
- Calls GET /auth/verify with Bearer token header
- Maps snake_case API response to camelCase (display_name→name, subscription_plan→plan)
- Returns null on non-ok responses, network errors, and timeouts/aborts
- 5-second abort timeout to prevent hanging

Creates test/verify-token.test.ts with all 6 specified tests:
1. Returns user data on 200 with snake_case→camelCase mapping
2. Returns null on non-ok response (e.g. 401)
3. Returns null on network error (silent)
4. Returns null on timeout/abort
5. Sends Bearer token in Authorization header
6. Builds correct URL from apiUrl param

Co-Authored-By: cli/issue-solver <cli-issue-solver@agents-squads.com>

Agent: cli/issue-solver
Squad: cli

* fix(auth): update verifyToken signature and response to match API spec

Revises the initial implementation based on actual API contract:
- Parameter order: verifyToken(apiUrl, token) — apiUrl first
- Endpoint: /auth/cli/verify (not /auth/verify)
- Response shape: { email, tenantId, tenantSlug, tenantName, status }
  mapping from snake_case { tenant_id, tenant_slug, tenant_name }
- Updates test/verify-token.test.ts to use vi.stubGlobal per-test
  with afterEach cleanup for better test isolation

All 6 tests pass.

Co-Authored-By: cli/issue-solver <cli-issue-solver@agents-squads.com>

Agent: cli/issue-solver
Squad: cli

---------

Co-authored-by: kokevidaurre <kokevidaurre@users.noreply.github.com>
* test(commands): add unit tests for goal and list commands

Adds 21 new tests covering:
- goal.test.ts (14 tests): goalSetCommand, goalListCommand,
  goalCompleteCommand, goalProgressCommand — including edge cases
  for invalid indexes, non-existent squads, metric annotations
- list.test.ts (7 tests): JSON output validation, agent counts,
  no-project error handling, table and agents view rendering

Partial fix for #47 — covers 2 of 19 untested command files.

Co-Authored-By: engineering/issue-solver <engineering-issue-solver@agents-squads.com>

Agent: engineering/issue-solver
Squad: engineering
Model: claude-opus-4-6

* test: add unit tests for feedback and progress commands

Closes #47 (partial — 2 of 15 untested commands)

Added 19 tests covering:
- feedback: add, show, parse history, rating validation, learnings
- progress: start/complete tasks, display, verbose mode, task IDs

Co-Authored-By: engineering/issue-solver <engineering-issue-solver@agents-squads.com>

Agent: engineering/issue-solver
Squad: engineering
Model: claude-opus-4-6

---------

Co-authored-by: kokevidaurre <kokevidaurre@users.noreply.github.com>
…ification

- classifyAgent now uses role descriptions from SQUAD.md (primary) with
  name-based fallback — no more regex substring collisions
- Strip **bold** markers from agent names in table parser
- Replace regex convergence/continuation signals with phrase matching
- "keychain auth" → "OAuth" in run output

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- session.test.ts: 11 tests covering sessionStartCommand,
  sessionStopCommand, sessionHeartbeatCommand, and detectSquadCommand
  (start/stop/heartbeat lifecycle, quiet mode, missing .agents dir)
- learn.test.ts: 14 tests covering learnCommand, learnShowCommand,
  and learnSearchCommand (default squad, specific squad, fallback,
  category inference, tag extraction, search, filters)

Part of #47 — adds coverage for 2 more previously untested commands.

Co-Authored-By: cli/issue-solver <cli-issue-solver@agents-squads.com>

Agent: cli/issue-solver
Squad: cli

Co-authored-by: kokevidaurre <kokevidaurre@users.noreply.github.com>
agents-squads bot and others added 5 commits March 9, 2026 10:32
…ive AI CLI checks (#561)

fix(terminal): stop ANSI leak in piped output

Prioritizes TTY check over AI CLI env var detection. Removes false-positive
env vars (GEMINI_API_KEY, CODEIUM_API_KEY) that triggered color output
when users pipe squads output.

Closes #558.
docs: add 8 missing commands to README command reference

Adds autonomy, cognition, deploy, detect-squad, exec, orchestrate,
session, and version to the README command tables.

Closes #557.
Agents were creating PRs with the founder's personal auth, blocking
self-approval due to branch protection. Now injects GitHub App bot
token so agents operate as bot identity, enabling auto-merge.

Also fixes lead merge instruction to use --auto flag (waits for CI).

Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
Co-authored-by: Claude <noreply@anthropic.com>
Pause squads with unresolved escalations (blocked/needs-human issues).
Grade each execution A-F using heuristics (merged PR=A, no artifacts=F).
Feed quality signals into cognition engine. Adjust daemon scoring based
on agent quality history — high performers get boosted, slop gets
deprioritized.

Closes #566, closes #567

Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
Co-authored-by: Claude <noreply@anthropic.com>
…565)

Closes #555

Add 40 tests covering all exported functions in src/lib/slack.ts (previously 0% coverage):
- slackApi: auth header, POST body, error handling
- isSlackConfigured: env var check
- getApprovalTier: YAML parsing for auto/notify/approve/confirm tiers
- getSquadChannelId: channel lookup and error cases
- postNotification: message posting with blocks
- postApprovalRequest: approval buttons and notify tier
- waitForApproval: reaction polling, context parsing, timeout
- requestApprovalAndWait: tier routing and fallback behavior
- createSquadChannel: creation, topic setting, name_taken handling
- notifyTonightStart/Complete: session notification formatting

Co-Authored-By: engineering/issue-solver <engineering-issue-solver@agents-squads.com>

Agent: engineering/issue-solver
Squad: engineering
Model: claude-opus-4-6

Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
kokevidaurre pushed a commit that referenced this pull request Mar 9, 2026
Merged PR #565, closed 5 issues (init UX + slack tests), closed stale PR #533.
Open issues down from 20 to 15. PR #492 still awaiting founder merge.

Co-Authored-By: Claude <noreply@anthropic.com>
agents-squads bot and others added 4 commits March 9, 2026 20:51
Merged PR #565, closed 5 issues (init UX + slack tests), closed stale PR #533.
Open issues down from 20 to 15. PR #492 still awaiting founder merge.

Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
Co-authored-by: Claude <noreply@anthropic.com>
Closes #553

Add 16 unit tests covering runConversation and saveTranscript:
- runConversation: no squads dir, no lead, convergence on lead signal,
  cost ceiling, max turns, task directive, repo cwd resolution,
  unclassifiable agent exclusion
- saveTranscript: no squads dir returns null, creates dir, skips existing
  dir, returns .md path, writes turn content, cost estimate, empty
  transcript, squad name in path

Co-Authored-By: cli/issue-solver <cli-issue-solver@agents-squads.com>

Agent: cli/issue-solver
Squad: cli

Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
Closes #554

Add 18 unit tests covering:
- checkServiceAvailable: unknown service, container not running,
  docker error, healthy postgres, guidance show/suppress,
  health URL fail/pass/non-ok, starting health status
- showServiceSetupGuide: unknown service, known service output,
  setup steps, env vars, all services, footer

Co-Authored-By: cli/issue-solver <cli-issue-solver@agents-squads.com>

Agent: cli/issue-solver
Squad: cli

Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
* fix(lint): eliminate 62 ESLint no-unused-vars warnings

Closes #550

Removes unused imports and renames unused variables across 10 files.
All no-unused-vars warnings reduced from 62 → 0.
Remaining 34 warnings are no-explicit-any (tracked in #551).

Files changed:
- daemon.ts: remove LoopState, SquadSignal, GhIssue, defaultState, getLastRunAge
- dashboard.ts: remove formatCostBar, fetchRateLimits
- doctor.ts: remove homedir, bold, icons imports
- health.ts: rename options → _options (unused param)
- run.ts: remove getPRsWithReviewFeedback, buildReviewTask, getBeliefsContext,
          homedir, checkNewPRs; use empty catch for fail-safe blocks
- stats.ts: remove getOutcomeRecords
- anthropic.ts: rename skillId → _skillId (stub functions)
- cognition.ts: remove execSync import
- outcomes.ts: rename unmergedPRs → _unmergedPRs
- workflow.ts: remove readFileSync, execAsync, promisify;
              rename model → _model, stderr → _stderr

Co-Authored-By: cli/issue-solver <cli-issue-solver@agents-squads.com>

Agent: cli/issue-solver
Squad: cli
Model: claude-sonnet-4-6

* fix(lint): restore exec import and add callback types in workflow.ts

Re-adds `exec` import removed by lint cleanup (still used at line 194).
Adds explicit types to exec callback params to fix TS7006 errors.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
kokevidaurre and others added 2 commits March 10, 2026 00:29
Closes #348

Cut verbose features prose (Dashboard, Memory System, Session Detection,
Autonomous Execution, Claude Code Integration JSON) and condensed
Configuration examples into a quick reference. Kept all command tables,
quick start, why squads, providers, project structure, and dev setup.

Result: clear getting started in <5 steps, links to docs for advanced
topics, all stale Claude Code hooks JSON removed.

Co-Authored-By: cli/issue-solver <cli-issue-solver@agents-squads.com>

Agent: cli/issue-solver
Squad: cli

Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
Professional README with clear usage, base squads, prerequisites.
Remove: old tarball, briefs/, .agents/, dashboard.png.

Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
Co-authored-by: Claude <noreply@anthropic.com>
agents-squads bot and others added 2 commits March 10, 2026 17:27
* test(outcomes): add 37 tests for outcome tracking module

Closes #574

Covers:
- gradeExecution: all grade paths (A, B, C, D, F) with edge cases
- computeScorecard: empty records, period filtering, rate calculations
- computeAllScorecards: unique agent grouping, sort, persist
- getAgentQualityScore: minimum threshold, grade average
- getOutcomeScoreModifier: waste/merge/quality modifier thresholds
- recordArtifacts: dedup, no-repo guard, gh CLI failures
- pollOutcomes: PR/issue state transitions, age-out, graceful failures
- getScorecards / getOutcomeRecords: cached reads

Co-Authored-By: cli/issue-solver <cli-issue-solver@agents-squads.com>

Agent: cli/issue-solver
Squad: cli

* refactor(test): simplify outcomes.test.ts — extract makeOutcomes() helper

- Add makeOutcomes() helper to eliminate 10+ inline outcomes object copies
- Replace all { ...makeRecord().outcomes, ... } antipattern with makeOutcomes({ ... })
- Remove redundant mockReadFileSync.mockReturnValue() calls in modifier tests
  (setupStore() already sets the mock; duplicating it was confusing)
- Fix implicit test ordering dependency in bonus modifier test by using
  explicit setupStore() instead of relying on previous test's mock state

All 37 tests pass.

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
Co-authored-by: Claude <noreply@anthropic.com>
Three changes to prevent test file collision during parallel execution:

1. pool: 'forks' in vitest.config.ts — each file runs in its own process,
   preventing GIT_DIR env var deletions in one file's beforeAll from
   leaking into other concurrently-running test files.

2. HOME: cwd in runCli env — the CLI reads ~/.squads/config.json via
   os.homedir(). With HOME=cwd, each test's config writes go to an
   isolated temp path instead of the shared real home directory.

3. Math.random() suffix on all temp dir names — eliminates same-millisecond
   collision on machines where Date.now() has low resolution.

Closes #578

Co-Authored-By: Claude <noreply@anthropic.com>

Agent: cli/issue-solver
Squad: cli

Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
@kokevidaurre kokevidaurre enabled auto-merge (squash) March 10, 2026 20:28
agents-squads bot and others added 9 commits March 11, 2026 10:51
Adds test/commands/run.test.ts covering the exported runCommand and
runSquadCommand functions with 22 unit tests across 5 describe blocks:
- no squads directory (3 tests)
- --cloud flag handling (5 tests)
- target not found error paths (5 tests)
- preflight provider CLI check (3 tests)
- slash syntax parsing (2 tests)
- runSquadCommand delegation (3 tests)

All tests mock fs, child_process, and all lib modules. Uses
SQUADS_SKIP_CHECKS=1 to bypass preflight where needed.

Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
Co-authored-by: Claude <noreply@anthropic.com>
#566 (#591)

Closes #566

Covers:
- hasUnresolvedEscalation: blocked/needs-human label detection, fail-open on gh errors
- scoreSquads: PAUSED signal (score=0) for blocked squads, normal scoring for clean squads
- classifyRunOutcome: failed/skipped/completed paths
- checkCooldown: cooldown enforcement and expiry
- defaultState: initial state structure

The escalation pause logic was already implemented in squad-loop.ts.
This PR adds the missing test coverage to lock in the behavior.

Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
Co-authored-by: Claude <noreply@anthropic.com>
…culateSquadCostProjections, and plan detection (#592)

- formatCostBar: 7 tests — boundary values, clamping, rounding, width
- calculateROIMetrics: 9 tests — cost per goal/commit/PR, ROI multiplier, projections, null handling
- calculateSquadCostProjections: 5 tests — null/empty input, multi-squad projections, weekly/monthly ratios
- detectPlan/getPlanType/isMaxPlan/getPlanDescription: 17 tests — all env signal paths, priority ordering, descriptions

Closes #556

Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
Co-authored-by: Claude <noreply@anthropic.com>
* feat(run): inject SYSTEM.md as immutable Layer 1 in agent prompt

- Add loadSystemProtocol() to run-context.ts — reads .agents/SYSTEM.md
- Inject SYSTEM.md first in prompt, marked as [IMMUTABLE — NEVER OVERRIDE]
- Skip loadApprovalInstructions() and loadPostExecution() when SYSTEM.md loaded
- Mark both deprecated functions with @deprecated JSDoc
- Graceful fallback: if no SYSTEM.md, legacy config files still used

Closes #585

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor(run-context): extract readAgentsFile helper, fix abstraction boundary

- Extract readAgentsFile() to eliminate boilerplate across 3 loaders
- loadSystemProtocol() returns raw content; caller wraps with [IMMUTABLE] markers
- loadApprovalInstructions() uses shared helper (removes duplicate find+read+warn)
- loadPostExecution() uses shared helper (removes duplicate find+read+warn)
- Add verbose log when SYSTEM.md absent (was silent)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
Co-authored-by: Claude <noreply@anthropic.com>
* feat(context): phase-ordered execution with role-based context cascade

Implement the full context overhaul for autonomous agent orchestration:

- Role-based context (scanner/worker/lead/coo) with token budgets and
  section gating — scanners get 3 sections, leads get all 10
- Topological phase ordering via depends_on in SQUAD.md frontmatter
  (Kahn's algorithm, cycle detection, wildcard support)
- --phased flag for autopilot: sequential phases, parallel within
- Context injection into conversation mode (workflow.ts)
- CLAUDECODE env var properly stripped via destructuring (not empty string)
- Backward-compatible: priorities.md falls back to goals.md, --phased is opt-in
- Pre-commit hook: remove false positives for documented file conventions
- README updated with "How Agents Think" context philosophy section
- All 1608 tests pass

Co-Authored-By: Claude <noreply@anthropic.com>

* feat(eval): default post-run COO evaluation after every squad run

After any squad or agent execution, the COO (company-lead) automatically
evaluates outputs against priorities and directives. Generates feedback.md
and active-work.md per squad. Cross-squad assessment for multi-squad runs.

- Single squad: `squads run engineering` → eval engineering
- Single agent: `squads run engineering/issue-solver` → eval engineering
- Autopilot cycle: eval all dispatched squads after each cycle
- Skip recursion: company squad runs don't trigger self-evaluation
- Opt-out: `--no-eval` flag to skip evaluation

Co-Authored-By: Claude <noreply@anthropic.com>

* feat(eval): trajectory-aware evaluation with history tracking

The COO evaluation now:
- Reads previous feedback.md FIRST as baseline (not blank-slate)
- Measures direction (improving/stable/declining), not just position
- Maintains a history table (last 10 grades) so trajectory is visible
- Uses 7-day GitHub window (not 24h) for meaningful trend analysis
- Cross-squad review written to cross-squad-review.md
- Explicit: "C improving from F > B declining from A"

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(eval): inject --task directive into runAgent prompt

The task option was only wired into conversation mode, not single-agent
execution. COO evaluation task was being silently dropped. Now injected
as a TASK DIRECTIVE section that overrides default agent behavior.

Co-Authored-By: Claude <noreply@anthropic.com>

* docs(readme): rewrite intro with architectural vision

Position Squads as OS-native alternative to framework-based agent tools.
Lead with the three architectural pillars: native LLM CLIs as runtime,
filesystem as memory, GitHub as message bus.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(run): cleanup worktrees after agent execution

Worktrees were created per execution but never removed, accumulating
120+ stale directories. Now cleanup runs in all execution paths:
foreground, background, detached, and non-Anthropic providers.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove hardcoded localhost URLs and Docker references from CLI

Source changes:
- Replace process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088' with
  getEnv().bridge_url in sync.ts and autonomy.ts
- Replace "Is the bridge running?" and "squads stack up" messages with
  "squads login" guidance

Test updates (27 tests across 6 files):
- env-config: default environment is now 'prod', local env has empty URLs
- services: checkServiceAvailable uses fetch health checks, not Docker
- local: new service interface (url instead of port/healthUrl/configPath)
- setup-checks: Docker is optional (always returns 'ok')
- templates/memory: match new interfaces and env requirements

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(lint): use const for non-reassigned Set binding in computePhases

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove Docker/infrastructure leaks from all source files

Complete cleanup of internal infrastructure references from OSS CLI:
- services.ts: remove Docker container checks, use fetch-based health
- local.ts: remove port/healthUrl/configPath, use simple URL-based status
- env-config.ts: default to 'prod' environment, local env uses empty URLs
- setup-checks.ts: Docker is optional (always returns 'ok')
- health.ts, memory.ts, deploy.ts, costs.ts: graceful degradation
- cli.ts, approval.ts, context-feed.ts, cost.ts, history.ts, trigger.ts,
  stack-config.ts, telemetry.ts: minor cleanup

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(test): set SQUADS_BRIDGE_URL in memory search/extract tests

Tests for memorySearchCommand and memoryExtractCommand need bridge URL
set to avoid early return from getBridgeUrl() empty check.

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
Co-authored-by: Claude <noreply@anthropic.com>
- Fix ReferenceError: provider is not defined in executeWithClaude
- Add missing outcomes.ts, insights.ts, stats.ts from develop
- Every squads run crashed on v0.7.0, D1 retention effectively 0%

Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
Co-authored-by: Claude <noreply@anthropic.com>
The pre-commit hook contained client names, personal emails, and
financial terms in plaintext — on a public repo. Moved blocked
patterns to .husky/.blocked-patterns (gitignored, local-only).
Hook reads from external file if present, skips PII check if not.

Co-Authored-By: Claude <noreply@anthropic.com>
Hook contained client names and personal data on a public repo.
Commenting out entirely until proper local-only solution is in place.

Co-Authored-By: Claude <noreply@anthropic.com>
Symlink was accidentally committed. Already in .gitignore.

Co-Authored-By: Claude <noreply@anthropic.com>
@kokevidaurre kokevidaurre merged commit c4c92b3 into main Mar 12, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant