squads-cli 0.4.13 → 0.6.0

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.
Files changed (146) hide show
  1. package/README.md +161 -4
  2. package/dist/{chunk-HKWCBCEK.js → chunk-4CMAEQQY.js} +6 -2
  3. package/dist/chunk-4CMAEQQY.js.map +1 -0
  4. package/dist/{chunk-NA3IECJA.js → chunk-N7KDWU4W.js} +155 -58
  5. package/dist/chunk-N7KDWU4W.js.map +1 -0
  6. package/dist/{chunk-HIQ2APYR.js → chunk-NHGLXN2F.js} +8 -6
  7. package/dist/chunk-NHGLXN2F.js.map +1 -0
  8. package/dist/{chunk-3TSY2K7R.js → chunk-O7UV3FWI.js} +140 -21
  9. package/dist/chunk-O7UV3FWI.js.map +1 -0
  10. package/dist/chunk-ZTQ7ISUR.js +338 -0
  11. package/dist/chunk-ZTQ7ISUR.js.map +1 -0
  12. package/dist/cli.js +5232 -6194
  13. package/dist/cli.js.map +1 -1
  14. package/dist/index.d.ts +110 -2
  15. package/dist/index.js +302 -25
  16. package/dist/index.js.map +1 -1
  17. package/dist/{memory-4PVUKIDK.js → memory-VNF2VFRB.js} +8 -4
  18. package/dist/{sessions-R4VWIGFR.js → sessions-6PB7ALCE.js} +3 -3
  19. package/dist/{squad-parser-YRE2FEAA.js → squad-parser-4BI3G4RS.js} +4 -2
  20. package/dist/templates/core/AGENTS.md.template +64 -0
  21. package/dist/templates/core/BUSINESS_BRIEF.md.template +29 -0
  22. package/dist/templates/core/CLAUDE.md.template +50 -0
  23. package/dist/templates/core/provider.yaml.template +5 -0
  24. package/dist/templates/first-squad/SQUAD.md.template +23 -0
  25. package/dist/templates/first-squad/lead.md.template +44 -0
  26. package/dist/templates/memory/getting-started/state.md.template +19 -0
  27. package/dist/templates/seed/BUSINESS_BRIEF.md.template +27 -0
  28. package/dist/templates/seed/CLAUDE.md.template +69 -0
  29. package/dist/templates/seed/config/provider.yaml +4 -0
  30. package/dist/templates/seed/hooks/settings.json.template +31 -0
  31. package/dist/templates/seed/memory/company/manager/state.md +16 -0
  32. package/dist/templates/seed/memory/engineering/issue-solver/state.md +12 -0
  33. package/dist/templates/seed/memory/intelligence/intel-lead/state.md +9 -0
  34. package/dist/templates/seed/memory/marketing/content-drafter/state.md +12 -0
  35. package/dist/templates/seed/memory/operations/ops-lead/state.md +12 -0
  36. package/dist/templates/seed/memory/research/researcher/state.md +10 -0
  37. package/dist/templates/seed/skills/gh/SKILL.md +57 -0
  38. package/dist/templates/seed/skills/squads-cli/SKILL.md +88 -0
  39. package/dist/templates/seed/squads/company/SQUAD.md +49 -0
  40. package/dist/templates/seed/squads/company/company-critic.md +21 -0
  41. package/dist/templates/seed/squads/company/company-eval.md +21 -0
  42. package/dist/templates/seed/squads/company/event-dispatcher.md +21 -0
  43. package/dist/templates/seed/squads/company/goal-tracker.md +21 -0
  44. package/dist/templates/seed/squads/company/manager.md +66 -0
  45. package/dist/templates/seed/squads/engineering/SQUAD.md +48 -0
  46. package/dist/templates/seed/squads/engineering/code-reviewer.md +57 -0
  47. package/dist/templates/seed/squads/engineering/issue-solver.md +58 -0
  48. package/dist/templates/seed/squads/engineering/test-writer.md +50 -0
  49. package/dist/templates/seed/squads/intelligence/SQUAD.md +37 -0
  50. package/dist/templates/seed/squads/intelligence/intel-critic.md +36 -0
  51. package/dist/templates/seed/squads/intelligence/intel-eval.md +31 -0
  52. package/dist/templates/seed/squads/intelligence/intel-lead.md +71 -0
  53. package/dist/templates/seed/squads/marketing/SQUAD.md +47 -0
  54. package/dist/templates/seed/squads/marketing/content-drafter.md +71 -0
  55. package/dist/templates/seed/squads/marketing/growth-analyst.md +49 -0
  56. package/dist/templates/seed/squads/marketing/social-poster.md +44 -0
  57. package/dist/templates/seed/squads/operations/SQUAD.md +45 -0
  58. package/dist/templates/seed/squads/operations/finance-tracker.md +47 -0
  59. package/dist/templates/seed/squads/operations/goal-tracker.md +48 -0
  60. package/dist/templates/seed/squads/operations/ops-lead.md +58 -0
  61. package/dist/templates/seed/squads/research/SQUAD.md +38 -0
  62. package/dist/templates/seed/squads/research/analyst.md +27 -0
  63. package/dist/templates/seed/squads/research/research-critic.md +20 -0
  64. package/dist/templates/seed/squads/research/research-eval.md +20 -0
  65. package/dist/templates/seed/squads/research/researcher.md +28 -0
  66. package/dist/templates/skills/squads-learn/SKILL.md +86 -0
  67. package/dist/templates/skills/squads-workflow/instruction.md +70 -0
  68. package/dist/{terminal-JZSAQSN7.js → terminal-YKA4O5CX.js} +4 -2
  69. package/dist/{update-MAY6EXFQ.js → update-ALJKFFM7.js} +3 -2
  70. package/package.json +9 -20
  71. package/templates/core/AGENTS.md.template +64 -0
  72. package/templates/core/BUSINESS_BRIEF.md.template +29 -0
  73. package/templates/core/CLAUDE.md.template +50 -0
  74. package/templates/core/provider.yaml.template +5 -0
  75. package/templates/first-squad/SQUAD.md.template +23 -0
  76. package/templates/first-squad/lead.md.template +44 -0
  77. package/templates/memory/getting-started/state.md.template +19 -0
  78. package/templates/seed/BUSINESS_BRIEF.md.template +27 -0
  79. package/templates/seed/CLAUDE.md.template +69 -0
  80. package/templates/seed/config/provider.yaml +4 -0
  81. package/templates/seed/hooks/settings.json.template +31 -0
  82. package/templates/seed/memory/company/manager/state.md +16 -0
  83. package/templates/seed/memory/engineering/issue-solver/state.md +12 -0
  84. package/templates/seed/memory/intelligence/intel-lead/state.md +9 -0
  85. package/templates/seed/memory/marketing/content-drafter/state.md +12 -0
  86. package/templates/seed/memory/operations/ops-lead/state.md +12 -0
  87. package/templates/seed/memory/research/researcher/state.md +10 -0
  88. package/templates/seed/skills/gh/SKILL.md +57 -0
  89. package/templates/seed/skills/squads-cli/SKILL.md +88 -0
  90. package/templates/seed/squads/company/SQUAD.md +49 -0
  91. package/templates/seed/squads/company/company-critic.md +21 -0
  92. package/templates/seed/squads/company/company-eval.md +21 -0
  93. package/templates/seed/squads/company/event-dispatcher.md +21 -0
  94. package/templates/seed/squads/company/goal-tracker.md +21 -0
  95. package/templates/seed/squads/company/manager.md +66 -0
  96. package/templates/seed/squads/engineering/SQUAD.md +48 -0
  97. package/templates/seed/squads/engineering/code-reviewer.md +57 -0
  98. package/templates/seed/squads/engineering/issue-solver.md +58 -0
  99. package/templates/seed/squads/engineering/test-writer.md +50 -0
  100. package/templates/seed/squads/intelligence/SQUAD.md +37 -0
  101. package/templates/seed/squads/intelligence/intel-critic.md +36 -0
  102. package/templates/seed/squads/intelligence/intel-eval.md +31 -0
  103. package/templates/seed/squads/intelligence/intel-lead.md +71 -0
  104. package/templates/seed/squads/marketing/SQUAD.md +47 -0
  105. package/templates/seed/squads/marketing/content-drafter.md +71 -0
  106. package/templates/seed/squads/marketing/growth-analyst.md +49 -0
  107. package/templates/seed/squads/marketing/social-poster.md +44 -0
  108. package/templates/seed/squads/operations/SQUAD.md +45 -0
  109. package/templates/seed/squads/operations/finance-tracker.md +47 -0
  110. package/templates/seed/squads/operations/goal-tracker.md +48 -0
  111. package/templates/seed/squads/operations/ops-lead.md +58 -0
  112. package/templates/seed/squads/research/SQUAD.md +38 -0
  113. package/templates/seed/squads/research/analyst.md +27 -0
  114. package/templates/seed/squads/research/research-critic.md +20 -0
  115. package/templates/seed/squads/research/research-eval.md +20 -0
  116. package/templates/seed/squads/research/researcher.md +28 -0
  117. package/templates/skills/squads-learn/SKILL.md +86 -0
  118. package/templates/skills/squads-workflow/instruction.md +70 -0
  119. package/dist/chunk-3TSY2K7R.js.map +0 -1
  120. package/dist/chunk-FUHBEL3L.js +0 -203
  121. package/dist/chunk-FUHBEL3L.js.map +0 -1
  122. package/dist/chunk-HIQ2APYR.js.map +0 -1
  123. package/dist/chunk-HKWCBCEK.js.map +0 -1
  124. package/dist/chunk-NA3IECJA.js.map +0 -1
  125. package/docker/.env.example +0 -17
  126. package/docker/README.md +0 -92
  127. package/docker/docker-compose.engram.yml +0 -304
  128. package/docker/docker-compose.yml +0 -234
  129. package/docker/init-db.sql +0 -478
  130. package/docker/init-engram-db.sql +0 -148
  131. package/docker/init-langfuse-db.sh +0 -10
  132. package/docker/otel-collector.yaml +0 -34
  133. package/docker/squads-bridge/Dockerfile +0 -14
  134. package/docker/squads-bridge/Dockerfile.proxy +0 -14
  135. package/docker/squads-bridge/anthropic_proxy.py +0 -313
  136. package/docker/squads-bridge/requirements.txt +0 -7
  137. package/docker/squads-bridge/squads_bridge.py +0 -2299
  138. package/docker/telemetry-ping/Dockerfile +0 -10
  139. package/docker/telemetry-ping/deploy.sh +0 -69
  140. package/docker/telemetry-ping/main.py +0 -136
  141. package/docker/telemetry-ping/requirements.txt +0 -3
  142. /package/dist/{memory-4PVUKIDK.js.map → memory-VNF2VFRB.js.map} +0 -0
  143. /package/dist/{sessions-R4VWIGFR.js.map → sessions-6PB7ALCE.js.map} +0 -0
  144. /package/dist/{squad-parser-YRE2FEAA.js.map → squad-parser-4BI3G4RS.js.map} +0 -0
  145. /package/dist/{terminal-JZSAQSN7.js.map → terminal-YKA4O5CX.js.map} +0 -0
  146. /package/dist/{update-MAY6EXFQ.js.map → update-ALJKFFM7.js.map} +0 -0
@@ -1,478 +0,0 @@
1
- -- Squads Local Database Initialization
2
- -- Creates additional schemas/tables beyond what Langfuse creates
3
-
4
- -- Schema for squads-specific data (separate from Langfuse)
5
- CREATE SCHEMA IF NOT EXISTS squads;
6
-
7
- -- GitHub metrics table - tracks git activity over time
8
- CREATE TABLE IF NOT EXISTS squads.github_metrics (
9
- id SERIAL PRIMARY KEY,
10
- org VARCHAR(255) NOT NULL,
11
- repo VARCHAR(255) NOT NULL,
12
- metric_date DATE NOT NULL,
13
-
14
- -- Activity counts
15
- commits INTEGER DEFAULT 0,
16
- prs_opened INTEGER DEFAULT 0,
17
- prs_merged INTEGER DEFAULT 0,
18
- prs_closed INTEGER DEFAULT 0,
19
- issues_opened INTEGER DEFAULT 0,
20
- issues_closed INTEGER DEFAULT 0,
21
- reviews INTEGER DEFAULT 0,
22
-
23
- -- Code metrics
24
- additions INTEGER DEFAULT 0,
25
- deletions INTEGER DEFAULT 0,
26
-
27
- -- Quality signals
28
- avg_pr_cycle_hours NUMERIC(10,2),
29
- review_pass_rate NUMERIC(5,2),
30
-
31
- -- Metadata
32
- created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
33
-
34
- UNIQUE(org, repo, metric_date)
35
- );
36
-
37
- -- Agent execution metrics - links to Langfuse traces
38
- CREATE TABLE IF NOT EXISTS squads.agent_executions (
39
- id SERIAL PRIMARY KEY,
40
- squad VARCHAR(100) NOT NULL,
41
- agent VARCHAR(100) NOT NULL,
42
- execution_id VARCHAR(255), -- Links to Langfuse trace_id
43
-
44
- -- Timing
45
- started_at TIMESTAMP WITH TIME ZONE NOT NULL,
46
- completed_at TIMESTAMP WITH TIME ZONE,
47
- duration_ms INTEGER,
48
-
49
- -- Results
50
- status VARCHAR(50) DEFAULT 'running', -- running, completed, failed
51
- output_type VARCHAR(50), -- commit, pr, issue, file, etc
52
- output_ref VARCHAR(255), -- PR URL, commit SHA, etc
53
-
54
- -- Cost tracking (backup to Langfuse)
55
- input_tokens INTEGER DEFAULT 0,
56
- output_tokens INTEGER DEFAULT 0,
57
- cost_usd NUMERIC(10,6) DEFAULT 0,
58
-
59
- -- Metadata
60
- created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
61
- );
62
-
63
- -- Baseline snapshots - for before/after comparison
64
- CREATE TABLE IF NOT EXISTS squads.baselines (
65
- id SERIAL PRIMARY KEY,
66
- org VARCHAR(255) NOT NULL,
67
- name VARCHAR(100) NOT NULL,
68
- captured_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
69
-
70
- -- 30-day metrics at capture time
71
- commits_30d INTEGER DEFAULT 0,
72
- prs_30d INTEGER DEFAULT 0,
73
- issues_30d INTEGER DEFAULT 0,
74
- avg_pr_cycle_hours NUMERIC(10,2),
75
-
76
- -- Metadata
77
- notes TEXT,
78
-
79
- UNIQUE(org, name)
80
- );
81
-
82
- -- Create indexes for common queries
83
- CREATE INDEX IF NOT EXISTS idx_github_metrics_date ON squads.github_metrics(metric_date DESC);
84
- CREATE INDEX IF NOT EXISTS idx_github_metrics_repo ON squads.github_metrics(org, repo);
85
- CREATE INDEX IF NOT EXISTS idx_agent_executions_squad ON squads.agent_executions(squad, agent);
86
- CREATE INDEX IF NOT EXISTS idx_agent_executions_status ON squads.agent_executions(status);
87
-
88
- -- Dashboard snapshots - full dashboard state over time
89
- CREATE TABLE IF NOT EXISTS squads.dashboard_snapshots (
90
- id SERIAL PRIMARY KEY,
91
- captured_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
92
-
93
- -- Top-level metrics
94
- total_squads INTEGER DEFAULT 0,
95
- total_commits INTEGER DEFAULT 0,
96
- total_prs_merged INTEGER DEFAULT 0,
97
- total_issues_closed INTEGER DEFAULT 0,
98
- total_issues_open INTEGER DEFAULT 0,
99
- goal_progress_pct INTEGER DEFAULT 0,
100
-
101
- -- Cost metrics (from Langfuse)
102
- cost_usd NUMERIC(10,4) DEFAULT 0,
103
- daily_budget_usd NUMERIC(10,2) DEFAULT 50,
104
- input_tokens INTEGER DEFAULT 0,
105
- output_tokens INTEGER DEFAULT 0,
106
-
107
- -- Git activity
108
- commits_30d INTEGER DEFAULT 0,
109
- avg_commits_per_day NUMERIC(5,1) DEFAULT 0,
110
- active_days INTEGER DEFAULT 0,
111
- peak_commits INTEGER DEFAULT 0,
112
- peak_date DATE,
113
-
114
- -- Squad breakdown (JSONB for flexibility)
115
- squads_data JSONB DEFAULT '[]'::jsonb,
116
- -- Format: [{ name, commits, prs, issues_closed, issues_open, goals_active, goals_total, progress }]
117
-
118
- -- Authors breakdown
119
- authors_data JSONB DEFAULT '[]'::jsonb,
120
- -- Format: [{ name, commits }]
121
-
122
- -- Repos breakdown
123
- repos_data JSONB DEFAULT '[]'::jsonb
124
- -- Format: [{ name, commits }]
125
- );
126
-
127
- -- Index for time-series queries
128
- CREATE INDEX IF NOT EXISTS idx_dashboard_snapshots_date ON squads.dashboard_snapshots(captured_at DESC);
129
-
130
- -- =============================================================================
131
- -- Telemetry Tables - Primary data store (Langfuse is optional forwarding)
132
- -- =============================================================================
133
-
134
- -- LLM generations - every API call to Claude/OpenAI
135
- CREATE TABLE IF NOT EXISTS squads.llm_generations (
136
- id SERIAL PRIMARY KEY,
137
- session_id VARCHAR(255) NOT NULL,
138
- trace_id VARCHAR(255),
139
-
140
- -- Context
141
- squad VARCHAR(100) DEFAULT 'hq',
142
- agent VARCHAR(100) DEFAULT 'coo',
143
- user_id VARCHAR(255),
144
-
145
- -- Model info
146
- model VARCHAR(100) NOT NULL,
147
-
148
- -- Token counts
149
- input_tokens INTEGER DEFAULT 0,
150
- output_tokens INTEGER DEFAULT 0,
151
- cache_read_tokens INTEGER DEFAULT 0,
152
- cache_creation_tokens INTEGER DEFAULT 0,
153
-
154
- -- Cost
155
- cost_usd NUMERIC(10,6) DEFAULT 0,
156
-
157
- -- Execution context (for per-agent cost tracking)
158
- task_type VARCHAR(50) DEFAULT 'execution', -- evaluation, execution, research, lead
159
- trigger_source VARCHAR(50) DEFAULT 'manual', -- manual, scheduled, event, smart
160
- execution_id VARCHAR(100), -- exec_<timestamp>_<random> for grouping
161
-
162
- -- Timing
163
- created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
164
- duration_ms INTEGER,
165
-
166
- -- Metadata (prompt summary, response summary, etc)
167
- metadata JSONB DEFAULT '{}'::jsonb
168
- );
169
-
170
- -- Tool executions - every tool call
171
- CREATE TABLE IF NOT EXISTS squads.tool_executions (
172
- id SERIAL PRIMARY KEY,
173
- session_id VARCHAR(255) NOT NULL,
174
- trace_id VARCHAR(255),
175
-
176
- -- Context
177
- squad VARCHAR(100) DEFAULT 'hq',
178
- agent VARCHAR(100) DEFAULT 'coo',
179
-
180
- -- Tool info
181
- tool_name VARCHAR(255) NOT NULL,
182
- success BOOLEAN DEFAULT true,
183
-
184
- -- Timing
185
- created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
186
- duration_ms INTEGER,
187
-
188
- -- Metadata (parameters, result summary)
189
- metadata JSONB DEFAULT '{}'::jsonb
190
- );
191
-
192
- -- Sessions - groups related generations/tools
193
- CREATE TABLE IF NOT EXISTS squads.sessions (
194
- id VARCHAR(255) PRIMARY KEY,
195
- squad VARCHAR(100) DEFAULT 'hq',
196
- agent VARCHAR(100) DEFAULT 'coo',
197
- user_id VARCHAR(255),
198
-
199
- -- Aggregated metrics (updated on each event)
200
- total_input_tokens INTEGER DEFAULT 0,
201
- total_output_tokens INTEGER DEFAULT 0,
202
- total_cost_usd NUMERIC(10,6) DEFAULT 0,
203
- generation_count INTEGER DEFAULT 0,
204
- tool_count INTEGER DEFAULT 0,
205
-
206
- -- Timing
207
- started_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
208
- last_activity_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
209
-
210
- -- Status
211
- status VARCHAR(50) DEFAULT 'active' -- active, completed, failed
212
- );
213
-
214
- -- Indexes for telemetry queries
215
- CREATE INDEX IF NOT EXISTS idx_llm_generations_session ON squads.llm_generations(session_id);
216
- CREATE INDEX IF NOT EXISTS idx_llm_generations_squad ON squads.llm_generations(squad, agent);
217
- CREATE INDEX IF NOT EXISTS idx_llm_generations_created ON squads.llm_generations(created_at DESC);
218
- CREATE INDEX IF NOT EXISTS idx_llm_generations_task_type ON squads.llm_generations(task_type);
219
- CREATE INDEX IF NOT EXISTS idx_llm_generations_execution ON squads.llm_generations(execution_id) WHERE execution_id IS NOT NULL;
220
- CREATE INDEX IF NOT EXISTS idx_tool_executions_session ON squads.tool_executions(session_id);
221
- CREATE INDEX IF NOT EXISTS idx_tool_executions_tool ON squads.tool_executions(tool_name);
222
- CREATE INDEX IF NOT EXISTS idx_sessions_squad ON squads.sessions(squad, agent);
223
- CREATE INDEX IF NOT EXISTS idx_sessions_status ON squads.sessions(status);
224
-
225
- -- =============================================================================
226
- -- Conversations - Captured from Claude Code sessions (engram hook)
227
- -- =============================================================================
228
-
229
- -- Conversations/memories from Claude Code sessions
230
- CREATE TABLE IF NOT EXISTS squads.conversations (
231
- id SERIAL PRIMARY KEY,
232
- session_id VARCHAR(255),
233
- user_id VARCHAR(255) DEFAULT 'local',
234
-
235
- -- Content
236
- role VARCHAR(50) NOT NULL, -- user, assistant, thinking
237
- content TEXT NOT NULL,
238
-
239
- -- Classification
240
- message_type VARCHAR(50) DEFAULT 'message', -- message, thinking, decision, learning
241
- importance VARCHAR(20) DEFAULT 'normal', -- low, normal, high
242
-
243
- -- Context
244
- squad VARCHAR(100),
245
- agent VARCHAR(100),
246
- working_dir VARCHAR(500),
247
-
248
- -- Timing
249
- created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
250
-
251
- -- Metadata (hook info, extracted entities, etc)
252
- metadata JSONB DEFAULT '{}'::jsonb
253
- );
254
-
255
- -- Full-text search on content
256
- CREATE INDEX IF NOT EXISTS idx_conversations_content_search
257
- ON squads.conversations USING gin(to_tsvector('english', content));
258
- CREATE INDEX IF NOT EXISTS idx_conversations_session ON squads.conversations(session_id);
259
- CREATE INDEX IF NOT EXISTS idx_conversations_user ON squads.conversations(user_id);
260
- CREATE INDEX IF NOT EXISTS idx_conversations_created ON squads.conversations(created_at DESC);
261
- CREATE INDEX IF NOT EXISTS idx_conversations_type ON squads.conversations(message_type);
262
- CREATE INDEX IF NOT EXISTS idx_conversations_importance ON squads.conversations(importance);
263
-
264
- -- =============================================================================
265
- -- CLI Events - Anonymous telemetry from squads-cli
266
- -- =============================================================================
267
-
268
- CREATE TABLE IF NOT EXISTS squads.cli_events (
269
- id SERIAL PRIMARY KEY,
270
- received_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
271
-
272
- -- Anonymous identification
273
- anonymous_id VARCHAR(100),
274
-
275
- -- Event data
276
- event_name VARCHAR(100) NOT NULL,
277
- cli_version VARCHAR(20),
278
-
279
- -- Properties (flexible JSON)
280
- properties JSONB DEFAULT '{}'::jsonb
281
- );
282
-
283
- -- Indexes for analytics queries
284
- CREATE INDEX IF NOT EXISTS idx_cli_events_name ON squads.cli_events(event_name);
285
- CREATE INDEX IF NOT EXISTS idx_cli_events_received ON squads.cli_events(received_at DESC);
286
- CREATE INDEX IF NOT EXISTS idx_cli_events_anonymous ON squads.cli_events(anonymous_id);
287
-
288
- -- =============================================================================
289
- -- Task Tracking - Track task completion, retries, and quality
290
- -- =============================================================================
291
-
292
- -- Tasks - track goal/task completion
293
- CREATE TABLE IF NOT EXISTS squads.tasks (
294
- id SERIAL PRIMARY KEY,
295
- task_id VARCHAR(255) UNIQUE NOT NULL, -- External ID for deduplication
296
- session_id VARCHAR(255),
297
-
298
- -- Context
299
- squad VARCHAR(100) NOT NULL,
300
- agent VARCHAR(100),
301
-
302
- -- Task info
303
- task_type VARCHAR(50) DEFAULT 'goal', -- goal, issue, pr, command
304
- description TEXT,
305
-
306
- -- Completion tracking
307
- status VARCHAR(50) DEFAULT 'started', -- started, completed, failed, cancelled
308
- success BOOLEAN,
309
- retry_count INTEGER DEFAULT 0,
310
-
311
- -- Output
312
- output_type VARCHAR(50), -- commit, pr, issue, file, none
313
- output_ref VARCHAR(500), -- URL or reference
314
-
315
- -- Cost
316
- total_tokens INTEGER DEFAULT 0,
317
- total_cost_usd NUMERIC(10,6) DEFAULT 0,
318
-
319
- -- Context window
320
- peak_context_tokens INTEGER DEFAULT 0, -- Max context size during task
321
- context_utilization_pct NUMERIC(5,2), -- Peak % of context window used
322
-
323
- -- Timing
324
- started_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
325
- completed_at TIMESTAMP WITH TIME ZONE,
326
- duration_ms INTEGER,
327
-
328
- -- Metadata
329
- metadata JSONB DEFAULT '{}'::jsonb
330
- );
331
-
332
- -- User feedback on task quality
333
- CREATE TABLE IF NOT EXISTS squads.task_feedback (
334
- id SERIAL PRIMARY KEY,
335
- task_id VARCHAR(255) REFERENCES squads.tasks(task_id),
336
-
337
- -- Rating
338
- quality_score INTEGER CHECK (quality_score >= 1 AND quality_score <= 5), -- 1-5 stars
339
-
340
- -- Detailed feedback
341
- was_helpful BOOLEAN,
342
- required_fixes BOOLEAN DEFAULT false,
343
- fix_description TEXT,
344
-
345
- -- Tags
346
- tags VARCHAR(50)[], -- ['accurate', 'fast', 'needed-revision', etc]
347
-
348
- -- Timing
349
- created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
350
-
351
- -- Free-form notes
352
- notes TEXT
353
- );
354
-
355
- -- Aggregated insights per squad/agent (materialized for fast queries)
356
- CREATE TABLE IF NOT EXISTS squads.agent_insights (
357
- id SERIAL PRIMARY KEY,
358
- captured_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
359
- period VARCHAR(20) NOT NULL, -- 'day', 'week', 'month'
360
- period_start DATE NOT NULL,
361
-
362
- -- Context
363
- squad VARCHAR(100) NOT NULL,
364
- agent VARCHAR(100),
365
-
366
- -- Task metrics
367
- tasks_started INTEGER DEFAULT 0,
368
- tasks_completed INTEGER DEFAULT 0,
369
- tasks_failed INTEGER DEFAULT 0,
370
- success_rate NUMERIC(5,2), -- percentage
371
-
372
- -- Retry metrics
373
- total_retries INTEGER DEFAULT 0,
374
- avg_retries_per_task NUMERIC(5,2),
375
- tasks_with_retries INTEGER DEFAULT 0,
376
-
377
- -- Quality metrics (from feedback)
378
- avg_quality_score NUMERIC(3,2),
379
- feedback_count INTEGER DEFAULT 0,
380
- helpful_pct NUMERIC(5,2),
381
- fix_required_pct NUMERIC(5,2),
382
-
383
- -- Efficiency metrics
384
- avg_duration_ms INTEGER,
385
- avg_tokens_per_task INTEGER,
386
- avg_cost_per_task NUMERIC(10,6),
387
- avg_context_utilization NUMERIC(5,2),
388
-
389
- -- Tool usage
390
- top_tools JSONB DEFAULT '[]'::jsonb, -- [{name, count, success_rate}]
391
- tool_failure_rate NUMERIC(5,2),
392
-
393
- UNIQUE(period, period_start, squad, agent)
394
- );
395
-
396
- -- Indexes for insights queries
397
- CREATE INDEX IF NOT EXISTS idx_tasks_squad ON squads.tasks(squad, agent);
398
- CREATE INDEX IF NOT EXISTS idx_tasks_status ON squads.tasks(status);
399
- CREATE INDEX IF NOT EXISTS idx_tasks_created ON squads.tasks(started_at DESC);
400
- CREATE INDEX IF NOT EXISTS idx_task_feedback_task ON squads.task_feedback(task_id);
401
- CREATE INDEX IF NOT EXISTS idx_agent_insights_lookup ON squads.agent_insights(squad, period, period_start DESC);
402
-
403
- -- =============================================================================
404
- -- SQUAD GOALS: Automatic agent binding and progress tracking
405
- -- =============================================================================
406
-
407
- -- Goals table - centralized goal tracking with numeric targets
408
- CREATE TABLE IF NOT EXISTS squads.squad_goals (
409
- id SERIAL PRIMARY KEY,
410
- squad VARCHAR(100) NOT NULL,
411
- description TEXT NOT NULL,
412
-
413
- -- Progress tracking
414
- completed BOOLEAN DEFAULT FALSE,
415
- progress_text TEXT,
416
- progress_value NUMERIC(5,2) DEFAULT 0, -- 0.00 to 100.00
417
-
418
- -- Numeric target (required for auto-agent binding)
419
- target_value NUMERIC,
420
- target_unit VARCHAR(50), -- leads, revenue, posts, features, etc.
421
-
422
- -- Status
423
- status VARCHAR(50) DEFAULT 'active', -- active, at_risk, on_hold, completed, blocked
424
-
425
- -- Timing
426
- deadline DATE,
427
- created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
428
- updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
429
-
430
- -- Metadata
431
- metadata JSONB DEFAULT '{}'::jsonb
432
- );
433
-
434
- -- Goal-agent bindings (automatic or manual)
435
- CREATE TABLE IF NOT EXISTS squads.goal_agents (
436
- id SERIAL PRIMARY KEY,
437
- goal_id INTEGER NOT NULL REFERENCES squads.squad_goals(id) ON DELETE CASCADE,
438
- squad VARCHAR(100) NOT NULL,
439
- agent VARCHAR(100) NOT NULL,
440
-
441
- -- Assignment metadata
442
- assignment_type VARCHAR(20) DEFAULT 'auto', -- auto, manual
443
- role VARCHAR(20), -- primary, supporting
444
- confidence NUMERIC(3,2), -- 0.00-1.00 for auto-matching quality
445
-
446
- created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
447
-
448
- UNIQUE(goal_id, agent)
449
- );
450
-
451
- -- Goal triggers (link goals to execution triggers)
452
- CREATE TABLE IF NOT EXISTS squads.goal_triggers (
453
- id SERIAL PRIMARY KEY,
454
- goal_id INTEGER NOT NULL REFERENCES squads.squad_goals(id) ON DELETE CASCADE,
455
- trigger_id INTEGER NOT NULL REFERENCES squads.triggers(id) ON DELETE CASCADE,
456
-
457
- created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
458
-
459
- UNIQUE(goal_id, trigger_id)
460
- );
461
-
462
- -- Add goal_id to trigger_executions (link executions to goals)
463
- ALTER TABLE squads.trigger_executions
464
- ADD COLUMN IF NOT EXISTS goal_id INTEGER REFERENCES squads.squad_goals(id) ON DELETE SET NULL;
465
-
466
- -- Indexes for goal queries
467
- CREATE INDEX IF NOT EXISTS idx_squad_goals_squad ON squads.squad_goals(squad);
468
- CREATE INDEX IF NOT EXISTS idx_squad_goals_status ON squads.squad_goals(status) WHERE status IN ('active', 'at_risk');
469
- CREATE INDEX IF NOT EXISTS idx_squad_goals_deadline ON squads.squad_goals(deadline) WHERE deadline IS NOT NULL;
470
- CREATE INDEX IF NOT EXISTS idx_goal_agents_goal ON squads.goal_agents(goal_id);
471
- CREATE INDEX IF NOT EXISTS idx_goal_agents_squad ON squads.goal_agents(squad);
472
- CREATE INDEX IF NOT EXISTS idx_goal_triggers_goal ON squads.goal_triggers(goal_id);
473
- CREATE INDEX IF NOT EXISTS idx_trigger_executions_goal ON squads.trigger_executions(goal_id) WHERE goal_id IS NOT NULL;
474
-
475
- -- Grant permissions
476
- GRANT ALL PRIVILEGES ON SCHEMA squads TO squads;
477
- GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA squads TO squads;
478
- GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA squads TO squads;
@@ -1,148 +0,0 @@
1
- -- =============================================================================
2
- -- Engram Database Initialization
3
- -- =============================================================================
4
- -- Creates the engram database with pgvector extension for memory storage
5
- -- This script runs after init-db.sql (squads schema)
6
-
7
- -- Create engram database
8
- SELECT 'CREATE DATABASE engram'
9
- WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = 'engram')\gexec
10
-
11
- -- Connect to engram database and set up extensions
12
- \c engram
13
-
14
- -- Enable pgvector for vector similarity search
15
- CREATE EXTENSION IF NOT EXISTS vector;
16
-
17
- -- Enable pg_trgm for fuzzy text search
18
- CREATE EXTENSION IF NOT EXISTS pg_trgm;
19
-
20
- -- Create engram schema
21
- CREATE SCHEMA IF NOT EXISTS engram;
22
-
23
- -- =============================================================================
24
- -- Auth Tables - Token-based authentication for MCP server
25
- -- =============================================================================
26
-
27
- -- Users table
28
- CREATE TABLE IF NOT EXISTS engram.users (
29
- id SERIAL PRIMARY KEY,
30
- email VARCHAR(255) UNIQUE NOT NULL,
31
- name VARCHAR(255),
32
- created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
33
- updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
34
- );
35
-
36
- -- API tokens table
37
- CREATE TABLE IF NOT EXISTS engram.tokens (
38
- id SERIAL PRIMARY KEY,
39
- user_id INTEGER REFERENCES engram.users(id) ON DELETE CASCADE,
40
- token_hash VARCHAR(255) NOT NULL,
41
- name VARCHAR(255),
42
- last_used_at TIMESTAMP WITH TIME ZONE,
43
- expires_at TIMESTAMP WITH TIME ZONE,
44
- created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
45
- revoked_at TIMESTAMP WITH TIME ZONE
46
- );
47
-
48
- -- Token usage audit log
49
- CREATE TABLE IF NOT EXISTS engram.token_usage (
50
- id SERIAL PRIMARY KEY,
51
- token_id INTEGER REFERENCES engram.tokens(id) ON DELETE SET NULL,
52
- user_id INTEGER REFERENCES engram.users(id) ON DELETE SET NULL,
53
- endpoint VARCHAR(255),
54
- ip_address INET,
55
- user_agent TEXT,
56
- created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
57
- );
58
-
59
- -- =============================================================================
60
- -- Memory Tables - Core memory storage
61
- -- =============================================================================
62
-
63
- -- Note: mem0 creates its own tables for memory storage
64
- -- These are additional tables for Engram-specific features
65
-
66
- -- Memory metadata (extends mem0 memories)
67
- CREATE TABLE IF NOT EXISTS engram.memory_metadata (
68
- id SERIAL PRIMARY KEY,
69
- memory_id VARCHAR(255) UNIQUE NOT NULL, -- Links to mem0 memory
70
- user_id INTEGER REFERENCES engram.users(id),
71
- project_id VARCHAR(255),
72
- importance FLOAT DEFAULT 0.5,
73
- access_count INTEGER DEFAULT 0,
74
- last_accessed_at TIMESTAMP WITH TIME ZONE,
75
- created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
76
- metadata JSONB DEFAULT '{}'::jsonb
77
- );
78
-
79
- -- Memory chunks (for large text chunking)
80
- CREATE TABLE IF NOT EXISTS engram.memory_chunks (
81
- id SERIAL PRIMARY KEY,
82
- parent_memory_id VARCHAR(255) NOT NULL,
83
- chunk_index INTEGER NOT NULL,
84
- total_chunks INTEGER NOT NULL,
85
- chunk_size INTEGER NOT NULL,
86
- has_overlap BOOLEAN DEFAULT false,
87
- created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
88
- UNIQUE(parent_memory_id, chunk_index)
89
- );
90
-
91
- -- =============================================================================
92
- -- Graph Sync Tables - Tracks Neo4j synchronization
93
- -- =============================================================================
94
-
95
- CREATE TABLE IF NOT EXISTS engram.graph_sync_log (
96
- id SERIAL PRIMARY KEY,
97
- memory_id VARCHAR(255) NOT NULL,
98
- sync_type VARCHAR(50) NOT NULL, -- 'create', 'update', 'delete', 'link'
99
- status VARCHAR(50) NOT NULL, -- 'pending', 'synced', 'failed'
100
- error_message TEXT,
101
- created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
102
- synced_at TIMESTAMP WITH TIME ZONE
103
- );
104
-
105
- -- =============================================================================
106
- -- Indexes
107
- -- =============================================================================
108
-
109
- -- Auth indexes
110
- CREATE INDEX IF NOT EXISTS idx_tokens_user ON engram.tokens(user_id);
111
- CREATE INDEX IF NOT EXISTS idx_tokens_hash ON engram.tokens(token_hash);
112
- CREATE INDEX IF NOT EXISTS idx_token_usage_token ON engram.token_usage(token_id);
113
- CREATE INDEX IF NOT EXISTS idx_token_usage_created ON engram.token_usage(created_at DESC);
114
-
115
- -- Memory indexes
116
- CREATE INDEX IF NOT EXISTS idx_memory_metadata_user ON engram.memory_metadata(user_id);
117
- CREATE INDEX IF NOT EXISTS idx_memory_metadata_project ON engram.memory_metadata(project_id);
118
- CREATE INDEX IF NOT EXISTS idx_memory_metadata_importance ON engram.memory_metadata(importance DESC);
119
- CREATE INDEX IF NOT EXISTS idx_memory_chunks_parent ON engram.memory_chunks(parent_memory_id);
120
-
121
- -- Graph sync indexes
122
- CREATE INDEX IF NOT EXISTS idx_graph_sync_memory ON engram.graph_sync_log(memory_id);
123
- CREATE INDEX IF NOT EXISTS idx_graph_sync_status ON engram.graph_sync_log(status);
124
- CREATE INDEX IF NOT EXISTS idx_graph_sync_pending ON engram.graph_sync_log(status) WHERE status = 'pending';
125
-
126
- -- =============================================================================
127
- -- Default User (for local development)
128
- -- =============================================================================
129
-
130
- INSERT INTO engram.users (email, name)
131
- VALUES ('local@squads.dev', 'Local Development User')
132
- ON CONFLICT (email) DO NOTHING;
133
-
134
- -- Grant permissions
135
- GRANT ALL PRIVILEGES ON SCHEMA engram TO squads;
136
- GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA engram TO squads;
137
- GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA engram TO squads;
138
-
139
- -- =============================================================================
140
- -- Verify setup
141
- -- =============================================================================
142
-
143
- DO $$
144
- BEGIN
145
- RAISE NOTICE 'Engram database initialized successfully';
146
- RAISE NOTICE 'Extensions: vector, pg_trgm';
147
- RAISE NOTICE 'Schema: engram';
148
- END $$;
@@ -1,10 +0,0 @@
1
- #!/bin/bash
2
- # Create separate database for Langfuse to avoid schema conflicts
3
- set -e
4
-
5
- psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
6
- CREATE DATABASE langfuse;
7
- GRANT ALL PRIVILEGES ON DATABASE langfuse TO squads;
8
- EOSQL
9
-
10
- echo "Created langfuse database"
@@ -1,34 +0,0 @@
1
- receivers:
2
- otlp:
3
- protocols:
4
- http:
5
- endpoint: 0.0.0.0:4318
6
-
7
- processors:
8
- batch:
9
- timeout: 5s
10
- send_batch_size: 100
11
-
12
- exporters:
13
- # Forward to Squads bridge (postgres primary, Langfuse optional)
14
- otlphttp:
15
- endpoint: http://squads-bridge:8080
16
- encoding: json
17
- headers: {}
18
- tls:
19
- insecure: true
20
-
21
- # Debug logging
22
- debug:
23
- verbosity: detailed
24
-
25
- service:
26
- pipelines:
27
- metrics:
28
- receivers: [otlp]
29
- processors: [batch]
30
- exporters: [otlphttp, debug]
31
- logs:
32
- receivers: [otlp]
33
- processors: [batch]
34
- exporters: [otlphttp, debug]
@@ -1,14 +0,0 @@
1
- FROM python:3.11-slim
2
-
3
- ENV PYTHONUNBUFFERED=1
4
-
5
- WORKDIR /app
6
-
7
- COPY requirements.txt .
8
- RUN pip install --no-cache-dir -r requirements.txt
9
-
10
- COPY squads_bridge.py .
11
-
12
- EXPOSE 8080
13
-
14
- CMD ["python", "squads_bridge.py"]
@@ -1,14 +0,0 @@
1
- FROM python:3.11-slim
2
-
3
- ENV PYTHONUNBUFFERED=1
4
-
5
- WORKDIR /app
6
-
7
- COPY requirements.txt .
8
- RUN pip install --no-cache-dir -r requirements.txt
9
-
10
- COPY anthropic_proxy.py .
11
-
12
- EXPOSE 8089
13
-
14
- CMD ["python", "anthropic_proxy.py"]