1.Getting Started
1.1 Project Overview
SoloSquad is a 24/7 AI assistant system for solo founders. From a familiar messenger (Discord in v1.0), you chat with 25 specialist AI teammates to build products, analyze markets, run marketing, and write code. The Slack adapter ships in the codebase but sits outside the v1.0 SemVer promise (post-v1.0 slot).
Installation is one npm line. Without a separate web dashboard or GUI tool, everything flows through the "messenger-native" interface.
npm install -g solosquad
solosquad init
Four teams with 25 AI specialists are built in:
| Team | Role | Key Agents |
|---|---|---|
| Strategy | Market analysis · business planning · hypothesis · scope estimation | PMF Planner, Feature Planner, Data Analyst, Business Strategist, Idea Refiner, Scope Estimator, Policy Architect |
| Growth | Marketing strategy · content · branding · paid ads | GTM Strategist, Content Writer, Brand Marketer, Paid Marketer |
| Experience | User research · market research · UX/UI design | User Researcher, Desk Researcher, UX Designer, UI Designer |
| Engineering | Frontend · backend · API · data · infra · QA · security | Creative Frontend, FDE, Architect, Backend Developer, API Developer, Data Collector, Data Engineer, Cloud Admin, QA Engineer, Security Engineer |
1.2 Core Concepts
"Output ≠ Goal" Philosophy
Output is not the goal. Output is the means to achieve the goal.
Well-crafted design, polished documents, clean code — none of these outputs by themselves guarantee business success. SoloSquad is a tool that produces outputs, but always prioritizes how each output contributes to the solo founder's actual success.
Messenger-Native
No web GUI or desktop app. The messenger you already keep open every day IS the interface. Issue natural-language commands in #owner-command, receive automated reports in #workflow.
3-Layer Context (Isolation)
Multiple businesses run in parallel without information bleed via three layers:
Self-Hosted
Runs directly on your PC / Mac Mini / VPS. SoloSquad never sends data to operator servers. Only the Claude API and your messenger server are external communication partners.
1.3 Expected Value
- Solo, but not alone — 4 teams, 25 specialist AI teammates always on standby
- Work while you sleep — automated routines run daily for market signal detection · experiment review · daily/weekly retro
- Multi-product isolation — day-job + side projects stay separate via per-org memory and channels
- Iterative evolution — v0.x is a fast iteration phase for the solo founder's own use. v1.0 begins formal API stability commitments
- Open-source npm package — no external SaaS dependency. You own the code and data
2.How It Works
2.1 System Architecture
SoloSquad consists of 3 core processes and 1 persistent store.
| Component | Role | Execution |
|---|---|---|
solosquad bot | Receives messenger messages → injects matching agent SKILL.md → runs Claude Code → sends response | Long-running process (24/7) |
solosquad schedule | Runs scheduled routines (morning brief, signal scan, ...) via cron | Long-running process (24/7) |
| Messenger Adapter | Discord or Slack adapter. Shared interface for bot/scheduler | Module inside bot/scheduler |
| File-based Memory | JSONL append-only logs + Markdown workflow artifacts at <org>/memory/, <org>/workflows/ | Filesystem |
Message processing flow (v0.6+)v0.6
Single-shot keyword routing evolved into the PM session model in v0.3, then to 4-channel routing + 3-tier search + atomic-swap hot-reload in v0.5. v0.6 added chokidar-based fs.watch hot-reload + 8-layer JIT spawn assembly + per-org × agent budget envelopes. On router miss, the FTS5 cold archive fallback recalls past decisions.
User → PM session (claude --resume <session-id>)
↓
buildRoutes(): 3-tier scan
[1] <org>/.agents/ (org-local override)
[2] ~/.solosquad/agents/ (user-global override)
[3] <workspace>/.solosquad/agents/ (25 bundled)
↓
4-channel resolver (priority: slash > explicit > keyword > freq)
· slash — "/think /plan /build /review /ship" etc.
· explicit — PM calls a SKILL via reasoning
· keyword — single-turn message word match
· freq — auto-load when accumulated count crosses threshold
(cooldown_turns suppresses re-firing — hysteresis)
↓
JIT inject matched SKILLs into context
↓
Task: <agent> "..." (fresh subagent session, [stage:<id> wf:<id>] marker)
↓
Merge result summary into PM context → next spawn or report to user
↓
git-snapshot before-spawn / after-spawn auto-commits (<org>/.solosquad/snapshot.git)
[Parallel] When a new SKILL.md is saved, the router does an atomic swap:
build new index → swap ref → messages in flight keep using the old index
(no bot restart required)
For v0.4 autonomous execution, solosquad goal run <goal-id> spawns a background PM session (bg-<goal-id>-<runId>) that runs the same 4-channel routing inside each cycle. Metric-gated keep/discard, git-snapshot revert, and cumulative cost caps apply per cycle.
2.2 Directory Hierarchy
Current npm release (v0.8.5) structure
3-tier search priority (v0.5): for a SKILL with the same name, override order is <org>/.agents/ > ~/.solosquad/agents/ > <workspace>/.solosquad/agents/ (bundled). The router scans all three at boot and merges them into a single index.
v0.6 new assetsv0.6
The Org Layer (which absorbs each organization's tone/emphasis/budget for the 25 specialists) and the Workspace Knowledge Layer (which separates accumulated craft) are formally introduced as first-class assets in v0.6. Bundled SKILLs are not modified line-by-line — org flavor enters only through the assets below.
assets/agents/{team}/KNOWLEDGE.md— previously_teams/*/TEAM_KNOWLEDGE.md, now co-located (Team = Domain). Auto-injected when any same-team agent spawns.<org>/core/{PRINCIPLES,VOICE}.md— org philosophy / tone (overrides workspacecore/). Spawn still works with empty files.<org>/agent-profile.yaml— per-org modifiers for 25 agents (defaults + per-agent section + budget +schema_version: 1). Per-agent budgets may only *narrow* the defaults.<org>/domain/{market,customers,product}.md— org domain knowledge (market, customers, product)..solosquad/knowledge/— accumulated shared user knowledge (decision frameworks, domain glossary). Selectively injected on keyword match.~/.solosquad/agent-profile-defaults.yaml— user-global inheritance. Shared budget/voice defaults across N orgs. Inheritance: workspace bundle defaults → user-global → org agent-profile.<org>/memory/archive.sqlite— FTS5 cold archive (JSONL older than 8 days moves to SQLite FTS5 virtual table, search fallback).
agent-profile.yaml example
schema_version: 1
defaults:
tone: conservative
budget:
daily_usd: 5
weekly_usd: 25
on_cap_action: pause # pause | warn
business-strategist:
emphasis: "Prioritize the Korean SMB market context"
decision_frame: "Cash flow > growth rate"
content-writer:
voice: "professional, no hype"
ban_phrases: ["revolutionary", "groundbreaking"]
paid-marketer:
budget: # may only narrow defaults
daily_usd: 2
Agents not specified inherit only the defaults block. When the cap is hit at spawn time, the spawn is refused and the PM responds "Daily budget reached — please try again tomorrow." Accumulator: <org>/memory/agent-costs.jsonl.
2.3 Context & Memory Management
Current memory structure (v0.2.4)
Every routine result appends to a JSONL file. One JSON line = one event.
<org>/memory/signals.jsonl example:
{"ts":"2026-05-12T12:00:00Z","kind":"signal","source":"reddit/r/saas","content":"...","urgency":"med"}
{"ts":"2026-05-12T12:00:15Z","kind":"signal","source":"twitter","content":"...","urgency":"high"}
3-layer context (P/E/T vocabulary)
| Layer | Location | Purpose | TTL |
|---|---|---|---|
| Persistent | Workspace + org SKILL.md, KNOWLEDGE.md, core/, principles | Role definitions · craft · policy | Forever |
| Episodic | <org>/workflows/<id>/, JSONL memory | Per-workflow / per-period progress logs | Days~months |
| Transient | Claude session prompt context | Working memory just before the current call | 5 minutes (Anthropic prompt cache TTL) |
Just-in-Time injection principlev0.5
Not every SKILL.md is added to context on every call. The 4-channel router (slash/explicit/keyword/freq) matches each turn and decides what to inject that turn, based on user keywords, slash commands, and frequency counts.
v0.6 memory flowv0.6
The v0.5 per-turn flow is preserved; v0.6 added spawn budget · 8-layer drop log · spec-gate evaluation · migration cost. During one PM turn, these files are updated:
<org>/.solosquad/sessions/<user>.json— last interaction, cumulative cost USD, activeWorkflowId,freqCooldowns(v0.5 — per-turn decay)<org>/workflows/<wf-id>/_events.jsonl— PM messages · spawn · completion events<org>/.solosquad/snapshot.git— before/after-spawn commits (memory/ + workflows/)<org>/memory/author-costs.jsonl— author-loop cumulative USD per step (v0.5)<org>/memory/agent-costs.jsonlv0.6 — per-agent spawn cost accumulator for agent-profile budget cap<org>/memory/spawn-decisions.jsonlv0.6 — log of which layers were dropped when token cap was hit (FTS5-indexed §4.6)<org>/memory/stop-hook-events.jsonlv0.6 — spec-gate hook evaluation result at cycle end<org>/memory/migration-costs.jsonlv0.6 — 0.5→0.6 migration's own LLM fallback cost accumulator<org>/memory/pm-skills/_recent.md— one-line summaries of workflows externalized by pm-compaction (PM reads this on the next turn)
FTS5 cold archivev0.6
As JSONL accumulates, search slows down. v0.6 moves entries older than 8 days to the SQLite FTS5 virtual table <org>/memory/archive.sqlite, keeping them searchable via token matching. The nightly archive-rotate routine (00:00; merged into system-housekeeping in v0.8.5) does this automatically. Search recall without a semantic-embedding infrastructure.
4 event_type indexingv0.6
v0.6 indexes 3 new event sources (router · author · spawn) alongside existing routine-logs/*.jsonl into the same archive. Data sources for §3 trajectory extraction and §3.4 freq auto-suggestion:
| event_type | Source | Use |
|---|---|---|
route_hit | agent-router resolve() non-null | Keyword → SKILL hit frequency |
route_miss | agent-router resolve() null | Input for freq auto-suggestion (inferred missing SKILLs) |
author_turn | Author-loop turn log | Avg clarification turns, refusal rate |
spawn_decision | PM Task tool calls + 8-layer drops | Reveals divergence between PM free routing vs deterministic router |
routine_log | Existing routine-logs/*.jsonl | Legacy auto-load |
Retention policyv0.6
The archive retains 365 days by default (workspace.yaml.archive.retention_days: 365). The archive-rotate routine performs the *delete old entries* step. Optional archive.compress_before_delete: true keeps an archive-<year-month>.zst for quarterly retention. Disk usage: solosquad memory stats --disk.
2.4 Workflow Definitions
4 default workflows
| Type | Purpose | Stages |
|---|---|---|
| PMF Discovery | New product-market fit exploration | Research → Planning → Design → Build → Launch |
| Feature Expansion | Add features to existing product | Analysis → Planning → Design → Build |
| Rebranding | Brand repositioning | Research → Branding → Design → Marketing |
| Rapid Prototype | Minimum viable validation | Refine → Build → Launch |
Key files: _status.yaml + _handoff.md
_status.yaml tracks per-stage progress (pending → in_progress → completed). _handoff.md is the context slice each stage hands off to the next agent.
_handoff.md standard sections:
- Summary: 3-line summary
- Artifacts: list of outputs
- Key Decisions: decisions + rationale
- Context for Next Agent: what the next agent should know
- Open Questions: unresolved questions
v0.6 handoff variants (3 types)v0.6
Different stages need different collaboration patterns; one template doesn't fit all. The 25 agent SKILL.md files now carry collab_pattern as a formal frontmatter field, and spawn applies the matching variant template automatically.
- hierarchical (22 agents) — Standard PM → specialist flow. Keep 4 sections (
templates/handoff-hierarchical.md) - graph (data-analyst, feature-planner) — Bidirectional convergence loop (e.g. research ↔ data-analyst). Adds
state_object_diff,loop_count(templates/handoff-graph.md) - dynamic (content-writer) — Next agent branches by result content. Adds
routing_signal(templates/handoff-dynamic.md)
2.5 Spawn assembly (8-layer JIT inject)v0.6
When a specialist spawns, context is assembled from the 8 layers below in priority order. When workspace.yaml.spawn.max_context_tokens (default 80,000) is hit, lower-priority layers are dropped, and the decision log is written to <org>/memory/spawn-decisions.jsonl (FTS5-indexed per §2.3):
spawn(business-strategist, org=Acme, repo?)
└─ assemble:
[1] .solosquad/knowledge/ + assets/knowledge/ (workspace shared, keyword-selective)
[2] agents/strategy/KNOWLEDGE.md (team(=domain) shared knowledge, same team only)
[3] agents/strategy/business-strategist/SKILL.md (agent identity, workspace-immutable)
[4] <org>/core/ (org philosophy/tone)
[5] <org>/agent-profile.yaml defaults + business-strategist section (org modifier)
[6] <org>/domain/ (org domain knowledge)
[7] <org>/workflows/<id>/_handoff.md + <org>/memory/ (recent + FTS5 recall)
[8] target_repo context (only when target_repo field is set)
Drop-priority table
| Priority | Layer | Drop policy |
|---|---|---|
| 1 (required) | [3] agent SKILL.md | Never drop — agent identity |
| 2 | [4] org core, [5] agent-profile | Never drop — org flavor |
| 3 | [7] handoff slice | Drop oldest handoffs first |
| 4 | [2] team KNOWLEDGE | Drop if keyword match is low |
| 5 | [6] org domain | Drop if keyword match is low |
| 6 | [1] workspace knowledge | Drop if no matches |
| 7 | [8] target repo context | Drop large files first |
When drops occur, <org>/memory/spawn-decisions.jsonl records which layer was truncated — that line is indexed in the §2.3 FTS5 archive with event_type: spawn_decision.
3.Core Concepts
3.1 SKILL.md — Agent Identity Definition
SKILL.md is the manual describing "how this role works" for a single agent. It follows Anthropic's official Agent Skills format, with SoloSquad extensions for routing, loop_mode, budget, etc.
---
name: "Business Strategist"
description: "Business strategy · market analysis · competitive positioning"
team: strategy
stateful: false # v0.5 — all specialists are stateless
triggers: # v0.5 — 4-channel entry points
slash: ["/strategize"]
keyword: ["business strategy", "business model"]
freq: # auto-load when cumulative count crosses threshold
keywords: ["strategy", "positioning", "competition"]
window_turns: 10
threshold: 3
cooldown_turns: 6
explicit: true # PM can call directly via reasoning
inputs:
required: [market_context, hypothesis]
optional: [time_range]
outputs:
- strategy.md
handoff_to:
- feature-planner
- pmf-planner
loop_mode: # v0.5 — spec-gate (Ralph loop) mode. null | spec-gate
kind: spec-gate
stop_when: "all tests pass"
budget: # v0.5 — paperclip envelope. Forwarded to author loop / explicit
per_call_usd: 1.5
daily_usd: 10
---
# Business Strategist Agent
You are a business strategy specialist helping a solo founder.
## Process
1. Understand the market context
2. Competitive analysis
3. Frame hypotheses + propose validation methods
...
- Location (3-tier search):
<org>/.agents/>~/.solosquad/agents/><workspace>/.solosquad/agents/(25 bundled) - Load timing: Router picks via 4-channel matching → PM injects into system prompt when spawning via Task tool
- Property: Stateless (v0.5 enforced) — every call is a fresh session; state lives outside (workflows / handoff / memory).
stateful: trueis used only by PM and v0.4 goal-runner background sessions - Required fields:
name,description(Anthropic spec). The rest are SoloSquad extensions with router fallbacks if missing - loop_mode = spec-gate: the author loop auto-emits
<org>/goals/<goal-id>/goal.mdas well → registers an autonomous cycle in the v0.4 goal-runner
3.2 KNOWLEDGE.md — Team (= Domain) Shared Knowledgev0.6
All agents in the same team share craft / definitions / anti-patterns through this file. v0.6 co-located it as agents/{team}/KNOWLEDGE.md, auto-injected when any same-team agent spawns (layer [2] of the 8-layer assembly).
| SKILL.md | KNOWLEDGE.md | |
|---|---|---|
| Scope | A single agent | An entire team (e.g. strategy team of 7) |
| Content | Role identity / how to work | Team craft / vocabulary / anti-patterns |
| Load condition | When that specific agent spawns | When any agent from the same team spawns |
assets/agents/_teams/{team}/TEAM_KNOWLEDGE.md was co-located to assets/agents/{team}/KNOWLEDGE.md. The _teams/ directory was fully removed. Migration 0.5→0.6 auto-moves the user workspace's .solosquad/agents/_teams/ as well.
3.3 CLAUDE.md — Project / Repo Guide
CLAUDE.md is the project-guide file that Claude Code (the general-purpose coding CLI) auto-loads at every session start. It is Claude Code's official convention, not a SoloSquad invention.
- Location: project root (or inside
.claude/) - Purpose: convey codebase structure, tech stack, user instructions to the model
- Load timing: Claude Code reads it automatically — no explicit user instruction needed
SoloSquad's own root CLAUDE.md targets developers of SoloSquad itself. When you work in your own product repo, that repo's CLAUDE.md applies.
Example: a user's SaaS repo CLAUDE.md
# My SaaS
TypeScript + Next.js. Deployed on Vercel.
## Conventions
- Components live in src/components/ as PascalCase
- API routes in src/pages/api/
...
3.4 SKILL.md vs AGENTS.md — Different Layers, Different Roles
SoloSquad uses both files but with clearly different responsibilities. A workspace has many SKILL.md files but exactly one AGENTS.md.
| SKILL.md (Anthropic official) | AGENTS.md (cross-tool standard) v0.4 | |
|---|---|---|
| Role | Individual agent's identity & operating manual | Workspace's single persistent guide (project conventions, forbidden paths, tool usage rules) |
| Location · count | 3-tier search: <org>/.agents/ > ~/.solosquad/agents/ > <workspace>/.solosquad/agents/ (25 bundled).claude/skills/{name}/SKILL.md (Claude Code marketplace compatible) | <workspace>/AGENTS.md — exactly one |
| Frontmatter | YAML, name · description required + SoloSquad extensions (team · stateful · triggers · loop_mode · budget etc.) | None — free markdown |
| Authored by | v0.5 analyzer auto-classifies + merges. v0.5 messenger author loop generates via 1-2 turn dialog. Humans may also edit. | Humans only. No AI agent may modify this file (same trust-anchor spirit as Codex /goal). |
| Other tool compat | Direct integration with Claude Code Plugin marketplace. | Recognized as a cross-tool standard by Codex, Aider, Cursor, modern Claude Code (Codex AGENTS.md spec). |
| In v0.4 autonomous execution | Spawned specialists receive their own SKILL.md as context. | immutable_paths · modifiable_paths · external-call allowlists are pinned — every goal.md execution inherits them. |
Bottom line: SKILL.md says "who this agent is, what they're good at"; AGENTS.md says "rules every AI tool touching this workspace must follow." They aren't rivals — they're different layers.
CLAUDE.md is no longer used v0.4. Previously both CLAUDE.md and AGENTS.md sat at the workspace root, but having two files at the same level created "where should I write this?" confusion and risked divergence. From v0.4, SoloSquad consolidates the workspace persistent guide into AGENTS.md alone. Migration leaves existing CLAUDE.md untouched; content is copied once into AGENTS.md — users may delete CLAUDE.md manually if no longer needed. Modern Claude Code also recognizes AGENTS.md as a fallback, so no compat loss.
3.5 Workflow Maker Meta-Skillv0.5
An author-loop system letting users, without touching code, register a new SKILL.md (or workflow chain) via 1-2 messenger turns. assets/agents/_meta/workflow-maker/SKILL.md acts as the author-loop system prompt; when PM classifies the intent as "I want to automate this task," it enters via explicit [META workflow-maker] invocation.
5-stage state machine
- CLARIFY — Clarify inputs / outputs / cadence in 1-2 turns (if user can't answer, default is taken with a "you can modify later" note)
- DRAFT — Preview SKILL.md + (optional) workflow.yaml + (optional) routine cron entry
- SANDBOX_PROMPT — Run once in dry-run sandbox → request user confirmation
- AWAIT_CONFIRM — User approval gate ("Confirm?")
- APPLIED — Deterministic merge:
solosquad agent validate <path>→ router atomic swap → usable from next call.loop_mode.kind: spec-gatedrafts also auto-emit<org>/goals/<goal-id>/goal.md
CLI integration
solosquad agent add --name X --team Y— scaffold (frontmatter template + empty body)solosquad agent validate <path>— schema + required-section check. Author-loop auto-runs this after savesolosquad agent validate --all [--corpus]— entire workspace + bundle + corpus regression. Runs in CI gate (.github/workflows/ci.yml)solosquad agent list / info— inventory and details of registered SKILLs
Cost cap (paperclip envelope)
LLM calls during clarification + draft + validate + sandbox accumulate in <org>/memory/author-costs.jsonl (ts, skill_draft_id, step, usd). When the workspace.yaml.author per_call_usd / daily_usd / weekly_usd cap is hit, PM replies "Daily budget reached — please try again tomorrow."
Analysis track
Existing .claude/skills/ assets in legacy repos are absorbed via solosquad analyze repo <path>. A 4-label classification report (role / workflow / codebase-fact / domain) is stored under <org>/.solosquad/analysis/, and after human review, solosquad add repo --from-report <report> performs a deterministic merge (backup → apply → verify). The second run uses analysis-ledger.yaml hashes so only new/changed parts incur LLM calls.
3.6 4-Channel Routing + Freq Cooldownv0.5
The hardcoded 60+ keyword AGENT_ROUTES constant from v0.2.4 was removed in v0.5. Each SKILL.md's triggers frontmatter is collected at boot into a router index, matched in 4-channel priority order:
| Channel | Meaning | Example |
|---|---|---|
slash | Explicit intent — load immediately (no ambiguity) | /think /plan /build /review /ship |
explicit | PM calls directly via reasoning | [META workflow-maker] — PM-only channel |
keyword | Single-turn message word match | "business strategy" → business-strategist |
freq | Auto-load when accumulated count across recent N turns crosses threshold (equivalent effect to semantic embedding via counting) | "land registry", "signal", "real estate" across last 10 turns sum ≥ 3 |
Priority: slash > explicit > keyword > freq. Within each channel, the 3-tier search path (org > user > bundle) handles overrides.
Freq channel hysteresis (cooldown)
Once a SKILL is auto-loaded via freq, its freq-match scoring is skipped for triggers.freq.cooldown_turns (default 6). Prevents re-firing the same SKILL every turn when the conversation lingers on one topic. Router memory: the freqCooldowns: { skill_name: until_turn } field in <org>/.solosquad/sessions/<user>.json decays per turn.
Freq SKILL ceiling
Up to 20 SKILLs may register on the freq channel per workspace. Validator refuses the 21st (to bound per-message regex matching cost — p95 < 10 ms target). Keyword tokens are hashmap-counted (O(|tokens|)), with regex as fallback.
Auto-load notification (UX)
When a SKILL is loaded via the freq channel, the user gets one notification: 🧠 {agent} context auto-loaded (recent keywords: ...). The user can immediately reject an unintended routing.
Hot-reload (atomic swap)
When the author loop saves a new SKILL.md, src/bot/index.ts rebuilds the router. Messages arriving during the build are handled by the previous index, and after build the ref is swapped (routeIndexRef = newIndex) — so in-flight messages never see a partial index. No bot restart needed. If the build fails, the previous index is retained and the PM is warned.
Meta-skill scanner isolation
The _meta/ folder is still skipped by the general scanner. A separate listMetaSkills() scans assets/agents/_meta/*/SKILL.md only and accepts only triggers.explicit: true. The workflow-maker meta-skill is enterable only through PM's explicit call — slash/keyword/freq registrations are refused.
3.7 Master Table — File Types per Hierarchy
Workspace layer (Layer 0)
| Path | File | Meaning | When |
|---|---|---|---|
<workspace>/.solosquad/agents/{team}/{agent}/ v0.5 | SKILL.md | 25 specialist identity manuals (bundled, frontmatter prepended) | When that agent spawns |
~/.solosquad/agents/ v0.5 | {team}/{agent}/SKILL.md | User-global SKILL override (shared across all workspaces) | Overrides same-named bundled SKILL |
<workspace>/.agents/ v0.5 | {team}/{agent}/SKILL.md | Org-local SKILL override (highest priority) | 1st in 3-tier search |
assets/agents/_meta/workflow-maker/ v0.5 | SKILL.md + references/*.md | Author-loop meta-skill (PM-only via explicit) | When PM classifies "create new SKILL/workflow" intent |
assets/agents/{team}/ v0.6 | KNOWLEDGE.md | Team (= domain) shared craft. _teams/ parallel hierarchy abolished, co-located | Auto-injected when same-team agent spawns (8-layer [2]) |
assets/core/ | OWNER.md / PRINCIPLES.md / VOICE.md | User profile / behavioral principles / writing tone | Default context for every session |
assets/orchestrator/ | SKILL.md | PM (orchestrator) role definition v0.3 + v0.4 goal-md-spec append | PM session |
assets/routines/ | morning-brief.mdevening-brief.mdpm-compaction.md v0.3system-housekeeping.md v0.8.5 | Automated routine prompts (4 in v0.8.5 — see §6.4) | Scheduler at cron time |
assets/templates/ | handoff.md / prd-{type}.md / status.yaml / goal.md v0.4 / AGENTS.md v0.4 / workflow.yaml v0.5 / goal-from-skill.md v0.5 | Workflow · autonomous-execution · workflow-chain scaffolding | When creating a new workflow / goal / skill |
.solosquad/knowledge/ v0.6 | (user-authored) | Accumulated shared knowledge (decision frameworks, domain glossary) | Selective load on keyword match (8-layer [1]) |
assets/knowledge/ v0.6 | Bundled workspace-knowledge starter guide | npm bundle — falls back from .solosquad/knowledge/ | Selective load on keyword match |
~/.solosquad/agent-profile-defaults.yaml v0.6 | (YAML) | User-global agent-profile defaults inherited by N orgs (budget, voice) | Inheritance: workspace bundle → user-global → org agent-profile |
<workspace>/ v0.4 | AGENTS.md | Workspace's single persistent guide (immutable_paths, modifiable_paths, Output guard pinned). Same file recognized by Codex, Aider, Cursor, modern Claude Code as a cross-tool standard. Edited by humans only. | Auto-inherited by every autonomous execution (solosquad goal run) and PM session. (CLAUDE.md is no longer used as of v0.4 — see §3.4) |
Organization layer (Layer 1)
| Path | File | Meaning |
|---|---|---|
<org>/ | .org.yaml | Org metadata (name, messenger, active repos) |
<org>/memory/ | signals.jsonlexperiments.jsonldecisions.jsonlroutine-logs/*.jsonlpm-skills/*.md v0.3author-costs.jsonl v0.5 | Routine results · decision events · PM compaction externalization · author-loop cost accumulator |
<org>/workflows/<wf-id>/ | _status.yaml_handoff.md_events.jsonl v0.3stage-N-{name}/ | Active workflow state · handoff · artifacts |
<org>/goals/<goal-id>/ v0.4 | goal.mdresults.tsv_best.json_last-run.md | Autonomous-execution intent (per-run) + cumulative cycle results + ship-candidate commit + last-run summary. Updated by solosquad goal run. |
<org>/slack/ or discord/ | Channel mapping YAML | Messenger channel ↔ org mapping |
<org>/.solosquad/sessions/ v0.3 | {user-id}.json — session id, cumulative cost, activeWorkflowId, freqCooldowns v0.5 | PM session id + 4-channel freq hysteresis state |
<org>/.solosquad/snapshot.git v0.3 | (bare repo) | Bare repo of memory/ + workflows/. PM commits before/after each spawn. Target of rollback --workflow <id> revert. |
<org>/.solosquad/analysis/ v0.5 | YYYY-MM-DD-*.md | solosquad analyze repo Markdown reports (4-label classification). Merged via --from-report after human review. |
<org>/.solosquad/analysis-ledger.yaml v0.5 | (YAML) | Repo-analysis ledger (path + SHA256[:12]). Second run only LLM-processes new/changed entries. |
<org>/.agents/ v0.5 | {team}/{agent}/SKILL.md | Org-local SKILL override (top of 3-tier search). Overrides same-named user-global / bundled SKILLs. |
<org>/core/ v0.6 | PRINCIPLES.md / VOICE.md | Org philosophy/tone (overrides workspace core). 8-layer [4] |
<org>/agent-profile.yaml v0.6 | (YAML) | Org-specific modifiers + budget for 25 agents, schema_version: 1. 8-layer [5] |
<org>/domain/ v0.6 | market.md / customers.md / product.md | Org domain knowledge. 8-layer [6] |
<org>/memory/archive.sqlite v0.6 | (SQLite + FTS5) | Cold archive — JSONL entries older than 8 days. 4 event_type indexing. Router-miss fallback. |
<org>/memory/agent-costs.jsonl v0.6 | (JSONL) | Spawn budget accumulator — for agent-profile cap |
<org>/memory/spawn-decisions.jsonl v0.6 | (JSONL) | 8-layer drop log — FTS5-indexed |
<org>/memory/stop-hook-events.jsonl v0.6 | (JSONL) | spec-gate cycle evaluation result |
<org>/memory/migration-costs.jsonl v0.6 | (JSONL) | 0.5→0.6 migration's own LLM-fallback cost accumulator |
Repository layer (Layer 2)
| Path | File | Meaning |
|---|---|---|
<org>/repositories/<repo>/ | (code + own .git/) | User's product code |
| Above | .solosquad/repo.yaml | Repo metadata (slug, role, target_org) |
| Above | CLAUDE.md | Repo guide auto-loaded by Claude Code |
| Above | .claude/skills/ | Repo-scoped skills (Claude Code Plugin compatible) |
3.8 collab_pattern + Self-Evolution Infrastructurev0.6
collab_pattern, which v0.5 carried as an extra bag, was promoted to a formal SkillSpec field in v0.6. Declaring collab_pattern: hierarchical | graph | dynamic in SKILL.md frontmatter makes the matching handoff variant template apply automatically at spawn time.
| collab_pattern | v0.6 distribution (25 agents) | Handoff slice |
|---|---|---|
hierarchical | 22 agents (majority) | Summary / Artifacts / Decisions / Open Questions (4 sections) |
graph | 2 (data-analyst, feature-planner) | Above 4 + state_object_diff + loop_count |
dynamic | 1 (content-writer) | Above 4 + routing_signal |
Trajectory extraction — auto-extract recurring patterns into SKILLsv0.6
When the same (agent sequence + workflow template) combination occurs 3+ times in the last 30 days, the nightly pm-compaction routine generates a draft SKILL.md at <org>/memory/pm-skills/_suggestions/. Next morning brief shows: "You ran the X pattern 3 times in the past 30 days. Register as a SKILL?" If confirmed, the v0.5 S3 applyDraft() is called directly — no separate applier code (avoiding duplication).
30-day rolling window — archive-rotate decays counts alongside. Auto-registration disabled (human gate retained).
Freq keyword miner — auto-suggest keywordsv0.6
Analyzes route_miss events in the FTS5 archive + N-grams from author-draft clarification questions to suggest additions to the triggers.keyword array of existing SKILL frontmatters. Not new SKILL creation — partial application. On user confirmation, applyDraft({ mode: "frontmatter-only" }) is the formal v0.5 option reused — body untouched, frontmatter patched. Rejected (keyword, skill) pairs are blocked from re-suggestion for 30 days.
Stop-hook DSL (v0.5 spec-gate actually operates)v0.6
The loop_mode.kind: spec-gate specced in v0.5 actually operates in v0.6 via the Anthropic 2025-12 stop-hook plugin adapter (src/engine/stop-hook-adapter.ts). Three forms of stop_when:
# (1) command — exit-code based (most deterministic)
loop_mode:
kind: spec-gate
stop_when:
command: "npm test" # exit 0 = satisfied, != 0 = continue
# (2) metric — results.tsv threshold (compatible with v0.4 autonomous execution)
loop_mode:
kind: spec-gate
stop_when:
metric:
name: "cvr_7day"
threshold: 0.10
direction: "≥"
# (3) natural — LLM fallback (budget cap applies)
loop_mode:
kind: spec-gate
stop_when:
natural: "all tests pass and lint clean"
Hook timeout 5 seconds; on failure, conservatively continue (false negatives are safer than false positives). Results: <org>/memory/stop-hook-events.jsonl.
3.9 v0.7 Farewell Archive Formatv0.7
Uninstall always generates a zip first. Format: archive.yaml (schema_version=1) + manifest.tsv (streaming SHA256) + workspace/ + orgs/<slug>/{memory,workflows,goals,domain,core,repos}/ + credentials/env.template (masked) + REVOKE-CHECKLIST.md + PII-NOTICE.md. v0.8.1 closes the reverse path with solosquad import · solosquad archive verify.
Classes A/A*/B/C/D/E (v0.7 data classification)
| Class | Example | Uninstall behavior |
|---|---|---|
| A | <org>/repositories/<repo>/ user code (incl. .git) | Zero modification/deletion under any flag. Tree not even enumerated. |
| A* | <repo>/.solosquad/repo.yaml single file | The only file SoloSquad creates inside a repo. Included in archive, deletable. |
| B | <org>/memory/ · workflows/ · goals/ | Archived, then on-disk preserved (--mode keep) or deleted |
| C | sessions · .org.yaml · workspace.yaml | Archived, then moved to _archived/. workspace.yaml deleted to issue a fresh one. |
| D | .env (secrets) | Only a masked template is archived. Original is managed separately by the user. |
| E | SoloSquad's own code (npm global) | Out of uninstall scope. Use npm uninstall -g solosquad separately. |
solosquad reset · solosquad clean are permanently rejected in v0.7. Lifecycle is just install ↔ uninstall — reinstall = uninstall + fresh workspace init. Class A (user code) is untouchable by any command, so the semantics of reset/clean would be ambiguous.
3.10 Multi-User Channel Modelv0.8
The single-operator model from v0.7 was extended to a multi-user context. Each user has a command-<handle> (requests) and works-<handle> (work output) channel pair, with metadata at <org>/.solosquad/users/<handle>.yaml. An author-guard prevents another user from intercepting responses in their channel. Register via solosquad messenger add <handle>.
3.11 dev_capability (development permissions)v0.8.2
The dev_capability: true field in a SKILL.md frontmatter declares that the agent can perform code-modifying dev actions (file changes, git commit, push). boolean — on/off. Granular permissions are split into the separate dev_permissions sub-tree:
bash.allowed/bash.denied— allowed/blocked bash command lists. The workspace-level denylist (workspace.yaml.dev_capability.bash_denylist) always merges on top — SKILLs cannot overridenetwork— whether outbound HTTP calls (curl/wget etc.) are permitted. MCP servers are a separate channelpush_targets.requires_confirmation— user confirmation gate ongit push(default true)merge.auto— permanently false, pinned (v0.8.2 §2 / §3.1) — auto-merge policy never added
All sensitive commands (git push, gh pr merge, gh pr close) are pinned in SENSITIVE_BASH_PREFIXES and must pass a 30-min dev-confirmation gate to execute. Results: append-only log at <org>/memory/dev-confirmations.jsonl.
3.12 The .solosquad/ Hierarchy — why a folder per levelv0.8.5
On first glance, a workspace shows three locations with a .solosquad/ folder, which can be confusing. Each contains system metadata at a different scope, and the dotfile convention visually separates them from user content on disk.
Why one at each level
- All are system metadata — managed by SoloSquad. Visually separated from user content (
memory/·workflows/·repositories/<repo>/body) - Dotfile convention — invisible to default
lsoutput. A single.solosquad/line in.gitignoreexcludes system assets at every level - Why different contents at different levels — scopes differ:
- (A) workspace = global (agent SKILLs · envs · timezone shared across all orgs)
- (B) org = one-time identification per org (multi-user handle → bot_user_id mapping)
- (C) repo = which org a repo belongs to and what role it plays (a repo never appears in multiple orgs simultaneously)
- User content stays in non-hidden directories (
memory/,workflows/,repositories/) — the user must be able to see and edit them withls/ git immediately
4.Onboarding
4.1 Identify Your User Type
Check which type you are first. The steps differ by type.
| Situation | Type | Go to |
|---|---|---|
| First-time install. Empty PC/Mac, want to create a workspace | A. New user | §4.2 |
| Already running a product repo, want to attach an AI team | B. Existing repo migration | §4.3 |
| Already on an older version (v0.1.x etc.). Need to update | C. Version update | §4.4 |
4.2 New User — Create Your First Workspace
You need Node.js 18+, git, Claude Code CLI.
macOS:
brew install node git
npm install -g @anthropic-ai/claude-code
Windows (PowerShell):
winget install OpenJS.NodeJS.LTS
winget install Git.Git
npm install -g @anthropic-ai/claude-code
Linux (Ubuntu):
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs git
npm install -g @anthropic-ai/claude-code
Verify:
node --version # v18 or newer
git --version
claude --version
git push (Windows: Git Credential Manager auto-invokes browser OAuth; macOS: osxkeychain stores PAT after one-time entry). SoloSquad does not interfere with this process and does not provide a separate setup procedure — standard git flow. Linux users may need to set up an SSH key or PAT separately (see git/GitHub official docs).
Full prerequisite checklist — what solosquad doctor actually verifies
The OS commands above cover the *minimal set* (node, git, claude). solosquad doctor additionally checks the following. Required tools missing = boot refused; recommended tools missing = warning + some features skipped.
| Tool | Minimum | Required | Used for | If missing |
|---|---|---|---|---|
node | v18 (LTS 22.x recommended) | Required | CLI runtime | Doctor fails immediately, cannot run |
npm | v9 (bundled with Node 18+) | Required | Package install / update | npm install -g solosquad impossible |
git | 2.30+ | Required | Workspace change tracking · engineering agent commit/PR | Bot / scheduler refuse to boot |
claude (Claude Code CLI) | latest | Required | Spawn runner for every agent (Step 2 OAuth login required) | PM / specialists won't run |
gh (GitHub CLI) | 2.20+ | Recommended | Engineering agent's PR flow (gh auth status must pass) | PR step skipped, commit-only mode (doctor warning) |
pwsh (PowerShell 7+) | 7.x | Windows recommended | Some install hooks · cross-platform scripts | Doctor warning (winget install Microsoft.PowerShell) |
docker | 24+ | Optional | Isolated execution | Doctor warning only, no functional impact |
Environment variables — stored in <workspace>/.solosquad/.env
Most are auto-set by the Step 5 wizard. You normally only touch them for token rotation, log path overrides, or v0.9 path-reference default location.
| Variable | Required | Format | Notes |
|---|---|---|---|
MESSENGER | Required | discord or slack | One workspace = one messenger. Auto-set by the wizard. |
DISCORD_TOKEN | Required if using Discord | MTxxxx.xxxx.xxxx (Bot Token, not Client Secret) | Obtained in §5 |
SLACK_BOT_TOKEN | Required if using Slack | xoxb-... | Obtained in §5 |
SLACK_APP_TOKEN | Required if using Slack | xapp-... | Socket Mode |
OWNER_NAME / OWNER_ROLE | Required | Free string | Auto-set by the wizard. Agents use these to address you and infer expertise. |
REPOS_BASE_PATH | Optional | Absolute path | v0.9 path-reference default location (e.g. ~/code) |
SOLOSQUAD_LOG_LEVEL | Optional | debug · info · warn · error | Default info |
SOLOSQUAD_LOG_DIR · _FILE · _FORMAT | Optional | Path · filename · json/text | Default: in-workspace standard location + text |
SOLOSQUAD_NO_DEPRECATION_WARN | Optional | 1 | Suppresses the deprecated-CLI warning |
ANTHROPIC_API_KEY | Not used | — | Delegated to Claude Code OAuth (Step 2) — SoloSquad never reads the key directly. Only referenced for prefix recognition in revoke-checklist output. |
- Disk: ~500MB for the npm global install (deps +
better-sqlite3prebuild + bundled master-guide HTML) + workspace growth (memory/archive.sqlite· routine-logs — 10MB to several GB depending on use) - Memory: 2GB+ (PM session + bot + scheduler + better-sqlite3 cache running concurrently)
- OS × arch: macOS arm64/x64, Linux x64/arm64, Windows x64 — the
better-sqlite3prebuilt matrix. Anything else (FreeBSD, 32-bit, Alpine musl) requires anode-gyptoolchain (Python 3 + C++ compiler). - Network outbound:
api.anthropic.com(Claude),discord.comorwss://...slack.com(messenger gateway),registry.npmjs.org(install / update),raw.githubusercontent.com(Claude Code assets) - Shell: bash and zsh officially supported. fish users may need to add npm's global bin to PATH manually (
fish_add_path (npm prefix -g)/bin). - Timezone: Every cron uses
workspace.yaml.timezone(defaultAsia/Seoul), not the system TZ. Changeable in the wizard. - npm permissions: Avoid
sudo npm install -g. On macOS/Linux, runnpm config set prefix ~/.npm-globaland add~/.npm-global/binto$PATH. Windows winget handles this automatically.
As of v0.9, SoloSquad uses Claude Code via OAuth as its single backend. No other AI CLI is supported at this time.
- Visit https://claude.ai → Settings → Subscribe to a Claude Code-capable plan (Max plan recommended for usage headroom)
- Install the CLI:
npm install -g @anthropic-ai/claude-code claude login— browser OAuth flow → credentials stored permanently on this machine (SoloSquad does not manage credentials itself; defers entirely to Claude Code's standard login flow)- Verify with
claude auth status --json→ expectloggedIn: true
Why OAuth-only: SoloSquad does not provide an "API key in .env" mode because it would expose the key on disk and add a credential-management burden. Claude Code's OAuth stores tokens in the OS credential store — SoloSquad's code never sees the key (the claude CLI uses it at invocation time).
Pick Slack or Discord. §5 covers token issuance. Finish §5 first, then come back here.
npm install -g solosquad
solosquad --version
A workspace is the directory holding all SoloSquad data (memory, workflows, messenger config, org metadata). Create a directory with any name you like, and running solosquad init from inside it makes that directory the workspace.
# Example: name it whatever you like — here we use "my-saas"
mkdir my-saas
cd my-saas
solosquad init
You can operate multiple workspaces (n-job scenario). Each directory is an independent workspace = independent bot, memory, orgs. To create one elsewhere, cd there first and then run the wizard.
4.2.1 Wizard prompts — why asked + constraints + storage locationv0.8.5
The wizard asks the following in order. Each prompt now has a 1-2 line help message above it (v0.8.5 new).
| Prompt | Default | Constraint | Why asked | Stored at |
|---|---|---|---|---|
| Where should the workspace be created? (only when a parent already has an existing workspace — v0.8.5) | cwd | cwd / existing / custom 3-way | Explicitly separate a new workspace when a parent has another .solosquad/ | — |
| Workspace display name | Directory basename | Free | Name shown in dashboards / briefs | workspace.yaml.display_name |
| Your name | None | Free | Used by PM and specialist agents to address you + decide response salutation | .solosquad/.env OWNER_NAME |
| Your role | founder | founder / developer / designer etc. (free) | Agents infer your expertise / interests to tune response depth and tone. Default is founder because SoloSquad's primary user is a solo founder. | .solosquad/.env OWNER_ROLE |
| Messenger platform | None | discord / slack | One workspace = one messenger. n-job: separate workspaces. Decides channel pair / broadcast behavior. | .solosquad/.env MESSENGER |
| Discord/Slack token | None | Token string | Bot API credential. Auto-channel creation, message I/O. | .solosquad/.env (gitignored) |
| Your handle on {messenger} v1.0.2 | Bot username (auto-extracted, normalized) | [a-z0-9_]+ only (other chars auto-replaced with _) | SoloSquad's canonical user identifier. Names channel pair command-<handle> / works-<handle>, drives workflow routing + memory partition. Moved to right after token entry in v1.0.2 (narrative coherence). Pick a handle that's unique among other messenger members' usernames or display names to avoid "who said this" confusion. | <org>/.solosquad/users/<handle>.yaml (Step 6 silent write) |
| Timezone | Asia/Seoul | IANA tz | Morning/evening brief times + all routine crons | workspace.yaml.timezone |
| Morning / Evening brief time | 08:00 / 18:00 | HH:MM | Cron for the two default user briefs | workspace.yaml.briefings |
| Organization name | None | Free | Org = business/product unit. Multiple orgs per workspace possible (e.g. tesla + spacex). Memory / workflows / repos isolated per org. | <workspace>/<slug>/.org.yaml |
| Provider | github | local / github / gitlab / gitea | Org's code hosting location metadata. add repo uses this to infer git URL host. Pick local if no remote. | .org.yaml.provider |
| Org homepage URL | Empty | URL or empty | Optional org homepage (e.g. github.com/tesla). Used by analysis / linker. Press Enter to skip. | .org.yaml.remote_url |
v1.0.2 change — step order: the handle prompt used to live at Step 5.2 (four steps after the messenger token); v1.0.2 moves it to Step 3.5 (immediately after the token). Restores the narrative "I just connected my Discord token → now decide what name I'll be known by on that messenger." The yaml write itself is deferred to Step 6 (after the org dir exists), silently.
v1.0.2 change — handle elevated: handle is now SoloSquad's sole canonical user identifier (channel-name derivation + workflow routing + memory partition). Discord's message.author.username is no longer compared — it lives only in audit logs. Usernames like seungw1n. that can't fit the channel-name charset are no longer blocked from their own channel.
v0.8.5 change — If no existing workspace is detected in a parent directory, the wizard no longer asks "Initialize workspace at: ..." — it uses the cwd silently (the directory you already chose with mkdir is not asked again). To create it elsewhere, cd there first.
claude login
A browser opens — log in with your Claude account. The credential is bound to this OS user account.
solosquad doctor # basic diagnosis
solosquad doctor --messenger-check # actually verify tokens
All ✓ means pass.
Run each in a separate terminal or via Docker.
# Option A — two terminals
solosquad bot # messenger bot
solosquad schedule # automated routines
# Option B — Docker (v0.5+ — inside deploy/docker/)
cd deploy/docker && docker compose up -d --build
# See deploy/docker/README.md for options/env vars
Send hi to #owner-command on Slack or Discord. If the bot responds, you're done.
4.3 Existing Repo Migration
When you already have a code repo and want to attach an AI team.
Current method (v0.2.4)v0.2.4
- First create a workspace via §4.2 Steps 1~7 (with at least one org).
- Register the repo:
cd ~/solosquad-workspace solosquad add repo /path/to/existing-repo # local path solosquad add repo https://github.com/me/x.git # or git URL (clone) - With multiple orgs, you'll be asked which one. Auto-assigned for single org.
- The repo ends up at
<workspace>/<org>/repositories/<repo>/. - If that repo has its own
.claude/skills/orCLAUDE.md, they remain — Claude Code auto-loads them when working on that repo.
v0.5 analyzer flowv0.5
A separate analyzer absorbs existing .claude/skills/ from legacy repos as SoloSquad assets.
solosquad analyze repo /path/to/legacy-repo
# → 4-label classification (role / workflow / codebase-fact / domain)
# → <org>/.solosquad/analysis/YYYY-MM-DD-*.md report
# → analysis-ledger.yaml records path + SHA256[:12] (second run only LLM-processes new/changed)
solosquad analyze repo <path> --force # full re-analysis when upgrading models
solosquad analyze repo <path> --prune-orphans # clean ledger entries whose files are gone
solosquad add repo /path/to/legacy-repo --from-report 2026-XX-XX-initial.md
# → backup → deterministic merge → verify
solosquad add repo <path> --merge-policy append|override|replace
# → explicit merge policy (default: append)
4.5 Recommended 5-Step Repo Importv0.8.3
Moving your own product code into a SoloSquad workspace happens once — the cost of mistakes is high, so dry-run is the default recommendation.
# [Step 1] Clean working tree + commit + push
cd ~/projects/my-saas
git status # 0 untracked / unstaged
git push origin main # safety net
# [Step 2] Initialize SoloSquad
mkdir ~/solosquad && cd ~/solosquad
solosquad init # creates workspace + first org
# [Step 3] dry-run preview (v0.8.3 new)
solosquad add repo ~/projects/my-saas --dry-run
# Output: From/To, file count/size, IDE workspace detection, symlinks,
# active processes (lsof/handle.exe), slug collisions, risk summary
# [Step 4] Actual move
solosquad add repo ~/projects/my-saas
# Or: --keep-original for copy mode (2× disk usage)
# [Step 5] Verify
solosquad sync # repositories/ ↔ .org.yaml sync
cd ~/solosquad/main/repositories/my-saas
git status # working tree clean
git log -1 # same commit as before
4.6 Risk scenarios + dry-run detectionv0.8.3
| Risk | dry-run output |
|---|---|
| IDE / dev server holds a file lock | lsof / handle.exe call → reports active PIDs |
| Absolute-path symlinks from outside point at this repo | Scans parent dir + ~/ with readlink → warns on hit |
| Absolute paths inside repo pointing to parent dirs (configs, docs) | greps configs/yaml/md — shows hit-file count + first match |
| Same slug already exists in the org | "Slug collision: ... already exists" warning (refuses the move) |
| IDE workspace file has absolute paths | Detects absolute-path patterns in .vscode/settings.json etc. → suggests manual update |
| External cron / scripts point at old path | Outside SoloSquad's awareness — message-only notification |
The risks above are warn-level — users can ignore and proceed. dry-run itself writes 0 bytes to disk.
4.4 Updating from an Older Version
Version rules (semver)
vN.N.N3-segment (e.g.v0.1.5,v0.2.0)- patch (3rd): bug fix / small improvement — rarely needs migration
- minor (2nd): new features / structural change — may need migration
- major (1st): fundamental rework — migration required
npm published version numbers are on a separate semver track. Document labels v0.x ≠ 1:1 with npm versions — policy in docs/product-roadmap.md §3.5.
Check current version
solosquad --version # installed CLI
solosquad update # compare with registry (announces only, no install)
Regular update (no migration)
Most patch updates: one line.
solosquad update # "New version available" → y → installs
# Or manual:
npm install -g solosquad@latest
solosquad --version
solosquad doctor # all 5 lines must be ✓
Structural update (migration required)
If solosquad update shows a warning like:
⚠ This update includes breaking changes to the workspace layout.
A workspace migration is required. After updating the CLI, run:
solosquad migrate --dry-run (preview)
solosquad migrate --apply (perform)
- Fully stop
solosquad bot/solosquad schedule— running processes may hold file locks (Ctrl+Cordocker compose down) - Close the workspace / repo in VSCode / JetBrains IDE (Windows file-handle locks)
- Audit hardcoded paths in external systems — e.g.
C:\...\Documents\solosquad-repos\<slug>must be updated to<workspace>\<slug>after migration - Always run dry-run first —
solosquad migrate(no flag) or--dry-run - Commit / stash any in-progress code first
Execution order:
npm install -g solosquad@latest— CLI firstcdinto the workspacesolosquad migrate --dry-run— preview- Review output, then
solosquad migrate --apply - Verify with
solosquad doctor - Restart
solosquad bot
Dry-run output example
$ solosquad migrate --dry-run
Workspace: /Users/you/solosquad-workspace
Detected structure: v0.1.x (source)
Target version: v0.2.0 (installed CLI)
Migration plan (0.1.x → 0.2.0):
✓ Move workspace config to .solosquad/
✓ Convert each product → organization directory
✓ Rename projects/ → workflows/
✓ Remove obsolete env vars (REPOS_BASE_PATH)
Estimated disk usage: +0 MB (moves only, no copies)
Backup location: /Users/you/.solosquad-backups/2026-...
Nothing written yet. Re-run with `--apply` to perform the migration.
Dry-run changes nothing. Don't like it? Just ignore.
What apply does automatically
- Snapshot backup of the entire workspace before any action (
~/.solosquad-backups/<timestamp>/) - File / folder moves and renames
- Creates new config files (
.solosquad/workspace.yaml,.org.yaml, etc.) - Auto-runs
doctorafter migration for verification
Skipping multiple versions (chain migration)
When jumping from v0.1.2 directly to v0.3.0, migrations run in sequence:
Chaining migrations:
0.1.x → 0.2.0 (layout restructure)
0.2.0 → 0.4.0 (cross-repo enhancements)
Each step is dry-run before apply. If a mid-step fails, rollback stops there.
v0.2.4 update specifics
v0.2.4 changes messenger channel structure / routine model and removes Telegram support.
All users:
migrate --applyinjectstimezone,briefings,background_routines(default Asia/Seoul, 08:00 / 18:00) into.solosquad/workspace.yaml- Messenger channels don't auto-shrink. The bot no longer broadcasts to
daily-brief/signals/experiments/weekly-review/errors— you may archive them in the messenger UI manually - JSONL memory / workflows directories are untouched
Discord users:
- Add Create Public Threads bot permission → re-invite (overwrites, no data effect). Required for auto-creation of system threads (
system-daily-signalsetc.).
Slack users:
- Add
channels:manageto Bot Token Scopes → "Reinstall to Workspace". Without it,#workflowchannel creation fails.
Telegram users (support removed)v0.2.4 removed
MESSENGER=telegramno longer works since v0.2.4. The bot exits with a clear error message on startup.- Transition:
- Run
solosquad migrate --applyfirst (workspace.yaml field injection is messenger-agnostic) - Set up Discord or Slack bot (§5.1 or §5.2)
- Change
MESSENGER=telegramtodiscordorslackin.solosquad/.env - Delete
TELEGRAM_BOT_TOKEN/TELEGRAM_CHAT_IDlines (ignored if left, but cleanup recommended) - Restart
solosquad bot→ new platform's#owner-command+#workflowauto-created
- Run
- JSONL memory is preserved — past signals / experiments / decisions all survive after switching messengers
Known issues (v0.1.x → v0.2.0 jump)
solosquad updatemay not show the migration warning — migration detection code was added in v0.2.0. Users upgrading from v0.1.x should runsolosquad migratemanually once.--dry-runflag unregistered in the v0.2.0 initial build. v0.2.1+ registered it formally. Even without the flag,solosquad migrateis dry-run by default.
First task after migration — solosquad sync
The v0.1.x → v0.2.0 migration converts each product to an org but leaves .git at the org root (relic of v0.1.x's product = repo). First sync offers two choices:
⚠ bv-ai-native-po/ has a .git folder at the organization root (v0.1.x legacy layout).
How would you like to handle this?
❯ Normalize — move code into repositories/<org-slug>/ (recommended)
Keep legacy — register repo.yaml at org root, skip restructure
- Normalize (recommended) — code and
.gitmove to<org>/repositories/<org-slug>/. System folders stay at org root. Required for future multi-repo. - Keep legacy — as-is.
<org>/.solosquad/repo.yamlcreated at org root. OK for single-repo setups.
Docker user update flow
# All commands in deploy/docker/ (v0.5+)
cd deploy/docker
# 1. Stop containers
docker compose down
# 2. Update CLI on host (for migration detection + execution)
npm install -g solosquad@latest
# 3. If migration needed (from workspace root)
cd ../..
solosquad migrate --dry-run
solosquad migrate --apply
# 4. Rebuild Docker image
cd deploy/docker
docker compose up -d --build
Migration must run on the host. Running it inside a container risks volume-mapping confusion. v0.5+ containers also mount ~/.solosquad/ + ~/.solosquad-backups/ so user-global SKILL overrides and backups work normally.
Multi-workspace update
When using multiple workspaces per persona, the CLI update is one-shot but migration runs per workspace:
npm install -g solosquad@latest
cd ~/solopreneur
solosquad migrate --dry-run
solosquad migrate --apply
cd ~/elon-24-7
solosquad migrate --dry-run
solosquad migrate --apply
Each workspace has an independent backup — one failure doesn't affect others.
Rollback
solosquad migrate --rollback # restore from the most recent backup
Warning: after rollback, use the CLI version matching the restored workspace. If you migrated to v0.2.0 and rolled back to v0.1.5:
npm install -g solosquad@0.1.5
doctor warns on CLI ↔ workspace version mismatch.
Backup management
Default backup location: ~/.solosquad-backups/<ISO-timestamp>-v<source-version>/
solosquad migrate --list-backups # list
solosquad migrate --delete-backup <id> # manual delete
Auto-retention: keeps the most recent 5. The 6th migration deletes the oldest. Preserve critical backups separately on an external drive or cloud.
Upgrade failure troubleshooting
"Cannot find package.json" type errors:
npm cache clean --force
npm uninstall -g solosquad
npm install -g solosquad@latest
Migration aborted:
solosquad migrate --rollback # restore most recent backup
Then report to GitHub Issues with logs.
Claude Code auth lost — v0.2.0+ Docker images mount ${HOME}/.claude, so host's claude login state is shared into the container:
claude login
docker compose restart
Beta / dev channels
solosquad update --channel dev # beta (no stability guarantee)
solosquad update --channel stable # default
5.Messenger Setup
For an AI to send / receive messages on a messenger, you need a bot account. The v1.0 officially supported messenger is Discord. The Slack adapter ships in the codebase and works, but it is not part of the v1.0 SemVer promise (post-v1.0 slot — see docs/plan/v1.0-formal-launch.md §5). Pick one messenger per workspace.
| Platform | v1.0 status | Best for | Pros | Cons |
|---|---|---|---|---|
| Discord | ★ v1.0 officially supported | Solo use with a friendly UI | Bot auto-creates channels, simple setup | Server name must include product slug |
| Slack | post-v1.0 slot | Workspace-centric collab, calm UI | Clean channel structure, strong search | Most setup steps + outside v1.0 SemVer promise |
5.1 Slack Bot Setup (9 steps) post-v1.0
This section is a post-v1.0 slot — not covered by the v1.0 SemVer promise. Use it if you already run Slack on v0.9.x or when the slot becomes active. New users: start with §5.2 Discord.
End result: .env has SLACK_BOT_TOKEN=xoxb-... and SLACK_APP_TOKEN=xapp-..., and the bot responds in #owner-command of your Slack workspace.
- Visit https://api.slack.com/apps (logged in with your Slack account)
- Top right Create New App → From scratch
- Enter App Name (e.g.
My AI Team) + select workspace → Create App
Left sidebar Features → OAuth & Permissions → in Bot Token Scopes add these 6:
| Scope | Why needed |
|---|---|
channels:read | Bot checks which channels it's in |
channels:history | Read messages in public channels |
chat:write | Send response messages |
app_mentions:read | Detect @botname invocations |
groups:read | Needed if bot operates in private channels |
channels:manage | When routines auto-create or modify channels |
OAuth Tokens for Your Workspace → Install to Workspace → Allow → copy Bot User OAuth Token (xoxb-...) → save to a note. This is SLACK_BOT_TOKEN.
- Left sidebar Settings → Socket Mode
- Enable Socket Mode ON
- In the App-Level Token popup, name it + add scope
connections:write→ Generate - Copy the generated
xapp-1-...immediately (won't be shown again). This isSLACK_APP_TOKEN.
xapp-.Left sidebar Features → Event Subscriptions
- Enable Events ON
- Expand Subscribe to bot events → Add Bot User Event:
message.channels(public channels)message.groups(private channels — required if#owner-commandis 🔒)app_mention(@botinvocations)
- Save Changes
After scope / event changes, the yellow banner → click reinstall your app. Bot Token may be re-issued — update your note and .env with the new value.
- Create a channel:
owner-command(exact name) - Pick public or private (private requires Step 5's
message.groups) - Channel header → Integrations → Add apps → your bot → Add. Or
/invite @botname
MESSENGER=slack
SLACK_BOT_TOKEN=xoxb-1234567890-...
SLACK_APP_TOKEN=xapp-1-...
SLACK_COMMAND_CHANNEL=owner-command
solosquad doctor --messenger-check
solosquad bot
If Slack auth.test → <bot-username> is ✓ and #owner-command echoes "hi", you're good.
5.2 Discord Bot Setup (8 steps)
End result: .env has DISCORD_TOKEN=..., and the bot responds in #owner-command of your Discord server.
- Visit https://discord.com/developers/applications
- Top right New Application
- Enter name → Create
- Click left Bot
- Reset Token → Yes
- Copy the token immediately (shown once). This is
DISCORD_TOKEN.
Scroll down on the same Bot page → Privileged Gateway Intents:
- Message Content Intent — REQUIRED (without it, message bodies arrive as empty strings and the bot can't respond)
Save Changes.
Left sidebar OAuth2 → URL Generator
- Scopes:
bot,applications.commands - Bot Permissions: View Channels, Send Messages, Read Message History, Manage Channels, Create Public Threads (v0.2.4+)
Copy the generated URL → open in browser → select server → Authorize.
To map the server to a product, the server name must contain the product slug.
- Registered product:
My Startup(slug:my-startup) - Discord server name
My Startup·My Startup Workspace·my-startup-dev→ auto-maps - Name like
Awesome Team→ mapping fails. Server settings → Overview → change Server Name
After bot invite and solosquad bot, these auto-create:
If a channel with the same name exists, creation is skipped.
MESSENGER=discord
DISCORD_TOKEN=MTIzNDU2...
solosquad doctor --messenger-check
solosquad bot
If Discord /users/@me → <bot-username> is ✓ and #owner-command echoes "hi", you're good.
5.3 Operation Verification
Common to both platforms:
solosquad doctor # base environment check
solosquad doctor --messenger-check # verify tokens via live messenger API
solosquad bot # start bot, logs to console
solosquad bot --debug # verbose logs
Send hi in #owner-command → if the bot responds in the form [product-name (agent-name)] ..., the whole pipeline is fine.
6.Usage
6.1 Command Reference
Currently available (v0.7.0 ~ v0.8.5)v0.7~v0.8.5
| Command | Since | Role |
|---|---|---|
solosquad init | v0.1 | Workspace init wizard — copies agents/routines, takes messenger token, registers product |
solosquad bot | v0.1 | Start messenger bot. v0.3 PM mode + v0.5 4-channel router + atomic-swap hot-reload |
solosquad schedule | v0.1 | Start automated routine scheduler (cron) |
solosquad status | v0.1 | Dashboard: registered products, workflows, recent activity |
solosquad doctor | v0.1 | Environment check (Node, git, claude, tokens, paths) |
solosquad doctor --messenger-check | v0.2 | Verify messenger tokens via live API |
solosquad update | v0.1 | Compare with npm latest + install prompt |
solosquad run-routine | v0.1 | Interactive routine runner |
solosquad run-routine <name> | v0.1 | Run a specific routine (morning-brief, pm-compaction, ...) |
solosquad run-routine --all | v0.1 | Run all routines sequentially |
solosquad migrate | v0.2 | Convert workspace between versions (dry-run by default) |
solosquad migrate --apply | v0.2 | Perform the migration |
solosquad migrate --rollback | v0.2 | Restore from most recent backup |
solosquad add org <name> | v0.2 | Add a new organization to the workspace |
solosquad add repo <url|path> | v0.2 | Register a repo (clone or local move) |
solosquad add repo --from-report <file> [--merge-policy append|override|replace] | v0.5 | Deterministic merge from analysis report (backup → apply → verify) |
solosquad sync | v0.2 | Scan repositories/ + sync .org.yaml + legacy .git cleanup prompt |
solosquad pm status / reset / compact | v0.3 | PM session status / restart / compaction |
solosquad workflow list / show <id> | v0.3 | Workflow list / details |
solosquad workflow focus <wf-id> [--clear] | v0.3 | Set active workflow for (user, org) |
solosquad rollback --workflow <id> [--to <sha>] [--list] | v0.3 | Revert the workflow's last spawn (snapshot.git) |
solosquad goal new / list / show / run / status / stop / verify | v0.4 | Manage autonomous-execution goals + N-hour autonomous loops (Codex /goal + AGENTS.md 2-layer) |
solosquad goal run <goal-id> [--hours N | --cycles N] | v0.4 | Spawn background PM session → metric-driven keep/discard cycle |
solosquad agent add --name X --team Y | v0.5 | Scaffold a new SKILL (frontmatter template + empty body) |
solosquad agent list / info | v0.5 | Inventory / details of registered SKILLs |
solosquad agent validate <path> [--all] [--corpus] | v0.5 | SKILL.md schema + required-section check. --all is the CI gate (npm run validate-skills) |
solosquad analyze repo <path> [--force] [--prune-orphans] | v0.5 | 4-label classification report from existing repo's .claude/skills/. Ledger-based incremental |
solosquad readiness check [--target v0.6] | v0.6 | Scan workspace — v0.5 data N rows, 4-workflow run count, author SKILL Y count, ledger analysis. Auto-runs before retro start. Pass/fail decision + exit code |
solosquad memory search <query> [--limit N] [--event-type X] [--org <slug>] | v0.6 | Full-text search of FTS5 cold archive. Filter by routine_log / route_hit / route_miss / author_turn / spawn_decision |
solosquad memory stats [--disk] [--org <slug>] | v0.6 | Archive row count / oldest / newest / per-event_type distribution. --disk reports SQLite file size |
solosquad agent reload [--org <slug>] | v0.6 | Manually rebuild router — explicit call needed under fs_watch.mode: manual (§6.4) |
solosquad uninstall [--mode full|keep|archive-only] [--dry-run] [--force] [--archive-path <p>] | v0.7 (v0.8.4 surface) | Create farewell archive, then clean up SoloSquad assets. --mode: full (default — full clean) / keep (preserves workflows · memory · knowledge for reinstall) / archive-only (archive only, skip cleanup). --dry-run recommended. User code under repositories/ is never modified/deleted under any flag. v0.8.4 deprecates --archive-only / --keep-workspace / --also-purge-backups (removed in v1.0); --scrub-content removed immediately |
solosquad import <archive.zip> [--mode merge|replace] | v0.8.1 (v0.8.4 surface) | Restore farewell archive into a new workspace. Verifies manifest SHA then --mode merge (default) or --mode replace. v0.8.4 deprecates boolean --merge / --replace aliases |
solosquad archive verify <archive.zip> | v0.8.1 | Archive integrity check (manifest.tsv SHA + PII-NOTICE scan) |
solosquad backup list | delete <id> | purge [--keep-recent N] [--dry-run] | v0.8.4 | Lifecycle management for ~/.solosquad-backups/. Absorbs migrate --list-backups · migrate --delete-backup · uninstall --also-purge-backups (one minor of deprecation, removed in v1.0) |
solosquad messenger add <handle> [--platform discord|slack] | v0.8 | Multi-user registration — auto-bootstrap command-<handle> / works-<handle> channels + activate author-guard |
solosquad add repo <path> [--dry-run] [--keep-original] | v0.8.3 (v0.8.4 surface) | --dry-run pre-checks 5 risk scenarios (0 disk writes). --keep-original for copy mode. v0.8.4 deprecates --inspect alias (removed in v1.0) |
solosquad logs [--level X] [--tail N] [--follow] [--since "1 hour ago"] [--type X] | v0.8.3 | Unified view of runtime + 4 operational jsonl. --type: runtime/costs/spawn/stop-hook/dev-confirm/migration (repeatable) |
Plannedv1.1+
| Command / Infrastructure | Version | Role |
|---|---|---|
solosquad goal queue <id> | v1.1 | Enter 1-active-per-org semaphore queue |
solosquad experiment new/list/show/run/stop/conclude | v1.1 | Experiment infrastructure (Amplitude 4-pattern borrowing) |
| 4 main bots as staff (chief + designer + engineer + marketer) | v1.1 | Hermes V2 Main + Specialist 2-tier. Chief lives in organization layer + doubles as domain expert |
Directory re-architecture (assets/ dropped → 5 root dirs) | v1.1 | agents/main + agents/specialists + skills/ + user/ + team/ + schedules/ (former routines) |
| 4 team axes (chief / engineering / design / marketing) | v1.1 | former strategy→chief / growth→marketing / experience→design. team/{team}/{KNOWLEDGE,OKR}.md |
| 5 specialist merges (25 → 20) | v1.1 | backend-engineer · data-engineer · idea-scoper · researcher · content-marketer |
| Forum Channel + 9-hop diagnostic + Echo guard | v1.2 | L1 Gateway surface (Discord first) |
| Web dashboard interaction client | v1.x (cascade-shifted) | Former v1.1 — read-only visualization / inbox (separate repo) |
| Knowledge ontology MCP connectors | v1.x (cascade-shifted) | Former v1.2 — Notion / Obsidian / external APIs / cross-agent |
6.2 Daily Operation
Get work done on the messenger (v0.6)v0.6
The main flow is multi-turn dialog with the PM session. PM classifies intent and spawns specialists via Task tool. The router injects appropriate SKILLs through the 4-channel priority (slash / explicit / keyword / freq).
| Example input | Assigned agent |
|---|---|
| "Write landing-page copy" | Content Writer (Growth) |
| "Analyze our competitors" | Desk Researcher (Experience) |
| "Summarize this week's experiments" | Data Analyst (Strategy) |
| "Design the signup API" | API Developer (Engineering) |
| "Make the login screen UI" | UI Designer (Experience) |
| "Set up pricing policy" | Business Strategist (Strategy) |
| "Plan this quarter's GTM" | GTM Strategist (Growth) |
If nothing matches, the PM falls back to general mode or asks clarifying questions.
PM-mode multi-turn dialogv0.3
User: "Redesign the landing page"
PM: Which section do you want to change?
(1) Hero (2) Pricing (3) Full redesign
User: 1
PM: [PRD drafted → spawn desk-researcher → spawn ui-designer → ...]
Done. Artifacts in stage-1-research/ and stage-2-design/.
Slash commandsv0.3
When you want to be explicit, use slash instead of natural language (gstack-style pattern). Wrapped in PM prompt as [SLASH /xyz] <args> for stable parsing.
/think <topic>— organize hypotheses / market signals (before PRD)/plan <topic>— author PRD + decompose status.yaml/build— execute the ready stage from the latest plan/review— summarize completed stages + report blocking issues/ship— trigger release / deployment routine/help— short-circuit on bot side, returns usage text only
Create a new SKILL from the messengerv0.5
"I do this often, I want to automate it" → PM classifies intent → explicit call to workflow-maker meta-skill → 1-2 clarification turns → SKILL.md draft → user approval → atomic swap → usable from next call. See §3.5.
0.5 → 0.6 migrationv0.6
For users upgrading from v0.5:
npm install -g solosquad@latest— CLI firstsolosquad migrate --dry-run— Pass 1 simulation + report at<org>/memory/migration-2026-XX-dryrun.md. 0 filesystem changes- Review report — N moves / M items requiring human review / K items unchanged (already final)
solosquad migrate --apply --confirm— refused without--confirmflag (mistake prevention)human_review_required: trueitems must be manually augmented by the user, then re-run- Pass 2 —
solosquad agent validate --allauto-runs + failures reported to STDOUT
The migration itself has a budget cap (workspace.yaml.migration.budget_usd, default 5 USD). When the heuristic fail-soft path falls to LLM fallback, this prevents token-spike runaway. On cap hit, remaining items are marked human_review_required and the migration exits safely. Accumulator: <org>/memory/migration-costs.jsonl.
readiness checkv0.6
Automatic measurement before v0.6 retro starts. solosquad readiness check --target v0.6 scans workspace → v0.5 data (author-costs.jsonl row count) / 4-workflow run count X/4 / author SKILL Y count (<org>/.agents/ + ~/.solosquad/agents/) / ledger analysis → deterministic output of "S1 can start ✓" or "Insufficient data — wait N weeks". Exit codes for automation.
fs.watch mode selectionv0.6
v0.6 auto-reflects external edits (direct VSCode edits · git pull · separate CLI ops) into the router — chokidar-based 3-tier watch + 300ms debounce. workspace.yaml.fs_watch.mode chooses 3 modes:
- auto — v0.5 atomic swap as-is. All external changes reflected immediately
- prompt (default) — PM gets
🔄 N SKILL changes detected — apply? [y/N]per turn. User y/n - manual — no auto-reload.
solosquad agent reloadmust be called explicitly
Additionally, fs_watch.git_only: true only reflects when HEAD ≡ upstream + clean tree — blocking the risk of unreviewed SKILLs from git pull reaching a running bot.
6.3 Recommended First Tasks (right after onboarding)
- Confirm
solosquad doctorshows all ✓. - Send
hiin#owner-command→ confirm response. - Run the first routine manually:
Confirm output appears insolosquad run-routine morning-briefworks-<handle>channel. - Edit user profile — Update
assets/core/OWNER.md(or.solosquad/core/OWNER.md) with your name / role / interests. Every agent reads this each session. - Behavioral principles — Write your decision criteria in
core/PRINCIPLES.md(e.g. "cash flow first", "no VC funding", "≤50 hours/week"). - Writing tone — Write content tone in
core/VOICE.md(e.g. "professional but warm, no hyperbole"). - Decide product name + create a workflow folder (
~/solosquad-workspace/<org>/workflows/wf-2026-XX-XX-test/). - Adjust brief times — edit
briefings.morning.timeetc. in.solosquad/workspace.yamlto match your daily rhythm.
6.4 Automated Routinesv0.8.5
Total 4. Three user-facing briefs + one infrastructure routine. v0.8.5 permanently removed 4 analysis routines (signal-scan / experiment-check / weekly-review / v06-retrospective-stats) and unified the 2 infrastructure routines (archive-rotate + log-rotate) into a single system-housekeeping.
User-facing briefs (3)
| Default time | Name | Output location | Role |
|---|---|---|---|
| 08:00 daily | Morning Brief | works-<handle> | Overnight summary (active goals · in-progress workflows · decisions) |
| 18:00 daily | Evening Brief | works-<handle> | Today's decisions / completions + tomorrow's priorities (appends to decisions.jsonl) |
| 23:00 daily v0.3 | PM Compaction | works-<handle> → system-pm-compaction | Externalizes completed workflows (memory/pm-skills/) — PM context management |
System infrastructure (user-invisible, always on, silent)
| Default time | Name | Role |
|---|---|---|
| 00:00 daily v0.8.5 | System Housekeeping | Two deterministic steps run back-to-back (try/catch isolated): ① JSONL → archive.sqlite FTS5 indexing + retention pass · ② delete .solosquad/logs/ files older than 14 days |
v0.8.5 change — routines 9 → 4:
- Removed (permanent):
signal-scan·experiment-check·weekly-review·v06-retrospective-stats. Analysis routines meaningless without user-authored domain prompts. Domain analysis goes into workflows / goals instead - Merged:
archive-rotate+log-rotate→system-housekeeping(single 00:00 cron, try/catch isolated) - Backward-compat:
workspace.yaml.background_routineskeys are read-ignored (no error)
Update ↔ migration flowv0.8.3
These two commands are separate. solosquad doctor explicitly tells you which one is needed on CLI ↔ workspace version mismatch (§7.3).
# 1. Diagnose
solosquad doctor
# ├─ "CLI: v0.8.5, workspace: v0.8.5" → OK
# ├─ "CLI: v0.8.5, workspace: v0.7.0" → recommends `solosquad migrate --apply`
# └─ "CLI: v0.7.0, workspace: v0.8.5" → recommends `npm install -g solosquad@latest`
# 2. CLI upgrade (npm package itself)
solosquad update # checks npm registry + self-install
# or: npm install -g solosquad@latest
# 3. (After CLI is new version) align workspace
solosquad migrate --dry-run # preview changes
solosquad migrate --apply # apply (auto backup → apply → verify)
solosquad migrate --rollback # restore from last backup (if needed)
- update = updates the CLI binary (npm package) itself
- migrate = converts the workspace (.solosquad/ · org/ · workflows/ · memory/) schema/layout to match new CLI
Edit timezone / times / activation
Edit .solosquad/workspace.yaml directly:
timezone: Asia/Seoul # any IANA tz
briefings:
morning:
time: "08:00"
enabled: true
evening:
time: "18:00"
enabled: true
Manual execution
solosquad run-routine # interactive menu
solosquad run-routine morning-brief # specific routine
solosquad run-routine --all # all
7.Glossary
This section explains every term and filename a newcomer to AI / dev might hit while reading these docs or the code.
7.1 Core Terms
- Workspace
- SoloSquad user's top-level folder, typically
~/solosquad-workspace. Holds 1+ organizations. A workspace is one user's "AI assistant HQ." - Organization (org)
- A business / product unit inside the workspace. e.g. day-job, side project. Each has isolated memory / workflows / messenger channels. The folder name is
<slug>(e.g.my-startup). - Repository (repo)
- Actual code in a git repo. One org may hold multiple repos. Location:
<workspace>/<org>/repositories/<repo>/. - Agent
- An AI worker performing one role (e.g. Business Strategist). SoloSquad has 25 specialists + 1 PM (v0.3+).
- Specialist
- Domain-specific expert agent. 25 of them. Distinct from PM (orchestrator).
- PM / Orchestrator
- The persistent agent talking directly with the user. Introduced in v0.3. Spawns specialists to drive multi-stage workflows.
- SKILL.md
- Manual file describing one agent's identity and operation. Anthropic Agent Skills official format.
- KNOWLEDGE.md (v0.6)
- Per-team (= domain) shared craft / definitions / anti-patterns. Located at
agents/{team}/KNOWLEDGE.md(v0.6 co-location). Auto-injected as 8-layer assemble [2] when any agent in the team spawns. - Org Layer (v0.6)
- Three new assets absorbing org-specific flavor:
<org>/core/{PRINCIPLES,VOICE}.md(org philosophy/tone) +<org>/agent-profile.yaml(25-agent modifier + budget) +<org>/domain/(org domain knowledge). Workspace SKILLs stay unchanged; org color comes solely from these 3 assets. - Workspace Knowledge (v0.6)
.solosquad/knowledge/— accumulated shared user knowledge (decision frameworks, domain glossary). Keeps agent SKILL.md short by separating craft / domain. Selective inject on keyword match.- 8-layer JIT inject (v0.6)
- At spawn time, context is assembled in order: workspace knowledge → team KNOWLEDGE → agent SKILL → org core → agent-profile → org domain → memory/handoff → repo. When
max_context_tokensis hit, lower-priority layers drop first. See §2.5. - Budget envelope (v0.5 author + v0.6 agent)
- Paperclip-style LLM call cap. v0.5 applied it to author loop only; v0.6 generalizes per (org × agent). Configured via
agent-profile.yaml'sbudget.daily_usd / weekly_usd / on_cap_action. On cap → spawn refused + PM response. Accumulator:<org>/memory/agent-costs.jsonl. - FTS5 cold archive (v0.6)
<org>/memory/archive.sqlite— JSONL older than 8 days moved into a SQLite FTS5 virtual table, kept searchable. Nightlyarchive-rotateat 00:00 (v0.8.5: merged intosystem-housekeeping). 4 event_types indexed (route_hit / route_miss / author_turn / spawn_decision) + existingroutine_log. Fallback recall on router miss.- Trajectory extraction (v0.6)
- Same (agent sequence + workflow template) occurring 3+ times in 30 days → auto SKILL draft suggestion. Nighttime
pm-compactionstep. Reuses v0.5applyDraft()directly (0 code duplication). No auto-registration — human gate retained. - Freq miner (v0.6)
- Analyzes FTS5
route_miss+ author-draft clarification N-grams → suggests additions to existing SKILL'striggers.keyword. Body untouched + frontmatter patched viaapplyDraft({ mode: "frontmatter-only" }). - Stop-hook DSL (v0.6)
- v0.5's
loop_mode.spec-gateactually runs via Anthropic 2025-12 stop-hook plugin. 3 forms:command(exit 0) ·metric(results.tsv threshold) ·natural(LLM fallback + budget cap). 5-second timeout; on failure, conservatively continue. - collab_pattern (v0.6)
- Formal frontmatter field in SKILL.md (was
extrabag in v0.5).hierarchical | graph | dynamic. 25-agent split: 22 hierarchical · 2 graph (data-analyst, feature-planner) · 1 dynamic (content-writer). Spawn auto-applies the matching handoff variant template. - Hot-reload (chokidar, v0.6)
fs.watch-based router auto-rebuild. 3-tier watch (workspace · org · user-global) + 300ms debounce + atomic swap.workspace.yaml.fs_watch.mode: auto / prompt (default) / manual.git_onlysafety mode allows only HEAD ≡ upstream + clean tree.- schema_version: 1 (v0.6)
- Forward-compat flag on v0.6 new assets (
.org.yaml·agent-profile.yaml· v0.6 ledger). v0.7 migration branches by version check. - Routine
- Task that runs automatically at scheduled times. SoloSquad ships 4 (v0.8.5): Morning Brief, Evening Brief, PM Compaction, System Housekeeping.
- Workflow
- A multi-stage project. 4 defaults: PMF Discovery, Feature Expansion, Rebranding, Rapid Prototype. Each workflow lives at
<org>/workflows/<id>/. - Stage
- One step inside a workflow. Stored in folders like
stage-1-research/. - Handoff
- Artifact passed from one stage to the next agent at stage end.
_handoff.mdwith standard sections: Summary, Artifacts, Decisions, etc. - Brief
- Morning/evening summary from the bot. Morning = overnight events + today's plan. Evening = today's events + tonight's plan.
- Agent Router
- Module that decides which specialist to invoke based on user message. v0.5 evolved to 4-channel triggers (slash > explicit > keyword > freq) + 3-tier search + atomic-swap hot-reload.
AGENT_ROUTEShardcode removed; trigger info now lives in each SKILL.md'striggersfrontmatter. - Spawn
- Action of PM (or router) starting a specialist agent in a fresh session. Each spawn is independent; state lives in external files. v0.3+ uses the PM's built-in Task tool with
[stage:<id> wf:<id>]markers in the prompt. - 4-channel routing (v0.5)
- SKILL match channels:
slash(explicit intent) >explicit(PM direct call) >keyword(single-turn match) >freq(accumulated frequency over N turns). Each SKILL.md frontmatter'striggerscollected as router index at boot. - Freq cooldown (v0.5)
- Once a SKILL auto-loads via freq, it's blocked from re-firing for
cooldown_turns(default 6) (hysteresis). Prevents noise when conversations linger on one topic. State stored in<org>/.solosquad/sessions/<user>.jsonfreqCooldownsfield, decayed per turn. - Hot-reload / Atomic swap (v0.5)
- On new SKILL.md save, the router index is rebuilt in background → ref swapped. Messages in flight see the old index. No bot restart needed.
- Author loop (v0.5)
- 5-stage state machine for creating a new SKILL.md via 1-2 PM messenger turns (CLARIFY → DRAFT → SANDBOX_PROMPT → AWAIT_CONFIRM → APPLIED).
assets/agents/_meta/workflow-maker/SKILL.mdmeta-skill serves as the system prompt. - Spec-gate / Loop mode (v0.5)
- SKILL.md
loop_mode.kind: spec-gatemeans Ralph-loop mode (stop_when condition). Author loop auto-emits<org>/goals/<goal-id>/goal.mdas well → registers an autonomous cycle in v0.4 goal-runner. - 3-tier SKILL search (v0.5)
- Same-name SKILL priority:
<org>/.agents/>~/.solosquad/agents/><workspace>/.solosquad/agents/(bundled). Higher tier overrides. - Stateless / Stateful
- Stateless = each call independent; Stateful = retains state across calls. SoloSquad specialists are stateless; the PM session is stateful.
- JIT (Just-in-Time) Injection
- Principle of not pre-loading all context but injecting only what this call needs at the moment. Prevents token-cost blowup.
- Memory
- Persistent store for routine / decision / signal results. v0.6 layout: JSONL append-only (signals / experiments / decisions / author-costs / agent-costs / spawn-decisions / stop-hook-events / migration-costs) + PM compaction externalization (
memory/pm-skills/) + per-org snapshot.git + FTS5 cold archive (archive.sqlite— 8d+ auto-move, 4 event_type indexing). - P/E/T (Persistent / Episodic / Transient)
- Vocabulary classifying memory into 3 layers. SoloSquad's SKILL = Persistent, workflows = Episodic, Claude session prompt = Transient.
- 3-Layer Context
- Workspace (Layer 0) / Organization (Layer 1) / Repository (Layer 2). Basic data-isolation units.
- PRD (Product Requirements Document)
- Product spec doc. Authored by PM, handed to specialists.
- PMF (Product-Market Fit)
- Whether the market truly needs this product.
- GTM (Go-To-Market)
- Strategy for entering the market — channels, message, pricing, first users.
- Anthropic / Claude
- Anthropic is the company behind Claude AI. Claude Code is Anthropic's coding CLI. SoloSquad uses Claude Code as its backend engine.
- Claude Code
- Anthropic's general-purpose coding CLI tool. SoloSquad calls
claudeto get AI responses. Separate install:npm install -g @anthropic-ai/claude-code. - npm (Node Package Manager)
- Node.js package installer.
npm install -g solosquadinstalls SoloSquad. - CLI (Command Line Interface)
- Terminal-driven program.
solosquadis a CLI. - cron
- Standard schedule format for repeated tasks. SoloSquad routines are cron-based.
- JSONL (JSON Lines)
- Text format where one line = one JSON object. Useful for append-only event logs. SoloSquad memory's default format.
- FTS5 (Full-Text Search v5)
- SQLite's built-in full-text search extension. Fast keyword search. Adopted in v0.6 as the memory archive index (depends on
better-sqlite3^12.10.0). - MCP (Model Context Protocol)
- Standard protocol connecting AI agents to external tools / data. Announced by Anthropic in 2024. SoloSquad can use MCP for external integrations (Notion, Figma, etc.).
- IANA tz (Timezone Database)
- International standard timezone names (e.g.
Asia/Seoul,America/Los_Angeles). Used inworkspace.yaml.timezone. - YAML
- Human-readable config file format. SoloSquad uses YAML in
workspace.yaml,.org.yaml,_status.yaml, etc. Structure via indentation. - Frontmatter
- YAML metadata block at top of a Markdown file, wrapped in
---. SKILL.md'sname/description/triggersetc. are frontmatter. - Docker / docker-compose
- Container virtualization tool. Useful when you want SoloSquad bot/scheduler running in background with auto-restart. Optional.
- VPS (Virtual Private Server)
- Cloud virtual server. For 24/7 ops when you can't keep a PC on. ~$4-6/month.
- Slug
- URL/folder-friendly name. Lowercase + hyphens. e.g. "My Startup" →
my-startup.
7.2 File Dictionary
Meaning of every file you'll encounter in a workspace or the code.
- .env
- File holding secrets (API tokens, etc.) such as
SLACK_BOT_TOKEN/DISCORD_TOKEN. Never commit to git. - .env.example
- Template for
.env, with empty values to show what to fill in. OK to commit. - .gitignore
- Patterns git ignores. SoloSquad ignores .env, node_modules, dist, repos, etc.
- .npmignore
- Patterns excluded from npm package publish (dev-only files).
- package.json
- npm package manifest. Name, version, dependencies, scripts. SoloSquad's
solosquadCLI entry point declared here. - package-lock.json
- Auto-generated file pinning exact dependency versions. Do not edit by hand.
- tsconfig.json
- TypeScript compile config. ES2022 / strict, etc.
- workspace.yaml
- Workspace-wide config at
.solosquad/workspace.yaml. timezone / briefings / background_routines schedule, messenger type, etc. - .org.yaml
- Per-org config at
<org>/.org.yaml. Org name / messenger / registered repos. - repo.yaml
- Per-repo config at
<repo>/.solosquad/repo.yaml. Repo slug / role (main/sub) / target_org. - SKILL.md
- Agent identity manual in Anthropic Agent Skills format. See §3.1.
- KNOWLEDGE.md (v0.6)
- Team (= domain) shared knowledge at
agents/{team}/KNOWLEDGE.md. See §3.2. - TEAM_KNOWLEDGE.md (v0.2.4, removed in v0.6)
- Renamed & relocated to
agents/{team}/KNOWLEDGE.mdin v0.6._teams/parallel hierarchy fully removed. - agent-profile.yaml (v0.6)
- At
<org>/agent-profile.yaml. Org-specific modifiers for 25 agents (tone, emphasis, voice, ban_phrases, budget). defaults + per-agent +schema_version: 1. - archive.sqlite (v0.6)
- At
<org>/memory/archive.sqlite. FTS5 cold archive. JSONL ≥8d → moved here + 4 event_type indexing + 365d retention. - CLAUDE.md
- Project guide auto-loaded by Claude Code each session. See §3.3.
- OWNER.md
- Your profile / interests / work pattern. Every agent reads it each session.
assets/core/OWNER.md. - PRINCIPLES.md
- Your decision-making principles. Guide every agent should follow.
assets/core/PRINCIPLES.md. - VOICE.md
- Your writing tone / voice. Guides agents that produce text (Content Writer, etc.).
assets/core/VOICE.md. - _status.yaml
- Workflow progress. State per stage:
pending → in_progress → completed. - _handoff.md
- Context passed to the next agent when a stage completes. Standard sections: Summary, Artifacts, Decisions, Open Questions.
- _events.jsonl (v0.3+)
- All PM session event logs. PM messages, spawns, subagent completions.
- signals.jsonl
- Results from Signal Scan routine (deprecated default in v0.8.5).
- experiments.jsonl
- Results from Experiment Check routine (deprecated default in v0.8.5).
- decisions.jsonl
- Decisions accumulated from Evening Brief / Weekly Review.
- routine-logs/*.jsonl
- Full execution logs for routines. Used for debugging / retro.
- Dockerfile (deploy/docker/Dockerfile)
- Docker image build recipe. For containerizing SoloSquad bot/scheduler. Moved to
deploy/docker/in v0.5. - docker-compose.yml (deploy/docker/docker-compose.yml)
- Settings for running multiple containers (bot + scheduler) together. v0.5+ also mounts
~/.solosquad/+~/.solosquad-backups/— user-global SKILL override and backups compatible. - README.md
- First-impression document. Shown on npm/GitHub. SoloSquad's README covers install + quick start.
- LICENSE
- License file. SoloSquad is MIT.
- CONTRIBUTING.md
- Guide for contributing (developer-facing).
7.3 Abbreviation Dictionary
- API
- Application Programming Interface. Inter-software protocol. Slack API, Claude API, etc.
- CAC
- Customer Acquisition Cost. Marketing metric.
- CLI
- Command Line Interface.
- CRUD
- Create / Read / Update / Delete. The 4 basic data ops.
- DAG
- Directed Acyclic Graph. Used to express workflow stage dependencies.
- E2E
- End-to-End. Full user-flow testing.
- ESM
- ECMAScript Module. JS module standard (Node16+).
- FDE
- Forward Deployed Engineer. Customer-on-site engineer. One agent in SoloSquad engineering team.
- FTS5
- Full-Text Search v5. SQLite built-in full-text search.
- GTM
- Go-To-Market.
- IANA
- Internet Assigned Numbers Authority. SoloSquad uses IANA timezone names (
Asia/Seouletc.). - JIT
- Just-in-Time. Load/run only when needed. Context-management principle.
- LTV
- Lifetime Value. Total revenue from one customer. LTV:CAC ≥ 3:1 is the typical SaaS health metric.
- MCP
- Model Context Protocol. AI ↔ external tools standard.
- npm
- Node Package Manager.
- PaaS
- Platform-as-a-Service. Cloud without server management. Railway, Fly.io.
- PMF
- Product-Market Fit.
- PRD
- Product Requirements Document.
- QA
- Quality Assurance.
- SaaS
- Software-as-a-Service.
- SDK
- Software Development Kit.
- SQL
- Structured Query Language.
- SSH
- Secure Shell. Remote-server access protocol. Used for VPS ops.
- TS
- TypeScript. JavaScript with static types. SoloSquad's implementation language.
- TTL
- Time-To-Live.
- tz
- timezone (abbreviation).
- UI / UX
- User Interface / User Experience.
- VPS
- Virtual Private Server.
- YAML
- YAML Ain't Markup Language.
8.Version Differences
Clear distinction between what you can install from npm today and what's planned.
8.1 Currently Available on npm (v0.7.0 ~ v0.8.5)Available
Core features (v0.1~v0.2)
- One-line npm install on Mac / Windows / Linux
- 25 specialist agents (Strategy 7 / Growth 4 / Experience 4 / Engineering 10)
- 2 messengers (Discord / Slack — one per workspace)
- Automated routines (4 in v0.8.5: Morning/Evening Brief, PM Compaction, System Housekeeping)
- 3-Layer Context (workspace / organization / repository)
- JSONL append-only memory (signals, experiments, decisions, routine-logs)
- workspace.yaml config (timezone, briefing schedule, routine activation)
- Migration framework (v0.1.x → v0.2.x backup → apply → verify → rollback)
- Docker compose option (background + auto-restart)
- VPS systemd service registration guide (docs/cloud-deployment.md)
- Multi-org / multi-repo support (
solosquad add org/repo/sync) - Environment diagnostics (
solosquad doctor/--messenger-check)
PM mode + multi-agent orchestrationv0.3
- PM agent owns all user communication (persistent session,
claude --resume) - Specialists spawn as ephemeral subagents via built-in
Tasktool (depth=1) - 5 slash commands (
/think /plan /build /review /ship) +/help _events.jsonlstandard (PM session event log) + spawn marker[stage:<id> wf:<id>]- Focus marker
[focus:<wf-id>]/[focus:none]bidirectional - PM compaction routine (completed workflow →
memory/pm-skills/externalization, 23:00 daily) - Boot-time recovery (
workflow-reconciler.ts) — orphanedin_progress→needs_revision, missed responses retransmitted - Per-org snapshot.git (
memory/+workflows/only) +solosquad rollback --workflow <id>revert - Full CLI:
solosquad pm·solosquad workflow·solosquad rollback
Autonomous engine — Goal Runnerv0.4
- 2-layer structure:
goal.md(per-run intent) +AGENTS.md(persistent guide, cross-tool standard) - Adopts OpenAI Codex
/goalpattern — humans modify, models only start/finish - 3-tier guardrails: preflight Input guard / runtime guard (timeout · discard streak · cost cap 90% warning) / Output guard (forbidden side effects + HTTP allowlist)
AGENTS.mdpins immutable_paths · modifiable_paths · external_side_effects · guardrail thresholds- Metric measurement → keep/discard → git-snapshot per cycle.
CONFIRMINGgate (all metrics ≥ threshold) advances _best.json solosquad goal run <goal-id> [--hours N | --cycles N]— N-hour autonomous loop (background PM sessionbg-<goal-id>-<runId>)solosquad goal verify— deterministic recompute (reconciliation)- Full CLI:
goal new / list / show / run / status / stop / verify
Workflow maker + SKILL system integrationv0.5
SKILL.mdAnthropic Agent Skills compatible frontmatter parser + validator (src/bot/skill-parser.ts)- SKILL schema extensions:
stateful·triggers(4-channel) ·loop_mode(spec-gate) ·budget - 4-channel router (slash > explicit > keyword > freq) + 3-tier search (org > user > bundle) + atomic-swap hot-reload
- Freq channel: frequency-counted auto-load +
cooldown_turnshysteresis + per-workspace 20-SKILL ceiling AGENT_ROUTEShardcode constant removed — distributed across each SKILL.md'striggers.keyword. 25 bundled SKILL frontmatters backfilled (idempotent)- Messenger author loop (CLARIFY → DRAFT → SANDBOX → AWAIT_CONFIRM → APPLIED) via
assets/agents/_meta/workflow-maker/SKILL.md - spec-gate SKILLs auto-emit
goal.md→ autonomous cycle in v0.4 goal-runner - Paperclip-envelope author daily/weekly budget cap +
<org>/memory/author-costs.jsonl - Repo analyzer: 4-label classification (role / workflow / codebase-fact / domain), deterministic matching, ledger incremental, applier backup/apply/verify/rollback
solosquad agent add / list / info / validate+analyze repo+add repo --from-reportCLI- CI gate:
npm run validate-skills(=solosquad agent validate --all --corpus)
Default workflow tuning + memory infra + self-evolutionv0.6
Integrates retro on accumulated v0.3~v0.5 data + FTS5 search of cumulative memory + auto-extract recurring patterns into SKILLs + org × agent flavor/budget separation + chokidar hot-reload + CI PR bot + 0.5→0.6 migration into one release. ~12,000 new LOC, 152 new tests (total 421/421 green).
- S1 — readiness + ETL + onboarding two tracks:
solosquad readiness check --target v0.6CLI + ETL of 5 v0.5 data sources → nightlyv06-retrospective-statsroutine +initbranches for new vs existing v0.5 users - S2 — folder restructure + 3 handoff variants:
agents/_teams/→agents/{team}/KNOWLEDGE.mdco-location +handoff-{hierarchical,graph,dynamic}.md+ 25 SKILL.mdcollab_patternfrontmatter formalized (22 hierarchical / 2 graph / 1 dynamic) - S3 — Org Layer + budget + spawn-assembler:
<org>/core/·agent-profile.yaml·domain/introduced + 8-layer JIT inject +max_context_tokensdrop policy +~/.solosquad/agent-profile-defaults.yamluser-global inheritance +schema_version: 1forward-compat - S4 — FTS5 archive + 4 event_type + retention:
archive.sqlite+ daily 00:00archive-rotate+ route_hit/route_miss/author_turn/spawn_decision indexing +retention_days: 365+compress_before_deleteoption - S5 — Trajectory + Freq miner + Stop-hook DSL: nightly pattern extraction (reuses v0.5
applyDraft()directly) + keyword auto-suggest (frontmatter-onlymode) + stop_when 3 forms (command/metric/natural) DSL + 5s timeout - S6.A — fs.watch + 3 modes + git_only: chokidar 3-tier watch + 300ms debounce +
fs_watch.mode: auto/prompt/manual+git_onlysafety mode +solosquad agent reload - S6.B — CI PR auto-review bot:
.github/workflows/skill-review.yml+ frontmatter diff comments + keyword collision warnings + 6 validators (agent-profile / core / domain / .org.yaml) - S6.C — Migration 0.5→0.6: 2-pass dry-run + human-review gate + v0.5 ledger
pending_v0.6_redestinationauto-reclassification + heuristic fail-soft markshuman_review_required: true+ self budget cap - New CLI:
readiness check·memory search/stats [--disk]·agent reload
Uninstall & Lifecycle — Farewell Archivev0.7
Closes the lifecycle as install ↔ uninstall. "Init/reset/clean" commands are permanently off the table (reinstall = uninstall + farewell + new workspace init).
- User code is untouchable —
<org>/repositories/<repo>/tree never modified/deleted under any flag. Tree not even enumerated - Farewell archive mandatory — uninstall always generates a zip first, no
--no-archiveflag. Format:archive.yaml(schema_version=1) +manifest.tsv(streaming SHA256) +workspace/+orgs/<slug>/{memory,workflows,goals,domain,core,repos}/+credentials/env.template(masked) +REVOKE-CHECKLIST.md+PII-NOTICE.md - 5 data classes (A/A*/B/C/D/E) +
--keep-workspacematrix — class B archived then preserved on disk, sessions moved to_archived/, workspace.yaml deleted to issue a fresh one - WAL-safe SQLite backup (borrowed from Hermes) — v0.6
memory/archive.sqlitecopied consistently viabetter-sqlite3 backup()API even during live writes - Concurrent-uninstall lockfile —
<workspace>/.solosquad/uninstall.lockatomic acquire + stale PID auto-cleanup - Stage progress journal —
uninstall.journal.jsonlappend-only, resumable when cleanup interrupted mid-flight - PM/scheduler PID refusal — prevents jsonl grow during archive walking → SHA mismatch. Entry refused without
--force - Workspace git tree detection — explicit user consent required if
<workspace>/.gitexists - Archive path writable + disk free × 1.5 check
- PII-NOTICE.md auto-attached + opt-in
--scrub-content(regex ruleset: card numbers · emails · phones · SSN — false-negative possibility documented; auto-scrub expansion in v1.x) - logout/uninstall split (borrowed from gh CLI) —
solosquad logoutmasks .env + sessions to_archived/+ createslogout.lock(latersolosquad bot/schedulerefuses entry) - REVOKE-CHECKLIST.md dynamically generated — Discord application ID, Slack workspace ID, estimated ~/.claude/projects paths, pm2/systemctl/crontab inspection commands auto-extracted
- doctor expansion — npm global hook limit warning (run
solosquad uninstallbeforenpm uninstall -g), stale lockfile detection, PM PID check, archive directory free space - CLI:
solosquad uninstall [--dry-run --archive-only --keep-workspace --also-purge-backups --scrub-content --force],solosquad logout [--org <slug> --all --force] - Migration:
0.6.0-to-0.7.0.ts— version bump +workspace.yaml.uninstalldefaults. Almost no schema change (uninstall infra introduction mostly) - Dependency:
archiver ^7.0.1(streaming write — chosen overadm-zipto avoid OOM)
Multi-User Messengerv0.8.0
Workspace extended from single-operator to multi-user context. All message routing flows through command-<handle> / works-<handle> channel pairs guarded by author-guard (anti-spoofing). Details: docs/plan/v0.8-multiuser-messenger.md.
<org>/.solosquad/users/<handle>.yamlper-user metadata — handle / platform / userId / channels / registered_at- Channel auto-bootstrap (
channel-bootstrap.ts) + multi-user broadcast (messenger/broadcast.ts) solosquad messengerCLI (user registration, re-issuance, broadcast toggle)- doctor expansion: user-registration totals, channel-mapping verification
- Migration 0.7→0.8:
workspace.yaml.messengerdefaults + auto-register the single operator (Discord/Slack token/users/@melookup)
Security & Lifecycle Pairv0.8.1
Closes the reverse path of v0.7 archive format + strengthens secret/PII handling. Details: docs/plan/v0.8.1-security-lifecycle-pair.md.
solosquad import <archive.zip>— restore farewell archive into a new workspace (manifest SHA verify + merge strategy)solosquad archive verify <archive.zip>— manifest.tsv integrity + PII-NOTICE scan- SKILL.md frontmatter
requires_secret— required-secret declaration (workflow-maker gate)
Dev Capabilityv0.8.2
Standardizes the "create a PR" pattern via SKILL dev_capability frontmatter. The dev-confirmation flow (30-min timeout) gets user approval before the bot makes git changes. Details: docs/plan/v0.8.2-dev-capability.md.
- SKILL.md
dev_capability: read|propose|patch|pr4-level permissions spawn-assemblervalidates capability, branches layer 8 (target_repo) into read/writedev-confirm.ts30-min timeout — auto-abort on no response + log todev-confirmations.jsonl
Onboarding UX + Observabilityv0.8.3
Last v0.8.x patch covering both first-encounter UX and the debugging experience. Details: docs/plan/v0.8.3-onboarding-ux-observability.md.
- add repo --dry-run / --inspect — preview folder mapping / size / 5 risk scenarios (IDE lock · symlinks · external abs paths · slug collision · active processes) when importing product code. 0 disk changes
- --keep-original — copy instead of move (2× disk usage, original safety net)
- logger expansion —
SOLOSQUAD_LOG_LEVEL·SOLOSQUAD_LOG_FORMAT=json·SOLOSQUAD_LOG_FILE=1→<workspace>/.solosquad/logs/solosquad-YYYY-MM-DD.logrolling 14 days. Existinglogger.info/warn/errorAPI unchanged - solosquad logs CLI — unified view of runtime + costs/spawn/stop-hook/dev-confirm/migration jsonl via
--level/--tail/--follow/--since/--type - log-rotate routine — daily 00:30 deletes files past retention (silent). In v0.8.5 merged into system-housekeeping
- solosquad logout removed — added in v0.7, judged value < complexity. Alternative flow: Ctrl+C to stop bot /
solosquad uninstall --archive-onlyto clean tokens - doctor enhancement — CLI ↔ workspace version mismatch detection + which command (
updatevsmigrate) to run - trajectory ROI measurement — 4 metrics from v0.6 §3.X measured over 30 days, pinned in CHANGELOG
[0.8.3]. On pass, v0.9 enables auto_register - Migration 0.8.2→0.8.3:
workspace.yaml.trajectory.auto_registerkey + log-rotate routine copy
CLI Surface Reductionv0.8.4
Last non-breaking flag cleanup before v1.0 formal launch. docs/api-stability.md §4 pins "Removing a flag is major" → flags become un-removable post-v1.0. This slot consolidates 6 axes: (a) uninstall flags 8→5 (--mode <full|keep|archive-only>), (b) add repo --inspect alias deprecated, (c) import --mode <merge|replace> pattern consistency, (d) agent validate --corpus moved internal, (e) solosquad backup list|delete|purge subgroup added, (f) solosquad init workspace path explicit-confirm prompt. Details: docs/plan/v0.8.4-cli-surface-reduction.md.
Onboarding QA & Release-Gatev0.8.5
Pinned QA results from running fresh init right after v0.8.4. Critical regression: src/cli/init.ts:29's hardcoded SOLOSQUAD_VERSION = "0.4.0" made every new user see a migration warning immediately after init. Side: master-guide had frozen at v0.6.0 — backfilled to v0.8.5, and 4-docs (product-roadmap · architecture · master-guide ko+en) pre-publish gate enforced via prepublishOnly. Wizard prompts each got a 1-line help (handle / name / role / messenger / provider). Details: docs/plan/v0.8.5-onboarding-qa.md.
- Bug fix:
src/util/version.tsreads version dynamically frompackage.json(fresh init no longer triggers spurious migration warning) - 4-docs pre-publish gate:
scripts/check-docs-freshness.ts+npm run docs-check+prepublishOnlyenforce - Wizard text: Step 2 "Initialize" → "Create Workspace", redundant CWD prompt removed, per-prompt help lines, Slack
channels:managewarning emphasized - master-guide §3.12 new section explaining
.solosquad/hierarchy - §4.2.1 wizard prompt table (12 rows × why-asked × constraint × storage location)
- §6.4 routine table: 4 default routines (3 user briefs + 1 infrastructure). 4 analysis routines permanently removed. archive-rotate + log-rotate merged into
system-housekeeping - Migration:
0.8.4-to-0.8.5.ts(version bump only, no schema change)
Removed
- Telegram adapter — unsupported since v0.2.4v0.2.4 removed
- Auto-cleanup of channels not provided — old
daily-brief/signals/experiments/weekly-review/errorschannels need manual archive in messenger UI AGENT_ROUTEShardcode constantv0.5 removed — keyword routing distributed across each SKILL.md'striggers.keywordfrontmatterassets/agents/_teams/directoryv0.6 removed —agents/{team}/KNOWLEDGE.mdco-location, parallel hierarchy abolished. Migration auto-moves user workspaces'.solosquad/agents/_teams/toosolosquad reset·solosquad cleancommandspermanently rejected since v0.7 — install ↔ uninstall covers the lifecycle. Reinstall = uninstall + new workspace initsolosquad logoutv0.8.3 removed — introduced in v0.7 by borrowing from gh CLI but value < complexity. Bot pause via Ctrl+C; token cleanup viasolosquad uninstall --archive-only.logout.lock/logoutLockPathcode also removed- Analysis routines
signal-scan/experiment-check/weekly-review/v06-retrospective-statsv0.8.5 removed — meaningless without user-authored domain prompts. Express domain analysis via workflows / goals archive-rotateandlog-rotateroutinesv0.8.5 merged — unified intosystem-housekeeping(single 00:00 cron, try/catch isolated)
8.2 Planned UpdatesPlanning
v1.0 — Formal Launch
- Stabilization through v0.6 + solo-founder self-use validation complete
- Begin stable API commitments
- Introduce breaking-change policy
- Consider auto-registration gate if v0.6 trajectory auto-extract ROI metrics pass
v1.0.4 — Discord config.yaml auto-create + Slack author-guard cleanupv1.0.4
- Bug G — Real fix for the Discord "No product linked" error. v1.0.3's Bug D only removed the server-name heuristic; the underlying silent
if (!fs.existsSync(configFile)) return;bail remained. SincescaffoldOrgnever writes the<org>/discord/config.yamlfile, every freshsolosquad initworkspace hit that bail. v1.0.4 switches to a load-or-empty + auto-write pattern: on first start the bot creates the file itself using info it already has (ownOrgSlug+ the guild it just connected to). - Bug H — Slack author-guard fully cleaned up. v1.0.2 removed the Discord callsite but left
src/bot/author-guard.tsbehind because Slack still imported it. v1.0.4 finishes the cleanup: the Slack callsite is gone, the file is deleted, and the unit test (test/author-guard.test.ts) is deleted too. - Plan §1.3 pinned — v1.0.3 plan §6's recurring pattern gains a third variant: code that silently bails on a missing record file when the authoritative decider is already in hand is also a trip-wire.
if (!fs.existsSync(x)) return;-style silent bails join the catcher guideline. - Best Practice P (partial) — 5-hop binding diagnostic message. A 9-reference survey of Discord ↔ AI agent integrations (OpenClaw, Claude Code Channels, LangChain, AutoGen, Composio, llmcord, openai/gpt-discord-bot, LibreChat, AnythingLLM) converges on five best practices; we adopted the most pressing one immediately. The generic
"No product linked to this server"message is replaced with a diagnostic that names which of the five binding hops failed (resolved org / config.yaml existence / guild_id presence / guild_id match / loadProducts inclusion). Future regressions are now attributable to a specific hop on the first failure. - Plan §7.2 pins the 9-reference survey results: SoloSquad adopted half of the (b) Runtime-pairing pattern (auto-capture without explicit approve), which is the underlying cause of the four cumulative regressions across v1.0.2 ~ v1.0.4. The remaining best practices (L: pairing-code + approve CLI / M: snowflake branded types / N: full silent-early-return removal / O: token-precedence documentation) are queued for v1.0.5 ~ v1.1.
- 619 tests green (613 baseline + 12 new − 6 deleted). Zero schema changes, zero CLI surface changes.
v1.0.3 — Discord 5-bug fix (migrate · sudo · messenger binding · update next-step · category rename)v1.0.3
- Bug A —
solosquad migratepermanent block lifted. TheversionMatchesslice arithmetic missed exactX.Y.Zwhen the pattern wasX.Y.Z.x, permanently blocking patch-level migration chains (v1.0.0 → v1.0.x). The"No migration found for source version 1.0.0"error is gone. - Bug B —
solosquad updateno longer wrongly suggestssudofor nvm/Homebrew users. Switched from aprocess.getuid()guess to an actualnpm config get prefix+fs.accessSync(W_OK)check. Most modern macOS users (user-owned prefix) no longer get a password prompt. - Bug D — Discord messenger connection failure resolved. Removed the v0.1.x heuristic that required the Discord server name to contain the SoloSquad org slug; the bot already knows its org (
ownOrgSlugfrom v0.8resolveBotIdentity). The "No product linked to this server" error is gone regardless of how you name your Discord server. Boot log now prints[Discord] Bound guild <name> (<id>) → org=<slug>. - Bug E —
solosquad updatesurfaces the next step. After a successful install, checks workspace version lag and printsNext step: solosquad migrate --applyexplicitly. No moredoctorround-trip to discover the missing step. - Bug F — Discord category renamed to
"solosquad". v0.1.x's agent-team-as-product vocab ("AI Team Reports") is replaced for new creations; existing categories with the legacy name are matched and reused (the bot does not force-rename them). - 613 tests green (596 baseline + 17 new). Zero schema changes, zero CLI surface changes.
v1.0.2 — Discord author-guard decoupling + onboarding reorderv1.0.2
- Discord author-guard removed. The
isAuthorizedAuthorgate insrc/messenger/discord-adapter.tscomparedmessage.author.usernameagainst the channel-derived handle — a comparison that universally false-positived whenever a user's Discord username contained any character outside the SoloSquad handle charset[a-z0-9_](e.g.seungw1n.with a trailing dot). The gate is gone; author identity is logged for audit but never gated. Discord channel ACL is now the sole permission boundary. - Handle = SoloSquad's sole canonical user identifier. Discord's
message.author.usernameis no longer a comparison axis — it's raw input, recorded in audit logs only. - Onboarding wizard reordered — handle prompt moved from
Step 5.2(four steps after the messenger token) toStep 3.5(immediately after the token). The yaml write itself defers to Step 6 (silent, after the org dir exists). - Handle-selection guidance added — the prompt now suggests picking a handle that's unique among other messenger members' usernames or display names, to avoid chat confusion.
- Slack equivalent fix is v1.0.3 — a separate post-v1.0 release. v1.0.2 keeps
src/bot/author-guard.tsin place because the Slack adapter still imports it; v1.0.3 will delete both the Slack callsite and the file. - 596 tests green (588 baseline + 8 new). Zero schema changes, zero CLI surface changes.
v1.0.1 — Discord deprecation + multi-repo routingv1.0.1
- Switch discord.js
readylistener toEvents.ClientReady. v14.26 deprecated thereadyalias (renamed to disambiguate from the gateway READY opcode) and will remove it in v15. Removes the NodeDeprecationWarningprinted on every bot start and pre-empts a silent failure (handler never firing) at the v15 cutover. - Drop the repo
roleprompt fromsolosquad init/solosquad add repo. New registrations default torole = "main"silently.--roleflag stays as a power-user override with a deprecation warning. Rationale: the field had exactly one load-bearing consumer (scheduler default cwd) and zero involvement in user-message routing — values like "frontend / backend / data / infra / docs" were never consumed by any router. - Add
@<slug>mention routing — a bot pre-processor scans user messages for@<slug>tokens, intersects them with the org's registered repos, and injects a stable[target_repo:<slug>](or[target_repos:a,b]) marker for the PM. Discord user pings (<@123456789>) and typos are silently dropped — zero false positives. Zero LLM calls at routing time (mirrors GitHub's Slack@<repo>and Nxnx run <project>:<target>patterns). - Add §"Multi-Repo Intent" to PM
SKILL.md— honor the marker first, auto-route when only one repo exists, ask one short clarifying question when ambiguous. Silent guessing is forbidden. - 588 tests green (573 baseline + 15 new). Zero schema changes, zero CLI surface removals — full api-stability policy compliance.
v1.1 — Multi-Agent Team Architecturev1.1
- 5-layer hierarchy (Hermes V2): L1 Gateway (v1.2) → L2 Orchestrator (Chief session, formerly PM) → L3 Team (
team/{team}/{KNOWLEDGE,OKR}.md) → L4 Agent (4 main bots) → L5 Specialist (20 + skills/) - Directory re-architecture (2026-05-27):
assets/dropped → 5 root dirs.agents/main(4) +agents/specialists/{team}(20) +skills/(cross-agent tools) +user/(founder info) +team/{team}/{KNOWLEDGE,OKR}.md(team knowledge+OKR) +schedules/(former routines) - Chief = orchestrator + domain expert (dual role):
<org>/agents/main/chief/SKILL.md— lives in organization layer, customized per-org as domain expert. Former PM session promoted - 4 main + 20 specialists (2-tier): chief · designer · engineer · marketer + per-team specialists. 5 specialist merges — backend-engineer · data-engineer · idea-scoper · researcher · content-marketer
- Chief = Supervisor 6 stages: TRIAGE → DECOMPOSE → DISPATCH → AWAIT → SYNTHESIZE → DECIDE (LangGraph + AutoGen consensus pattern)
- Educational Nudge (Triage stage 0): vague input → present KNOWLEDGE.md slice first, confirm before proceeding
- Dependency Injection (8-layer JIT Layer 6.5): stage domain keyword match → auto-inject signals.jsonl. New Layer 4a (Team OKR)
- Experiment infrastructure:
<org>/experiments/<id>/manifest.yaml+ Amplitude 4-pattern + significance check - SKILL frontmatter v1 → v2: 4 new fields —
bot_name/tier/domain_tags/routing_keywords - routine → schedule vocabulary unification:
assets/routines/→schedules/, CLIrun-routine→run-schedule(alias for 6 months) - Board of Agents tone: Chief = "Board Chair", user = "founder", specialists = "board members"
- Details:
docs/prd/v1.1-multi-agent-team-architecture.md(includes §21 Amendment)
v1.2 — Messenger Connection (Discord-first)v1.2
- L1 Gateway split: adds messenger surface on top of v1.1's L2~L5
- Bot Identity Registry (
<org>/.solosquad/bots.json) + 9-hop diagnostic + Echo guard - Forum Channel + Thread budget: 1 goal cycle = 1 forum post
- Mention routing extension: add
@<bot>on top of v1.0.1@<slug>(e.g.@eng how do I write this) - Absorbs v1.0.4 G+H+P + un-applied L+M+N+O best practices. Slack parity fix in v1.2.x patch
- Details:
docs/prd/v1.2-messenger-connection-discord-first.md
v1.x — Cascade-shifted slotsv1.x
- Former v1.1 → v1.x Dashboard Interaction — web dashboard itself developed in a separate repo (
solopreneur-dashboard/solopreneur-api). This repo provides only the interaction client / inbox - Former v1.2 → v1.x Knowledge & Tacit-Knowledge Ontology — MCP external connections (Notion / Obsidian / external APIs / cross-agent)
- Cascade rationale: at the solo-founder dogfooding stage, the leading indicator (24/7 autonomous team) outweighs dashboard / ontology priority. Details:
docs/prd/product-roadmap.md§6 2026-05-24 entry
Reference docs
docs/plan/v0.3-pm-mode-orchestration.mddocs/plan/v0.4-autonomous-engine.mddocs/plan/v0.5-workflow-maker.mddocs/plan/v0.6-default-workflow-tuning.mddocs/plan/v0.7-uninstall-lifecycle.mddocs/plan/v0.8-multiuser-messenger.mddocs/plan/v0.8.1-security-lifecycle-pair.mddocs/plan/v0.8.2-dev-capability.mddocs/plan/v0.8.3-onboarding-ux-observability.mddocs/plan/v0.8.4-cli-surface-reduction.mddocs/plan/v0.8.5-onboarding-qa.mddocs/prd/v1.1-multi-agent-team-architecture.md— new v1.1. Multi-Agent Team Architecturedocs/prd/v1.2-messenger-connection-discord-first.md— new v1.2. Messenger Connection (L1 Gateway)docs/prd/v1.x-dashboard-interaction.md— former v1.1 cascade-shifteddocs/prd/v1.x-knowledge-ontology.md— former v1.2 cascade-shifteddocs/prd/product-roadmap.md— full decision logdocs/reference/AI_Agent_Harness_Report.md— design vocabulary sourcedocs/trend-record/2026-05-11-baseline-survey.md— peer-project comparison
9.Operations Guide
9.1 Choose a 24/7 Operating Mode
The bot needs solosquad bot running continuously to maintain its messenger connection. Comparison:
| Mode | Target | Difficulty | Cost | PC power |
|---|---|---|---|---|
| A. Local desktop | A PC kept always on (Mac Mini, etc.) | Low | Electricity only | Must stay on |
| B. Cloud VPS | No home server, fully 24/7 | Medium | $4-6+/month | PC can be off |
A-1. Keep terminal open (simplest)
solosquad bot
Runs only while the terminal is open. Stops on Ctrl+C or window close. PC sleep breaks the connection.
macOS sleep prevention (especially useful on Mac Mini):
caffeinate -dims
Or System Settings → Energy Saver → "Prevent display sleep" + disable Power Nap.
Windows sleep prevention: Settings → System → Power → "Never go to sleep."
For the scheduler in parallel, separate terminal:
solosquad schedule
A-2. Docker Compose (background + auto-restart, recommended)
Prerequisite: Docker Desktop installed (https://docs.docker.com/desktop/). Works on macOS Apple Silicon / Intel. Verify solosquad init copied Dockerfile and docker-compose.yml to the workspace.
cd ~/solosquad-workspace
docker compose up -d --build # initial build + background start
docker compose logs -f bot # bot logs
docker compose logs -f scheduler # scheduler logs
docker compose ps # service status
docker compose restart # restart
docker compose down # stop
Sharing Claude Code authentication: the in-container claude CLI also needs auth. docker-compose.yml mounts host's ${HOME}/.claude to container's /root/.claude → host login session is shared.
claude loginon hostdocker compose up -d --build- In-container
claudereads host credentials, operates under the same account
For a different path, set in .env:
CLAUDE_AUTH_DIR=/Users/youruser/.claude
After PC reboot: with Docker Desktop set to auto-start (Docker Desktop settings → "Start Docker Desktop when you log in"), containers auto-recover via restart: unless-stopped.
${HOME}/.claude volume mount is macOS/Linux. On Windows Docker, set CLAUDE_AUTH_DIR to an absolute path like C:/Users/yourname/.claude, or use A-1 / A-3.
A-3. macOS launchd / Windows NSSM (service-ify)
For native process auto-start on login without Docker.
macOS — launchd. Create ~/Library/LaunchAgents/com.solosquad.bot.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>com.solosquad.bot</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/solosquad</string>
<string>bot</string>
</array>
<key>WorkingDirectory</key><string>/Users/YOURNAME/solosquad-workspace</string>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
<key>StandardOutPath</key><string>/tmp/solosquad-bot.log</string>
<key>StandardErrorPath</key><string>/tmp/solosquad-bot.err</string>
</dict>
</plist>
Verify the path (/usr/local/bin/solosquad) with which solosquad. Register / start:
launchctl load ~/Library/LaunchAgents/com.solosquad.bot.plist
launchctl start com.solosquad.bot
tail -f /tmp/solosquad-bot.log
Add com.solosquad.scheduler.plist similarly for the scheduler.
Windows — NSSM:
- Download NSSM from https://nssm.cc → add
nssm.exeto PATH - Admin PowerShell:
nssm install SolosquadBot "C:\Users\YOU\AppData\Roaming\npm\solosquad.cmd" bot nssm set SolosquadBot AppDirectory "C:\Users\YOU\solosquad-workspace" nssm start SolosquadBot
B. Cloud VPS (advanced)
When you have no plan to keep a home server on, or "bot must live even when PC is off."
Worth considering when:
- No 24/7 PC at home
- Traveling / laptop-only lifestyle
- Multiple team members co-operate the bot
- Stability ties directly to business (auto-alert / routine failures cause losses)
| Provider | Monthly | Notes |
|---|---|---|
| Hetzner | ~$4 | EU-based, best price/perf |
| Vultr | $5 | Seoul region available |
| Linode | $5 | Stable |
| DigitalOcean | $6 | Rich community resources |
| Railway (PaaS) | $5+ | GitHub integration auto-deploy, no server management |
| Fly.io (Docker PaaS) | $5+ | Tokyo region, global deploy |
| AWS ECS Fargate | $10-15 | Enterprise-grade |
Quick summary (VPS + systemd):
# SSH into VPS
sudo apt update && sudo apt install -y nodejs npm git
npm install -g @anthropic-ai/claude-code solosquad
mkdir ~/solosquad && cd ~/solosquad
solosquad init
claude login
# Register systemd service — see docs/cloud-deployment.md
docs/cloud-deployment.md covers VPS initial setup, Node.js install, global solosquad install, systemd service registration, log management, updates, backups.
9.2 Multi-Workspace (persona separation)
When you want day-job / side-project persona separation, run multiple Discord workspaces. (Slack adapter still works for legacy separation but is outside the v1.0 SemVer promise.)
~/solopreneur/ # Discord bot, day-job persona
~/personal-lab/ # Discord bot, side persona
Each gets independent .env / tokens / bot accounts. Operate in parallel without interference. This constraint exists from v0.2.0+ — v0.1.x's MESSENGER=discord,slack (multi-target) is no longer supported. v1.0 ships only the Discord adapter under the SemVer promise; the Slack adapter remains in code but is a post-v1.0 slot.
Updating: CLI update is one-shot but migration runs per workspace (see §4.4).
9.3 Multi-Product Operation (organizations & repos)
A workspace can hold multiple organizations (= product/business). Each has fully isolated memory / workflows / messenger channels.
Add organization
solosquad add org <name> # interactive (asks for provider/remote_url)
solosquad add org my-side --provider github --remote-url https://github.com/my-side
Creates <workspace>/<name>/ folder + .org.yaml + memory/ (routine-logs/ + 4 JSONL schemas) + workflows/ + repositories/ + messenger folder automatically.
Add repository
URL → clone, path → register (move if needed).
solosquad add repo https://github.com/foo/bar.git # clone + register
solosquad add repo ./existing-local-repo # move (after confirm) + register
solosquad add repo https://github.com/foo/bar.git --org tesla --role frontend
solosquad add repo <url|path> --slug my-custom-slug # folder name override
Org auto-decision order:
--org <slug>explicit → use immediately- Workspace has exactly one org → auto-pick (don't ask)
- Current cwd is inside a specific org folder → auto-use that org
- Multiple orgs + above all fail → interactive prompt
Auto-extraction:
remote_url— read from git remote, recorded inrepo.yamllanguage— detected frompackage.json(TypeScript auto-detected) /pyproject.toml/go.mod/Cargo.tomlroledefault —mainif.gitexists, elseunknown
Bulk sync
If repos are already cloned in repositories/, register them all at once:
solosquad sync # scan all orgs
solosquad sync --org tesla # specific org
solosquad sync --dry-run # preview (writes nothing)
Behavior:
- Folders under
<org>/repositories/<folder>with.gitbut norepo.yaml→ auto-register - Already-registered repos → skipped with
=marker - Folders without
.git→?warning, skipped .org.yaml.products[].reposupdated to actually-existing repos- Repos listed in
.org.yamlbut no longer existing →-red warning
Cross-repo workflow (v0.2.1+)
The v0.2.1 runtime, when a stage in _status.yaml has a target_repo field, uses that repo as cwd when executing the stage. Workflows spanning multiple repos can be coordinated as one workflow:
# <org>/workflows/model-y-refresh/_status.yaml
stages:
- id: stage-1-vision
target_repo: autopilot-vision # Claude uses this repo as cwd
status: in_progress
depends_on: []
- id: stage-2-planner
target_repo: autopilot-planner # different repo
status: pending
depends_on: [stage-1-vision]
Active stage decision:
- A stage with
status: in_progress→ that one - Otherwise, the first
status: pendingwhosedepends_onare all completed - If neither, fall back to role=main repo → org root
Stage transitions (pending → in_progress → completed) are automated by v0.3 PM mode — PM marks in_progress before spawning a specialist, merges the Task tool response, then advances to completed.
9.4 Security Checklist
This system has AI executing code and commands. Confirm the following:
.envis in.gitignore- Rotate bot tokens periodically (90 days recommended)
- Always review AI output before deploying to production
- Keep messenger bot permissions minimal — don't grant beyond §5's scope list
- Run
solosquad doctorperiodically - Cloud ops: SSH key auth only, firewall outbound-only
- v0.8.1+: run
solosquad archive verifyonce before externally storing an archive (PII-NOTICE scan + manifest SHA verify) - v0.8 multi-user: when adding another user, explain bot multiplicity — each user only responds in their own channel pair (
command-<handle>/works-<handle>) per author-guard
Details: docs/plan/v0.2-safety-security.md, docs/plan/v0.8.1-security-lifecycle-pair.md
9.5 Periodic Backup + Observabilityv0.8.3
Backup + log observability flow during operation.
- Periodic backup: monthly recommended.
solosquad uninstall --mode archive-onlycreates just the farewell archive zip (workspace stays). Archive integrity ensured via manifest.tsv SHA.solosquad archive verifyrecommended before external storage. Migration backups (~/.solosquad-backups/) listed viasolosquad backup list; old backups cleaned viasolosquad backup purge --keep-recent 3 - gh CLI authentication: for dev_capability (
patch/pr) to create PRs,gh auth loginmust be complete on the host.solosquad doctoronly checksghexistence — token validity is verified separately viagh auth status - Log location + retention: with
SOLOSQUAD_LOG_FILE=1enabled, daily rolling at<workspace>/.solosquad/logs/solosquad-YYYY-MM-DD.log. Retained 14 days (daily 00:00 system-housekeeping).SOLOSQUAD_LOG_FORMAT=jsonfor structured output - solosquad logs command: tail/follow/filter 4 operational jsonl (agent-costs / spawn-decisions / stop-hook-events / dev-confirmations / migration-costs) in one place
- CLI ↔ workspace mismatch:
solosquad doctorexplicitly indicates whethermigrateorupdateis needed
10.Troubleshooting & FAQ
10.1 Install / Run Issues
"solosquad: command not found"
- Verify install:
npm install -g solosquad - Verify Node.js 18+:
node --version - On Linux permission errors:
sudo npm install -g solosquador set up~/.npm-global
"claude: command not found"
npm install -g @anthropic-ai/claude-code
claude login
solosquad doctor # final check
Bot doesn't respond on messenger
First check for environment mismatch:
solosquad doctor # base diagnosis
solosquad doctor --messenger-check # live API token verification
If you see .env vs process.env mismatch, update to latest solosquad (the .env-load bug was fixed in v0.1.3).
Slack checklist (re-verify §5.1 Step 9):
- Event Subscriptions enabled +
message.channelssubscribed - After scope changes, performed Reinstall to Workspace
- Bot invited to
#owner-command
Discord checklist (final list in §5.2):
- Message Content Intent ON
- Bot has Create Public Threads permission (v0.2.4+, for system thread creation)
- Server name contains product slug
Existing Telegram users: removed in v0.2.4. Change MESSENGER=telegram to discord or slack in .solosquad/.env and complete fresh setup (see §4.4).
Routines don't run
- Verify
solosquad scheduleis running (psordocker compose ps) - Manual test:
solosquad run-routine morning-brief
Docker: claude: command not found inside container
- Verify
CLAUDE_AUTH_DIRvolume mount - Auth directly inside container:
docker exec -it solosquad-bot claude login
Strange behavior after update
solosquad doctor
solosquad update # if already latest, only announces
docker compose up -d --build # if Docker, rebuild image
git push authentication failed (when using agent dev_capability)
If the agent committed but failed at push with fatal: Authentication failed or Permission denied (publickey):
cd <repo>
git push --dry-run # reproduce the same error directly
- Windows: Git for Windows installer auto-enables Git Credential Manager. Reinstall (
winget install Git.Git), then verify first push opens browser OAuth - macOS: Set
git config --global credential.helper osxkeychain, then first push prompts for GitHub PAT → permanently stored in Keychain - Linux: Set up SSH key (
ssh-keygen+ register public key in GitHub) or PAT +credential.helper storemanually
Authentication itself is outside SoloSquad's scope. For detailed procedures, see the GitHub official docs.
10.2 Migration Troubleshooting
"Cannot find package.json" type errors
npm cache clean --force
npm uninstall -g solosquad
npm install -g solosquad@latest
Migration aborted
solosquad migrate --rollback # restore most recent backup
Then report to GitHub Issues with logs.
Bot doesn't start after migration
solosquad doctor
Check output. Missing tokens / wrong .env location are common causes.
Claude Code auth lost
claude login
docker compose restart # if Docker
Not sure which version to upgrade to
Check release notes first:
- GitHub Releases: https://github.com/Adelie-Squad/solosquad/releases
docs/product-roadmap.md
For minor updates containing breaking changes in important projects, observing for about a week before upgrading is reasonable.
10.3 FAQ
Q. How much does it cost?
A. Any Claude Code-capable subscription works (Max recommended). As of v0.9, SoloSquad uses *Claude Code via OAuth* as its single backend. Cloud ops add ~$4-6/month for VPS.
Q. Is Slack supported in v1.0?
A. The v1.0 officially supported messenger is Discord. The Slack adapter ships in the codebase and continues to work for v0.9.x users, but it is not covered by the v1.0 SemVer promise (post-v1.0 slot). New users should start with Discord. For persona separation, run two Discord workspaces: ~/solopreneur/ + ~/elon-24-7/, each with independent .env / tokens / bot accounts. This constraint exists since v0.2.0+ — the older MESSENGER=discord,slack multi-target syntax is not supported.
Q. What if my timezone isn't Korea?
A. Change TZ= in .env (e.g. TZ=America/Los_Angeles). Same in Docker.
Q. What if the AI gives a wrong answer?
A. AI is a tool. Always verify important decisions yourself. solosquad rollback --workflow <id> (v0.3+) can revert spawn results. v0.4 autonomous execution auto-protects via per-cycle git-snapshot keep/discard.
Q. Can I run it on a Raspberry Pi instead of Mac Mini?
A. Possible if Node.js 18+ runs. But verify whether Claude Code CLI officially supports arm64 Linux first.
Q. Can I use it fully offline?
A. No. Claude API and Slack/Discord server communication are required.
Q. Anything I must do before updating?
A. If solosquad bot / schedule is running, stop it first. docker compose down or Ctrl+C in terminal.
Q. Do I have to update every time?
A. No. If you're using it stably, there's no rush. But security hotfixes (e.g. v0.1.3 dotenv miss) should be applied quickly.
Q. Can I automate updates?
A. With Docker, scheduling docker compose up -d --build in cron will refresh the image. But automation isn't possible when migration is required — human confirmation is the principle.
Q. I want to pin an older version.
A. Install explicitly: npm install -g solosquad@0.1.5. Decline solosquad update's upgrade prompts.
Q. Multiple people use one machine.
A. Use different OS accounts. Each account's home directory holds an independent workspace. Run migration per account.
Q. Are there beta / dev channels?
A. solosquad update --channel dev switches to beta (no stability guarantee). --channel stable is default.
Q. How do I upgrade from v0.5 to v0.6?
A. npm install -g solosquad@latest, then from workspace root run solosquad migrate --dry-run → review report (<org>/memory/migration-2026-XX-dryrun.md) → if OK, solosquad migrate --apply --confirm. The --confirm flag is required (mistake prevention). After migration, solosquad agent validate --all auto-runs and reports failures to STDOUT.
Q. Migration reported "human_review_required" items — now what?
A. Some v0.5 ledger assets use heuristic re-placement that can't be 100% accurate — e.g. "org flavor" extraction from a SKILL body with 0 matches. These items are marked human_review_required: true and refused for auto-application. Review the report, manually augment the relevant agent section in <org>/agent-profile.yaml, then re-run migration. Originals are never touched (non-destructive principle).
Q. (v0.6) Auto-reload feels too aggressive — I want to trigger it manually.
A. Set workspace.yaml.fs_watch.mode: manual to disable auto-reload. After SKILL changes, call solosquad agent reload explicitly. fs_watch.mode: prompt (default) is an intermediate mode where the PM asks in messenger whether to apply.
Q. (v0.8.3) What's the difference between solosquad update and solosquad migrate?
A. update refreshes the CLI binary (npm package). migrate converts the workspace schema / layout to match the new CLI. Typical flow: ① solosquad doctor to check CLI ↔ workspace mismatch → ② npm install -g solosquad@latest or solosquad update to refresh CLI → ③ solosquad migrate --dry-run preview → ④ solosquad migrate --apply. doctor explicitly tells you which command is needed (v0.8.3 §7.3).
Q. (v0.8.3) How do I bring existing product code into a SoloSquad workspace?
A. ① cd ~/projects/my-saas && git status to clean untracked + git push for safety → ② mkdir ~/solosquad && cd ~/solosquad && solosquad init → ③ solosquad add repo ~/projects/my-saas --dry-run to pre-check folder mapping / size / 5 risks (IDE lock · symlinks · external abs paths · slug collision · active processes) → ④ solosquad add repo ~/projects/my-saas to actually move (or --keep-original to copy). Your original files remain byte-identical (v0.7 class A rule). The only thing SoloSquad adds is one <repo>/.solosquad/repo.yaml.
Q. (v0.8.3) After moving an existing repo, IDE paths broke.
A. If IDE configs like .vscode/settings.json / .idea/workspace.xml contain absolute paths, SoloSquad doesn't modify user files — you have to update them manually. The dry-run output flags IDE files with absolute-path settings. Same for cron jobs / aliases / CI runner paths — external systems pointing at old paths must be updated by the user.
Q. (v0.8.3) I want to see what the bot is doing — where are the logs?
A. Set SOLOSQUAD_LOG_FILE=1 for daily rolling at <workspace>/.solosquad/logs/solosquad-YYYY-MM-DD.log. Tail in real-time with solosquad logs --tail 200 --follow. Directly query 4 operational jsonl with --type costs/spawn/stop-hook/dev-confirm/migration. 14-day retention (system-housekeeping at 00:00 auto-cleans).
Q. (v0.8.3) Where did solosquad logout go?
A. Added in v0.7, removed in v0.8.3. Judged value < complexity. Replacement flow: pause bot via Ctrl+C to kill the process (restart with solosquad bot); .env secret masking / REVOKE checklist is provided by solosquad uninstall --archive-only; sessions preservation via direct file move under <org>/.solosquad/sessions/ or solosquad pm reset --user <id>. Existing logout.lock files are inert as of v0.8.3 and can be deleted manually.
Q. (v0.8.3) When does trajectory auto-registration activate?
A. When all 4 ROI metrics defined in v0.6 pass (① 30-day suggestions ≥ 5 ② adoption rate ≥ 60% ③ adopted SKILLs' 30-day usage rate ≥ average ④ reject cooldown < 30%), workspace.yaml.trajectory.auto_register: true becomes default in v0.9. If any one fails, "suggestion-only forever" is locked. The v0.8.3 patch only pins the measured values in CHANGELOG; auto-registration code lands in v0.9.
10.4 Uninstall · Reinstall · Migration Workaroundv0.8.5
Safe uninstall sequence
Because npm v7+ does not invoke the preuninstall hook on global packages (npm/cli#3042), you must follow the order yourself for the farewell archive and REVOKE-CHECKLIST to be generated.
- Stop bot · scheduler (required) — if still running, the archive snapshot SHA will mismatch.
# macOS / Linux docker compose down # if using Docker # or Ctrl+C in bot/scheduler terminals # Windows (PowerShell) docker compose down # or Ctrl+C in terminals # or force-stop by PID: Stop-Process -Id <pid1>,<pid2> -Forcesolosquad doctor's "solosquad bot/schedule processes alive (pid ...)" warning shows remaining PIDs. Thesolosquad uninstallprecheck also refuses entry without--forcewhen live PIDs are detected.v0.9.2 hotfix — On Windows with v0.9.1 or earlier, the precheck blocked uninstall with phantom PIDs even when no bot was running (the WMI query self-matched its own powershell.exe process). The workaround was--force; v0.9.2 adds a$_.Name -eq 'node.exe'guard so the precheck behaves correctly. SeeCHANGELOG.md§[0.9.2]. - Preview with uninstall dry-run
solosquad uninstall --dry-run # Output: archive zip path, what gets archived / deleted / preserved, # REVOKE targets (Discord/Slack/Anthropic tokens), disk free space - Execute uninstall — 3 modes
User code atsolosquad uninstall # default --mode full (complete cleanup) solosquad uninstall --mode keep # preserve workflows/memory/knowledge (for reinstall) solosquad uninstall --mode archive-only # archive zip only, skip cleanuprepositories/<repo>/is never modified or deleted under any mode/flag (v0.7 class A inviolability). - Store archive zip safely —
~/solosquad-archive-<workspace>-<ts>.zipauto-created. Recommended: copy to external disk / cloud drive. Verify:solosquad archive verify ~/solosquad-archive-...zip # manifest.tsv SHA256 + PII-NOTICE scan - Clean up external resources — REVOKE-CHECKLIST.md — copy in both workspace root and archive zip. Guides you through:
- Discord Application ID — delete bot or reset token in Developer Portal
- Slack workspace ID — remove bot or revoke OAuth in App management
- Anthropic Claude — estimated
~/.claude/projects/<path-hash>/path (manual cleanup at user discretion) - pm2 / systemctl / crontab — if external automation is registered, unregister commands auto-extracted
- Remove npm package (optional)
Skip this if reinstalling —npm uninstall -g solosquadnpm install -g solosquad@latestoverwrites.
uninstall + reinstall to bypass migration
When you want to start the workspace fresh, or skip a large migration chain:
# 1. Uninstall via safe sequence (can use --mode archive-only to only create a data backup zip)
solosquad uninstall --mode archive-only
# 2. Update CLI (skip if already latest)
npm install -g solosquad@latest
# 3. New workspace init (v0.8.5 wizard — workspace.yaml.version is 0.8.5 from start)
mkdir new-workspace
cd new-workspace
solosquad init
# 4. (Optional) Import previous data — restore workflows/memory/knowledge
solosquad import ~/solosquad-archive-<old>-<ts>.zip --mode merge
# or --mode replace (workspace must be empty)
This is the shortcut path that skips the migration chain in one go. Instead of running 9 migrations from v0.4 → v0.8.5, archive → re-init → import jumps straight to the new format. Caveat: archive zip uses v0.7 format, so some pre-v0.6 raw assets are preserved but may not be re-placed into v0.8 multi-user structure (user verification needed).
Getting to 0 doctor warnings after fresh install
Right after a new init, solosquad doctor warnings split into *always-shown info* vs *action-required*:
| Warning | Category | Action |
|---|---|---|
△ PowerShell 7+ (Windows only) | Recommended | winget install Microsoft.PowerShell — works on 5.1 too, but 7+ has better UTF-8 / Get-CimInstance stability |
△ gh CLI not found | Required only for dev_capability | Install from https://cli.github.com/ + gh auth login |
△ Docker (optional) | Optional | Recommended for 24/7 ops. Terminal-only solosquad bot also works without it |
△ npm v7+ has no global uninstall hook | Always shown (informational) | Ignore. Purpose is to guide ordering at uninstall time |
△ CLI vX.Y.Z > workspace vA.B.C | Action required | solosquad migrate --apply (v0.8.5 fresh init doesn't trigger this) |
△ solosquad bot/schedule processes alive (pid ...) | Shown when bot is running | Only needs stopping right before uninstall. Normal signal during regular operation |
△ stale uninstall.lock | Previous uninstall ended abnormally | Manual delete: rm <workspace>/.solosquad/uninstall.lock |
solosquad uninstall writes the manifest with streaming SHA256 over the jsonl files. If the bot is appending jsonl concurrently, the manifest SHA will mismatch → archive verification fails. --force bypasses, but you lose archive integrity.
10.5 Bot · Scheduler · Agent git Operationsv0.8.2~v0.8.6
Scheduler does not auto-start
SoloSquad has no daemon / background auto-start. solosquad init does not register cron, and there is no OS-boot auto-start. You must explicitly start with:
solosquad bot # messenger bot (Socket Mode + fs.watch)
solosquad schedule # cron routine runner (morning/evening brief, system-housekeeping)
These two are separate processes. For both to run 24/7, use two terminals or two Docker compose services. solosquad doctor's △ solosquad bot/schedule processes alive (pid ...) warning shows whenever *either one* is alive — on Windows it uses Get-CimInstance Win32_Process to find node.exe processes whose commandLine matches solosquad + (bot|schedule|run-routine).
Agent dev_capability — *up to git push* (v0.8.6 current scope)
With v0.8.2's dev_capability, agents — through messenger conversation alone — *write code → commit → push*. PR creation, review, discussion, and merge happen in the GitHub web UI by the user. v0.8.6 scope statement:
| Step | Owner | v0.8.6 support |
|---|---|---|
| Code authoring · analysis | spawned agent | ✓ |
git checkout -b <branch> | agent | ✓ |
git add / commit | agent | ✓ |
git push origin <branch> | agent (dev-confirm gate) | ✓ 30-min timeout |
| "compare URL" reply (PR creation guidance) | agent posts to messenger | ✓ |
| PR creation | user in GitHub web UI | — (user responsibility) |
| PR review · comments | user in GitHub web UI | — (user responsibility) |
| Merge | user in GitHub web UI | — (user responsibility) |
Prerequisites — all *user pre-setup* (not automated by SoloSquad)
- git installed + push auth working — §4.2 Step 1 prerequisites are enough. Windows/macOS handle this automatically on first push. Linux may need SSH key or PAT setup separately (git/GitHub docs). Verify:
cd <workspace>/<org>/repositories/<repo> git push --dry-run # "Everything up-to-date" or "To <url>..." → ✓ pass # "Authentication failed" → see troubleshooting §10.1 - Register repo
solosquad add repo https://github.com/me/my-saas.git --org my-saas - Enable workspace.yaml dev_capability
# <workspace>/.solosquad/workspace.yaml dev_capability: enabled: true # master toggle (default true) require_push_confirmation: true # user confirmation on git push (permanently true, immutable) bash_denylist: # workspace-strict blocked commands (optional) - "rm -rf /" - "shutdown"
Agent push flow
User (command-<handle>): "Integrate Stripe payment module"
↓
PM classifies intent → spawn Backend Developer SKILL (dev_capability: true)
↓
BD enters repo cwd → analyzes code → adds src/payments/ → writes tests
↓
git checkout -b feat/stripe-payment
git add src/payments/
git commit -m "feat: Stripe payment integration"
↓
🛑 [dev-confirm gate] PM notifies user via messenger:
"git push origin feat/stripe-payment? (30-min timeout) [y/N]"
↓
User "y" → push executed
↓
BD's final reply (works-<handle>):
"✓ Branch pushed.
Open this URL to create the PR:
https://github.com/me/my-saas/compare/main...feat/stripe-payment"
↓
[From here, user responsibility]
User clicks URL → GitHub web UI to create PR → review code → merge
git push is pinned in SENSITIVE_BASH_PREFIXES and must pass a 30-min dev-confirmation gate (src/bot/dev-confirm.ts). If user doesn't respond within timeout, push auto-aborts + logged to <org>/memory/dev-confirmations.jsonl.
Onboarding additions (for dev_capability users)
Beyond the §4.2 9-step, additional setup for dev_capability users — *gh CLI install unnecessary in v0.8.6 scope*:
- Step 1.5 — verify git push auth (optional, only if failing)
git push --dry-run # in any of your own repos # If failing: see troubleshooting §10.1 - Step 7.5 (right after doctor) — register repo + verify push
solosquad add repo <url> --org <org> cd <workspace>/<org>/repositories/<repo> git push --dry-run # confirm auth works inside the workspace too - Step 7.7 — set workspace.yaml dev_capability explicitly
dev_capability: enabled: true require_push_confirmation: true # immutable, pinned bash_denylist: [] - Step 8.5 (right after starting bot) — messenger first dry test
In command-<handle> channel: "Fix one typo in <repo-name>'s README and push it" → Small change verifies the full flow (spawn → diff → commit → dev-confirm → push → compare URL) - (Optional) Step 8.7 — branch protection rules — In GitHub repo settings, enable
Require pull request before merging+Require approvals: 1on the main branch. Forces explicit user approval for PR merges as a safety net.
- gh CLI track —
gh pr create/gh pr review/gh pr mergecalled via bash. dev-confirm gate already matchesgh pr merge. Requiresgh auth loginone-time + workflow definition withauto_pr: true - MCP track — Anthropic's official
@modelcontextprotocol/server-githubconnected via Claude Code MCP config. PR lifecycle via native tool calls. Structured I/O is advantageous for multi-agent discussion - Multi-agent PR discussion — workflow.yaml schema v2's
reviewerssection auto-spawns reviewers (QA · Security · BusinessStrategist) + PM aggregation.discussion_roundscap +auto_merge: falsepermanently pinned
docs/plan/v0.8.6-migrate-hotfix-pr-workflow.md §3, docs/plan/v1.x-workflow-goal-routine-evolution.md (PR workflow §additions slot)