@llamaventures/cli 1.15.0 → 1.15.1

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/AGENT_BRIEFING.md CHANGED
@@ -38,6 +38,9 @@ Any time the user mentions a company name or founder name:
38
38
  1. **Run `llama deal search "<name>"` BEFORE web search.** Always. No exceptions.
39
39
  2. If pipeline has it → pull the data, integrate into your reply silently.
40
40
  3. If pipeline doesn't have it → ask once: "New name. Add to pipeline? (Y/n)". On yes, `llama deal create`.
41
+ - Use `--status Outreached` when we only contacted/logged the company and have no response or effective relationship yet.
42
+ - Use `--status Sourced` only once there is a response, intro, meeting, or another real relationship signal.
43
+ - Also set `--source-direction Inbound` if the deal came into the firm; set `--source-direction Outbound` if Llama found/listed/reached out first.
41
44
  4. If user gives you new facts (status / valuation / founder note) → `llama deal update` immediately, tell the user **one line** afterward.
42
45
 
43
46
  Don't:
@@ -201,12 +204,20 @@ llama deal show <dealId>
201
204
  llama deal list [--owner ...] [--status ...]
202
205
 
203
206
  # Pipeline — write
204
- llama deal create "Company" --description "..."
207
+ llama deal create "Company" --description "..." --source-direction Outbound --status Outreached
208
+ llama deal create "Company" --description "..." --source-direction Inbound --status Sourced
205
209
  llama deal update <dealId> <field> <value>
206
- # writable: status theirStage stage notes dealOwner source description website
210
+ # writable: status theirStage stage notes dealOwner source sourceDirection description website
207
211
  # location founders proposedAmount roundSize valuation sector subsector
208
212
  # foundedYear leadInvestor investors (each write logs a deal_events row)
209
213
 
214
+ # Our Stage vocabulary starts with:
215
+ # Outreached → Sourced → First Meeting → Diligence → Partner Meeting → Term Sheet → Invested
216
+ # `Outreached` is relationship memory only. Do not inflate it to `Sourced`
217
+ # unless a real relationship signal exists.
218
+ # `sourceDirection` is separate: Inbound = came into the firm; Outbound =
219
+ # we found/listed/reached out first.
220
+
210
221
  # Brief blocks
211
222
  llama brief blocks <dealId>
212
223
  llama brief add-text <dealId> --heading "..." --body "..."
package/CHANGELOG.md CHANGED
@@ -6,6 +6,17 @@ this project adheres to [Semantic Versioning](https://semver.org).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.15.1] — 2026-06-16
10
+
11
+ ### Changed
12
+ - Documented the new `Outreached` Our Stage across CLI, MCP, and agent
13
+ briefing surfaces. Agents should use `Outreached` for logged outreach
14
+ without a response/effective relationship, and reserve `Sourced` for real
15
+ relationship signals.
16
+ - Added `sourceDirection` / `--source-direction` guidance across CLI, MCP, and
17
+ agent briefing surfaces. Use `Inbound` for deals that came into the firm and
18
+ `Outbound` for companies Llama found/listed/reached out to first.
19
+
9
20
  ## [1.15.0] — 2026-06-15
10
21
 
11
22
  ### Added
package/README.md CHANGED
@@ -180,11 +180,14 @@ llama token show
180
180
 
181
181
  # Pipeline — read
182
182
  llama deal search "acme ai"
183
+ llama deal list --owner alex --status Outreached
184
+ llama deal list --source-direction Outbound --status Outreached
183
185
  llama deal list --owner alex --status Diligence
184
186
  llama deal show <dealId>
185
187
 
186
188
  # Pipeline — write
187
- llama deal create "Acme AI" --description "..." --source Gavin
189
+ llama deal create "Acme AI" --description "..." --source Gavin --source-direction Outbound --status Outreached
190
+ llama deal create "Acme AI" --description "..." --source Gavin --source-direction Inbound --status Sourced
188
191
  llama deal update <dealId> status Diligence
189
192
  llama deal enrich <dealId> --dry-run
190
193
  llama deal enrich <dealId> --apply --executor server_agent
@@ -193,6 +196,13 @@ llama deal agent run <dealId> --message "collect founder evidence and update typ
193
196
  llama deal delete <dealId> # soft (audit-logged)
194
197
  llama deal restore <dealId>
195
198
 
199
+ # Status semantics
200
+ # Outreached = contact/logged, but no response or effective relationship yet.
201
+ # Sourced = response, intro, meeting, or another real relationship signal exists.
202
+ # sourceDirection is separate:
203
+ # Inbound = came into the firm.
204
+ # Outbound = we found/listed/reached out first.
205
+
196
206
  # Deal Brief — ordered, typed blocks (text · link · embed · callout)
197
207
  llama brief blocks <dealId>
198
208
  llama brief add-text <dealId> --heading "..." --body "..."
package/README.zh-CN.md CHANGED
@@ -201,11 +201,14 @@ llama token show
201
201
 
202
202
  # Pipeline——读
203
203
  llama deal search "acme ai"
204
+ llama deal list --owner alex --status Outreached
205
+ llama deal list --source-direction Outbound --status Outreached
204
206
  llama deal list --owner alex --status Diligence
205
207
  llama deal show <dealId>
206
208
 
207
209
  # Pipeline——写
208
- llama deal create "Acme AI" --description "..." --source Gavin
210
+ llama deal create "Acme AI" --description "..." --source Gavin --source-direction Outbound --status Outreached
211
+ llama deal create "Acme AI" --description "..." --source Gavin --source-direction Inbound --status Sourced
209
212
  llama deal update <dealId> status Diligence
210
213
  llama deal enrich <dealId> --dry-run
211
214
  llama deal enrich <dealId> --apply --executor server_agent
@@ -214,6 +217,13 @@ llama deal agent run <dealId> --message "collect founder evidence and update typ
214
217
  llama deal delete <dealId> # 软删除(审计日志记录)
215
218
  llama deal restore <dealId>
216
219
 
220
+ # Status 语义
221
+ # Outreached = 只是联系/记录了,还没有回复或有效关系。
222
+ # Sourced = 已有回复、intro、会议,或其它真实关系信号。
223
+ # sourceDirection 是单独维度:
224
+ # Inbound = 自然流入公司。
225
+ # Outbound = 我们主动发现/建名单/触达。
226
+
217
227
  # Deal Brief——有序的、有类型的 block(text · link · embed · callout)
218
228
  llama brief blocks <dealId>
219
229
  llama brief add-text <dealId> --heading "..." --body "..."
package/bin/llama-mcp.mjs CHANGED
@@ -280,7 +280,7 @@ server.registerTool(
280
280
  {
281
281
  description:
282
282
  "Search the Llama Ventures deal pipeline. Fuzzy match on company name, " +
283
- "founders, description, founder info, notes, deal owner, source, and location. " +
283
+ "founders, description, founder info, notes, deal owner, source, source direction, and location. " +
284
284
  "Returns up to `limit` deals (default 200, cap 1000).",
285
285
  inputSchema: {
286
286
  q: z.string().optional().describe("fuzzy search query across all text fields"),
@@ -291,7 +291,7 @@ server.registerTool(
291
291
  .string()
292
292
  .optional()
293
293
  .describe(
294
- "exact match on 'Our Stage' (Sourced, First Meeting, Diligence, Partner Meeting, Term Sheet, Invested, Passed, Stalled, Future, Unknown)"
294
+ "exact match on 'Our Stage' (Outreached, Sourced, First Meeting, Diligence, Partner Meeting, Term Sheet, Invested, Passed, Stalled, Future, Unknown). Outreached means contact was logged but no effective relationship/response exists yet."
295
295
  ),
296
296
  theirStage: z.string().optional().describe("exact match on 'Their Stage'"),
297
297
  stage: z
@@ -300,6 +300,10 @@ server.registerTool(
300
300
  .describe(
301
301
  "exact match on Round (Pre-Seed, Seed, Series A, Series B, Series C+, Stealth)"
302
302
  ),
303
+ sourceDirection: z
304
+ .string()
305
+ .optional()
306
+ .describe("exact match on source direction: Inbound, Outbound, or Unknown"),
303
307
  limit: z.number().optional().describe("max results (default 200, cap 1000)"),
304
308
  offset: z.number().optional(),
305
309
  },
@@ -318,7 +322,7 @@ server.registerTool(
318
322
  {
319
323
  description:
320
324
  "Get the full canonical record for one deal by uuid. Includes status, " +
321
- "stage, founders, owner, source, valuation, all whitelisted writable fields, " +
325
+ "stage, founders, owner, source, sourceDirection, valuation, all whitelisted writable fields, " +
322
326
  "and the `extra` JSONB blob.",
323
327
  inputSchema: {
324
328
  dealId: z.string().describe("deal uuid"),
@@ -348,8 +352,17 @@ server.registerTool(
348
352
  .string()
349
353
  .optional()
350
354
  .describe("Pre-Seed | Seed | Series A | Series B | Series C+ | Stealth"),
351
- status: z.string().optional().describe("Our Stage workflow position"),
355
+ status: z
356
+ .string()
357
+ .optional()
358
+ .describe(
359
+ "Our Stage workflow position. Use Outreached when we only contacted/logged them and have no response/effective relationship; use Sourced only once there is a response, intro, meeting, or other real relationship signal."
360
+ ),
352
361
  source: z.string().optional().describe("free-form sourced-by; recommend nominating a user"),
362
+ sourceDirection: z
363
+ .string()
364
+ .optional()
365
+ .describe("Separate direction tag: Inbound if the deal came into the firm; Outbound if Llama found/listed/reached out first; Unknown if unclear."),
353
366
  notes: z.string().optional(),
354
367
  location: z.string().optional(),
355
368
  },
@@ -362,7 +375,7 @@ server.registerTool(
362
375
  {
363
376
  description:
364
377
  "Update a single whitelisted field on a deal. Writable fields: status, theirStage, " +
365
- "notes, stage, dealOwner, source, description, website, location, founders, " +
378
+ "notes, stage, dealOwner, source, sourceDirection, description, website, location, founders, " +
366
379
  "proposedAmount, roundSize, valuation, sector, subsector, foundedYear, leadInvestor, " +
367
380
  "investors. Logs a field_change event in deal_events.",
368
381
  inputSchema: {
package/bin/llama.mjs CHANGED
@@ -141,7 +141,7 @@ function clientSideMatch(deal, filters) {
141
141
  const fields = [
142
142
  deal.companyName, deal.founders, deal.founderInfo,
143
143
  deal.description, deal.notes, deal.dealOwner,
144
- deal.source, deal.location,
144
+ deal.source, deal.sourceDirection, deal.location,
145
145
  ];
146
146
  if (!fields.some((f) => incl(f, filters.q))) return false;
147
147
  }
@@ -151,6 +151,7 @@ function clientSideMatch(deal, filters) {
151
151
  if (filters.status && !eq(deal.status, filters.status)) return false;
152
152
  if (filters.theirStage && !eq(deal.theirStage, filters.theirStage)) return false;
153
153
  if (filters.stage && !eq(deal.stage, filters.stage)) return false;
154
+ if (filters.sourceDirection && !eq(deal.sourceDirection, filters.sourceDirection)) return false;
154
155
  return true;
155
156
  }
156
157
 
@@ -158,11 +159,14 @@ function clientSideMatch(deal, filters) {
158
159
  function buildDealsQuery(q, flags) {
159
160
  const params = new URLSearchParams();
160
161
  if (q) params.set("q", q);
161
- for (const key of ["companyName", "founder", "owner", "status", "theirStage", "stage", "limit", "offset"]) {
162
+ for (const key of ["companyName", "founder", "owner", "status", "theirStage", "stage", "sourceDirection", "limit", "offset"]) {
162
163
  if (flags[key] !== undefined && flags[key] !== true) {
163
164
  params.set(key, String(flags[key]));
164
165
  }
165
166
  }
167
+ if (flags["source-direction"] !== undefined && flags["source-direction"] !== true) {
168
+ params.set("sourceDirection", String(flags["source-direction"]));
169
+ }
166
170
  return params;
167
171
  }
168
172
 
@@ -185,6 +189,7 @@ async function searchDeals(q, flags) {
185
189
  status: flags.status,
186
190
  theirStage: flags.theirStage,
187
191
  stage: flags.stage,
192
+ sourceDirection: flags.sourceDirection || flags["source-direction"],
188
193
  };
189
194
  const filtered = result.filter((d) => clientSideMatch(d, filters));
190
195
  const limit = Number(flags.limit) > 0 ? Number(flags.limit) : 200;
@@ -297,15 +302,16 @@ auto-detects \`gcloud auth print-identity-token\` and uses Bearer auth.
297
302
  Manually-set \`llc_\` tokens are used as a fallback.
298
303
 
299
304
  Deals:
300
- llama deal create "Company" --source <name> --description "..." --website https://...
305
+ llama deal create "Company" --source <name> --source-direction Inbound|Outbound --description "..." --status Outreached|Sourced --website https://...
301
306
  llama deal show <dealId>
302
307
  llama deal feed <dealId> # every contribution (facts + notes), human-typed or assistant-drafted, newest first
303
308
  llama deal update <dealId> <field> <value>
304
- Writable fields: status, theirStage, stage, notes, dealOwner, source,
309
+ Writable fields: status, theirStage, stage, notes, dealOwner, source, sourceDirection,
305
310
  description, website, location, founders, founderInfo, proposedAmount,
306
311
  roundSize, valuation, deckLink, folderUrl, sector, subsector,
307
312
  foundedYear, leadInvestor, investors, agentActive.
308
313
  e.g. llama deal update <dealId> website https://acme.ai
314
+ llama deal update <dealId> status Outreached
309
315
  llama deal update <dealId> sector "Developer Tools"
310
316
  llama deal update <dealId> foundedYear 2024
311
317
  llama deal update <dealId> leadInvestor "Acme Capital"
@@ -320,7 +326,7 @@ Deals:
320
326
  string. Audited to deal_events as field_change "extra.<key>".
321
327
  llama deal extra unset <dealId> <key> # delete the key (admin)
322
328
  llama deal search <query> [--founder name] [--owner <user-key>] [--status Diligence]
323
- [--theirStage Raising] [--stage Seed]
329
+ [--theirStage Raising] [--stage Seed] [--source-direction Inbound]
324
330
  [--limit 200] [--offset 0]
325
331
  llama deal list [--owner ...] [--status ...] [...same flags as search]
326
332
 
@@ -1243,6 +1249,7 @@ https://command.llamaventures.vc/settings/tokens, run
1243
1249
  const body = {
1244
1250
  companyName,
1245
1251
  source: flags.source,
1252
+ sourceDirection: flags.sourceDirection || flags["source-direction"],
1246
1253
  description: flags.description,
1247
1254
  website: flags.website,
1248
1255
  notes: flags.notes,
@@ -1319,7 +1326,7 @@ https://command.llamaventures.vc/settings/tokens, run
1319
1326
  const q = positional.join(" ").trim();
1320
1327
  if (!q && Object.keys(flags).length === 0) {
1321
1328
  throw new Error(
1322
- `Usage: llama deal search <query> [--founder ...] [--owner ...] [--status ...] [--stage ...] [--limit N]`
1329
+ `Usage: llama deal search <query> [--founder ...] [--owner ...] [--status ...] [--stage ...] [--source-direction Inbound|Outbound] [--limit N]`
1323
1330
  );
1324
1331
  }
1325
1332
  print(await searchDeals(q, flags));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@llamaventures/cli",
3
- "version": "1.15.0",
3
+ "version": "1.15.1",
4
4
  "description": "CLI + MCP server for the Llama Ventures investment workbench (command.llamaventures.vc).",
5
5
  "type": "module",
6
6
  "scripts": {