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 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 gradient ASCII art (lowercase with shadow)
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 using figlet (fallback)
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(figletArt));
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 figlet (alternative style)
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(art));
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 (Terracotta/Orange inspired by Claude Code)
2
+ // Theme Colors (extracted from specs.md pixel logo)
3
3
  const THEME_COLORS = {
4
- primary: '#D97757', // Terracotta
5
- secondary: '#ff9966', // Light orange
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: '#6b7280' // Gray
11
+ dim: '#2D2D32' // Dark charcoal outline
11
12
  };
12
13
 
13
14
  const FLOWS = {
@@ -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",
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"