@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 +13 -2
- package/CHANGELOG.md +11 -0
- package/README.md +11 -1
- package/README.zh-CN.md +11 -1
- package/bin/llama-mcp.mjs +18 -5
- package/bin/llama.mjs +13 -6
- package/package.json +1 -1
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
|
|
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));
|