mirror of
https://github.com/KeygraphHQ/shannon.git
synced 2026-08-29 06:20:44 +02:00
feat: brand the npm page, CLI output, and reports (#432)
* docs: rebuild the npm package README on the main README's identity * docs: point the README banner fallback at an asset that exists * docs: declare the npm package author, homepage, and issue tracker * docs(cli): retire "Framework" and settle on the canonical product line * docs: describe the banner image in alt text instead of repeating the lockup * feat(cli): print a plain-text banner when stdout is not a terminal * feat(report): attribute the markdown report from a shared brand constant * feat(cli): frame the plain-text banner with rules and split the version line * docs: drop the URL from the npm author field
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
// Copyright (C) 2025 Keygraph, Inc.
|
||||
|
||||
/**
|
||||
* Centralized brand strings for report deliverables.
|
||||
*
|
||||
* Kept in two parts because the two renderers join them differently: the Typst
|
||||
* template splits its `brand` input on a pipe to set the cover's two lines
|
||||
* (`report.typ:212`), while a human-read line takes an em dash.
|
||||
*/
|
||||
|
||||
export const PRODUCT_NAME = 'Shannon';
|
||||
export const PRODUCT_DESCRIPTOR = 'AI Pentester by Keygraph';
|
||||
|
||||
/** Cover wordmark for the Typst template, which parses the pipe. */
|
||||
export const TYPST_BRAND = `${PRODUCT_NAME} | ${PRODUCT_DESCRIPTOR}`;
|
||||
|
||||
/** Attribution line for prose surfaces. */
|
||||
export const BRAND_LOCKUP = `${PRODUCT_NAME} — ${PRODUCT_DESCRIPTOR}`;
|
||||
@@ -22,13 +22,14 @@ import { copyFile, cp, mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
|
||||
import { tmpdir } from 'node:os';
|
||||
import path from 'node:path';
|
||||
import { promisify } from 'node:util';
|
||||
import { TYPST_BRAND } from '../branding.js';
|
||||
import { adaptReportToTypst } from './report-json-adapter.js';
|
||||
import type { ReportData } from './report-renderer.js';
|
||||
|
||||
const execFileAsync = promisify(execFile);
|
||||
|
||||
const DEFAULT_TESTER = 'Shannon';
|
||||
const DEFAULT_BRAND = 'Shannon | AI Pentester by Keygraph';
|
||||
const DEFAULT_BRAND = TYPST_BRAND;
|
||||
|
||||
const DATA_FILENAME = 'data.json';
|
||||
const TEMPLATE_FILENAME = 'report.typ';
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
* report agent previously wrote by hand. No LLM in the loop.
|
||||
*/
|
||||
|
||||
import { BRAND_LOCKUP } from '../branding.js';
|
||||
import type { AddFindingInput, AdditionalSection, StepItem, StructuredStep } from '../collectors/finding-collector.js';
|
||||
import type { VulnClass } from '../types/config.js';
|
||||
|
||||
@@ -212,6 +213,8 @@ export function renderReport(data: ReportData): string {
|
||||
// 1. Executive Summary
|
||||
sections.push('# Security Assessment Report');
|
||||
sections.push('');
|
||||
sections.push(`*${BRAND_LOCKUP}*`);
|
||||
sections.push('');
|
||||
sections.push('## Executive Summary');
|
||||
sections.push(`- Target: ${report_meta.target}`);
|
||||
sections.push(`- Assessment Date: ${report_meta.assessment_date}`);
|
||||
|
||||
Reference in New Issue
Block a user