@llamaventures/cli 1.7.0 → 1.8.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.
- package/AGENT_BRIEFING.md +13 -0
- package/bin/llama-mcp.mjs +16 -0
- package/bin/llama.mjs +95 -4
- package/package.json +1 -1
package/AGENT_BRIEFING.md
CHANGED
|
@@ -29,6 +29,19 @@ Don't:
|
|
|
29
29
|
|
|
30
30
|
Conversation produces value → that value flows somewhere. This is not optional.
|
|
31
31
|
|
|
32
|
+
### When someone gives you info about a deal (the most common case)
|
|
33
|
+
|
|
34
|
+
A teammate says "I just met them and heard…" or pastes a chunk of notes. Your job: get it into the right deal, in the right layer, and confirm it's right. Three steps:
|
|
35
|
+
|
|
36
|
+
1. **Find the deal** — `llama deal search "<name>"` (Pipeline First). New name → offer to create it.
|
|
37
|
+
2. **Split what they gave you into two kinds** — this is the whole data model:
|
|
38
|
+
- **Verifiable claims → facts.** `llama deal fact add <dealId> --category <cat> --claim "…" --source "<where it came from>"`. A claim someone *relayed* ("their ARR is $3M", "raised from a16z") is a fact at **unverified** trust — it's hearsay until checked. Pass `--attested` ONLY if you actually verified it against a source yourself.
|
|
39
|
+
- **Their judgment / impression → a note.** `llama post <dealId> "…"`. "Founder seemed evasive", "I'd lean pass", "worth a second meeting" — opinion, not fact. Attributed, never "verified".
|
|
40
|
+
- A pasted blob → pull the verifiable claims out as facts, capture their take as a note.
|
|
41
|
+
3. **Confirm accuracy.** After filing, tell them in plain language what you recorded and where, and ask if it's right. Facts you add stay **unverified** until a human confirms them (then they rise to human-vouched) — the confirmation IS the trust step. Never silently mark something verified.
|
|
42
|
+
|
|
43
|
+
Why split it: facts and opinions live in different layers so the deal keeps one clean **source of truth** (facts, sourced + trust-rated) separate from people's **takes** (notes). The four layers — facts / notes / brief (AI's synthesis) / timeline — are documented in Llama Command's `docs/SCHEMA.md`.
|
|
44
|
+
|
|
32
45
|
### Where does this HTML / thesis / artifact go? (decision tree)
|
|
33
46
|
|
|
34
47
|
When the user hands you an HTML page, thesis write-up, market map, dashboard, IC memo, sector landscape — anything that isn't a one-off note — pick the destination in this order. **Llama Command native (the workbench) outranks Netlify for everything internal.** Only escape to Netlify when the page is truly going to a public / founder-facing URL.
|
package/bin/llama-mcp.mjs
CHANGED
|
@@ -303,6 +303,22 @@ server.registerTool(
|
|
|
303
303
|
callApi("GET", `/api/deals/${encodeURIComponent(dealId)}/blocks`)
|
|
304
304
|
);
|
|
305
305
|
|
|
306
|
+
server.registerTool(
|
|
307
|
+
"deal_feed",
|
|
308
|
+
{
|
|
309
|
+
description:
|
|
310
|
+
"The unified, time-sorted stream of everything a HUMAN has added to a deal — " +
|
|
311
|
+
"facts + notes/discussion + legacy posts, merged at query time, newest first. " +
|
|
312
|
+
"Excludes AI-generated content. Each item: kind (fact|note), ts, who, text, " +
|
|
313
|
+
"and for facts: source + trust rung + category.",
|
|
314
|
+
inputSchema: {
|
|
315
|
+
dealId: z.string(),
|
|
316
|
+
},
|
|
317
|
+
},
|
|
318
|
+
async ({ dealId }) =>
|
|
319
|
+
callApi("GET", `/api/deals/${encodeURIComponent(dealId)}/feed`)
|
|
320
|
+
);
|
|
321
|
+
|
|
306
322
|
server.registerTool(
|
|
307
323
|
"brief_add_text",
|
|
308
324
|
{
|
package/bin/llama.mjs
CHANGED
|
@@ -198,8 +198,7 @@ async function searchDeals(q, flags) {
|
|
|
198
198
|
return result;
|
|
199
199
|
}
|
|
200
200
|
|
|
201
|
-
|
|
202
|
-
console.log(`Llama Command CLI
|
|
201
|
+
const HELP_FULL = `Llama Command CLI
|
|
203
202
|
|
|
204
203
|
Agent onboarding (run once on first install):
|
|
205
204
|
llama agent-onboard # print AGENT_BRIEFING.md — the workflow contract for AI agents
|
|
@@ -225,6 +224,7 @@ Manually-set \`llc_\` tokens are used as a fallback.
|
|
|
225
224
|
Deals:
|
|
226
225
|
llama deal create "Company" --source <name> --description "..." --website https://...
|
|
227
226
|
llama deal show <dealId>
|
|
227
|
+
llama deal feed <dealId> # everything humans added (facts + notes), newest first
|
|
228
228
|
llama deal update <dealId> <field> <value>
|
|
229
229
|
Writable fields: status, theirStage, stage, notes, dealOwner, source,
|
|
230
230
|
description, website, location, founders, proposedAmount, roundSize,
|
|
@@ -410,7 +410,86 @@ Token discovery (in order):
|
|
|
410
410
|
Env:
|
|
411
411
|
LLAMA_TOKEN token override
|
|
412
412
|
LLAMA_API_URL API base URL override
|
|
413
|
-
|
|
413
|
+
`;
|
|
414
|
+
|
|
415
|
+
// ── Progressive help (Constitution §1) ──
|
|
416
|
+
// Default `llama` / `llama --help` prints a SHORT root: the command groups +
|
|
417
|
+
// a few starters. Drill into one group with `llama help <area>` (or
|
|
418
|
+
// `llama <area> --help`); `llama help all` prints the full reference above.
|
|
419
|
+
const HELP_ROOT = `Llama Command CLI — the \`llama\` command for the Llama Ventures workbench.
|
|
420
|
+
|
|
421
|
+
Common:
|
|
422
|
+
llama deal search "<name>" find a deal in the pipeline
|
|
423
|
+
llama deal show <dealId> full deal record
|
|
424
|
+
llama deal feed <dealId> everything humans added, newest first
|
|
425
|
+
llama post <dealId> "..." add a note to a deal
|
|
426
|
+
llama agent-onboard print the AI-agent workflow contract
|
|
427
|
+
|
|
428
|
+
Command groups — run \`llama help <group>\` for that group's commands:
|
|
429
|
+
deal create · show · feed · update · search · collaborators · links · delete
|
|
430
|
+
brief brief blocks: list · add · edit · history · refresh
|
|
431
|
+
facts deal facts + skill corrections (the sourced, trust-rated layer)
|
|
432
|
+
timeline timeline · posts · mentions
|
|
433
|
+
wiki cross-deal knowledge entries (markdown or HTML)
|
|
434
|
+
memo long-form HTML investment memo
|
|
435
|
+
html deal-specific HTML artifacts (/deals/<id>/browse/<slug>)
|
|
436
|
+
pitch external founder intake (no token needed)
|
|
437
|
+
ownership claim · nominate · approvals
|
|
438
|
+
admin audit events (system admin only)
|
|
439
|
+
auth setup · tokens · auth status
|
|
440
|
+
|
|
441
|
+
llama help all the full command reference (everything at once)
|
|
442
|
+
|
|
443
|
+
Auth: if you've run \`gcloud auth login\` with your @llamaventures.vc account,
|
|
444
|
+
the CLI auto-detects it — no token needed (\`llc_\` tokens are a fallback).`;
|
|
445
|
+
|
|
446
|
+
// Area → which top-level sections of HELP_FULL belong to it.
|
|
447
|
+
const HELP_AREA_MATCH = {
|
|
448
|
+
deal: [/^Deals/, /^Collaborators/, /^Soft-delete/, /^Deal links/, /^Deal soft-delete/],
|
|
449
|
+
brief: [/^Brief blocks/, /^Brief \/ persona/],
|
|
450
|
+
facts: [/^Deal facts/, /^Skill corrections/],
|
|
451
|
+
timeline: [/^Timeline/, /^Mentions/],
|
|
452
|
+
wiki: [/^Wiki/, /^Where does this HTML/],
|
|
453
|
+
memo: [/^Memo/],
|
|
454
|
+
html: [/^Deal page HTML/],
|
|
455
|
+
pitch: [/^External pitch/],
|
|
456
|
+
ownership: [/^Ownership/, /^Approvals/],
|
|
457
|
+
admin: [/^Admin/],
|
|
458
|
+
auth: [/^Setup/, /^Zero-config/, /^Token discovery/, /^Env/],
|
|
459
|
+
};
|
|
460
|
+
|
|
461
|
+
// Slice HELP_FULL into sections: a top-level (non-indented) header line plus
|
|
462
|
+
// the indented/blank lines that follow it, until the next header.
|
|
463
|
+
function helpSections() {
|
|
464
|
+
const out = [];
|
|
465
|
+
let cur = null;
|
|
466
|
+
for (const line of HELP_FULL.split("\n")) {
|
|
467
|
+
if (/^[A-Za-z]/.test(line)) {
|
|
468
|
+
cur = { head: line, lines: [line] };
|
|
469
|
+
out.push(cur);
|
|
470
|
+
} else if (cur) {
|
|
471
|
+
cur.lines.push(line);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
return out;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
function usage(area) {
|
|
478
|
+
if (area === "all") {
|
|
479
|
+
console.log(HELP_FULL);
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
const matchers = area && HELP_AREA_MATCH[area];
|
|
483
|
+
if (matchers) {
|
|
484
|
+
const blocks = helpSections()
|
|
485
|
+
.filter((s) => matchers.some((re) => re.test(s.head)))
|
|
486
|
+
.map((s) => s.lines.join("\n").replace(/\s+$/, ""));
|
|
487
|
+
if (blocks.length) {
|
|
488
|
+
console.log(blocks.join("\n\n"));
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
console.log(HELP_ROOT);
|
|
414
493
|
}
|
|
415
494
|
|
|
416
495
|
// ============================================================
|
|
@@ -688,7 +767,12 @@ async function main() {
|
|
|
688
767
|
return;
|
|
689
768
|
}
|
|
690
769
|
if (!area || area === "help" || area === "--help" || area === "-h") {
|
|
691
|
-
usage();
|
|
770
|
+
usage(area === "help" ? action : undefined);
|
|
771
|
+
return;
|
|
772
|
+
}
|
|
773
|
+
// `llama <area> --help` / `-h` → just that group's commands
|
|
774
|
+
if (action === "--help" || action === "-h") {
|
|
775
|
+
usage(area);
|
|
692
776
|
return;
|
|
693
777
|
}
|
|
694
778
|
|
|
@@ -978,6 +1062,13 @@ https://command.llamaventures.vc/settings/tokens, run
|
|
|
978
1062
|
return;
|
|
979
1063
|
}
|
|
980
1064
|
|
|
1065
|
+
if (area === "deal" && action === "feed") {
|
|
1066
|
+
const dealId = rest[0];
|
|
1067
|
+
if (!dealId) throw new Error("Usage: llama deal feed <dealId>");
|
|
1068
|
+
print(await request("GET", `/api/deals/${encodeURIComponent(dealId)}/feed`));
|
|
1069
|
+
return;
|
|
1070
|
+
}
|
|
1071
|
+
|
|
981
1072
|
if (area === "deal" && action === "update") {
|
|
982
1073
|
const [dealId, field, ...valueParts] = rest;
|
|
983
1074
|
const value = valueParts.join(" ");
|