agent-banner-library 0.0.1
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/CHANGELOG.md +7 -0
- package/LICENSE +21 -0
- package/README.md +141 -0
- package/dist/cjs/banner.cjs +73 -0
- package/dist/cjs/banner.cjs.map +10 -0
- package/dist/cjs/format.cjs +55 -0
- package/dist/cjs/format.cjs.map +10 -0
- package/dist/cjs/index.cjs +7 -0
- package/dist/cjs/index.cjs.map +10 -0
- package/dist/cjs/types.cjs +3 -0
- package/dist/cjs/types.cjs.map +10 -0
- package/dist/esm/banner.js +66 -0
- package/dist/esm/banner.js.map +1 -0
- package/dist/esm/format.js +46 -0
- package/dist/esm/format.js.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/types/banner.d.ts +4 -0
- package/dist/types/banner.d.ts.map +1 -0
- package/dist/types/format.d.ts +9 -0
- package/dist/types/format.d.ts.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/types.d.ts +21 -0
- package/dist/types/types.d.ts.map +1 -0
- package/package.json +82 -0
package/CHANGELOG.md
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Auronforge
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# agent-banner-library
|
|
2
|
+
|
|
3
|
+
Reusable Node.js + TypeScript library to standardize startup banner logs for REST API agents.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install agent-banner-library
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
### Express
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import express from 'express';
|
|
17
|
+
import { printAgentBanner } from 'agent-banner-library';
|
|
18
|
+
|
|
19
|
+
const app = express();
|
|
20
|
+
const port = 3001;
|
|
21
|
+
|
|
22
|
+
app.listen(port, () => {
|
|
23
|
+
printAgentBanner({
|
|
24
|
+
agentName: 'Backlog Structurer Agent API',
|
|
25
|
+
baseUrl: `http://localhost:${port}`,
|
|
26
|
+
prefix: '/api/v1',
|
|
27
|
+
endpoints: [
|
|
28
|
+
{
|
|
29
|
+
method: 'POST',
|
|
30
|
+
path: '/backlog/structure',
|
|
31
|
+
description: 'Generate structured backlog',
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Fastify
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
import Fastify from 'fastify';
|
|
42
|
+
import { renderAgentBanner } from 'agent-banner-library';
|
|
43
|
+
|
|
44
|
+
const app = Fastify();
|
|
45
|
+
const port = 3002;
|
|
46
|
+
|
|
47
|
+
await app.listen({ port });
|
|
48
|
+
|
|
49
|
+
const banner = renderAgentBanner({
|
|
50
|
+
agentName: 'Capability Mapper',
|
|
51
|
+
baseUrl: `http://localhost:${port}`,
|
|
52
|
+
prefix: 'api/v1',
|
|
53
|
+
endpoints: [
|
|
54
|
+
{
|
|
55
|
+
method: 'GET',
|
|
56
|
+
path: 'capabilities',
|
|
57
|
+
description: 'List capabilities',
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
app.log.info(banner);
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Configuration
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
export interface AgentBannerConfig {
|
|
69
|
+
agentName: string;
|
|
70
|
+
packageJsonPath?: string;
|
|
71
|
+
version?: string;
|
|
72
|
+
baseUrl: string;
|
|
73
|
+
prefix: string;
|
|
74
|
+
docsPath?: string;
|
|
75
|
+
healthPath?: string;
|
|
76
|
+
endpoints?: Array<{
|
|
77
|
+
method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD';
|
|
78
|
+
path: string;
|
|
79
|
+
description: string;
|
|
80
|
+
}>;
|
|
81
|
+
environment?: string;
|
|
82
|
+
timestamp?: string | Date;
|
|
83
|
+
width?: number;
|
|
84
|
+
emoji?: boolean;
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Default behaviors:
|
|
89
|
+
|
|
90
|
+
- `packageJsonPath` defaults to `process.cwd() + "/package.json"`.
|
|
91
|
+
- `version` is read from `package.json` if not provided, or `0.0.0` on failure.
|
|
92
|
+
- `prefix` and `path` are normalized to start with `/` and avoid double slashes.
|
|
93
|
+
- `docsPath` defaults to `/docs` and `healthPath` to `/health`.
|
|
94
|
+
- `environment` defaults to `process.env.NODE_ENV ?? "development"`.
|
|
95
|
+
- `timestamp` defaults to `new Date()` and is always rendered as ISO.
|
|
96
|
+
- `width` defaults to 48 characters.
|
|
97
|
+
- `emoji` defaults to `true`.
|
|
98
|
+
|
|
99
|
+
## Sample Output
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
════════════════════════════════════════════════════════
|
|
103
|
+
🚀 Backlog Structurer Agent API - 1.2.3
|
|
104
|
+
════════════════════════════════════════════════════════
|
|
105
|
+
📡 Server running on: http://localhost:3001
|
|
106
|
+
📚 API Documentation: http://localhost:3001/api/v1/docs
|
|
107
|
+
🏥 Health Check: http://localhost:3001/api/v1/health
|
|
108
|
+
📝 Endpoints:
|
|
109
|
+
- POST - Generate structured backlog - http://localhost:3001/api/v1/backlog/structure
|
|
110
|
+
════════════════════════════════════════════════════════
|
|
111
|
+
Environment: development
|
|
112
|
+
Timestamp: 2026-02-05T23:49:50.079Z
|
|
113
|
+
════════════════════════════════════════════════════════
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## ESM/CJS
|
|
117
|
+
|
|
118
|
+
- ESM: `import { renderAgentBanner } from "agent-banner-library"`.
|
|
119
|
+
- CJS: `const { renderAgentBanner } = require("agent-banner-library")`.
|
|
120
|
+
|
|
121
|
+
## TSLint
|
|
122
|
+
|
|
123
|
+
TSLint is deprecated but included for legacy compatibility as required. It is not used by default in CI.
|
|
124
|
+
|
|
125
|
+
## Development
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
npm run lint
|
|
129
|
+
npm run typecheck
|
|
130
|
+
npm run test:coverage
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Tooling Configs
|
|
134
|
+
|
|
135
|
+
- lint-staged: [.lintstagedrc.cjs](.lintstagedrc.cjs)
|
|
136
|
+
- standard-version: [.versionrc.cjs](.versionrc.cjs) and `npm run release`
|
|
137
|
+
|
|
138
|
+
## CI/CD
|
|
139
|
+
|
|
140
|
+
- CI workflow: [.github/workflows/ci.yml](.github/workflows/ci.yml)
|
|
141
|
+
- Release workflow: [.github/workflows/release.yml](.github/workflows/release.yml)
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.renderAgentBanner = renderAgentBanner;
|
|
7
|
+
exports.printAgentBanner = printAgentBanner;
|
|
8
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
const format_1 = require("./format");
|
|
11
|
+
function resolveVersion(packageJsonPath, override) {
|
|
12
|
+
if (override) {
|
|
13
|
+
return override;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const raw = node_fs_1.default.readFileSync(packageJsonPath, 'utf8');
|
|
17
|
+
const parsed = JSON.parse(raw);
|
|
18
|
+
if (typeof parsed.version === 'string' && parsed.version.trim()) {
|
|
19
|
+
return parsed.version.trim();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return '0.0.0';
|
|
24
|
+
}
|
|
25
|
+
return '0.0.0';
|
|
26
|
+
}
|
|
27
|
+
function renderAgentBanner(config) {
|
|
28
|
+
const baseUrl = (0, format_1.normalizeBaseUrl)(config.baseUrl);
|
|
29
|
+
const prefix = (0, format_1.normalizePrefix)(config.prefix);
|
|
30
|
+
const docsPath = (0, format_1.normalizePath)(config.docsPath ?? '/docs');
|
|
31
|
+
const healthPath = (0, format_1.normalizePath)(config.healthPath ?? '/health');
|
|
32
|
+
const endpoints = config.endpoints ?? [];
|
|
33
|
+
const packageJsonPath = config.packageJsonPath ?? node_path_1.default.join(process.cwd(), 'package.json');
|
|
34
|
+
const version = resolveVersion(packageJsonPath, config.version);
|
|
35
|
+
const environment = config.environment ?? process.env.NODE_ENV ?? 'development';
|
|
36
|
+
const timestamp = (0, format_1.toIsoTimestamp)(config.timestamp);
|
|
37
|
+
const width = config.width ?? format_1.DEFAULT_BANNER_WIDTH;
|
|
38
|
+
const border = (0, format_1.getBorder)(width);
|
|
39
|
+
const emoji = config.emoji ?? true;
|
|
40
|
+
const rocket = emoji ? '🚀 ' : '';
|
|
41
|
+
const server = emoji ? '📡 ' : '';
|
|
42
|
+
const docs = emoji ? '📚 ' : '';
|
|
43
|
+
const health = emoji ? '🏥 ' : '';
|
|
44
|
+
const endpointsLabel = emoji ? '📝 ' : '';
|
|
45
|
+
const docsUrl = (0, format_1.urlJoin)(baseUrl, prefix, docsPath);
|
|
46
|
+
const healthUrl = (0, format_1.urlJoin)(baseUrl, prefix, healthPath);
|
|
47
|
+
const endpointLines = endpoints.length
|
|
48
|
+
? endpoints.map((endpoint) => {
|
|
49
|
+
const endpointPath = (0, format_1.normalizePath)(endpoint.path);
|
|
50
|
+
const endpointUrl = (0, format_1.urlJoin)(baseUrl, prefix, endpointPath);
|
|
51
|
+
return ` - ${endpoint.method} - ${endpoint.description} - ${endpointUrl}`;
|
|
52
|
+
})
|
|
53
|
+
: [' - (none)'];
|
|
54
|
+
const lines = [
|
|
55
|
+
border,
|
|
56
|
+
`${rocket}${config.agentName} - ${version}`,
|
|
57
|
+
border,
|
|
58
|
+
`${server}Server running on: ${baseUrl}`,
|
|
59
|
+
`${docs}API Documentation: ${docsUrl}`,
|
|
60
|
+
`${health}Health Check: ${healthUrl}`,
|
|
61
|
+
`${endpointsLabel}Endpoints:`,
|
|
62
|
+
...endpointLines,
|
|
63
|
+
border,
|
|
64
|
+
`Environment: ${environment}`,
|
|
65
|
+
`Timestamp: ${timestamp}`,
|
|
66
|
+
border,
|
|
67
|
+
];
|
|
68
|
+
return `${lines.join('\n')}\n`;
|
|
69
|
+
}
|
|
70
|
+
function printAgentBanner(config, logger = console) {
|
|
71
|
+
logger.log(renderAgentBanner(config));
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=banner.cjs.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"file": "banner.cjs",
|
|
4
|
+
"sourceRoot": "",
|
|
5
|
+
"sources": [
|
|
6
|
+
"../../src/banner.ts"
|
|
7
|
+
],
|
|
8
|
+
"names": [],
|
|
9
|
+
"mappings": "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"
|
|
10
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BORDER_CHAR = exports.DEFAULT_BANNER_WIDTH = void 0;
|
|
4
|
+
exports.getBorder = getBorder;
|
|
5
|
+
exports.normalizeBaseUrl = normalizeBaseUrl;
|
|
6
|
+
exports.normalizePrefix = normalizePrefix;
|
|
7
|
+
exports.normalizePath = normalizePath;
|
|
8
|
+
exports.toIsoTimestamp = toIsoTimestamp;
|
|
9
|
+
exports.urlJoin = urlJoin;
|
|
10
|
+
exports.DEFAULT_BANNER_WIDTH = 48;
|
|
11
|
+
exports.BORDER_CHAR = '═';
|
|
12
|
+
function getBorder(width) {
|
|
13
|
+
const safeWidth = Number.isFinite(width) && width > 0 ? Math.floor(width) : exports.DEFAULT_BANNER_WIDTH;
|
|
14
|
+
return exports.BORDER_CHAR.repeat(safeWidth);
|
|
15
|
+
}
|
|
16
|
+
function normalizeBaseUrl(baseUrl) {
|
|
17
|
+
return baseUrl.trim().replace(/\/+$/, '');
|
|
18
|
+
}
|
|
19
|
+
function normalizePrefix(prefix) {
|
|
20
|
+
const trimmed = prefix.trim();
|
|
21
|
+
if (!trimmed || trimmed === '/') {
|
|
22
|
+
return '/';
|
|
23
|
+
}
|
|
24
|
+
let value = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
|
|
25
|
+
value = value.replace(/\/+$/, '');
|
|
26
|
+
return value || '/';
|
|
27
|
+
}
|
|
28
|
+
function normalizePath(pathValue) {
|
|
29
|
+
const trimmed = pathValue.trim();
|
|
30
|
+
if (!trimmed || trimmed === '/') {
|
|
31
|
+
return '/';
|
|
32
|
+
}
|
|
33
|
+
let value = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
|
|
34
|
+
value = value.replace(/\/{2,}/g, '/');
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
function toIsoTimestamp(input) {
|
|
38
|
+
if (!input) {
|
|
39
|
+
return new Date().toISOString();
|
|
40
|
+
}
|
|
41
|
+
return typeof input === 'string' ? input : input.toISOString();
|
|
42
|
+
}
|
|
43
|
+
function urlJoin(baseUrl, ...parts) {
|
|
44
|
+
const normalizedBase = normalizeBaseUrl(baseUrl);
|
|
45
|
+
const normalizedParts = parts
|
|
46
|
+
.map((part) => part.trim())
|
|
47
|
+
.filter((part) => part.length > 0)
|
|
48
|
+
.map((part) => part.replace(/^\/+|\/+$/g, ''))
|
|
49
|
+
.filter((part) => part.length > 0);
|
|
50
|
+
if (normalizedParts.length === 0) {
|
|
51
|
+
return normalizedBase;
|
|
52
|
+
}
|
|
53
|
+
return `${normalizedBase}/${normalizedParts.join('/')}`;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=format.cjs.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"file": "format.cjs",
|
|
4
|
+
"sourceRoot": "",
|
|
5
|
+
"sources": [
|
|
6
|
+
"../../src/format.ts"
|
|
7
|
+
],
|
|
8
|
+
"names": [],
|
|
9
|
+
"mappings": ";;;AAGA,8BAGC;AAED,4CAEC;AAED,0CASC;AAED,sCASC;AAED,wCAMC;AAED,0BAaC;AAvDY,QAAA,oBAAoB,GAAG,EAAE,CAAC;AAC1B,QAAA,WAAW,GAAG,GAAG,CAAC;AAE/B,SAAgB,SAAS,CAAC,KAAa;IACrC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,4BAAoB,CAAC;IACjG,OAAO,mBAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAe;IAC9C,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,SAAgB,eAAe,CAAC,MAAc;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QAChC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;IAC9D,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClC,OAAO,KAAK,IAAI,GAAG,CAAC;AACtB,CAAC;AAED,SAAgB,aAAa,CAAC,SAAiB;IAC7C,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QAChC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;IAC9D,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,cAAc,CAAC,KAAqB;IAClD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClC,CAAC;IAED,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;AACjE,CAAC;AAED,SAAgB,OAAO,CAAC,OAAe,EAAE,GAAG,KAAe;IACzD,MAAM,cAAc,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,eAAe,GAAG,KAAK;SAC1B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SACjC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;SAC7C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAErC,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,OAAO,GAAG,cAAc,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC1D,CAAC"
|
|
10
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderAgentBanner = exports.printAgentBanner = void 0;
|
|
4
|
+
var banner_1 = require("./banner");
|
|
5
|
+
Object.defineProperty(exports, "printAgentBanner", { enumerable: true, get: function () { return banner_1.printAgentBanner; } });
|
|
6
|
+
Object.defineProperty(exports, "renderAgentBanner", { enumerable: true, get: function () { return banner_1.renderAgentBanner; } });
|
|
7
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { DEFAULT_BANNER_WIDTH, getBorder, normalizeBaseUrl, normalizePath, normalizePrefix, toIsoTimestamp, urlJoin, } from './format';
|
|
4
|
+
function resolveVersion(packageJsonPath, override) {
|
|
5
|
+
if (override) {
|
|
6
|
+
return override;
|
|
7
|
+
}
|
|
8
|
+
try {
|
|
9
|
+
const raw = fs.readFileSync(packageJsonPath, 'utf8');
|
|
10
|
+
const parsed = JSON.parse(raw);
|
|
11
|
+
if (typeof parsed.version === 'string' && parsed.version.trim()) {
|
|
12
|
+
return parsed.version.trim();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return '0.0.0';
|
|
17
|
+
}
|
|
18
|
+
return '0.0.0';
|
|
19
|
+
}
|
|
20
|
+
export function renderAgentBanner(config) {
|
|
21
|
+
const baseUrl = normalizeBaseUrl(config.baseUrl);
|
|
22
|
+
const prefix = normalizePrefix(config.prefix);
|
|
23
|
+
const docsPath = normalizePath(config.docsPath ?? '/docs');
|
|
24
|
+
const healthPath = normalizePath(config.healthPath ?? '/health');
|
|
25
|
+
const endpoints = config.endpoints ?? [];
|
|
26
|
+
const packageJsonPath = config.packageJsonPath ?? path.join(process.cwd(), 'package.json');
|
|
27
|
+
const version = resolveVersion(packageJsonPath, config.version);
|
|
28
|
+
const environment = config.environment ?? process.env.NODE_ENV ?? 'development';
|
|
29
|
+
const timestamp = toIsoTimestamp(config.timestamp);
|
|
30
|
+
const width = config.width ?? DEFAULT_BANNER_WIDTH;
|
|
31
|
+
const border = getBorder(width);
|
|
32
|
+
const emoji = config.emoji ?? true;
|
|
33
|
+
const rocket = emoji ? '🚀 ' : '';
|
|
34
|
+
const server = emoji ? '📡 ' : '';
|
|
35
|
+
const docs = emoji ? '📚 ' : '';
|
|
36
|
+
const health = emoji ? '🏥 ' : '';
|
|
37
|
+
const endpointsLabel = emoji ? '📝 ' : '';
|
|
38
|
+
const docsUrl = urlJoin(baseUrl, prefix, docsPath);
|
|
39
|
+
const healthUrl = urlJoin(baseUrl, prefix, healthPath);
|
|
40
|
+
const endpointLines = endpoints.length
|
|
41
|
+
? endpoints.map((endpoint) => {
|
|
42
|
+
const endpointPath = normalizePath(endpoint.path);
|
|
43
|
+
const endpointUrl = urlJoin(baseUrl, prefix, endpointPath);
|
|
44
|
+
return ` - ${endpoint.method} - ${endpoint.description} - ${endpointUrl}`;
|
|
45
|
+
})
|
|
46
|
+
: [' - (none)'];
|
|
47
|
+
const lines = [
|
|
48
|
+
border,
|
|
49
|
+
`${rocket}${config.agentName} - ${version}`,
|
|
50
|
+
border,
|
|
51
|
+
`${server}Server running on: ${baseUrl}`,
|
|
52
|
+
`${docs}API Documentation: ${docsUrl}`,
|
|
53
|
+
`${health}Health Check: ${healthUrl}`,
|
|
54
|
+
`${endpointsLabel}Endpoints:`,
|
|
55
|
+
...endpointLines,
|
|
56
|
+
border,
|
|
57
|
+
`Environment: ${environment}`,
|
|
58
|
+
`Timestamp: ${timestamp}`,
|
|
59
|
+
border,
|
|
60
|
+
];
|
|
61
|
+
return `${lines.join('\n')}\n`;
|
|
62
|
+
}
|
|
63
|
+
export function printAgentBanner(config, logger = console) {
|
|
64
|
+
logger.log(renderAgentBanner(config));
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=banner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/banner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export const DEFAULT_BANNER_WIDTH = 48;
|
|
2
|
+
export const BORDER_CHAR = '═';
|
|
3
|
+
export function getBorder(width) {
|
|
4
|
+
const safeWidth = Number.isFinite(width) && width > 0 ? Math.floor(width) : DEFAULT_BANNER_WIDTH;
|
|
5
|
+
return BORDER_CHAR.repeat(safeWidth);
|
|
6
|
+
}
|
|
7
|
+
export function normalizeBaseUrl(baseUrl) {
|
|
8
|
+
return baseUrl.trim().replace(/\/+$/, '');
|
|
9
|
+
}
|
|
10
|
+
export function normalizePrefix(prefix) {
|
|
11
|
+
const trimmed = prefix.trim();
|
|
12
|
+
if (!trimmed || trimmed === '/') {
|
|
13
|
+
return '/';
|
|
14
|
+
}
|
|
15
|
+
let value = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
|
|
16
|
+
value = value.replace(/\/+$/, '');
|
|
17
|
+
return value || '/';
|
|
18
|
+
}
|
|
19
|
+
export function normalizePath(pathValue) {
|
|
20
|
+
const trimmed = pathValue.trim();
|
|
21
|
+
if (!trimmed || trimmed === '/') {
|
|
22
|
+
return '/';
|
|
23
|
+
}
|
|
24
|
+
let value = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
|
|
25
|
+
value = value.replace(/\/{2,}/g, '/');
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
export function toIsoTimestamp(input) {
|
|
29
|
+
if (!input) {
|
|
30
|
+
return new Date().toISOString();
|
|
31
|
+
}
|
|
32
|
+
return typeof input === 'string' ? input : input.toISOString();
|
|
33
|
+
}
|
|
34
|
+
export function urlJoin(baseUrl, ...parts) {
|
|
35
|
+
const normalizedBase = normalizeBaseUrl(baseUrl);
|
|
36
|
+
const normalizedParts = parts
|
|
37
|
+
.map((part) => part.trim())
|
|
38
|
+
.filter((part) => part.length > 0)
|
|
39
|
+
.map((part) => part.replace(/^\/+|\/+$/g, ''))
|
|
40
|
+
.filter((part) => part.length > 0);
|
|
41
|
+
if (normalizedParts.length === 0) {
|
|
42
|
+
return normalizedBase;
|
|
43
|
+
}
|
|
44
|
+
return `${normalizedBase}/${normalizedParts.join('/')}`;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/format.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAE/B,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC;IACjG,OAAO,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QAChC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;IAC9D,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClC,OAAO,KAAK,IAAI,GAAG,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QAChC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;IAC9D,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAqB;IAClD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClC,CAAC;IAED,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,GAAG,KAAe;IACzD,MAAM,cAAc,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,eAAe,GAAG,KAAK;SAC1B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SACjC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;SAC7C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAErC,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,OAAO,GAAG,cAAc,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AgentBannerConfig } from './types';
|
|
2
|
+
export declare function renderAgentBanner(config: AgentBannerConfig): string;
|
|
3
|
+
export declare function printAgentBanner(config: AgentBannerConfig, logger?: Pick<Console, 'log'>): void;
|
|
4
|
+
//# sourceMappingURL=banner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/banner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AA6BjD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CA+CnE;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,iBAAiB,EACzB,MAAM,GAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAW,GACrC,IAAI,CAEN"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const DEFAULT_BANNER_WIDTH = 48;
|
|
2
|
+
export declare const BORDER_CHAR = "\u2550";
|
|
3
|
+
export declare function getBorder(width: number): string;
|
|
4
|
+
export declare function normalizeBaseUrl(baseUrl: string): string;
|
|
5
|
+
export declare function normalizePrefix(prefix: string): string;
|
|
6
|
+
export declare function normalizePath(pathValue: string): string;
|
|
7
|
+
export declare function toIsoTimestamp(input?: string | Date): string;
|
|
8
|
+
export declare function urlJoin(baseUrl: string, ...parts: string[]): string;
|
|
9
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/format.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,WAAW,WAAM,CAAC;AAE/B,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAStD;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CASvD;AAED,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAM5D;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAanE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC/D,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD';
|
|
2
|
+
export interface AgentEndpoint {
|
|
3
|
+
method: HttpMethod;
|
|
4
|
+
path: string;
|
|
5
|
+
description: string;
|
|
6
|
+
}
|
|
7
|
+
export interface AgentBannerConfig {
|
|
8
|
+
agentName: string;
|
|
9
|
+
packageJsonPath?: string;
|
|
10
|
+
version?: string;
|
|
11
|
+
baseUrl: string;
|
|
12
|
+
prefix: string;
|
|
13
|
+
docsPath?: string;
|
|
14
|
+
healthPath?: string;
|
|
15
|
+
endpoints?: AgentEndpoint[];
|
|
16
|
+
environment?: string;
|
|
17
|
+
timestamp?: string | Date;
|
|
18
|
+
width?: number;
|
|
19
|
+
emoji?: boolean;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAE1F,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB"}
|
package/package.json
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agent-banner-library",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Standardized startup banner logger for REST API agents.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"agent",
|
|
7
|
+
"banner",
|
|
8
|
+
"logger",
|
|
9
|
+
"startup",
|
|
10
|
+
"rest",
|
|
11
|
+
"api"
|
|
12
|
+
],
|
|
13
|
+
"author": "Auronforge",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "https://github.com/auronforge/agent-banner-library.git",
|
|
18
|
+
"directory": "packages/agent-banner"
|
|
19
|
+
},
|
|
20
|
+
"bugs": {
|
|
21
|
+
"url": "https://github.com/auronforge/agent-banner-library/issues"
|
|
22
|
+
},
|
|
23
|
+
"homepage": "https://github.com/auronforge/agent-banner-library#readme",
|
|
24
|
+
"type": "module",
|
|
25
|
+
"main": "./dist/cjs/index.cjs",
|
|
26
|
+
"module": "./dist/esm/index.js",
|
|
27
|
+
"types": "./dist/types/index.d.ts",
|
|
28
|
+
"exports": {
|
|
29
|
+
".": {
|
|
30
|
+
"types": "./dist/types/index.d.ts",
|
|
31
|
+
"import": "./dist/esm/index.js",
|
|
32
|
+
"require": "./dist/cjs/index.cjs"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist",
|
|
37
|
+
"README.md",
|
|
38
|
+
"CHANGELOG.md",
|
|
39
|
+
"LICENSE"
|
|
40
|
+
],
|
|
41
|
+
"publishConfig": {
|
|
42
|
+
"access": "public"
|
|
43
|
+
},
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=20"
|
|
46
|
+
},
|
|
47
|
+
"scripts": {
|
|
48
|
+
"build": "npm run build:types && npm run build:esm && npm run build:cjs",
|
|
49
|
+
"build:esm": "tsc -p tsconfig.build.esm.json",
|
|
50
|
+
"build:cjs": "tsc -p tsconfig.build.cjs.json && node scripts/rename-cjs.js",
|
|
51
|
+
"build:types": "tsc -p tsconfig.build.types.json",
|
|
52
|
+
"lint": "eslint . --max-warnings=0",
|
|
53
|
+
"lint:fix": "eslint . --fix",
|
|
54
|
+
"format": "prettier --write",
|
|
55
|
+
"format:check": "prettier --check",
|
|
56
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
57
|
+
"dev": "npx tsx scripts/dev.ts",
|
|
58
|
+
"test": "jest",
|
|
59
|
+
"test:coverage": "jest --coverage",
|
|
60
|
+
"release": "standard-version",
|
|
61
|
+
"prepublishOnly": "npm run build",
|
|
62
|
+
"prepare": "husky install"
|
|
63
|
+
},
|
|
64
|
+
"devDependencies": {
|
|
65
|
+
"@commitlint/cli": "^19.3.0",
|
|
66
|
+
"@commitlint/config-conventional": "^19.3.0",
|
|
67
|
+
"@types/jest": "^29.5.12",
|
|
68
|
+
"@typescript-eslint/eslint-plugin": "^8.3.0",
|
|
69
|
+
"@typescript-eslint/parser": "^8.3.0",
|
|
70
|
+
"eslint": "^9.10.0",
|
|
71
|
+
"eslint-config-prettier": "^9.1.0",
|
|
72
|
+
"husky": "^9.1.4",
|
|
73
|
+
"jest": "^29.7.0",
|
|
74
|
+
"lint-staged": "^15.2.9",
|
|
75
|
+
"prettier": "^3.3.3",
|
|
76
|
+
"standard-version": "^9.5.0",
|
|
77
|
+
"ts-jest": "^29.2.5",
|
|
78
|
+
"tslib": "^2.6.3",
|
|
79
|
+
"tsx": "^4.19.2",
|
|
80
|
+
"typescript": "^5.6.3"
|
|
81
|
+
}
|
|
82
|
+
}
|