agent-banner-library 0.0.5 → 0.0.6

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 CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ### 0.0.6 (2026-02-07)
6
+
7
+ - version bump
8
+
5
9
  ### 0.0.5 (2026-02-06)
6
10
 
7
11
  ### Features
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const banner_1 = require("./banner.cjs");
4
+ const border = '═'.repeat(48);
5
+ describe('renderAgentBanner', () => {
6
+ it('renders the exact banner output', () => {
7
+ const output = (0, banner_1.renderAgentBanner)({
8
+ agentName: 'Backlog Structurer Agent API',
9
+ version: '1.2.3',
10
+ baseUrl: 'http://localhost:3001',
11
+ prefix: '/api/v1',
12
+ docsPath: '/docs',
13
+ healthPath: '/health',
14
+ endpoints: [
15
+ {
16
+ method: 'POST',
17
+ path: '/backlog/structure',
18
+ description: 'Generate structured backlog',
19
+ },
20
+ ],
21
+ environment: 'development',
22
+ timestamp: '2026-02-05T23:49:50.079Z',
23
+ width: 48,
24
+ });
25
+ const expected = [
26
+ border,
27
+ '🚀 Backlog Structurer Agent API - 1.2.3',
28
+ border,
29
+ '📡 Server running on: http://localhost:3001',
30
+ '📚 API Documentation: http://localhost:3001/api/v1/docs',
31
+ '🏥 Health Check: http://localhost:3001/api/v1/health',
32
+ '📝 Endpoints:',
33
+ ' - POST - Generate structured backlog - http://localhost:3001/api/v1/backlog/structure',
34
+ border,
35
+ 'Environment: development',
36
+ 'Timestamp: 2026-02-05T23:49:50.079Z',
37
+ border,
38
+ ].join('\n');
39
+ expect(output).toBe(`${expected}\n`);
40
+ });
41
+ it('renders without emojis and handles empty endpoints', () => {
42
+ const output = (0, banner_1.renderAgentBanner)({
43
+ agentName: 'Capability Mapper',
44
+ version: '2.0.0',
45
+ baseUrl: 'http://localhost:3002/',
46
+ prefix: 'api/v2/',
47
+ environment: 'test',
48
+ timestamp: '2026-02-05T00:00:00.000Z',
49
+ emoji: false,
50
+ });
51
+ const expected = [
52
+ border,
53
+ 'Capability Mapper - 2.0.0',
54
+ border,
55
+ 'Server running on: http://localhost:3002',
56
+ 'API Documentation: http://localhost:3002/api/v2/docs',
57
+ 'Health Check: http://localhost:3002/api/v2/health',
58
+ 'Endpoints:',
59
+ ' - (none)',
60
+ border,
61
+ 'Environment: test',
62
+ 'Timestamp: 2026-02-05T00:00:00.000Z',
63
+ border,
64
+ ].join('\n');
65
+ expect(output).toBe(`${expected}\n`);
66
+ });
67
+ it('uses package.json version and handles missing file', () => {
68
+ const outputWithOverride = (0, banner_1.renderAgentBanner)({
69
+ agentName: 'Version Override',
70
+ version: '9.9.9',
71
+ baseUrl: 'http://localhost:3000',
72
+ prefix: '/api',
73
+ });
74
+ expect(outputWithOverride).toContain('Version Override - 9.9.9');
75
+ const outputMissing = (0, banner_1.renderAgentBanner)({
76
+ agentName: 'Missing Package',
77
+ baseUrl: 'http://localhost:3000',
78
+ prefix: '/api',
79
+ packageJsonPath: './does-not-exist.json',
80
+ });
81
+ expect(outputMissing).toContain('Missing Package - 0.0.0');
82
+ });
83
+ it('prints via logger', () => {
84
+ const calls = [];
85
+ const logger = {
86
+ log(message) {
87
+ calls.push(message);
88
+ },
89
+ };
90
+ const output = (0, banner_1.renderAgentBanner)({
91
+ agentName: 'Logger Test',
92
+ baseUrl: 'http://localhost:3000',
93
+ prefix: '/api',
94
+ });
95
+ logger.log(output);
96
+ expect(calls[0]).toBe(output);
97
+ });
98
+ });
99
+ //# sourceMappingURL=banner.test.cjs.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "file": "banner.test.cjs",
4
+ "sourceRoot": "",
5
+ "sources": [
6
+ "../../src/banner.test.ts"
7
+ ],
8
+ "names": [],
9
+ "mappings": "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"
10
+ }
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const format_1 = require("./format.cjs");
4
+ describe('normalizePrefix', () => {
5
+ it('normalizes prefix variants', () => {
6
+ expect((0, format_1.normalizePrefix)('api/v1')).toBe('/api/v1');
7
+ expect((0, format_1.normalizePrefix)('/api/v1/')).toBe('/api/v1');
8
+ expect((0, format_1.normalizePrefix)('/')).toBe('/');
9
+ });
10
+ it('handles empty prefixes', () => {
11
+ expect((0, format_1.normalizePrefix)(' ')).toBe('/');
12
+ });
13
+ });
14
+ describe('normalizePath', () => {
15
+ it('normalizes endpoint paths', () => {
16
+ expect((0, format_1.normalizePath)('backlog/structure')).toBe('/backlog/structure');
17
+ expect((0, format_1.normalizePath)('/backlog/structure')).toBe('/backlog/structure');
18
+ });
19
+ it('handles empty paths', () => {
20
+ expect((0, format_1.normalizePath)(' ')).toBe('/');
21
+ });
22
+ });
23
+ describe('normalizeBaseUrl', () => {
24
+ it('trims trailing slashes', () => {
25
+ expect((0, format_1.normalizeBaseUrl)('http://localhost:3000/')).toBe('http://localhost:3000');
26
+ });
27
+ });
28
+ describe('getBorder', () => {
29
+ it('falls back on invalid widths', () => {
30
+ expect((0, format_1.getBorder)(0).length).toBeGreaterThan(0);
31
+ });
32
+ });
33
+ describe('toIsoTimestamp', () => {
34
+ it('handles Date and string inputs', () => {
35
+ const date = new Date('2026-02-05T00:00:00.000Z');
36
+ expect((0, format_1.toIsoTimestamp)(date)).toBe('2026-02-05T00:00:00.000Z');
37
+ expect((0, format_1.toIsoTimestamp)('2026-02-05T00:00:00.000Z')).toBe('2026-02-05T00:00:00.000Z');
38
+ });
39
+ it('handles undefined input', () => {
40
+ const value = (0, format_1.toIsoTimestamp)();
41
+ expect(value).toMatch(/T/);
42
+ });
43
+ });
44
+ describe('urlJoin', () => {
45
+ it('joins urls without double slashes', () => {
46
+ const url = (0, format_1.urlJoin)('http://localhost:3001/', '/api/v1/', '/health');
47
+ expect(url).toBe('http://localhost:3001/api/v1/health');
48
+ });
49
+ it('supports root prefix', () => {
50
+ const url = (0, format_1.urlJoin)('http://localhost:3001', '/', '/docs');
51
+ expect(url).toBe('http://localhost:3001/docs');
52
+ });
53
+ it('returns base url when no parts', () => {
54
+ const url = (0, format_1.urlJoin)('http://localhost:3001/');
55
+ expect(url).toBe('http://localhost:3001');
56
+ });
57
+ });
58
+ //# sourceMappingURL=format.test.cjs.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "file": "format.test.cjs",
4
+ "sourceRoot": "",
5
+ "sources": [
6
+ "../../src/format.test.ts"
7
+ ],
8
+ "names": [],
9
+ "mappings": ";;AAAA,qCAOkB;AAElB,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,IAAA,wBAAe,EAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,IAAA,wBAAe,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,CAAC,IAAA,wBAAe,EAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,IAAA,wBAAe,EAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,IAAA,sBAAa,EAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACtE,MAAM,CAAC,IAAA,sBAAa,EAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,IAAA,sBAAa,EAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,IAAA,yBAAgB,EAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,IAAA,kBAAS,EAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAClD,MAAM,CAAC,IAAA,uBAAc,EAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAA,uBAAc,EAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,KAAK,GAAG,IAAA,uBAAc,GAAE,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,GAAG,GAAG,IAAA,gBAAO,EAAC,wBAAwB,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QACrE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,GAAG,GAAG,IAAA,gBAAO,EAAC,uBAAuB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,GAAG,GAAG,IAAA,gBAAO,EAAC,wBAAwB,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"
10
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const index_1 = require("./index.cjs");
4
+ describe('index exports', () => {
5
+ it('exports renderAgentBanner and printAgentBanner', () => {
6
+ const output = (0, index_1.renderAgentBanner)({
7
+ agentName: 'Index Test',
8
+ baseUrl: 'http://localhost:3000',
9
+ prefix: '/api',
10
+ });
11
+ const calls = [];
12
+ const logger = {
13
+ log(message) {
14
+ calls.push(message);
15
+ },
16
+ };
17
+ (0, index_1.printAgentBanner)({
18
+ agentName: 'Index Test',
19
+ baseUrl: 'http://localhost:3000',
20
+ prefix: '/api',
21
+ }, logger);
22
+ expect(output).toContain('Index Test');
23
+ expect(calls[0]).toContain('Index Test');
24
+ });
25
+ });
26
+ //# sourceMappingURL=index.test.cjs.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "file": "index.test.cjs",
4
+ "sourceRoot": "",
5
+ "sources": [
6
+ "../../src/index.test.ts"
7
+ ],
8
+ "names": [],
9
+ "mappings": ";;AAAA,mCAA8D;AAE9D,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,MAAM,GAAG,IAAA,yBAAiB,EAAC;YAC/B,SAAS,EAAE,YAAY;YACvB,OAAO,EAAE,uBAAuB;YAChC,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QAEH,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG;YACb,GAAG,CAAC,OAAe;gBACjB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;SACF,CAAC;QAEF,IAAA,wBAAgB,EACd;YACE,SAAS,EAAE,YAAY;YACvB,OAAO,EAAE,uBAAuB;YAChC,MAAM,EAAE,MAAM;SACf,EACD,MAAM,CACP,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"
10
+ }
@@ -0,0 +1,97 @@
1
+ import { renderAgentBanner } from './banner';
2
+ const border = '═'.repeat(48);
3
+ describe('renderAgentBanner', () => {
4
+ it('renders the exact banner output', () => {
5
+ const output = renderAgentBanner({
6
+ agentName: 'Backlog Structurer Agent API',
7
+ version: '1.2.3',
8
+ baseUrl: 'http://localhost:3001',
9
+ prefix: '/api/v1',
10
+ docsPath: '/docs',
11
+ healthPath: '/health',
12
+ endpoints: [
13
+ {
14
+ method: 'POST',
15
+ path: '/backlog/structure',
16
+ description: 'Generate structured backlog',
17
+ },
18
+ ],
19
+ environment: 'development',
20
+ timestamp: '2026-02-05T23:49:50.079Z',
21
+ width: 48,
22
+ });
23
+ const expected = [
24
+ border,
25
+ '🚀 Backlog Structurer Agent API - 1.2.3',
26
+ border,
27
+ '📡 Server running on: http://localhost:3001',
28
+ '📚 API Documentation: http://localhost:3001/api/v1/docs',
29
+ '🏥 Health Check: http://localhost:3001/api/v1/health',
30
+ '📝 Endpoints:',
31
+ ' - POST - Generate structured backlog - http://localhost:3001/api/v1/backlog/structure',
32
+ border,
33
+ 'Environment: development',
34
+ 'Timestamp: 2026-02-05T23:49:50.079Z',
35
+ border,
36
+ ].join('\n');
37
+ expect(output).toBe(`${expected}\n`);
38
+ });
39
+ it('renders without emojis and handles empty endpoints', () => {
40
+ const output = renderAgentBanner({
41
+ agentName: 'Capability Mapper',
42
+ version: '2.0.0',
43
+ baseUrl: 'http://localhost:3002/',
44
+ prefix: 'api/v2/',
45
+ environment: 'test',
46
+ timestamp: '2026-02-05T00:00:00.000Z',
47
+ emoji: false,
48
+ });
49
+ const expected = [
50
+ border,
51
+ 'Capability Mapper - 2.0.0',
52
+ border,
53
+ 'Server running on: http://localhost:3002',
54
+ 'API Documentation: http://localhost:3002/api/v2/docs',
55
+ 'Health Check: http://localhost:3002/api/v2/health',
56
+ 'Endpoints:',
57
+ ' - (none)',
58
+ border,
59
+ 'Environment: test',
60
+ 'Timestamp: 2026-02-05T00:00:00.000Z',
61
+ border,
62
+ ].join('\n');
63
+ expect(output).toBe(`${expected}\n`);
64
+ });
65
+ it('uses package.json version and handles missing file', () => {
66
+ const outputWithOverride = renderAgentBanner({
67
+ agentName: 'Version Override',
68
+ version: '9.9.9',
69
+ baseUrl: 'http://localhost:3000',
70
+ prefix: '/api',
71
+ });
72
+ expect(outputWithOverride).toContain('Version Override - 9.9.9');
73
+ const outputMissing = renderAgentBanner({
74
+ agentName: 'Missing Package',
75
+ baseUrl: 'http://localhost:3000',
76
+ prefix: '/api',
77
+ packageJsonPath: './does-not-exist.json',
78
+ });
79
+ expect(outputMissing).toContain('Missing Package - 0.0.0');
80
+ });
81
+ it('prints via logger', () => {
82
+ const calls = [];
83
+ const logger = {
84
+ log(message) {
85
+ calls.push(message);
86
+ },
87
+ };
88
+ const output = renderAgentBanner({
89
+ agentName: 'Logger Test',
90
+ baseUrl: 'http://localhost:3000',
91
+ prefix: '/api',
92
+ });
93
+ logger.log(output);
94
+ expect(calls[0]).toBe(output);
95
+ });
96
+ });
97
+ //# sourceMappingURL=banner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.test.js","sourceRoot":"","sources":["../../src/banner.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { getBorder, normalizeBaseUrl, normalizePath, normalizePrefix, toIsoTimestamp, urlJoin, } from './format';
2
+ describe('normalizePrefix', () => {
3
+ it('normalizes prefix variants', () => {
4
+ expect(normalizePrefix('api/v1')).toBe('/api/v1');
5
+ expect(normalizePrefix('/api/v1/')).toBe('/api/v1');
6
+ expect(normalizePrefix('/')).toBe('/');
7
+ });
8
+ it('handles empty prefixes', () => {
9
+ expect(normalizePrefix(' ')).toBe('/');
10
+ });
11
+ });
12
+ describe('normalizePath', () => {
13
+ it('normalizes endpoint paths', () => {
14
+ expect(normalizePath('backlog/structure')).toBe('/backlog/structure');
15
+ expect(normalizePath('/backlog/structure')).toBe('/backlog/structure');
16
+ });
17
+ it('handles empty paths', () => {
18
+ expect(normalizePath(' ')).toBe('/');
19
+ });
20
+ });
21
+ describe('normalizeBaseUrl', () => {
22
+ it('trims trailing slashes', () => {
23
+ expect(normalizeBaseUrl('http://localhost:3000/')).toBe('http://localhost:3000');
24
+ });
25
+ });
26
+ describe('getBorder', () => {
27
+ it('falls back on invalid widths', () => {
28
+ expect(getBorder(0).length).toBeGreaterThan(0);
29
+ });
30
+ });
31
+ describe('toIsoTimestamp', () => {
32
+ it('handles Date and string inputs', () => {
33
+ const date = new Date('2026-02-05T00:00:00.000Z');
34
+ expect(toIsoTimestamp(date)).toBe('2026-02-05T00:00:00.000Z');
35
+ expect(toIsoTimestamp('2026-02-05T00:00:00.000Z')).toBe('2026-02-05T00:00:00.000Z');
36
+ });
37
+ it('handles undefined input', () => {
38
+ const value = toIsoTimestamp();
39
+ expect(value).toMatch(/T/);
40
+ });
41
+ });
42
+ describe('urlJoin', () => {
43
+ it('joins urls without double slashes', () => {
44
+ const url = urlJoin('http://localhost:3001/', '/api/v1/', '/health');
45
+ expect(url).toBe('http://localhost:3001/api/v1/health');
46
+ });
47
+ it('supports root prefix', () => {
48
+ const url = urlJoin('http://localhost:3001', '/', '/docs');
49
+ expect(url).toBe('http://localhost:3001/docs');
50
+ });
51
+ it('returns base url when no parts', () => {
52
+ const url = urlJoin('http://localhost:3001/');
53
+ expect(url).toBe('http://localhost:3001');
54
+ });
55
+ });
56
+ //# sourceMappingURL=format.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.test.js","sourceRoot":"","sources":["../../src/format.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { printAgentBanner, renderAgentBanner } from './index';
2
+ describe('index exports', () => {
3
+ it('exports renderAgentBanner and printAgentBanner', () => {
4
+ const output = renderAgentBanner({
5
+ agentName: 'Index Test',
6
+ baseUrl: 'http://localhost:3000',
7
+ prefix: '/api',
8
+ });
9
+ const calls = [];
10
+ const logger = {
11
+ log(message) {
12
+ calls.push(message);
13
+ },
14
+ };
15
+ printAgentBanner({
16
+ agentName: 'Index Test',
17
+ baseUrl: 'http://localhost:3000',
18
+ prefix: '/api',
19
+ }, logger);
20
+ expect(output).toContain('Index Test');
21
+ expect(calls[0]).toContain('Index Test');
22
+ });
23
+ });
24
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE9D,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,MAAM,GAAG,iBAAiB,CAAC;YAC/B,SAAS,EAAE,YAAY;YACvB,OAAO,EAAE,uBAAuB;YAChC,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QAEH,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG;YACb,GAAG,CAAC,OAAe;gBACjB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;SACF,CAAC;QAEF,gBAAgB,CACd;YACE,SAAS,EAAE,YAAY;YACvB,OAAO,EAAE,uBAAuB;YAChC,MAAM,EAAE,MAAM;SACf,EACD,MAAM,CACP,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=banner.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.test.d.ts","sourceRoot":"","sources":["../../src/banner.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=format.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.test.d.ts","sourceRoot":"","sources":["../../src/format.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/index.test.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-banner-library",
3
- "version": "0.0.5",
3
+ "version": "0.0.6",
4
4
  "description": "Standardized startup banner logger for REST API agents.",
5
5
  "keywords": [
6
6
  "agent",
@@ -56,7 +56,7 @@
56
56
  "typecheck": "tsc -p tsconfig.json --noEmit",
57
57
  "dev": "npx tsx scripts/dev.ts",
58
58
  "test": "jest",
59
- "test:coverage": "jest --coverage",
59
+ "test:coverage": "jest --coverage --passWithNoTests",
60
60
  "release": "standard-version --skip.tag",
61
61
  "prepublishOnly": "npm run build",
62
62
  "prepare": "husky install"