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 +80 -0
- package/dist/cli.js +144 -63
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
|
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
|
-
|
|
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
|
|
975
|
+
## What is Squads?
|
|
969
976
|
|
|
970
|
-
|
|
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
|
-
|
|
980
|
+
## For Claude (READ THIS)
|
|
973
981
|
|
|
974
|
-
|
|
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
|
|
987
|
-
squads 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
|
-
#
|
|
994
|
+
# Agent Name
|
|
996
995
|
|
|
997
996
|
## Purpose
|
|
998
|
-
|
|
997
|
+
One sentence: what this agent does.
|
|
999
998
|
|
|
1000
999
|
## Instructions
|
|
1001
|
-
1.
|
|
1002
|
-
2.
|
|
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
|
|
1858
|
-
return
|
|
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: "
|
|
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
|
|
4582
|
-
var 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
|
|
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(`${
|
|
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
|
|
4928
|
-
|
|
4929
|
-
|
|
4930
|
-
|
|
4931
|
-
|
|
4932
|
-
|
|
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
|
-
|
|
4987
|
-
|
|
4988
|
-
|
|
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
|
-
|
|
5045
|
-
|
|
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}
|
|
5048
|
-
writeLine(
|
|
5049
|
-
writeLine(` ${colors.
|
|
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
|
|
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(
|
|
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(
|
|
8244
|
+
join17(homedir5(), "agents-squads", "hq", ".env")
|
|
8164
8245
|
];
|
|
8165
8246
|
for (const envPath of envPaths) {
|
|
8166
8247
|
if (existsSync17(envPath)) {
|