squads-cli 0.4.0 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -761,6 +761,86 @@ your-project/
761
761
  └── CLAUDE.md # Project instructions
762
762
  ```
763
763
 
764
+ ## Analytics
765
+
766
+ Track token usage, costs, and API calls across your squads.
767
+
768
+ ### Setup
769
+
770
+ 1. **Configure your Claude plan:**
771
+ ```bash
772
+ export SQUADS_PLAN_TYPE=max # $200/mo flat rate
773
+ # or
774
+ export SQUADS_PLAN_TYPE=usage # pay-per-token
775
+ ```
776
+
777
+ 2. **Connect to telemetry (optional):**
778
+ ```bash
779
+ # Self-hosted via Docker
780
+ cd docker && docker-compose up -d
781
+
782
+ # Or configure external services
783
+ export LANGFUSE_HOST=https://your-langfuse.com
784
+ export LANGFUSE_PUBLIC_KEY=pk-...
785
+ export LANGFUSE_SECRET_KEY=sk-...
786
+ ```
787
+
788
+ 3. **View in dashboard:**
789
+ ```bash
790
+ squads dash
791
+ ```
792
+
793
+ ### Metrics Tracked
794
+
795
+ - Token usage (input/output/cache)
796
+ - API costs per squad/agent
797
+ - Rate limit status
798
+ - Generation counts
799
+
800
+ ## Infrastructure
801
+
802
+ Optional services that enhance squad capabilities.
803
+
804
+ ### Services
805
+
806
+ | Service | Purpose |
807
+ |---------|---------|
808
+ | postgres | Session storage, trigger conditions |
809
+ | redis | Caching, rate limiting |
810
+ | otel | OpenTelemetry metrics pipeline |
811
+ | langfuse | Telemetry dashboard |
812
+ | bridge | Conversation capture API |
813
+
814
+ ### Self-Hosted Setup
815
+
816
+ ```bash
817
+ # Clone the infrastructure
818
+ git clone https://github.com/agents-squads/squads-infra
819
+ cd squads-infra
820
+
821
+ # Start services
822
+ docker-compose up -d
823
+
824
+ # Configure CLI
825
+ squads stack env >> ~/.zshrc
826
+ source ~/.zshrc
827
+
828
+ # Verify
829
+ squads stack health
830
+ ```
831
+
832
+ ### Minimal Setup (Postgres only)
833
+
834
+ ```bash
835
+ # Just need triggers and session storage
836
+ docker run -d --name squads-postgres \
837
+ -e POSTGRES_PASSWORD=squads \
838
+ -p 5432:5432 \
839
+ postgres:16
840
+
841
+ export SQUADS_POSTGRES_URL=postgres://postgres:squads@localhost:5432/squads
842
+ ```
843
+
764
844
  ## Development
765
845
 
766
846
  ```bash
package/dist/cli.js CHANGED
@@ -37,12 +37,15 @@ import {
37
37
  import { config } from "dotenv";
38
38
  import { existsSync as existsSync17 } from "fs";
39
39
  import { join as join17 } from "path";
40
- import { homedir as homedir6 } from "os";
40
+ import { homedir as homedir5 } from "os";
41
41
  import { Command } from "commander";
42
42
  import chalk4 from "chalk";
43
43
 
44
44
  // src/version.ts
45
- var version = "0.3.0";
45
+ import { createRequire } from "module";
46
+ var require2 = createRequire(import.meta.url);
47
+ var pkg = require2("../package.json");
48
+ var version = pkg.version;
46
49
 
47
50
  // src/commands/init.ts
48
51
  import chalk from "chalk";
@@ -830,6 +833,10 @@ async function initCommand(options) {
830
833
 
831
834
  Demonstrates squads functionality with safe, educational examples.
832
835
 
836
+ ## Goals
837
+
838
+ - [ ] Run the demo agents and explore the dashboard
839
+
833
840
  ## Agents
834
841
 
835
842
  | Agent | Purpose |
@@ -965,44 +972,83 @@ Markdown report saved to .agents/outputs/demo/project-analysis.md
965
972
  claudeMdPath,
966
973
  `# Project Instructions
967
974
 
968
- ## Squads CLI
975
+ ## What is Squads?
969
976
 
970
- This project uses AI agent squads for automation.
977
+ Squads is a framework for building AI agent teams that automate real work.
978
+ Each **squad** is a team of **agents** (markdown prompts) that execute via Claude.
971
979
 
972
- ### Quick Start
980
+ ## For Claude (READ THIS)
973
981
 
974
- \`\`\`bash
975
- squads status # Overview
976
- squads dash # Full dashboard
977
- squads run demo # Try the demo squad
978
- squads run <squad> # Execute a squad
979
- \`\`\`
980
-
981
- ### Memory
982
-
983
- Squads have persistent memory across sessions:
982
+ When helping users with squad-related tasks:
984
983
 
984
+ ### Check Context First
985
985
  \`\`\`bash
986
- squads memory query "<topic>" # Search memory
987
- squads memory show <squad> # View squad memory
986
+ squads status # What squads exist?
987
+ squads memory query "X" # What do we know about X?
988
988
  \`\`\`
989
989
 
990
990
  ### Creating Agents
991
-
992
- Agents are markdown files in \`.agents/squads/<squad>/\`:
991
+ Agents live in \`.agents/squads/<squad-name>/<agent-name>.md\`:
993
992
 
994
993
  \`\`\`markdown
995
- # My Agent
994
+ # Agent Name
996
995
 
997
996
  ## Purpose
998
- What this agent does.
997
+ One sentence: what this agent does.
999
998
 
1000
999
  ## Instructions
1001
- 1. Step one
1002
- 2. Step two
1000
+ 1. Specific step
1001
+ 2. Another step
1002
+ 3. Output location
1003
1003
 
1004
1004
  ## Output
1005
- What it produces.
1005
+ What it produces and where it goes.
1006
+ \`\`\`
1007
+
1008
+ ### Running Agents
1009
+ \`\`\`bash
1010
+ squads run <squad> # Run all agents in squad
1011
+ squads run <squad>/<agent> # Run specific agent
1012
+ \`\`\`
1013
+
1014
+ ### Tracking Progress
1015
+ \`\`\`bash
1016
+ squads dash # Full dashboard with goals
1017
+ squads goal list # View all goals
1018
+ squads goal set <squad> "X" # Add a goal
1019
+ \`\`\`
1020
+
1021
+ ### Common User Requests
1022
+
1023
+ | User says | You should |
1024
+ |-----------|------------|
1025
+ | "Create an agent to..." | Create \`.agents/squads/<squad>/<name>.md\` |
1026
+ | "Automate X" | Create agent, then \`squads run\` |
1027
+ | "What's the status?" | Run \`squads dash\` or \`squads status\` |
1028
+ | "Run the X agent" | \`squads run <squad>/x\` |
1029
+ | "Check memory" | \`squads memory query "<topic>"\` |
1030
+
1031
+ ## Quick Reference
1032
+
1033
+ \`\`\`bash
1034
+ squads status # Overview
1035
+ squads dash # Full dashboard
1036
+ squads run demo # Try demo squad
1037
+ squads list # All agents
1038
+ squads memory query X # Search memory
1039
+ squads goal list # View goals
1040
+ \`\`\`
1041
+
1042
+ ## Project Structure
1043
+
1044
+ \`\`\`
1045
+ .agents/
1046
+ \u251C\u2500\u2500 squads/ # Agent teams
1047
+ \u2502 \u2514\u2500\u2500 <squad>/
1048
+ \u2502 \u251C\u2500\u2500 SQUAD.md # Squad definition
1049
+ \u2502 \u2514\u2500\u2500 *.md # Agent files
1050
+ \u251C\u2500\u2500 memory/ # Persistent context
1051
+ \u2514\u2500\u2500 outputs/ # Agent outputs
1006
1052
  \`\`\`
1007
1053
  `
1008
1054
  );
@@ -1076,6 +1122,20 @@ function findSquadsDir() {
1076
1122
  }
1077
1123
  return null;
1078
1124
  }
1125
+ function findProjectRoot() {
1126
+ const squadsDir = findSquadsDir();
1127
+ if (!squadsDir) return null;
1128
+ return join3(squadsDir, "..", "..");
1129
+ }
1130
+ function hasLocalInfraConfig() {
1131
+ const projectRoot = findProjectRoot();
1132
+ if (!projectRoot) return false;
1133
+ const envPath = join3(projectRoot, ".env");
1134
+ if (!existsSync3(envPath)) return false;
1135
+ const content = readFileSync2(envPath, "utf-8");
1136
+ const infraKeys = ["LANGFUSE_", "SQUADS_BRIDGE", "SQUADS_POSTGRES", "SQUADS_REDIS"];
1137
+ return infraKeys.some((key) => content.includes(key));
1138
+ }
1079
1139
  function listSquads(squadsDir) {
1080
1140
  const squads = [];
1081
1141
  const entries = readdirSync(squadsDir, { withFileTypes: true });
@@ -1749,7 +1809,7 @@ async function executeWithClaude(prompt2, verbose, _timeoutMinutes = 30, foregro
1749
1809
  writeLine(` ${colors.dim}Session: ${sessionName}${RESET}`);
1750
1810
  writeLine(` ${colors.dim}Auth: ${useApi ? "API credits" : "subscription"}${RESET}`);
1751
1811
  }
1752
- const claudeCmd = `cd '${projectRoot}' && claude --dangerously-skip-permissions --mcp-config '${userConfigPath}' -- '${escapedPrompt}'`;
1812
+ const claudeCmd = `cd '${projectRoot}' && claude --dangerously-skip-permissions --mcp-config '${userConfigPath}' -- '${escapedPrompt}'; tmux kill-session -t ${sessionName} 2>/dev/null`;
1753
1813
  const tmux = spawn2("tmux", [
1754
1814
  "new-session",
1755
1815
  "-d",
@@ -1854,8 +1914,8 @@ function getPackageVersion() {
1854
1914
  ];
1855
1915
  for (const pkgPath of possiblePaths) {
1856
1916
  if (existsSync5(pkgPath)) {
1857
- const pkg = JSON.parse(readFileSync4(pkgPath, "utf-8"));
1858
- return pkg.version || "0.0.0";
1917
+ const pkg2 = JSON.parse(readFileSync4(pkgPath, "utf-8"));
1918
+ return pkg2.version || "0.0.0";
1859
1919
  }
1860
1920
  }
1861
1921
  } catch {
@@ -3533,6 +3593,7 @@ async function goalListCommand(squadName, options = {}) {
3533
3593
  const squadsDir = findSquadsDir();
3534
3594
  if (!squadsDir) {
3535
3595
  writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);
3596
+ writeLine(` ${colors.dim}Run \`squads init\` to create one.${RESET}`);
3536
3597
  return;
3537
3598
  }
3538
3599
  const squadsToCheck = squadName ? [squadName] : listSquads(squadsDir);
@@ -3844,7 +3905,6 @@ async function feedbackStatsCommand() {
3844
3905
  // src/commands/dashboard.ts
3845
3906
  import { readdirSync as readdirSync4, existsSync as existsSync10, statSync as statSync2 } from "fs";
3846
3907
  import { join as join10 } from "path";
3847
- import { homedir as homedir4 } from "os";
3848
3908
 
3849
3909
  // src/lib/providers.ts
3850
3910
  var PROVIDERS = {
@@ -4155,7 +4215,7 @@ function detectPlan() {
4155
4215
  if (tier >= 1 && tier <= 2) {
4156
4216
  return { plan: "usage", confidence: "inferred", reason: `Tier ${tier} (new user)` };
4157
4217
  }
4158
- return { plan: "max", confidence: "inferred", reason: "Default (no config)" };
4218
+ return { plan: "unknown", confidence: "inferred", reason: "Not configured" };
4159
4219
  }
4160
4220
  function getPlanType() {
4161
4221
  return detectPlan().plan;
@@ -4547,7 +4607,7 @@ async function fetchInsights(period = "week") {
4547
4607
  };
4548
4608
  }
4549
4609
  }
4550
- async function fetchNpmStats(packageName = "squads-cli") {
4610
+ async function fetchNpmStats(packageName = process.env.SQUADS_NPM_PACKAGE || "squads-cli") {
4551
4611
  try {
4552
4612
  const [dayRes, weekRes, monthRes] = await Promise.all([
4553
4613
  fetch(`https://api.npmjs.org/downloads/point/last-day/${packageName}`),
@@ -4577,9 +4637,9 @@ async function fetchNpmStats(packageName = "squads-cli") {
4577
4637
  }
4578
4638
 
4579
4639
  // src/lib/db.ts
4580
- import { createRequire } from "module";
4581
- var require2 = createRequire(import.meta.url);
4582
- var pg = require2("pg");
4640
+ import { createRequire as createRequire2 } from "module";
4641
+ var require3 = createRequire2(import.meta.url);
4642
+ var pg = require3("pg");
4583
4643
  var { Pool } = pg;
4584
4644
  var DATABASE_URL = process.env.SQUADS_DATABASE_URL || "postgresql://squads:squads_local_dev@localhost:5433/squads";
4585
4645
  var pool = null;
@@ -4735,6 +4795,7 @@ async function dashboardCommand(options = {}) {
4735
4795
  const squadsDir = findSquadsDir();
4736
4796
  if (!squadsDir) {
4737
4797
  writeLine(`${colors.red}No .agents/squads directory found${RESET}`);
4798
+ writeLine(`${colors.dim}Run \`squads init\` to create one.${RESET}`);
4738
4799
  return;
4739
4800
  }
4740
4801
  if (options.ceo) {
@@ -4877,12 +4938,12 @@ async function dashboardCommand(options = {}) {
4877
4938
  const prs = gh?.prsMerged || 0;
4878
4939
  const issuesClosed = gh?.issuesClosed || 0;
4879
4940
  const issuesOpen = gh?.issuesOpen || 0;
4880
- const activeCount = squad.goals.filter((g) => !g.completed).length;
4941
+ const completedCount = squad.goals.filter((g) => g.completed).length;
4881
4942
  const totalCount = squad.goals.length;
4882
4943
  const commitColor = commits > 10 ? colors.green : commits > 0 ? colors.cyan : colors.dim;
4883
4944
  const prColor = prs > 0 ? colors.green : colors.dim;
4884
4945
  const issueColor = issuesClosed > 0 ? colors.green : colors.dim;
4885
- writeLine(` ${colors.purple}${box.vertical}${RESET} ${colors.cyan}${padEnd(squad.name, w.name)}${RESET}${commitColor}${padEnd(String(commits), w.commits)}${RESET}${prColor}${padEnd(String(prs), w.prs)}${RESET}${issueColor}${padEnd(`${issuesClosed}/${issuesOpen}`, w.issues)}${RESET}${padEnd(`${activeCount}/${totalCount}`, w.goals)}${progressBar(squad.goalProgress, 8)} ${colors.purple}${box.vertical}${RESET}`);
4946
+ writeLine(` ${colors.purple}${box.vertical}${RESET} ${colors.cyan}${padEnd(squad.name, w.name)}${RESET}${commitColor}${padEnd(String(commits), w.commits)}${RESET}${prColor}${padEnd(String(prs), w.prs)}${RESET}${issueColor}${padEnd(`${issuesClosed}/${issuesOpen}`, w.issues)}${RESET}${padEnd(`${completedCount}/${totalCount}`, w.goals)}${progressBar(squad.goalProgress, 8)} ${colors.purple}${box.vertical}${RESET}`);
4886
4947
  }
4887
4948
  writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);
4888
4949
  writeLine();
@@ -4924,14 +4985,12 @@ async function dashboardCommand(options = {}) {
4924
4985
  await closeDatabase();
4925
4986
  }
4926
4987
  function findAgentsSquadsDir() {
4927
- const candidates = [
4928
- join10(process.cwd(), ".."),
4929
- join10(homedir4(), "agents-squads")
4930
- ];
4931
- for (const dir of candidates) {
4932
- if (existsSync10(join10(dir, "hq"))) {
4933
- return dir;
4934
- }
4988
+ const parentDir = join10(process.cwd(), "..");
4989
+ if (existsSync10(join10(parentDir, "hq"))) {
4990
+ return parentDir;
4991
+ }
4992
+ if (existsSync10(join10(process.cwd(), ".git"))) {
4993
+ return process.cwd();
4935
4994
  }
4936
4995
  return null;
4937
4996
  }
@@ -4983,19 +5042,36 @@ function renderGitPerformanceCached(cache) {
4983
5042
  function renderTokenEconomicsCached(cache, goalCount) {
4984
5043
  const costs = cache.costs;
4985
5044
  const stats = cache.bridgeStats;
4986
- if (!costs && !stats) {
4987
- writeLine(` ${bold}Token Economics${RESET} ${colors.dim}(no data)${RESET}`);
4988
- writeLine(` ${colors.dim}Set LANGFUSE_PUBLIC_KEY & LANGFUSE_SECRET_KEY for tracking${RESET}`);
5045
+ const hasInfra = hasLocalInfraConfig();
5046
+ const hasData = costs || stats;
5047
+ writeLine(` ${bold}Token Economics${RESET}`);
5048
+ writeLine();
5049
+ const planType = getPlanType();
5050
+ const tier = parseInt(process.env.ANTHROPIC_TIER || "0", 10);
5051
+ if (planType === "unknown") {
5052
+ writeLine(` ${colors.dim}\u25CB${RESET} ${bold}Plan${RESET} ${colors.yellow}not configured${RESET}`);
5053
+ writeLine();
5054
+ writeLine(` ${colors.dim}Set your Claude plan:${RESET}`);
5055
+ writeLine(` ${colors.dim}$${RESET} export SQUADS_PLAN_TYPE=max ${colors.dim}# $200/mo flat${RESET}`);
5056
+ writeLine(` ${colors.dim}$${RESET} export SQUADS_PLAN_TYPE=usage ${colors.dim}# pay-per-token${RESET}`);
5057
+ writeLine();
5058
+ } else {
5059
+ const maxPlan = planType === "max";
5060
+ const planIcon = maxPlan ? `${colors.purple}\u25C6${RESET}` : `${colors.dim}\u25CB${RESET}`;
5061
+ const planLabel = maxPlan ? "Claude Max" : "Claude Pro";
5062
+ const planCost = maxPlan ? "$200/mo flat" : "pay-per-token";
5063
+ const tierDisplay = tier > 0 ? ` ${colors.dim}Tier ${tier}${RESET}` : "";
5064
+ writeLine(` ${planIcon} ${bold}${planLabel}${RESET} ${colors.dim}${planCost}${RESET}${tierDisplay}`);
5065
+ writeLine();
5066
+ }
5067
+ if (!hasInfra || !hasData) {
5068
+ writeLine(` ${colors.dim}\u25CB${RESET} Track costs, tokens, and API usage`);
5069
+ writeLine(` ${colors.dim}\u25CB${RESET} Monitor rate limits and budgets`);
5070
+ writeLine();
5071
+ writeLine(` ${colors.dim}Setup:${RESET} github.com/agents-squads/squads-cli#analytics`);
4989
5072
  writeLine();
4990
5073
  return;
4991
5074
  }
4992
- writeLine(` ${bold}Token Economics${RESET}`);
4993
- writeLine();
4994
- const maxPlan = isMaxPlan();
4995
- const tier = parseInt(process.env.ANTHROPIC_TIER || "4", 10);
4996
- const planIcon = maxPlan ? `${colors.purple}\u25C6${RESET}` : `${colors.dim}\u25CB${RESET}`;
4997
- writeLine(` ${planIcon} ${bold}Claude Max${RESET} ${colors.dim}$200/mo flat${RESET} ${colors.dim}Tier ${tier}${RESET}`);
4998
- writeLine();
4999
5075
  const todayTokens = stats ? stats.today.inputTokens + stats.today.outputTokens : 0;
5000
5076
  const todayCalls = stats?.today.generations || costs?.totalCalls || 0;
5001
5077
  const todayCost = stats?.today.costUsd || costs?.totalCost || 0;
@@ -5041,12 +5117,13 @@ function renderTokenEconomicsCached(cache, goalCount) {
5041
5117
  }
5042
5118
  function renderInfrastructureCached(cache) {
5043
5119
  const stats = cache.bridgeStats;
5044
- if (!stats) {
5045
- writeLine(` ${bold}Infrastructure${RESET} ${colors.dim}(bridge offline)${RESET}`);
5120
+ const hasInfra = hasLocalInfraConfig();
5121
+ if (!hasInfra || !stats) {
5122
+ writeLine(` ${bold}Infrastructure${RESET} ${colors.dim}(not connected)${RESET}`);
5046
5123
  writeLine();
5047
- writeLine(` ${colors.dim}Start with:${RESET} cd docker && docker-compose up -d`);
5048
- writeLine(` ${colors.dim}Docs:${RESET} https://agents-squads.com/docs/setup`);
5049
- writeLine(` ${colors.yellow}Need help?${RESET} ${colors.dim}jorge@agents-squads.com${RESET}`);
5124
+ writeLine(` ${colors.dim}\u25CB${RESET} postgres ${colors.dim}\u25CB${RESET} redis ${colors.dim}\u25CB${RESET} otel`);
5125
+ writeLine();
5126
+ writeLine(` ${colors.dim}Setup:${RESET} github.com/agents-squads/squads-cli#infrastructure`);
5050
5127
  writeLine();
5051
5128
  return;
5052
5129
  }
@@ -5081,6 +5158,10 @@ function renderInfrastructureCached(cache) {
5081
5158
  writeLine();
5082
5159
  }
5083
5160
  function renderAcquisitionCached(cache) {
5161
+ const npmPackage = process.env.SQUADS_NPM_PACKAGE;
5162
+ if (!npmPackage) {
5163
+ return;
5164
+ }
5084
5165
  const npm = cache.npmStats;
5085
5166
  if (!npm) {
5086
5167
  return;
@@ -5092,8 +5173,6 @@ function renderAcquisitionCached(cache) {
5092
5173
  writeLine(` ${colors.cyan}${npm.downloads.lastWeek}${RESET} installs/week ${trendIcon} ${trendColor}${Math.abs(npm.weekOverWeek)}%${RESET} ${colors.dim}wow${RESET}`);
5093
5174
  writeLine(` ${colors.dim}Today${RESET} ${npm.downloads.lastDay} ${colors.dim}\u2502${RESET} ${colors.dim}Month${RESET} ${npm.downloads.lastMonth}`);
5094
5175
  writeLine();
5095
- writeLine(` ${colors.dim}GitHub \u2192 npm install \u2192 squads dash \u2192 ?${RESET}`);
5096
- writeLine();
5097
5176
  }
5098
5177
  async function saveSnapshotCached(squadData, cache, _baseDir) {
5099
5178
  if (!cache.dbAvailable) return;
@@ -5564,6 +5643,7 @@ async function openIssuesCommand(options = {}) {
5564
5643
  const squadsDir = findSquadsDir();
5565
5644
  if (!squadsDir) {
5566
5645
  writeLine(` ${colors.red}No .agents/squads directory found${RESET}`);
5646
+ writeLine(` ${colors.dim}Run \`squads init\` to create one.${RESET}`);
5567
5647
  return;
5568
5648
  }
5569
5649
  const evalAgents = findEvalAgents(squadsDir, options.squad);
@@ -5729,7 +5809,7 @@ import open from "open";
5729
5809
  import { createClient } from "@supabase/supabase-js";
5730
5810
  import { existsSync as existsSync11, readFileSync as readFileSync8, writeFileSync as writeFileSync8, mkdirSync as mkdirSync7 } from "fs";
5731
5811
  import { join as join12 } from "path";
5732
- import { homedir as homedir5 } from "os";
5812
+ import { homedir as homedir4 } from "os";
5733
5813
  import "open";
5734
5814
  import http from "http";
5735
5815
  var PERSONAL_DOMAINS = [
@@ -5758,7 +5838,7 @@ var PERSONAL_DOMAINS = [
5758
5838
  "tutanota.com",
5759
5839
  "hey.com"
5760
5840
  ];
5761
- var AUTH_DIR = join12(homedir5(), ".squads-cli");
5841
+ var AUTH_DIR = join12(homedir4(), ".squads-cli");
5762
5842
  var AUTH_PATH = join12(AUTH_DIR, "auth.json");
5763
5843
  function isPersonalEmail(email) {
5764
5844
  const domain = email.split("@")[1]?.toLowerCase();
@@ -6306,6 +6386,7 @@ async function resultsCommand(options = {}) {
6306
6386
  const squadsDir = findSquadsDir();
6307
6387
  if (!squadsDir) {
6308
6388
  writeLine(`${colors.red}No .agents/squads directory found${RESET}`);
6389
+ writeLine(`${colors.dim}Run \`squads init\` to create one.${RESET}`);
6309
6390
  return;
6310
6391
  }
6311
6392
  const days = parseInt(options.days || "7", 10);
@@ -8160,7 +8241,7 @@ if (!process.stdout.isTTY) {
8160
8241
  var envPaths = [
8161
8242
  join17(process.cwd(), ".env"),
8162
8243
  join17(process.cwd(), "..", "hq", ".env"),
8163
- join17(homedir6(), "agents-squads", "hq", ".env")
8244
+ join17(homedir5(), "agents-squads", "hq", ".env")
8164
8245
  ];
8165
8246
  for (const envPath of envPaths) {
8166
8247
  if (existsSync17(envPath)) {