@nestbox-ai/cli 1.0.63 → 1.0.64
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/README.md +528 -10
- package/dist/agents/reportGenerator/REPORT_CONFIG_GUIDE.md +1449 -0
- package/dist/agents/reportGenerator/SYSTEM_PROMPT.md +28 -0
- package/dist/agents/reportGenerator/annual_report_10k.yaml +633 -0
- package/dist/agents/reportGenerator/index.d.ts +18 -0
- package/dist/agents/reportGenerator/index.js +210 -0
- package/dist/agents/reportGenerator/index.js.map +1 -0
- package/dist/agents/reportGenerator/report_config.schema.yaml +905 -0
- package/dist/agents/reportGenerator/vc_portfolio_monitoring.yaml +443 -0
- package/dist/commands/generate/reportComposer.d.ts +2 -0
- package/dist/commands/generate/reportComposer.js +99 -0
- package/dist/commands/generate/reportComposer.js.map +1 -0
- package/dist/commands/generate.js +2 -0
- package/dist/commands/generate.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
# VC Portfolio Monitoring Report
|
|
2
|
+
# Use case: Monthly portfolio review across multiple portfolio companies.
|
|
3
|
+
# Each company has its own docset (separate GraphRAG index).
|
|
4
|
+
# Extracts ARR, burn, runway, headcount, and key risks per company,
|
|
5
|
+
# then synthesises a cross-portfolio dashboard.
|
|
6
|
+
# Schema v2.2
|
|
7
|
+
|
|
8
|
+
schema_version: "2.2"
|
|
9
|
+
|
|
10
|
+
report:
|
|
11
|
+
id: vc_portfolio_monitoring_q1_2026
|
|
12
|
+
name: "VC Portfolio Monitoring — Q1 2026"
|
|
13
|
+
description: |
|
|
14
|
+
Cross-portfolio KPI dashboard extracting key metrics from each portfolio
|
|
15
|
+
company's board update or monthly investor report.
|
|
16
|
+
Covers ARR/revenue, burn/runway, headcount, recent milestones, and risks.
|
|
17
|
+
version: "2026.Q1"
|
|
18
|
+
|
|
19
|
+
context:
|
|
20
|
+
fund_name: "Acme Ventures Fund III"
|
|
21
|
+
reporting_period: "Q1 2026"
|
|
22
|
+
as_of_date: "2026-03-31"
|
|
23
|
+
currency: "USD"
|
|
24
|
+
units_policy: |
|
|
25
|
+
Return raw full-dollar numbers. Convert abbreviations:
|
|
26
|
+
"$2.5M" → 2500000, "$350K" → 350000, "$1.2B" → 1200000000.
|
|
27
|
+
Percentages as whole numbers: 92.3 not 0.923.
|
|
28
|
+
Return null for any value not explicitly found in the document.
|
|
29
|
+
answer_quality_policy:
|
|
30
|
+
numeric_requirements:
|
|
31
|
+
- "Every numeric value must have a citation (c_xxxxxxxx format)"
|
|
32
|
+
- "Return null for values not explicitly stated — never estimate"
|
|
33
|
+
labeling_requirements:
|
|
34
|
+
- "Always include the reporting period with each metric"
|
|
35
|
+
|
|
36
|
+
doc_repository:
|
|
37
|
+
api_base_url: ${DOC_REPO_URL:-http://localhost:8080}
|
|
38
|
+
api_key: ${DOC_REPO_API_KEY}
|
|
39
|
+
rotation: 200
|
|
40
|
+
|
|
41
|
+
mcp: []
|
|
42
|
+
|
|
43
|
+
# Each portfolio company is its own docset with its own GraphRAG index
|
|
44
|
+
docsets:
|
|
45
|
+
- id: company_alpha
|
|
46
|
+
description: "Alpha Inc — Q1 2026 board update"
|
|
47
|
+
api_key: ${OPENAI_API_KEY}
|
|
48
|
+
docs:
|
|
49
|
+
- id: alpha_board_update
|
|
50
|
+
locator: "repo:doc-alpha0001"
|
|
51
|
+
description: "Alpha Inc Q1 2026 Board Update"
|
|
52
|
+
|
|
53
|
+
- id: company_beta
|
|
54
|
+
description: "Beta Systems — Q1 2026 monthly investor report"
|
|
55
|
+
api_key: ${OPENAI_API_KEY}
|
|
56
|
+
docs:
|
|
57
|
+
- id: beta_investor_report
|
|
58
|
+
locator: "repo:doc-beta0002"
|
|
59
|
+
description: "Beta Systems Q1 2026 Investor Report"
|
|
60
|
+
|
|
61
|
+
- id: company_gamma
|
|
62
|
+
description: "Gamma Health — Q1 2026 board deck"
|
|
63
|
+
api_key: ${OPENAI_API_KEY}
|
|
64
|
+
docs:
|
|
65
|
+
- id: gamma_board_deck
|
|
66
|
+
locator: "repo:doc-gamma003"
|
|
67
|
+
description: "Gamma Health Q1 2026 Board Deck"
|
|
68
|
+
|
|
69
|
+
llamaindex:
|
|
70
|
+
model: gpt-4o
|
|
71
|
+
base_url: ${OPENAI_BASE_URL:-https://api.openai.com/v1}
|
|
72
|
+
api_key: ${OPENAI_API_KEY}
|
|
73
|
+
max_tool_calls: 40
|
|
74
|
+
tool_timeout_seconds: 150
|
|
75
|
+
max_agent_iterations: 35
|
|
76
|
+
system_prompt: |
|
|
77
|
+
You are a venture capital analyst extracting KPIs from portfolio company reports.
|
|
78
|
+
|
|
79
|
+
## ANTI-FABRICATION RULE
|
|
80
|
+
ALL values MUST come from your search tool results. Never guess. Return null if not found.
|
|
81
|
+
|
|
82
|
+
## Rules
|
|
83
|
+
1. Return raw full-dollar numbers (9700000 not "$9.7M")
|
|
84
|
+
2. Percentages as whole numbers (92.3 not 0.923)
|
|
85
|
+
3. Every numeric value needs a c_xxxxxxxx citation
|
|
86
|
+
4. Return null for any value not explicitly stated in the document
|
|
87
|
+
5. Negative values are valid (e.g., churn ARR, net cash burn)
|
|
88
|
+
|
|
89
|
+
computations:
|
|
90
|
+
fields:
|
|
91
|
+
|
|
92
|
+
# ── Company Alpha KPIs ─────────────────────────────────────────────────────
|
|
93
|
+
- id: alpha_kpis
|
|
94
|
+
label: "Alpha Inc — Q1 2026 KPIs"
|
|
95
|
+
type: object
|
|
96
|
+
priority: 1
|
|
97
|
+
docset_id: company_alpha
|
|
98
|
+
agents:
|
|
99
|
+
- id: alpha_extract
|
|
100
|
+
prompt: |
|
|
101
|
+
Extract the following KPIs for Alpha Inc from their Q1 2026 board update.
|
|
102
|
+
|
|
103
|
+
## Financial Metrics
|
|
104
|
+
- arr_end: Ending ARR for the most recent period (full dollars)
|
|
105
|
+
- arr_mom_growth_pct: MoM or QoQ ARR growth % (whole number)
|
|
106
|
+
- monthly_burn: Net monthly cash burn (full dollars)
|
|
107
|
+
- cash_on_hand: Current cash balance (full dollars)
|
|
108
|
+
- runway_months: Months of runway at current burn
|
|
109
|
+
|
|
110
|
+
## Operating Metrics
|
|
111
|
+
- headcount: Total employee count
|
|
112
|
+
- customer_count: Total paying customer or logo count
|
|
113
|
+
- nrr: Net Revenue Retention % (if stated)
|
|
114
|
+
|
|
115
|
+
## Qualitative
|
|
116
|
+
- top_milestone: Single most important milestone this quarter (string)
|
|
117
|
+
- top_risk: Single most important risk mentioned (string)
|
|
118
|
+
|
|
119
|
+
## Search Strategy
|
|
120
|
+
1. basic_search: "ARR revenue growth Q1 2026 monthly"
|
|
121
|
+
2. basic_search: "cash burn runway headcount customers"
|
|
122
|
+
3. basic_search: "highlights milestones risks challenges"
|
|
123
|
+
|
|
124
|
+
Set to null anything not explicitly stated.
|
|
125
|
+
output_schema:
|
|
126
|
+
type: object
|
|
127
|
+
properties:
|
|
128
|
+
company: { type: string }
|
|
129
|
+
period: { type: string }
|
|
130
|
+
arr_end: { type: number }
|
|
131
|
+
arr_mom_growth_pct: { type: number }
|
|
132
|
+
monthly_burn: { type: number }
|
|
133
|
+
cash_on_hand: { type: number }
|
|
134
|
+
runway_months: { type: number }
|
|
135
|
+
headcount: { type: number }
|
|
136
|
+
customer_count: { type: number }
|
|
137
|
+
nrr: { type: number }
|
|
138
|
+
top_milestone: { type: string }
|
|
139
|
+
top_risk: { type: string }
|
|
140
|
+
citations: { type: array, items: { type: string } }
|
|
141
|
+
notes: { type: string }
|
|
142
|
+
mcp_scope: []
|
|
143
|
+
prompt: "Return Alpha Inc Q1 2026 KPIs with citations."
|
|
144
|
+
|
|
145
|
+
# ── Company Beta KPIs ──────────────────────────────────────────────────────
|
|
146
|
+
- id: beta_kpis
|
|
147
|
+
label: "Beta Systems — Q1 2026 KPIs"
|
|
148
|
+
type: object
|
|
149
|
+
priority: 1
|
|
150
|
+
docset_id: company_beta
|
|
151
|
+
agents:
|
|
152
|
+
- id: beta_extract
|
|
153
|
+
prompt: |
|
|
154
|
+
Extract the following KPIs for Beta Systems from their Q1 2026 investor report.
|
|
155
|
+
|
|
156
|
+
## Financial Metrics
|
|
157
|
+
- arr_end: Ending ARR for the most recent period
|
|
158
|
+
- arr_mom_growth_pct: MoM or QoQ ARR growth %
|
|
159
|
+
- monthly_burn: Net monthly cash burn
|
|
160
|
+
- cash_on_hand: Current cash balance
|
|
161
|
+
- runway_months: Months of runway at current burn
|
|
162
|
+
|
|
163
|
+
## Operating Metrics
|
|
164
|
+
- headcount: Total employee count
|
|
165
|
+
- customer_count: Total paying customer count
|
|
166
|
+
- nrr: Net Revenue Retention % (if stated)
|
|
167
|
+
|
|
168
|
+
## Qualitative
|
|
169
|
+
- top_milestone: Most important milestone this quarter
|
|
170
|
+
- top_risk: Most important risk mentioned
|
|
171
|
+
|
|
172
|
+
## Search Strategy
|
|
173
|
+
1. basic_search: "ARR revenue MRR monthly quarterly growth"
|
|
174
|
+
2. basic_search: "cash burn runway balance headcount team"
|
|
175
|
+
3. basic_search: "highlights wins milestones risks concerns"
|
|
176
|
+
|
|
177
|
+
Set to null anything not explicitly stated.
|
|
178
|
+
output_schema:
|
|
179
|
+
type: object
|
|
180
|
+
properties:
|
|
181
|
+
company: { type: string }
|
|
182
|
+
period: { type: string }
|
|
183
|
+
arr_end: { type: number }
|
|
184
|
+
arr_mom_growth_pct: { type: number }
|
|
185
|
+
monthly_burn: { type: number }
|
|
186
|
+
cash_on_hand: { type: number }
|
|
187
|
+
runway_months: { type: number }
|
|
188
|
+
headcount: { type: number }
|
|
189
|
+
customer_count: { type: number }
|
|
190
|
+
nrr: { type: number }
|
|
191
|
+
top_milestone: { type: string }
|
|
192
|
+
top_risk: { type: string }
|
|
193
|
+
citations: { type: array, items: { type: string } }
|
|
194
|
+
notes: { type: string }
|
|
195
|
+
mcp_scope: []
|
|
196
|
+
prompt: "Return Beta Systems Q1 2026 KPIs with citations."
|
|
197
|
+
|
|
198
|
+
# ── Company Gamma KPIs ─────────────────────────────────────────────────────
|
|
199
|
+
- id: gamma_kpis
|
|
200
|
+
label: "Gamma Health — Q1 2026 KPIs"
|
|
201
|
+
type: object
|
|
202
|
+
priority: 1
|
|
203
|
+
docset_id: company_gamma
|
|
204
|
+
agents:
|
|
205
|
+
- id: gamma_extract
|
|
206
|
+
prompt: |
|
|
207
|
+
Extract KPIs for Gamma Health from their Q1 2026 board deck.
|
|
208
|
+
|
|
209
|
+
## Financial Metrics
|
|
210
|
+
- arr_end or revenue_end: ARR or revenue for the quarter
|
|
211
|
+
- arr_mom_growth_pct: MoM or QoQ growth %
|
|
212
|
+
- monthly_burn: Net monthly cash burn
|
|
213
|
+
- cash_on_hand: Current cash balance
|
|
214
|
+
- runway_months: Months of runway
|
|
215
|
+
|
|
216
|
+
## Operating Metrics
|
|
217
|
+
- headcount: Total employee count
|
|
218
|
+
- customer_count: Patients, clients, or paying customer count
|
|
219
|
+
- nrr: Net Revenue Retention % (if applicable)
|
|
220
|
+
|
|
221
|
+
## Qualitative
|
|
222
|
+
- top_milestone: Most important milestone
|
|
223
|
+
- top_risk: Most important risk
|
|
224
|
+
|
|
225
|
+
## Search Strategy
|
|
226
|
+
1. basic_search: "revenue ARR growth quarterly monthly"
|
|
227
|
+
2. basic_search: "cash burn runway balance employees headcount"
|
|
228
|
+
3. basic_search: "milestones highlights risks"
|
|
229
|
+
|
|
230
|
+
Set to null anything not explicitly stated.
|
|
231
|
+
output_schema:
|
|
232
|
+
type: object
|
|
233
|
+
properties:
|
|
234
|
+
company: { type: string }
|
|
235
|
+
period: { type: string }
|
|
236
|
+
arr_end: { type: number }
|
|
237
|
+
arr_mom_growth_pct: { type: number }
|
|
238
|
+
monthly_burn: { type: number }
|
|
239
|
+
cash_on_hand: { type: number }
|
|
240
|
+
runway_months: { type: number }
|
|
241
|
+
headcount: { type: number }
|
|
242
|
+
customer_count: { type: number }
|
|
243
|
+
nrr: { type: number }
|
|
244
|
+
top_milestone: { type: string }
|
|
245
|
+
top_risk: { type: string }
|
|
246
|
+
citations: { type: array, items: { type: string } }
|
|
247
|
+
notes: { type: string }
|
|
248
|
+
mcp_scope: []
|
|
249
|
+
prompt: "Return Gamma Health Q1 2026 KPIs with citations."
|
|
250
|
+
|
|
251
|
+
# ── Cross-Portfolio Summary (depends on all 3 companies) ──────────────────
|
|
252
|
+
- id: portfolio_summary
|
|
253
|
+
label: "Cross-Portfolio Summary"
|
|
254
|
+
type: object
|
|
255
|
+
priority: 2
|
|
256
|
+
depends_on: [alpha_kpis, beta_kpis, gamma_kpis]
|
|
257
|
+
agents:
|
|
258
|
+
- id: portfolio_summary_extract
|
|
259
|
+
docset_id: company_alpha # use any docset — this agent synthesises from context
|
|
260
|
+
prompt: |
|
|
261
|
+
Summarise the overall health of the portfolio based on the individual
|
|
262
|
+
company KPIs available in your context (from depends_on).
|
|
263
|
+
|
|
264
|
+
## What to Produce
|
|
265
|
+
- total_portfolio_arr: Sum of all companies' ARR (null if any are missing)
|
|
266
|
+
- portfolio_avg_runway_months: Average runway across companies
|
|
267
|
+
- healthiest_company: Company name with strongest metrics
|
|
268
|
+
- most_at_risk_company: Company name with lowest runway or highest burn
|
|
269
|
+
- common_themes: 2-3 themes appearing across multiple companies
|
|
270
|
+
- portfolio_outlook: "positive" | "cautious" | "mixed" | "concerning"
|
|
271
|
+
|
|
272
|
+
Base your answer entirely on the company KPIs from context.
|
|
273
|
+
If a company KPI is null, exclude it from calculations and note it.
|
|
274
|
+
output_schema:
|
|
275
|
+
type: object
|
|
276
|
+
properties:
|
|
277
|
+
total_portfolio_arr: { type: number }
|
|
278
|
+
portfolio_avg_runway_months: { type: number }
|
|
279
|
+
healthiest_company: { type: string }
|
|
280
|
+
most_at_risk_company: { type: string }
|
|
281
|
+
common_themes: { type: array, items: { type: string } }
|
|
282
|
+
portfolio_outlook: { type: string }
|
|
283
|
+
notes: { type: string }
|
|
284
|
+
mcp_scope: []
|
|
285
|
+
prompt: "Return cross-portfolio summary derived from company KPIs."
|
|
286
|
+
|
|
287
|
+
tables:
|
|
288
|
+
# ── Portfolio Dashboard Table ──────────────────────────────────────────────
|
|
289
|
+
- id: portfolio_dashboard
|
|
290
|
+
title: "Portfolio Company Dashboard — Q1 2026"
|
|
291
|
+
priority: 2
|
|
292
|
+
depends_on: [alpha_kpis, beta_kpis, gamma_kpis]
|
|
293
|
+
agents:
|
|
294
|
+
- id: dashboard_build
|
|
295
|
+
docset_id: company_alpha # placeholder — values come from context
|
|
296
|
+
prompt: |
|
|
297
|
+
Build the portfolio dashboard table from the company KPI results
|
|
298
|
+
available in your context (from depends_on).
|
|
299
|
+
|
|
300
|
+
For each of the 3 companies (Alpha Inc, Beta Systems, Gamma Health),
|
|
301
|
+
create one row with:
|
|
302
|
+
- company: Company name
|
|
303
|
+
- arr_end: Ending ARR (full dollars)
|
|
304
|
+
- arr_growth_pct: QoQ ARR growth %
|
|
305
|
+
- monthly_burn: Monthly burn (full dollars)
|
|
306
|
+
- runway_months: Runway in months
|
|
307
|
+
- headcount: Employee count
|
|
308
|
+
- nrr: NRR % (if available)
|
|
309
|
+
- outlook: "green" | "yellow" | "red" based on runway and growth
|
|
310
|
+
|
|
311
|
+
Use only values from the company KPIs in context. Set null where missing.
|
|
312
|
+
Return {"rows": [...]} with one object per company.
|
|
313
|
+
output_schema:
|
|
314
|
+
type: object
|
|
315
|
+
properties:
|
|
316
|
+
rows:
|
|
317
|
+
type: array
|
|
318
|
+
items:
|
|
319
|
+
type: object
|
|
320
|
+
properties:
|
|
321
|
+
company: { type: string }
|
|
322
|
+
arr_end: { type: number }
|
|
323
|
+
arr_growth_pct: { type: number }
|
|
324
|
+
monthly_burn: { type: number }
|
|
325
|
+
runway_months: { type: number }
|
|
326
|
+
headcount: { type: number }
|
|
327
|
+
nrr: { type: number }
|
|
328
|
+
outlook: { type: string }
|
|
329
|
+
mcp_scope: []
|
|
330
|
+
prompt: "Build portfolio dashboard table from company KPIs."
|
|
331
|
+
|
|
332
|
+
template:
|
|
333
|
+
format: markdown
|
|
334
|
+
sections:
|
|
335
|
+
header: |
|
|
336
|
+
# {{report.name}}
|
|
337
|
+
> **Fund:** {{context.fund_name}} | **As of:** {{context.as_of_date}} | **Period:** {{context.reporting_period}}
|
|
338
|
+
|
|
339
|
+
content: |
|
|
340
|
+
{{sections.header}}
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## Portfolio Dashboard
|
|
345
|
+
|
|
346
|
+
{{table.portfolio_dashboard}}
|
|
347
|
+
|
|
348
|
+
**Overall outlook:** {{ field.portfolio_summary.portfolio_outlook | default("—") }}
|
|
349
|
+
**Combined portfolio ARR:** {{ field.portfolio_summary.total_portfolio_arr | currency("$", 0) | default("—") }}
|
|
350
|
+
**Average runway:** {{ field.portfolio_summary.portfolio_avg_runway_months | number(1) | default("—") }} months
|
|
351
|
+
|
|
352
|
+
**Common themes:** {{ field.portfolio_summary.common_themes | default("—") }}
|
|
353
|
+
**Healthiest:** {{ field.portfolio_summary.healthiest_company | default("—") }}
|
|
354
|
+
**Most at risk:** {{ field.portfolio_summary.most_at_risk_company | default("—") }}
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## Alpha Inc
|
|
359
|
+
|
|
360
|
+
| Metric | Value |
|
|
361
|
+
|--------|-------|
|
|
362
|
+
| ARR | {{ field.alpha_kpis.arr_end | currency("$", 0) | default("—") }} |
|
|
363
|
+
| QoQ Growth | {{ field.alpha_kpis.arr_mom_growth_pct | number(1) | default("—") }}% |
|
|
364
|
+
| Monthly Burn | {{ field.alpha_kpis.monthly_burn | currency("$", 0) | default("—") }}/mo |
|
|
365
|
+
| Cash | {{ field.alpha_kpis.cash_on_hand | currency("$", 0) | default("—") }} |
|
|
366
|
+
| Runway | {{ field.alpha_kpis.runway_months | number(1) | default("—") }} months |
|
|
367
|
+
| Headcount | {{ field.alpha_kpis.headcount | number(0) | default("—") }} |
|
|
368
|
+
| NRR | {{ field.alpha_kpis.nrr | number(1) | default("—") }}% |
|
|
369
|
+
|
|
370
|
+
**Milestone:** {{ field.alpha_kpis.top_milestone | default("—") }}
|
|
371
|
+
**Risk:** {{ field.alpha_kpis.top_risk | default("—") }}
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
## Beta Systems
|
|
376
|
+
|
|
377
|
+
| Metric | Value |
|
|
378
|
+
|--------|-------|
|
|
379
|
+
| ARR | {{ field.beta_kpis.arr_end | currency("$", 0) | default("—") }} |
|
|
380
|
+
| QoQ Growth | {{ field.beta_kpis.arr_mom_growth_pct | number(1) | default("—") }}% |
|
|
381
|
+
| Monthly Burn | {{ field.beta_kpis.monthly_burn | currency("$", 0) | default("—") }}/mo |
|
|
382
|
+
| Cash | {{ field.beta_kpis.cash_on_hand | currency("$", 0) | default("—") }} |
|
|
383
|
+
| Runway | {{ field.beta_kpis.runway_months | number(1) | default("—") }} months |
|
|
384
|
+
| Headcount | {{ field.beta_kpis.headcount | number(0) | default("—") }} |
|
|
385
|
+
| NRR | {{ field.beta_kpis.nrr | number(1) | default("—") }}% |
|
|
386
|
+
|
|
387
|
+
**Milestone:** {{ field.beta_kpis.top_milestone | default("—") }}
|
|
388
|
+
**Risk:** {{ field.beta_kpis.top_risk | default("—") }}
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
## Gamma Health
|
|
393
|
+
|
|
394
|
+
| Metric | Value |
|
|
395
|
+
|--------|-------|
|
|
396
|
+
| ARR | {{ field.gamma_kpis.arr_end | currency("$", 0) | default("—") }} |
|
|
397
|
+
| QoQ Growth | {{ field.gamma_kpis.arr_mom_growth_pct | number(1) | default("—") }}% |
|
|
398
|
+
| Monthly Burn | {{ field.gamma_kpis.monthly_burn | currency("$", 0) | default("—") }}/mo |
|
|
399
|
+
| Cash | {{ field.gamma_kpis.cash_on_hand | currency("$", 0) | default("—") }} |
|
|
400
|
+
| Runway | {{ field.gamma_kpis.runway_months | number(1) | default("—") }} months |
|
|
401
|
+
| Headcount | {{ field.gamma_kpis.headcount | number(0) | default("—") }} |
|
|
402
|
+
| NRR | {{ field.gamma_kpis.nrr | number(1) | default("—") }}% |
|
|
403
|
+
|
|
404
|
+
**Milestone:** {{ field.gamma_kpis.top_milestone | default("—") }}
|
|
405
|
+
**Risk:** {{ field.gamma_kpis.top_risk | default("—") }}
|
|
406
|
+
|
|
407
|
+
guardrails:
|
|
408
|
+
- id: gr_no_fabrication
|
|
409
|
+
target: computations
|
|
410
|
+
on_fail: warn
|
|
411
|
+
model: gpt-4.1-mini
|
|
412
|
+
api_key: ${OPENAI_API_KEY}
|
|
413
|
+
description: "Detect fabricated or placeholder values"
|
|
414
|
+
prompt: |
|
|
415
|
+
FAIL if you find: citations like "Source A"/"Source B" (real ones use c_xxxxxxxx),
|
|
416
|
+
ARR values that are ALL round multiples of 100000, or retention values below 1.0.
|
|
417
|
+
Return JSON: {"pass": boolean, "issues": []}
|
|
418
|
+
Content: {{content}}
|
|
419
|
+
|
|
420
|
+
- id: gr_runway_sanity
|
|
421
|
+
target: computations
|
|
422
|
+
on_fail: warn
|
|
423
|
+
model: gpt-4.1-mini
|
|
424
|
+
api_key: ${OPENAI_API_KEY}
|
|
425
|
+
description: "Runway values must be positive and plausible"
|
|
426
|
+
prompt: |
|
|
427
|
+
Check all runway_months values. FAIL if any are negative or greater than 120 months.
|
|
428
|
+
Check all monthly_burn values. FAIL if any are positive (burn should be stored as positive number,
|
|
429
|
+
but flag if burn is implausibly large compared to cash, e.g., burn > cash).
|
|
430
|
+
Return JSON: {"pass": boolean, "issues": []}
|
|
431
|
+
Content: {{content}}
|
|
432
|
+
|
|
433
|
+
execution:
|
|
434
|
+
retries:
|
|
435
|
+
max_attempts: 3
|
|
436
|
+
backoff_seconds: 2.0
|
|
437
|
+
output:
|
|
438
|
+
directory: ./output
|
|
439
|
+
timestamp_suffix: true
|
|
440
|
+
include_final_report: true
|
|
441
|
+
include_computed_json: true
|
|
442
|
+
include_evidence: true
|
|
443
|
+
include_guardrails: true
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.registerReportComposerGenerateCommand = registerReportComposerGenerateCommand;
|
|
16
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
17
|
+
const fs_1 = __importDefault(require("fs"));
|
|
18
|
+
const path_1 = __importDefault(require("path"));
|
|
19
|
+
const ora_1 = __importDefault(require("ora"));
|
|
20
|
+
const reportGenerator_1 = require("../../agents/reportGenerator");
|
|
21
|
+
// ─── Command ──────────────────────────────────────────────────────────────────
|
|
22
|
+
function registerReportComposerGenerateCommand(generateCommand) {
|
|
23
|
+
generateCommand
|
|
24
|
+
.command('report-composer')
|
|
25
|
+
.description('Generate a report composer report.yaml configuration from an instructions file using Claude AI')
|
|
26
|
+
.requiredOption('-f, --file <path>', 'Path to the instructions Markdown file')
|
|
27
|
+
.requiredOption('-o, --output <dir>', 'Output directory for the generated report.yaml')
|
|
28
|
+
.requiredOption('--anthropicApiKey <key>', 'Anthropic API key (or set ANTHROPIC_API_KEY env var)')
|
|
29
|
+
.option('--model <model>', 'Claude model ID', 'claude-sonnet-4-6')
|
|
30
|
+
.option('--maxIterations <n>', 'Maximum agent iterations', '5')
|
|
31
|
+
.action((options) => __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
var _a, _b;
|
|
33
|
+
// ── Resolve API key (flag takes priority over env var) ─────────────────
|
|
34
|
+
const apiKey = options.anthropicApiKey || process.env.ANTHROPIC_API_KEY;
|
|
35
|
+
if (!apiKey) {
|
|
36
|
+
console.error(chalk_1.default.red('Error: Anthropic API key required. Use --anthropicApiKey or set ANTHROPIC_API_KEY.'));
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
// ── Read instructions file ──────────────────────────────────────────────
|
|
40
|
+
const instructionsPath = path_1.default.resolve(options.file);
|
|
41
|
+
if (!fs_1.default.existsSync(instructionsPath)) {
|
|
42
|
+
console.error(chalk_1.default.red(`Error: Instructions file not found: ${instructionsPath}`));
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
const instructions = fs_1.default.readFileSync(instructionsPath, 'utf8');
|
|
46
|
+
if (!instructions.trim()) {
|
|
47
|
+
console.error(chalk_1.default.red('Error: Instructions file is empty.'));
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
// ── Ensure output directory exists ─────────────────────────────────────
|
|
51
|
+
const outputDir = path_1.default.resolve(options.output);
|
|
52
|
+
fs_1.default.mkdirSync(outputDir, { recursive: true });
|
|
53
|
+
const reportOut = path_1.default.join(outputDir, 'report.yaml');
|
|
54
|
+
// ── Run agent ──────────────────────────────────────────────────────────
|
|
55
|
+
console.log(chalk_1.default.bold('\nNestbox — Report Composer Generator'));
|
|
56
|
+
console.log(chalk_1.default.dim(`Instructions: ${instructionsPath}`));
|
|
57
|
+
console.log(chalk_1.default.dim(`Output: ${outputDir}`));
|
|
58
|
+
console.log(chalk_1.default.dim(`Model: ${options.model}`));
|
|
59
|
+
console.log();
|
|
60
|
+
const spinner = (0, ora_1.default)('Initialising agent...').start();
|
|
61
|
+
try {
|
|
62
|
+
const result = yield (0, reportGenerator_1.runReportComposerAgent)({
|
|
63
|
+
instructions,
|
|
64
|
+
anthropicApiKey: apiKey,
|
|
65
|
+
model: options.model,
|
|
66
|
+
maxIterations: parseInt((_a = options.maxIterations) !== null && _a !== void 0 ? _a : '8', 10),
|
|
67
|
+
onProgress: (msg) => {
|
|
68
|
+
spinner.text = msg;
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
spinner.stop();
|
|
72
|
+
// ── Write output file ────────────────────────────────────────────────
|
|
73
|
+
const reportWritten = result.reportYaml.trim().length > 0;
|
|
74
|
+
if (reportWritten)
|
|
75
|
+
fs_1.default.writeFileSync(reportOut, result.reportYaml, 'utf8');
|
|
76
|
+
// ── Summary ──────────────────────────────────────────────────────────
|
|
77
|
+
console.log(chalk_1.default.bold('Results'));
|
|
78
|
+
if (reportWritten) {
|
|
79
|
+
const status = result.reportValid ? chalk_1.default.green('✓ valid') : chalk_1.default.yellow('⚠ invalid');
|
|
80
|
+
console.log(` report.yaml ${status} → ${reportOut}`);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
console.log(` report.yaml ${chalk_1.default.red('✗ not generated')}`);
|
|
84
|
+
}
|
|
85
|
+
console.log(chalk_1.default.dim(`\n Completed in ${result.iterations} iteration(s).`));
|
|
86
|
+
if (!reportWritten || !result.reportValid) {
|
|
87
|
+
console.log(chalk_1.default.yellow('\nWarning: report.yaml was not generated or has validation issues.'));
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
console.log(chalk_1.default.green('\nDone.'));
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
spinner.stop();
|
|
94
|
+
console.error(chalk_1.default.red(`\nError: ${(_b = err === null || err === void 0 ? void 0 : err.message) !== null && _b !== void 0 ? _b : err}`));
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
}));
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=reportComposer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reportComposer.js","sourceRoot":"","sources":["../../../src/commands/generate/reportComposer.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.registerGenerateCommands = registerGenerateCommands;
|
|
4
4
|
const project_1 = require("./generate/project");
|
|
5
5
|
const docProc_1 = require("./generate/docProc");
|
|
6
|
+
const reportComposer_1 = require("./generate/reportComposer");
|
|
6
7
|
/**
|
|
7
8
|
* Register all generate-related commands
|
|
8
9
|
*/
|
|
@@ -14,5 +15,6 @@ function registerGenerateCommands(program) {
|
|
|
14
15
|
// Register all subcommands
|
|
15
16
|
(0, project_1.registerProjectCommand)(generateCommand);
|
|
16
17
|
(0, docProc_1.registerDocProcGenerateCommand)(generateCommand);
|
|
18
|
+
(0, reportComposer_1.registerReportComposerGenerateCommand)(generateCommand);
|
|
17
19
|
}
|
|
18
20
|
//# sourceMappingURL=generate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":";;AAQA,4DAUC;AAjBD,gDAA4D;AAC5D,gDAAoE;AACpE,8DAAkF;AAElF;;GAEG;AACH,SAAgB,wBAAwB,CAAC,OAAgB;IACvD,mCAAmC;IACnC,MAAM,eAAe,GAAG,OAAO;SAC5B,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,sCAAsC,CAAC,CAAC;IAEvD,2BAA2B;IAC3B,IAAA,gCAAsB,EAAC,eAAe,CAAC,CAAC;IACxC,IAAA,wCAA8B,EAAC,eAAe,CAAC,CAAC;IAChD,IAAA,sDAAqC,EAAC,eAAe,CAAC,CAAC;AACzD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nestbox-ai/cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.64",
|
|
4
4
|
"description": "The cli tools that helps developers to build agents",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
10
|
"dev": "tsx src/index.ts",
|
|
11
|
-
"copy-agent-assets": "mkdir -p dist/agents
|
|
11
|
+
"copy-agent-assets": "for d in docProc reportGenerator; do mkdir -p dist/agents/$d && cp src/agents/$d/*.md src/agents/$d/*.yaml dist/agents/$d/; done",
|
|
12
12
|
"build": "tsc && npm run copy-agent-assets",
|
|
13
13
|
"start": "node dist/index.js",
|
|
14
14
|
"lint": "eslint src --ext .ts",
|