@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.
@@ -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,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerReportComposerGenerateCommand(generateCommand: Command): void;
@@ -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":";;AAOA,4DASC;AAfD,gDAA4D;AAC5D,gDAAoE;AAEpE;;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;AAClD,CAAC"}
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.63",
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/docProc && cp src/agents/docProc/*.md src/agents/docProc/*.yaml dist/agents/docProc/",
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",