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:
ezl-keygraph
2026-08-27 18:53:56 +05:30
committed by GitHub
parent ed5659e2e2
commit dc2a4fe4e8
10 changed files with 105 additions and 22 deletions
+18
View File
@@ -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}`;
+2 -1
View File
@@ -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}`);