@llamaventures/cli 1.22.1 → 1.23.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 +2 -0
- package/CHANGELOG.md +30 -0
- package/bin/llama-mcp.mjs +1 -2
- package/bin/llama.mjs +45 -12
- package/contracts/required-operations.json +4 -0
- package/lib/build-manifest.json +2 -2
- package/package.json +1 -1
package/AGENT_BRIEFING.md
CHANGED
|
@@ -66,6 +66,7 @@ A teammate says "I just met them and heard…" or pastes a chunk of notes. Your
|
|
|
66
66
|
2. **Split what they gave you into two kinds** — this is the whole data model:
|
|
67
67
|
- **A source packet with 2+ facts, or facts + a note → ingest once.** Build a JSON object with `source`, `facts`, and optional `note`, then run `llama deal ingest <dealId> --file <packet.json>`. This is the preferred agent path: one atomic, deduplicated, retry-safe commit. Reuse an explicit `idempotencyKey` when retrying the same material. The matching MCP tool is `deal_ingest` and uses the same packet shape.
|
|
68
68
|
- **Verifiable claims → facts.** `llama deal fact add <dealId> --category <cat> --claim "…" --source "<where it came from>" --source-url <url>`. 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. In raw API terms, the fact text field is `claim` (`value` is only a compatibility alias), `source` is the human-readable provenance label, and `sourceUrl` is the canonical URL.
|
|
69
|
+
- **Trust and contest are separate axes.** A *contested* fact is excluded from what the Deal Agent treats as current, whatever its trust rung — so a fact can read as both `human-vouched` and suppressed. `fact verify --status confirmed` does **not** lift a contest; the response tells you when one is still standing. To lift one: `llama deal fact uncontest <dealId> <factId> --reason "…"`. The lifted contest is kept in the fact's history, not erased.
|
|
69
70
|
- **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".
|
|
70
71
|
- A pasted blob → pull the verifiable claims out as facts, capture their take as a note.
|
|
71
72
|
3. **Read it back before you claim it's saved.** A generic tool call returning `{ok:true}` is NOT proof the content is where the user will look for it. `deal ingest` is the exception because its response is built from the rows and note block read back after commit: confirm `createdFacts`, `skippedFacts`, `note`, and `summary` in that receipt. For every other write, run `llama deal feed <dealId>` and confirm your fact/note actually appears. Never say "记好了 / saved" from a request acknowledgment alone — the #1 failure is an agent writing to the wrong surface (e.g. the brief, which is the Memo and does NOT appear in the feed) and reporting success anyway. If the authoritative ingest receipt or the feed read-back does not contain the material, fix it before reporting success.
|
|
@@ -217,6 +218,7 @@ llama deal create "Company" --description "..." --source-direction Outbound --st
|
|
|
217
218
|
llama deal create "Company" --description "..." --source-direction Outbound --status Outreached --deal-owner "owner@llamaventures.vc"
|
|
218
219
|
llama deal create "Company" --description "..." --source-direction Inbound --status Sourced --deal-owner "Exact Name"
|
|
219
220
|
llama deal update <dealId> <field> <value>
|
|
221
|
+
llama deal fact uncontest <dealId> <factId> --reason "..." # lift a wrong contest; verify does NOT
|
|
220
222
|
# writable: status theirStage stage notes dealOwner source sourceDirection description website
|
|
221
223
|
# location founders proposedAmount roundSize valuation sector subsector
|
|
222
224
|
# foundedYear leadInvestor investors (each write logs a deal_events row)
|
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,36 @@ this project adheres to [Semantic Versioning](https://semver.org).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [1.23.0] - 2026-08-05
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
- `llama deal fact uncontest <dealId> <factId> --reason "..."` lifts a contest
|
|
13
|
+
that turned out to be wrong. Contesting a fact removes it from what the Deal
|
|
14
|
+
Agent treats as current, and until now nothing could put it back — so a true
|
|
15
|
+
claim contested on weak evidence stayed suppressed in every regenerated brief
|
|
16
|
+
and memo. The lifted contest is kept in the fact's history server-side, not
|
|
17
|
+
erased. Requires Llama Command >= 3.21.0.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
- `--help` and `AGENT_BRIEFING.md` now state that **trust and contest are
|
|
21
|
+
separate axes**: `fact verify --status confirmed` does NOT lift a contest, and
|
|
22
|
+
a contested fact stays excluded from synthesis whatever its trust rung. The
|
|
23
|
+
server now returns a warning when a verify leaves a contest standing.
|
|
24
|
+
- `deal update` help says what `notes` is for — the one-line Summary headline at
|
|
25
|
+
the top of the deal page (~280 chars), not a place for meeting notes. It was
|
|
26
|
+
previously listed among 20 field names with no semantics, so the honest
|
|
27
|
+
reading was "notes" and long text landed in a headline slot.
|
|
28
|
+
|
|
29
|
+
### Note
|
|
30
|
+
This release also carries the unpublished 1.22.2 fix below.
|
|
31
|
+
|
|
32
|
+
## [1.22.2] - 2026-08-04
|
|
33
|
+
|
|
34
|
+
### Fixed
|
|
35
|
+
- `llama claim` and `llama nominate` now require `--reason` and send it to
|
|
36
|
+
Llama Command's audited Owner-label endpoint. The CLI no longer emits a
|
|
37
|
+
request that Core must reject before recording the responsibility change.
|
|
38
|
+
|
|
9
39
|
## [1.22.1] - 2026-08-04
|
|
10
40
|
|
|
11
41
|
### Changed
|
package/bin/llama-mcp.mjs
CHANGED
|
@@ -457,8 +457,7 @@ server.registerTool(
|
|
|
457
457
|
{
|
|
458
458
|
description:
|
|
459
459
|
"Create a new pipeline deal. Source defaults to the caller's user record. " +
|
|
460
|
-
"Owner
|
|
461
|
-
"until a partner approves it via /partner/approvals.",
|
|
460
|
+
"Owner is an audited responsibility label, not an operating-permission boundary.",
|
|
462
461
|
inputSchema: {
|
|
463
462
|
companyName: z.string(),
|
|
464
463
|
description: z.string().optional().describe("one-liner: what they do"),
|
package/bin/llama.mjs
CHANGED
|
@@ -395,6 +395,9 @@ Deals:
|
|
|
395
395
|
description, website, location, founders, founderInfo, proposedAmount,
|
|
396
396
|
roundSize, valuation, deckLink, folderUrl, sector, subsector,
|
|
397
397
|
foundedYear, leadInvestor, investors, agentActive.
|
|
398
|
+
'notes' is the ONE-LINE judgment shown as the Summary headline at the top of
|
|
399
|
+
the deal page (~280 chars). Meeting notes and narrative go in a comment
|
|
400
|
+
(llama post); verifiable claims go in facts (llama deal fact add).
|
|
398
401
|
e.g. llama deal update <dealId> website https://acme.ai
|
|
399
402
|
llama deal update <dealId> status Interested
|
|
400
403
|
llama deal update <dealId> sector "Developer Tools"
|
|
@@ -446,12 +449,12 @@ Deal links (separate from brief link blocks — these live in deal_links):
|
|
|
446
449
|
llama deal link restore <dealId> <linkId>
|
|
447
450
|
|
|
448
451
|
Ownership:
|
|
449
|
-
llama claim <dealId>
|
|
450
|
-
llama nominate <dealId> --user <userId>
|
|
451
|
-
|
|
452
|
-
|
|
452
|
+
llama claim <dealId> --reason "..." # set yourself as Owner
|
|
453
|
+
llama nominate <dealId> --user <userId> --reason "..." # set another teammate as Owner
|
|
454
|
+
Owner is an audited responsibility label, not a permission boundary. Any
|
|
455
|
+
internal teammate can change it after Partner Support; reason is mandatory.
|
|
453
456
|
|
|
454
|
-
Approvals (
|
|
457
|
+
Approvals (Partner queue — contribution decisions):
|
|
455
458
|
llama approvals list
|
|
456
459
|
llama approvals decide <approvalId> approved|rejected [--note "..."]
|
|
457
460
|
|
|
@@ -503,6 +506,9 @@ Deal facts (AI-extracted or human-asserted, with verification):
|
|
|
503
506
|
llama deal fact list <dealId>
|
|
504
507
|
llama deal fact add <dealId> --category <cat> --claim "<text>" [--source "..."] [--source-url <url>] [--confidence high|medium|low] [--attested]
|
|
505
508
|
llama deal fact verify <dealId> <factId> --status confirmed|disputed [--corrected-value "..."]
|
|
509
|
+
llama deal fact uncontest <dealId> <factId> --reason "<why the contest was wrong>"
|
|
510
|
+
contest and trust are separate axes: 'verify --status confirmed' does NOT lift a contest,
|
|
511
|
+
and a contested fact stays excluded from what the Deal Agent treats as current.
|
|
506
512
|
|
|
507
513
|
Mentions / Inbox:
|
|
508
514
|
llama mentions # default: my unresolved cues
|
|
@@ -1826,7 +1832,29 @@ async function main() {
|
|
|
1826
1832
|
return;
|
|
1827
1833
|
}
|
|
1828
1834
|
|
|
1829
|
-
|
|
1835
|
+
// Lift a contest that turned out to be wrong. Contesting a claim removes
|
|
1836
|
+
// it from everything the Deal Agent treats as current; before this existed
|
|
1837
|
+
// there was no way back, so a TRUE claim contested on weak evidence stayed
|
|
1838
|
+
// suppressed in every regenerated brief and memo. `verify --status
|
|
1839
|
+
// confirmed` does NOT do this — trust and contest are separate axes.
|
|
1840
|
+
if (sub === "uncontest") {
|
|
1841
|
+
const factId = rest[2];
|
|
1842
|
+
const reason = flags.reason !== undefined && flags.reason !== true ? String(flags.reason).trim() : "";
|
|
1843
|
+
if (!factId || !reason) {
|
|
1844
|
+
throw new Error(
|
|
1845
|
+
`Usage: llama deal fact uncontest <dealId> <factId> --reason "<why the contest was wrong>"`
|
|
1846
|
+
);
|
|
1847
|
+
}
|
|
1848
|
+
// @core-api-operation POST /api/deals/{dealId}/facts/{factId}/uncontest
|
|
1849
|
+
print(await request(
|
|
1850
|
+
"POST",
|
|
1851
|
+
`/api/deals/${encodeURIComponent(dealId)}/facts/${encodeURIComponent(factId)}/uncontest`,
|
|
1852
|
+
{ reason }
|
|
1853
|
+
));
|
|
1854
|
+
return;
|
|
1855
|
+
}
|
|
1856
|
+
|
|
1857
|
+
throw new Error(`Unknown fact sub-command "${sub}". Use list, add, verify, or uncontest.`);
|
|
1830
1858
|
}
|
|
1831
1859
|
|
|
1832
1860
|
// ----- Brief refresh: trigger stale-section re-eval watcher run -----
|
|
@@ -1890,12 +1918,16 @@ async function main() {
|
|
|
1890
1918
|
// ----- Ownership: self-claim -----
|
|
1891
1919
|
if (area === "claim") {
|
|
1892
1920
|
const dealId = action; // second positional
|
|
1893
|
-
|
|
1921
|
+
const { flags } = parseFlags(rest, ["reason"]);
|
|
1922
|
+
const reason = typeof flags.reason === "string" ? flags.reason.trim() : "";
|
|
1923
|
+
if (!dealId || !reason) {
|
|
1924
|
+
throw new Error('Usage: llama claim <dealId> --reason "<why this person should own it>"');
|
|
1925
|
+
}
|
|
1894
1926
|
const me = await request("GET", "/api/me");
|
|
1895
1927
|
print(await request(
|
|
1896
1928
|
"POST",
|
|
1897
1929
|
`/api/deals/${encodeURIComponent(dealId)}/propose-owner`,
|
|
1898
|
-
{ userId: me.id }
|
|
1930
|
+
{ userId: me.id, reason }
|
|
1899
1931
|
));
|
|
1900
1932
|
return;
|
|
1901
1933
|
}
|
|
@@ -1903,15 +1935,16 @@ async function main() {
|
|
|
1903
1935
|
// ----- Ownership: partner nominates someone else -----
|
|
1904
1936
|
if (area === "nominate") {
|
|
1905
1937
|
const dealId = action;
|
|
1906
|
-
const { flags } = parseFlags(rest);
|
|
1938
|
+
const { flags } = parseFlags(rest, ["user", "reason"]);
|
|
1907
1939
|
const userId = Number(flags.user);
|
|
1908
|
-
|
|
1909
|
-
|
|
1940
|
+
const reason = typeof flags.reason === "string" ? flags.reason.trim() : "";
|
|
1941
|
+
if (!dealId || !Number.isFinite(userId) || !reason) {
|
|
1942
|
+
throw new Error('Usage: llama nominate <dealId> --user <userId> --reason "<why>"');
|
|
1910
1943
|
}
|
|
1911
1944
|
print(await request(
|
|
1912
1945
|
"POST",
|
|
1913
1946
|
`/api/deals/${encodeURIComponent(dealId)}/propose-owner`,
|
|
1914
|
-
{ userId }
|
|
1947
|
+
{ userId, reason }
|
|
1915
1948
|
));
|
|
1916
1949
|
return;
|
|
1917
1950
|
}
|
package/lib/build-manifest.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"format": "llama.cli-build.v1",
|
|
3
3
|
"packageName": "@llamaventures/cli",
|
|
4
|
-
"packageVersion": "1.
|
|
5
|
-
"sourceSha": "
|
|
4
|
+
"packageVersion": "1.23.0",
|
|
5
|
+
"sourceSha": "3f3fb4ae90469e4c561bc8ad319c59d877d0fcf2",
|
|
6
6
|
"sourceKind": "github",
|
|
7
7
|
"sourceDirty": false,
|
|
8
8
|
"coreApiContract": {
|