specsmd 0.0.3 → 0.0.5
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/lib/cli-utils.js +16 -45
- package/lib/constants.js +5 -4
- package/lib/ink-logo.mjs +59 -0
- package/package.json +3 -2
package/lib/cli-utils.js
CHANGED
|
@@ -3,19 +3,9 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
const chalk = require('chalk');
|
|
6
|
-
const figlet = require('figlet');
|
|
7
6
|
const gradient = require('gradient-string');
|
|
8
7
|
const path = require('path');
|
|
9
8
|
|
|
10
|
-
// Lazy load oh-my-logo (ESM module) via dynamic import
|
|
11
|
-
let ohMyLogo = null;
|
|
12
|
-
const getOhMyLogo = async () => {
|
|
13
|
-
if (!ohMyLogo) {
|
|
14
|
-
ohMyLogo = await import('oh-my-logo');
|
|
15
|
-
}
|
|
16
|
-
return ohMyLogo;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
9
|
const { THEME_COLORS } = require('./constants');
|
|
20
10
|
|
|
21
11
|
// Theme Colors (Terracotta/Orange inspired by Claude Code)
|
|
@@ -24,6 +14,16 @@ const THEME = THEME_COLORS;
|
|
|
24
14
|
// Create gradient for logo
|
|
25
15
|
const logoGradient = gradient([THEME.primary, THEME.secondary]);
|
|
26
16
|
|
|
17
|
+
// Pixel-art style logo (brick blocks with 3D effect)
|
|
18
|
+
const PIXEL_LOGO = `
|
|
19
|
+
███████╗ ██████╗ ███████╗ ██████╗ ███████╗ ███╗ ███╗ ██████╗
|
|
20
|
+
██╔════╝ ██╔══██╗ ██╔════╝ ██╔════╝ ██╔════╝ ████╗ ████║ ██╔══██╗
|
|
21
|
+
███████╗ ██████╔╝ █████╗ ██║ ███████╗ ██╔████╔██║ ██║ ██║
|
|
22
|
+
╚════██║ ██╔═══╝ ██╔══╝ ██║ ╚════██║ ██║╚██╔╝██║ ██║ ██║
|
|
23
|
+
███████║ ██║ ███████╗ ╚██████╗ ███████║ ██╗ ██║ ╚═╝ ██║ ██████╔╝
|
|
24
|
+
╚══════╝ ╚═╝ ╚══════╝ ╚═════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝
|
|
25
|
+
`;
|
|
26
|
+
|
|
27
27
|
// Theme chalk instances
|
|
28
28
|
const theme = {
|
|
29
29
|
primary: chalk.hex(THEME.primary),
|
|
@@ -75,8 +75,7 @@ const CLIUtils = {
|
|
|
75
75
|
},
|
|
76
76
|
|
|
77
77
|
/**
|
|
78
|
-
* Display the specs.md logo with
|
|
79
|
-
* Uses oh-my-logo for beautiful gradient rendering
|
|
78
|
+
* Display the specs.md logo with ASCII art
|
|
80
79
|
* @param {boolean} clearScreen - Whether to clear screen first
|
|
81
80
|
*/
|
|
82
81
|
async displayLogo(clearScreen = true) {
|
|
@@ -87,32 +86,14 @@ const CLIUtils = {
|
|
|
87
86
|
const version = this.getVersion();
|
|
88
87
|
|
|
89
88
|
console.log('');
|
|
90
|
-
|
|
91
|
-
try {
|
|
92
|
-
// Use oh-my-logo with custom orange palette and Standard font (lowercase)
|
|
93
|
-
const { render } = await getOhMyLogo();
|
|
94
|
-
const logo = await render('specs.md', {
|
|
95
|
-
palette: [THEME.primary, THEME.secondary, '#ffb380'],
|
|
96
|
-
font: 'Standard',
|
|
97
|
-
direction: 'horizontal'
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
console.log(logo);
|
|
101
|
-
} catch (err) {
|
|
102
|
-
// Fallback to figlet + gradient-string if oh-my-logo fails
|
|
103
|
-
const figletArt = figlet.textSync('specs.md', {
|
|
104
|
-
font: 'Standard',
|
|
105
|
-
horizontalLayout: 'default'
|
|
106
|
-
});
|
|
107
|
-
console.log(logoGradient(figletArt));
|
|
108
|
-
}
|
|
89
|
+
console.log(logoGradient(PIXEL_LOGO));
|
|
109
90
|
|
|
110
91
|
// Tagline with version
|
|
111
92
|
console.log(theme.primary(' AI-native development orchestration') + theme.primary.bold(` v${version}`) + '\n');
|
|
112
93
|
},
|
|
113
94
|
|
|
114
95
|
/**
|
|
115
|
-
* Display the specsmd logo synchronously
|
|
96
|
+
* Display the specsmd logo synchronously with ASCII art
|
|
116
97
|
* @param {boolean} clearScreen - Whether to clear screen first
|
|
117
98
|
*/
|
|
118
99
|
displayLogoSync(clearScreen = true) {
|
|
@@ -122,21 +103,15 @@ const CLIUtils = {
|
|
|
122
103
|
|
|
123
104
|
const version = this.getVersion();
|
|
124
105
|
|
|
125
|
-
// Generate ASCII art with figlet
|
|
126
|
-
const figletArt = figlet.textSync('specs.md', {
|
|
127
|
-
font: 'Big',
|
|
128
|
-
horizontalLayout: 'default'
|
|
129
|
-
});
|
|
130
|
-
|
|
131
106
|
console.log('');
|
|
132
|
-
console.log(logoGradient(
|
|
107
|
+
console.log(logoGradient(PIXEL_LOGO));
|
|
133
108
|
|
|
134
109
|
// Tagline with version
|
|
135
110
|
console.log(theme.primary(' AI-native development orchestration') + theme.primary.bold(` v${version}`) + '\n');
|
|
136
111
|
},
|
|
137
112
|
|
|
138
113
|
/**
|
|
139
|
-
* Display the logo using
|
|
114
|
+
* Display the logo using pixel-art style (alternative/legacy method name)
|
|
140
115
|
* @param {boolean} clearScreen - Whether to clear screen first
|
|
141
116
|
*/
|
|
142
117
|
displayFigletLogo(clearScreen = true) {
|
|
@@ -145,12 +120,8 @@ const CLIUtils = {
|
|
|
145
120
|
}
|
|
146
121
|
|
|
147
122
|
const version = this.getVersion();
|
|
148
|
-
const art = figlet.textSync('specs.md', {
|
|
149
|
-
font: 'Big',
|
|
150
|
-
horizontalLayout: 'full'
|
|
151
|
-
});
|
|
152
123
|
|
|
153
|
-
console.log(logoGradient(
|
|
124
|
+
console.log(logoGradient(PIXEL_LOGO));
|
|
154
125
|
console.log(theme.dim(' AI-native development orchestration') + theme.primary.bold(` v${version}`) + '\n');
|
|
155
126
|
},
|
|
156
127
|
|
package/lib/constants.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
|
|
2
|
-
// Theme Colors (
|
|
2
|
+
// Theme Colors (extracted from specs.md pixel logo)
|
|
3
3
|
const THEME_COLORS = {
|
|
4
|
-
primary: '#
|
|
5
|
-
secondary: '#
|
|
4
|
+
primary: '#C45050', // Brick red fill
|
|
5
|
+
secondary: '#D86565', // Coral red highlight
|
|
6
|
+
accent: '#EC8080', // Light coral
|
|
6
7
|
success: '#22c55e', // Green
|
|
7
8
|
error: '#ef4444', // Red
|
|
8
9
|
warning: '#f59e0b', // Amber
|
|
9
10
|
info: '#3b82f6', // Blue
|
|
10
|
-
dim: '#
|
|
11
|
+
dim: '#2D2D32' // Dark charcoal outline
|
|
11
12
|
};
|
|
12
13
|
|
|
13
14
|
const FLOWS = {
|
package/lib/ink-logo.mjs
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* specs.md Logo Component
|
|
4
|
+
*
|
|
5
|
+
* Red ASCII logo with black shadows
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import { render, Text, Box } from 'ink';
|
|
10
|
+
|
|
11
|
+
const { createElement: h } = React;
|
|
12
|
+
|
|
13
|
+
// Colors (red)
|
|
14
|
+
const LOGO_COLOR = '#CC0000';
|
|
15
|
+
const VERSION_COLOR = '#FF3333';
|
|
16
|
+
|
|
17
|
+
// ASCII Logo (exact from specs.md branding)
|
|
18
|
+
const asciiLogoRaw = `
|
|
19
|
+
█████
|
|
20
|
+
░░███
|
|
21
|
+
█████ ████████ ██████ ██████ █████ █████████████ ███████
|
|
22
|
+
███░░ ░░███░░███ ███░░███ ███░░███ ███░░ ░░███░░███░░███ ███░░███
|
|
23
|
+
░░█████ ░███ ░███░███████ ░███ ░░░ ░░█████ ░███ ░███ ░███ ░███ ░███
|
|
24
|
+
░░░░███ ░███ ░███░███░░░ ░███ ███ ░░░░███ ░███ ░███ ░███ ░███ ░███
|
|
25
|
+
██████ ░███████ ░░██████ ░░██████ ██████ ██ █████░███ █████░░████████
|
|
26
|
+
░░░░░░ ░███░░░ ░░░░░░ ░░░░░░ ░░░░░░ ░░ ░░░░░ ░░░ ░░░░░ ░░░░░░░░
|
|
27
|
+
░███
|
|
28
|
+
█████
|
|
29
|
+
░░░░░
|
|
30
|
+
`;
|
|
31
|
+
|
|
32
|
+
// Process to remove shadow characters (░ becomes space for black background)
|
|
33
|
+
const asciiLogo = asciiLogoRaw.replace(/░/g, ' ');
|
|
34
|
+
|
|
35
|
+
// Header component
|
|
36
|
+
const Header = ({ version = '0.0.3' }) => {
|
|
37
|
+
return h(Box, { flexDirection: 'column' },
|
|
38
|
+
h(Text, { color: LOGO_COLOR }, asciiLogo),
|
|
39
|
+
h(Box, { marginTop: 0 },
|
|
40
|
+
h(Text, { color: LOGO_COLOR },
|
|
41
|
+
' AI-native development orchestration ',
|
|
42
|
+
h(Text, { bold: true, color: VERSION_COLOR }, `v${version}`)
|
|
43
|
+
)
|
|
44
|
+
)
|
|
45
|
+
);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// Exports for use in other modules
|
|
49
|
+
export { Header, asciiLogo, LOGO_COLOR, VERSION_COLOR };
|
|
50
|
+
|
|
51
|
+
// App component for standalone testing
|
|
52
|
+
const App = () => {
|
|
53
|
+
const args = process.argv.slice(2);
|
|
54
|
+
const version = args[0] || '0.0.3';
|
|
55
|
+
return h(Header, { version });
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
console.clear();
|
|
59
|
+
render(h(App));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "specsmd",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"description": "Multi-agent orchestration system for AI-native software development. Delivers AI-DLC, Agile, and custom SDLC flows as markdown-based agent systems.",
|
|
5
5
|
"main": "lib/installer.js",
|
|
6
6
|
"bin": {
|
|
@@ -45,7 +45,8 @@
|
|
|
45
45
|
"gradient-string": "^2.0.2",
|
|
46
46
|
"js-yaml": "^4.1.0",
|
|
47
47
|
"oh-my-logo": "^0.4.0",
|
|
48
|
-
"prompts": "^2.4.2"
|
|
48
|
+
"prompts": "^2.4.2",
|
|
49
|
+
"terminal-image": "^4.1.0"
|
|
49
50
|
},
|
|
50
51
|
"engines": {
|
|
51
52
|
"node": ">=14.0.0"
|