release: v0.3.0-rc.1 — OIDC publish fix + @next burn-in#756
release: v0.3.0-rc.1 — OIDC publish fix + @next burn-in#756kokevidaurre merged 18 commits intomainfrom
Conversation
…1/7] (#731) * refactor(core): run engine decomposition, context helpers, squad parser improvements Core runtime refactoring from v0.3.0 development cycle: - run-context.ts: expanded context helpers for goal injection, feedback, state - run-modes.ts: simplified run modes, removed per-squad limits - run-types.ts: added conversation_agents field type - execution-engine.ts: phase-ordered execution, role-based context - agent-runner.ts: bot identity injection, guardrail hooks, tool sets - squad-parser.ts: findProjectRoot, skills loading, dynamic discovery - env-config.ts: environment URL resolution additions Original commits: ~25 from develop (refactors, type fixes, context system updates) Backup tag: pre-v0.3.0-backup Co-Authored-By: Claude <noreply@anthropic.com> * fix: address Gemini review — configurable cred path, use parseAgentFrontmatter, fix staleness calc - execution-engine.ts: GCP credential path now configurable via SQUADS_GCP_CREDENTIALS_DIR env var (was hardcoded ~/.squads/secrets/). Use parseAgentFrontmatter() instead of fragile regex for model detection. - run-context.ts: Replace magic number 86400000 with MS_PER_DAY constant, use Math.floor instead of Math.round for staleness calculation. Co-Authored-By: Claude <noreply@anthropic.com> * fix(types): add model field to AgentFrontmatter interface Typecheck failed because parseAgentFrontmatter() returns AgentFrontmatter which didn't include the model property. Co-Authored-By: Claude <noreply@anthropic.com> * fix(lint): remove unused imports in agent-runner — SOFT_DEADLINE_RATIO, preflightExecutorCheck, pushCognitionSignal, findMemoryDir, timeoutMins Co-Authored-By: Claude <noreply@anthropic.com> * fix(lint): remove all 20 unused variable warnings across 9 files Cleaned up unused imports and variables flagged by eslint: - agent-runner.ts: DEFAULT_TIMEOUT_MINUTES, bold, gradient - scorecard-engine.ts: readFileSync - org-cycle.ts: logObservability, ObservabilityRecord - outcomes.ts: prefixed unmergedPRs with _ - repo-enforcement.ts: resolve - run-context.ts: removed unused readDirMd function + readdirSync - run-modes.ts: spawn, getProjectRoot, checkLocalCooldown, DEFAULT_SCHEDULED_COOLDOWN_MS, saveTranscript, reportExecutionStart, reportConversationResult, getBridgeUrl, ora - run-utils.ts: findMemoryDir - squad-loop.ts: Squad type Zero warnings remaining. Zero type errors. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com> Co-authored-by: Claude <noreply@anthropic.com>
…v0.3.0 — 2/7] (#732) * feat(run): workflow rewrite — smart skip, org cycle, wave execution, focus/resume Run engine and workflow rewrite from v0.3.0 development cycle. Fixes applied from Gemini Code Assist review: - HIGH: task directive now includes planPrompt context (was bypassed) - HIGH: converged reflects actual status (was forced true) - MEDIUM: setTimeout cleared on close/error (resource leak) - MEDIUM: skip logic query limit bumped to 500 - MEDIUM: fallback assigns ALL workers, not just first - Added CLI_RUN_COMPLETE telemetry event - Removed unused imports (dirname, homedir, bold) Co-Authored-By: Claude <noreply@anthropic.com> * fix(test): add findProjectRoot to squad-parser mock in workflow tests Co-Authored-By: Claude <noreply@anthropic.com> * fix(test): findProjectRoot mock should use mockReturnValue (sync, not async) findProjectRoot() returns string|null, not a Promise. Co-Authored-By: Claude <noreply@anthropic.com> * fix(test): update workflow tests for spawn-based agent execution workflow.ts now uses spawn instead of execSync. Updated test mocks: - Added createMockChild helper for spawn-based child processes - Added appendFileSync to fs mock - Added observability mock (snapshotGoals, diffGoals, logObservability) - All 16 tests pass Co-Authored-By: Claude <noreply@anthropic.com> * fix: remove hardcoded squad names from org cycle waves Wave definitions had our internal squad names (research, intelligence, cli, marketing, etc.) hardcoded. A user's squads would never match. Now: all planned squads run in a single parallel wave. Custom wave ordering can be added later via SQUAD.md `wave:` field. Co-Authored-By: Claude <noreply@anthropic.com> * fix: remove hardcoded git commit of .agents/memory/ between waves Auto-committing hq memory between waves was our internal pattern, not a product feature. Users won't have .agents/memory/ in their project root. Removed. Co-Authored-By: Claude <noreply@anthropic.com> * refactor: extract plan prompt to templates/prompts/plan.md "No prompts in code" — behavioral instructions live in markdown. Extracted the inline planPrompt template string to a markdown file with {{VARIABLE}} placeholders. TypeScript loads and substitutes. Also: squadContext is now included in the template (was passed as empty string, losing goals/priorities context). Co-Authored-By: Claude <noreply@anthropic.com> * fix(lint): remove unused execSync import from run.ts No longer needed after removing hardcoded git commit between waves. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com> Co-authored-by: Claude <noreply@anthropic.com>
* feat(conversation): agents talk + use tools, cognition engine, convergence Conversation mode rewrite and cognition engine from v0.3.0 cycle: - conversation.ts: Rewritten so agents talk AND use tools (was text-only). Parallel same-role agents within cycles. Hard-stop on lead completion. Squad cwd resolution for all agent turns. Transcript serialization fixes. Agent classification by name first, then role description. - cognition.ts: Local-first intelligence engine. Quality grading. Escalation pause for daemon. Signal synthesis via Claude CLI. Push memory signals after daemon cycles. Co-Authored-By: Claude <noreply@anthropic.com> * refactor: remove cognition.ts changes from this PR Cognition engine is not actively used (post-pivot, daemon is stopped). Changes parked in future/cognition-t2 branch for Tier 2 reactivation. This PR now only contains conversation.ts changes. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com> Co-authored-by: Claude <noreply@anthropic.com>
… — 4/7] (#734) * feat(commands): add review, credentials, goals, log commands + minor fixes New commands: - credentials.ts: per-squad GCP service account management - goals.ts: goals dashboard with status tracking - log.ts: run history with timestamps, duration, status - review.ts: post-cycle evaluation dashboard Fixes applied: - Added CLI_LOG telemetry event - Removed unused imports (writeFileSync, formatRelativeTime) - Removed unused variables (blockedStr, achievedStr) - Fixed hardcoded org name in review.ts issue URL resolution Co-Authored-By: Claude <noreply@anthropic.com> * fix: address Gemini review on credentials.ts - Use static renameSync import instead of dynamic import('fs') - Remove redundant --all handling (dedicated create-all command exists) Co-Authored-By: Claude <noreply@anthropic.com> * refactor(credentials): remove hardcoded squad names, read config from SQUAD.md credentials.ts had our internal squad names and GCP roles hardcoded. Now fully agnostic: - Permissions read from SQUAD.md `credentials.gcp.roles/apis` fields - Squads discovered dynamically from squads directory - No hardcoded squad names, org names, or internal structure - Helpful error message shows users how to configure their SQUAD.md - create-all discovers squads with GCP config automatically Co-Authored-By: Claude <noreply@anthropic.com> * test(credentials): add 8 tests for SQUAD.md GCP credentials parser Extracted parseGcpCredentials() as pure function for testability. Tests cover: inline YAML, quoted values, multiple APIs, missing config, empty content, roles without apis, mixed SQUAD.md content. All 8 pass. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com> Co-authored-by: Claude <noreply@anthropic.com>
…735) * feat(init): demo agent scaffold, what's next guidance, email capture Init UX improvements from v0.3.0 cycle: - "What's next" guidance after init with actionable next steps - Opt-in email capture for product updates - Demo squad scaffold with hello-world starter agent - IDP catalog seeding for agent frontmatter schemas - Competitor collection during init - Hints for empty business description - cli.run.complete telemetry event Co-Authored-By: Claude <noreply@anthropic.com> * fix(test): update E2E to expect 5 squads (4 core + demo) Init now creates a demo squad with hello-world agent. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com> Co-authored-by: Claude <noreply@anthropic.com>
… — 6/7] (#736) * feat(security): PreToolUse guardrail hooks for spawned agent sessions guardrail.json template injected into all spawned Claude sessions. Prevents agents from running destructive commands, force-pushing, publishing packages, or accessing secrets directly. Co-Authored-By: Claude <noreply@anthropic.com> * fix(security): add npm/yarn/pnpm publish to guardrail blocked commands Gemini review caught missing publish checks. Agents should never publish packages — that requires founder approval. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com> Co-authored-by: Claude <noreply@anthropic.com>
…#737) * test+docs: coverage + tier 2 docs + version bump to 0.3.0 Tests added (213 new tests): - catalog.test.ts: catalog command tests - dashboard.test.ts: dashboard engine, renderers, loader tests - services.test.ts: services command tests - first-run.e2e.test.ts: updated for demo squad scaffold - guardrail.test.ts: guardrail hook tests - init.test.ts: expanded init command tests - telemetry.test.ts: telemetry event tests Docs: - docs/tier2.md: Tier 2 architecture documentation Version: - package.json: bump to 0.3.0 Note: cli.test.ts failures are pre-existing on develop (not introduced by this PR). Co-Authored-By: Claude <noreply@anthropic.com> * docs: remove tier2.md — internal architecture, not product docs Hardcoded our repo structure, ports, service names. Belongs in private engineering repo, not the public CLI. Co-Authored-By: Claude <noreply@anthropic.com> * test: replace mock-heavy tests with real integration tests Before: 2,299 lines mocking fs, squad-parser, child_process, etc. Testing mocks, not the product. False confidence. After: 465 lines testing real files on real filesystem. - catalog: real IDP directory with YAML files - dashboard: zero mocks, real data structures into renderers - services: real docker-compose.yml in temp dir - init: real temp directory, verify actual files created 39 tests, all passing. 80% less code, 100% more real coverage. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com> Co-authored-by: Claude <noreply@anthropic.com>
* fix(services): make agnostic — remove hardcoded paths and internal assumptions Before: searched for docker-compose.yml in ~/agents-squads/engineering/docker/ and hardcoded squads-postgres container name, internal DB table names. Now: - Discovers docker-compose.yml from project root, ./docker/, ./infra/, SQUADS_COMPOSE_FILE env var, or --file flag - Uses docker compose ps against user's compose file - Removed hardcoded port output and DB introspection - --file option on all 3 subcommands (up/down/status) - Health check verifies containers are actually running - Updated tests to match new agnostic implementation Co-Authored-By: Claude <noreply@anthropic.com> * test(services): update tests for agnostic services command - Use SQUADS_COMPOSE_FILE env var instead of hardcoded engineering path - Check --file option on all subcommands - Fix health check mock to return 'running' state - Updated status test for Docker not installed case Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com> Co-authored-by: Claude <noreply@anthropic.com>
…0.3.0] (#739) * fix(telemetry): restore write-only API key — telemetry broken since March 14 Commit 6261882 removed the telemetry key and replaced it with an env var that no user has set. Result: zero telemetry events since ~March 14. Write-only analytics keys are standard practice (Segment, PostHog, Mixpanel all ship them in public code). The key can only write events; it cannot read, delete, or access any data. Users can still opt out. Closes #388 (GitHub Traffic API — this restores our primary data signal) Co-Authored-By: Claude <noreply@anthropic.com> * fix: use plain string for telemetry key, drop base64 obfuscation Gemini review: base64 encoding adds no security and reduces transparency. Plain string is honest — it's a write-only key, nothing to hide. Co-Authored-By: Claude <noreply@anthropic.com> * fix: lock telemetry key — no env var override Telemetry goes to our infrastructure only. No reason to let users redirect it. They can opt out, but not redirect. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com> Co-authored-by: Claude <noreply@anthropic.com>
….0] (#740) * fix(run): UX improvements — prerequisites check, no-args squad list, schedule hint (#675, #694, #695) - Add checkPrerequisites() validating Node >= 18 and Claude CLI before run - Show available squads with missions when `squads run` invoked without args - Display scheduling tip after first successful squad run (persisted in ~/.squads-cli/schedule-hint-shown) Co-Authored-By: Claude <noreply@anthropic.com> * fix: skip prerequisites check in CI/test environments checkPrerequisites() called process.exit(1) when Claude CLI not found, killing the test runner. Now skips when CI or VITEST env vars are set. Co-Authored-By: Claude <noreply@anthropic.com> * fix: address Gemini review — remove redundant CLI check, fix cron hint, cleanup - Removed redundant Claude CLI check (preflightExecutorCheck handles it) - Removed non-existent --cron flag from schedule hint - Removed unused runAutopilot import (replaced by squad listing) - Added VITEST to skip conditions Co-Authored-By: Claude <noreply@anthropic.com> * fix(lint): remove unused execSync import Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com> Co-authored-by: Claude <noreply@anthropic.com>
Tags matching v<semver>-<suffix> (e.g., v0.3.0-rc.1) publish to @next and mark the GitHub Release as pre-release. Clean semver tags (v0.3.0) continue publishing to @latest. Enables a burn-in channel for major releases — users opt in with `npm i squads-cli@next` before we promote to @latest. Co-Authored-By: Claude <noreply@anthropic.com>
) * fix(workflow): role-based timeouts + anti-collision rules in plan prompt Two root causes of poor org run quality: 1. Workers timed out at 8 minutes (hardcoded) — can't complete real work like creating PRs, running BQ queries, or writing reports. Now role-based: scanners 10min, verifiers 15min, leads+workers 30min. 2. Multiple squads created duplicate deliverables (e.g., both ops and cli tried to create the v0.3.0 release PR). Plan prompt now includes explicit rules: only work on YOUR goals, check depends_on before acting, verify before creating, no PII on public repos. Closes #742 (partially — timeout portion) Co-Authored-By: Claude <noreply@anthropic.com> * fix: use DEFAULT_TIMEOUT_MINUTES + SQUADS_AGENT_TIMEOUT_MINUTES env var No hardcoded values. Timeout comes from: 1. SQUADS_AGENT_TIMEOUT_MINUTES env var (user override) 2. DEFAULT_TIMEOUT_MINUTES from run-types.ts (30 min) Co-Authored-By: Claude <noreply@anthropic.com> * fix: address Gemini review — timeout declaration order + dependency check instructions - workflow.ts: move timeout declaration before event handlers (no-use-before-define) - plan.md: specify how to check depends_on (read goals.md status field, use gh CLI) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com> Co-authored-by: Claude <noreply@anthropic.com>
…nfig [v0.3.0] (#749) * fix(audit): remove hardcoded values, extract prompts, parameterize config 5 audit findings remediated: 1. tier-detect.ts: use getApiUrl/getBridgeUrl from env-config 2. agent-runner/workflow/run-modes: replace company-lead string match with frontmatter role 3. cognition.ts: parameterize company name via SQUADS_COMPANY_NAME 4. run-modes.ts: extract lead prompt to templates/prompts/lead-mode.md 5. lead-orchestrator.ts: extract orchestrator prompt to templates/prompts/orchestrator.md Co-Authored-By: Claude <noreply@anthropic.com> * fix: address Gemini review — use replaceAll for template tags - lead-orchestrator.ts: {{WORKERS}} now uses regex for consistency - run-modes.ts: all template tags use replaceAll() for multi-occurrence safety Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com> Co-authored-by: Claude <noreply@anthropic.com>
* feat: add project-level config system (.squads/config.yml) Centralizes runtime settings (agent timeout, token budget, cost ceiling, company name, compose file, telemetry) into a single project config file with env var > config file > constant default resolution order. - New: src/lib/config.ts — loader with minimal YAML parser, no deps - New: templates/config.example.yml — ships with package - Updated: workflow.ts reads token_budget + cost_ceiling from config - Updated: cognition.ts reads company_name from config (was hardcoded) - Updated: services.ts reads compose_file from config - Updated: telemetry.ts checks config for telemetry opt-out - Updated: init.ts generates .squads/config.yml + gitignore entry Co-Authored-By: Claude <noreply@anthropic.com> * fix: address Gemini review — YAML parser, gitignore check, config resolution - config.ts: allow uppercase YAML keys (normalized to lowercase), fix comment stripping for quoted values and comment-only values - init.ts: exact line match for gitignore entry (not substring) - services.ts: remove redundant env var check, use loadProjectConfig() as single config source Co-Authored-By: Claude <noreply@anthropic.com> * test(services): reset config cache in beforeEach Config cache held a stale null compose_file across tests, so the env-var override case failed because earlier tests had already cached the unset state. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com> Co-authored-by: Claude <noreply@anthropic.com>
* feat(templates): evaluation-first goals + add growth squad Every non-demo starter squad now ships with a first-run "Squad evaluation" goal so `squads run <squad>` produces deliverable output on first invocation: audit the domain against BUSINESS_BRIEF.md and output a baseline report with top priorities. Adds a new `growth` squad (4 agents — growth-lead, funnel-analyst, experiment-runner, growth-critic) distinct from marketing: growth owns AARRR funnel, experiments, and kills vanity metrics. Marketing creates content, growth measures and distributes. Growth exposed via: - Use-case option in `squads init` - `--pack growth` flag - Included in `--pack all` - Included in `full-company` use case Closes #751 * fix: address Gemini review — marketing dep + use-case + state files - growth use case now includes getMarketingSquad() (declared dependency) - --pack processing updates selectedUseCase so getFirstRunCommand suggests the right first agent (e.g. growth-lead instead of always research/lead) - --pack growth now also installs marketing (dependency) - Added initial state.md for funnel-analyst, experiment-runner, growth-critic so their first-run Read() calls do not fail --------- Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
Pre-release candidate for v0.3.0. Will publish to @next dist-tag via release.yml (tag matches v<semver>-<suffix> pattern). Users can test with: npm i -g squads-cli@next Promotes to @latest after burn-in by tagging main with v0.3.0. Co-Authored-By: Claude <noreply@anthropic.com>
Both publish.yml (manual) and release.yml (tag-triggered) passed
NODE_AUTH_TOKEN: \${{ secrets.NPM_TOKEN }} to npm publish, which npm
prefers over OIDC. With a stale NPM_TOKEN, publishes failed 404 and
OIDC was never attempted.
Changes:
- Remove NODE_AUTH_TOKEN from both publish steps — npm falls back to OIDC
via the trusted publisher already configured on npmjs.com
- Upgrade Node to 22 and install npm@latest so npm >= 11.5.1 is used
(required for OIDC trusted publisher authentication)
- publish.yml: detect pre-release dist-tag from package.json version
(matches release.yml behavior) so rc versions go to @next, not @latest
Closes #754
Co-authored-by: Jorge Vidaurre <jorge@agents-squads.com>
There was a problem hiding this comment.
Code Review
This pull request updates the CLI to version 0.3.0-rc.1, introducing a refactored squad workflow based on a Plan-Execute-Review-Verify architecture and adding new commands for credentials management, goal tracking, and run history. Significant changes include parallel execution of agents, quota detection with resume capabilities, and a new project-level configuration system. Feedback identifies a security vulnerability from a hardcoded telemetry key, a bug in the YAML parser's comment stripping logic, and potential reliability issues concerning broad error handling, lack of concurrency control in parallel runs, and brittle regex-based task parsing.
…0 + token) Conflicts arose because: - main shipped at 0.3.0 via #743 - develop bumped to 0.3.0-rc.1 for @next burn-in - develop replaced release.yml NPM_TOKEN with OIDC trusted publishing Resolution: take develop's side for all three files. Publishing 0.3.0-rc.1 to @next is the intended path, and OIDC replaces the stale NPM_TOKEN that caused the original 404.
|
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
Summary
Small develop→main promote to unblock the v0.3.0 ship path.
What's included
35ef4cdf836d9cWhat this unlocks
After this merges, re-running the
Publish to npm (manual)workflow will:0.3.0-rc.1is a pre-release → publish under the@nextdist-tag@lateston0.2.2until we promote after burn-inUsers running
npm install -g squads-clistill get the stable 0.2.2. Early testers can opt in vianpm install -g squads-cli@next.Why a separate release PR
PR #743 shipped v0.3.0 code to main yesterday but the publish workflow failed 404 (stale
NPM_TOKEN). #755 removes the token dependency entirely so we don't hit the same wall again.Diff footprint
4 files, +30 / -10. CI-only change, no product code.
Refs #754, #744