@ironbackend/cli 1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 IronBackend Contributors
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,113 @@
1
+ # @ironbackend/cli
2
+
3
+ Backend Architecture Intelligence CLI for AI Coding Assistants.
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@ironbackend/cli)](https://www.npmjs.com/package/@ironbackend/cli)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](../../LICENSE)
7
+
8
+ ## What is IronBackend?
9
+
10
+ A senior backend architect embedded inside your AI, installable via npm. IronBackend injects production-grade architectural knowledge into AI coding assistants like **Cursor**, **Claude**, **GitHub Copilot**, and more.
11
+
12
+ ## Installation
13
+
14
+ ```bash
15
+ # Install globally
16
+ npm install -g ironbackend
17
+
18
+ # Or use with npx
19
+ npx ironbackend init cursor
20
+ ```
21
+
22
+ ## Quick Start
23
+
24
+ ```bash
25
+ # Initialize for your AI tool
26
+ ironbackend init cursor # Cursor IDE
27
+ ironbackend init claude # Claude Code
28
+ ironbackend init copilot # GitHub Copilot
29
+ ironbackend init antigravity # Antigravity
30
+
31
+ # Interactive mode
32
+ ironbackend init
33
+
34
+ # With pre-selected style and stack
35
+ ironbackend init cursor --style hexagonal --stack node-nestjs
36
+ ```
37
+
38
+ ## Commands
39
+
40
+ | Command | Description |
41
+ |---------|-------------|
42
+ | `init <tool>` | Initialize for AI tool (cursor, claude, copilot, etc.) |
43
+ | `init` | Interactive tool selection |
44
+ | `select style <id>` | Select architecture style |
45
+ | `select stack <id>` | Select tech stack |
46
+ | `export prompts` | Export AI prompts |
47
+ | `doctor` | Validate setup |
48
+ | `list` | List available styles & stacks |
49
+ | `info` | Show current configuration |
50
+
51
+ ## Supported AI Tools
52
+
53
+ | Tool | Output Path |
54
+ |------|-------------|
55
+ | Claude Code | `CLAUDE.md` |
56
+ | Cursor IDE | `.cursor/rules/ironbackend.mdc` |
57
+ | Windsurf | `.windsurfrules` |
58
+ | Antigravity | `.gemini/settings/prompts.md` |
59
+ | GitHub Copilot | `.github/copilot-instructions.md` |
60
+ | Kiro | `.kiro/rules.md` |
61
+ | Codex | `AGENTS.md` |
62
+ | Gemini CLI | `GEMINI.md` |
63
+ | Trae | `.trae/rules.md` |
64
+
65
+ ## Architecture Styles
66
+
67
+ - **Clean Monolith** - Small teams, startups
68
+ - **Modular Monolith** - Growing teams, bounded contexts
69
+ - **Hexagonal** - Test-driven development
70
+ - **Event-Driven** - High throughput
71
+ - **CQRS** - Read-heavy workloads
72
+ - **Microservices (Sync/Async)** - Multiple teams
73
+ - **Serverless** - Variable traffic
74
+ - **Read-Heavy API** - Aggressive caching
75
+ - **Automation/Bot** - Scheduled jobs
76
+
77
+ ## Tech Stacks
78
+
79
+ - Node.js + NestJS + PostgreSQL
80
+ - Java + Spring Boot + PostgreSQL
81
+ - .NET + ASP.NET Core + SQL Server
82
+ - Python + FastAPI + PostgreSQL
83
+
84
+ ## Example
85
+
86
+ After running `ironbackend init cursor --style hexagonal --stack node-nestjs`:
87
+
88
+ Your AI assistant receives context like:
89
+
90
+ ```markdown
91
+ # IronBackend System Prompt
92
+
93
+ You are a senior backend engineer with 10+ years of experience
94
+ in Hexagonal Architecture using Node.js/NestJS.
95
+
96
+ ## Core Principles
97
+ 1. Domain and application core have no external dependencies
98
+ 2. Ports define what the application needs or provides
99
+ 3. Adapters implement ports for specific technologies
100
+
101
+ ## Enforced Rules
102
+ [ERROR] API-001: All endpoints must have explicit schemas
103
+ [ERROR] DOM-005: Domain logic must not depend on framework code
104
+ ```
105
+
106
+ ## Related Packages
107
+
108
+ - [`@ironbackend/core`](https://www.npmjs.com/package/@ironbackend/core) - Knowledge base
109
+ - [`@ironbackend/prompts`](https://www.npmjs.com/package/@ironbackend/prompts) - Prompt builders
110
+
111
+ ## License
112
+
113
+ MIT
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+
3
+ import('../dist/index.js').catch(err => {
4
+ console.error('Failed to load IronBackend CLI:', err.message);
5
+ process.exit(1);
6
+ });
@@ -0,0 +1,31 @@
1
+ /**
2
+ * AI Tools Registry
3
+ * Defines supported AI coding assistants and their configuration output paths
4
+ */
5
+ export interface AIToolConfig {
6
+ id: string;
7
+ name: string;
8
+ description: string;
9
+ outputPath: string;
10
+ /** File format: 'mdc' for Cursor rules, 'md' for standard markdown */
11
+ format: 'mdc' | 'md';
12
+ /** Globs pattern for file matching (used in some formats) */
13
+ globs?: string[];
14
+ }
15
+ /**
16
+ * All supported AI coding tools
17
+ */
18
+ export declare const AI_TOOLS: AIToolConfig[];
19
+ /**
20
+ * Get AI tool by ID
21
+ */
22
+ export declare function getAITool(id: string): AIToolConfig | undefined;
23
+ /**
24
+ * Get all AI tool IDs
25
+ */
26
+ export declare function getAIToolIds(): string[];
27
+ /**
28
+ * Generate content for specific AI tool format
29
+ */
30
+ export declare function formatForAITool(tool: AIToolConfig, content: string): string;
31
+ //# sourceMappingURL=ai-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-tools.d.ts","sourceRoot":"","sources":["../src/ai-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,MAAM,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,YAAY,EAiElC,CAAC;AAEF;;GAEG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE9D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAc3E"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * AI Tools Registry
3
+ * Defines supported AI coding assistants and their configuration output paths
4
+ */
5
+ /**
6
+ * All supported AI coding tools
7
+ */
8
+ export const AI_TOOLS = [
9
+ {
10
+ id: 'claude',
11
+ name: 'Claude Code',
12
+ description: 'Anthropic Claude Code (CLI & IDE)',
13
+ outputPath: 'CLAUDE.md',
14
+ format: 'md'
15
+ },
16
+ {
17
+ id: 'cursor',
18
+ name: 'Cursor',
19
+ description: 'Cursor IDE with .mdc rules',
20
+ outputPath: '.cursor/rules/ironbackend.mdc',
21
+ format: 'mdc',
22
+ globs: ['**/*.ts', '**/*.js', '**/*.py', '**/*.java', '**/*.cs', '**/*.go']
23
+ },
24
+ {
25
+ id: 'windsurf',
26
+ name: 'Windsurf',
27
+ description: 'Codeium Windsurf IDE',
28
+ outputPath: '.windsurfrules',
29
+ format: 'md'
30
+ },
31
+ {
32
+ id: 'antigravity',
33
+ name: 'Antigravity',
34
+ description: 'Google Antigravity coding assistant',
35
+ outputPath: '.gemini/settings/prompts.md',
36
+ format: 'md'
37
+ },
38
+ {
39
+ id: 'copilot',
40
+ name: 'GitHub Copilot',
41
+ description: 'GitHub Copilot with custom instructions',
42
+ outputPath: '.github/copilot-instructions.md',
43
+ format: 'md'
44
+ },
45
+ {
46
+ id: 'kiro',
47
+ name: 'Kiro',
48
+ description: 'AWS Kiro IDE',
49
+ outputPath: '.kiro/rules.md',
50
+ format: 'md'
51
+ },
52
+ {
53
+ id: 'codex',
54
+ name: 'Codex',
55
+ description: 'OpenAI Codex CLI',
56
+ outputPath: 'AGENTS.md',
57
+ format: 'md'
58
+ },
59
+ {
60
+ id: 'gemini',
61
+ name: 'Gemini CLI',
62
+ description: 'Google Gemini CLI',
63
+ outputPath: 'GEMINI.md',
64
+ format: 'md'
65
+ },
66
+ {
67
+ id: 'trae',
68
+ name: 'Trae',
69
+ description: 'Trae AI IDE',
70
+ outputPath: '.trae/rules.md',
71
+ format: 'md'
72
+ }
73
+ ];
74
+ /**
75
+ * Get AI tool by ID
76
+ */
77
+ export function getAITool(id) {
78
+ return AI_TOOLS.find(tool => tool.id === id);
79
+ }
80
+ /**
81
+ * Get all AI tool IDs
82
+ */
83
+ export function getAIToolIds() {
84
+ return AI_TOOLS.map(tool => tool.id);
85
+ }
86
+ /**
87
+ * Generate content for specific AI tool format
88
+ */
89
+ export function formatForAITool(tool, content) {
90
+ if (tool.format === 'mdc') {
91
+ // Cursor MDC format with frontmatter
92
+ const globs = tool.globs || ['**/*'];
93
+ return `---
94
+ description: IronBackend - Backend Architecture Intelligence
95
+ globs: ${JSON.stringify(globs)}
96
+ ---
97
+
98
+ ${content}`;
99
+ }
100
+ // Standard markdown format
101
+ return content;
102
+ }
103
+ //# sourceMappingURL=ai-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-tools.js","sourceRoot":"","sources":["../src/ai-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAmB;IACpC;QACI,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,mCAAmC;QAChD,UAAU,EAAE,WAAW;QACvB,MAAM,EAAE,IAAI;KACf;IACD;QACI,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,4BAA4B;QACzC,UAAU,EAAE,+BAA+B;QAC3C,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC;KAC9E;IACD;QACI,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,sBAAsB;QACnC,UAAU,EAAE,gBAAgB;QAC5B,MAAM,EAAE,IAAI;KACf;IACD;QACI,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,qCAAqC;QAClD,UAAU,EAAE,6BAA6B;QACzC,MAAM,EAAE,IAAI;KACf;IACD;QACI,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,yCAAyC;QACtD,UAAU,EAAE,iCAAiC;QAC7C,MAAM,EAAE,IAAI;KACf;IACD;QACI,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,cAAc;QAC3B,UAAU,EAAE,gBAAgB;QAC5B,MAAM,EAAE,IAAI;KACf;IACD;QACI,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,kBAAkB;QAC/B,UAAU,EAAE,WAAW;QACvB,MAAM,EAAE,IAAI;KACf;IACD;QACI,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,mBAAmB;QAChC,UAAU,EAAE,WAAW;QACvB,MAAM,EAAE,IAAI;KACf;IACD;QACI,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,aAAa;QAC1B,UAAU,EAAE,gBAAgB;QAC5B,MAAM,EAAE,IAAI;KACf;CACJ,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,EAAU;IAChC,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IACxB,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAkB,EAAE,OAAe;IAC/D,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QACxB,qCAAqC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO;;SAEN,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;;;EAG5B,OAAO,EAAE,CAAC;IACR,CAAC;IAED,2BAA2B;IAC3B,OAAO,OAAO,CAAC;AACnB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Doctor Command
3
+ * Validate IronBackend configuration
4
+ */
5
+ import { Command } from 'commander';
6
+ /**
7
+ * Create the doctor command
8
+ */
9
+ export declare function createDoctorCommand(): Command;
10
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAW7C"}
@@ -0,0 +1,251 @@
1
+ /**
2
+ * Doctor Command
3
+ * Validate IronBackend configuration
4
+ */
5
+ import { Command } from 'commander';
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ import chalk from 'chalk';
9
+ import { getStyle, getStack, getStyleIds, getStackIds, VERSION } from '@ironbackend/core';
10
+ const IRONBACKEND_DIR = '.ironbackend';
11
+ const CONFIG_FILE = 'config.json';
12
+ /**
13
+ * Create the doctor command
14
+ */
15
+ export function createDoctorCommand() {
16
+ const cmd = new Command('doctor');
17
+ cmd
18
+ .description('Validate IronBackend configuration and check for issues')
19
+ .option('-v, --verbose', 'Show detailed output')
20
+ .action(async (options) => {
21
+ await runDoctor(options);
22
+ });
23
+ return cmd;
24
+ }
25
+ async function runDoctor(options) {
26
+ console.log(chalk.bold.blue('\n🩺 IronBackend Doctor\n'));
27
+ const checks = [];
28
+ const cwd = process.cwd();
29
+ // Check 1: .ironbackend directory exists
30
+ const ironbackendPath = path.join(cwd, IRONBACKEND_DIR);
31
+ if (fs.existsSync(ironbackendPath)) {
32
+ checks.push({
33
+ name: 'Configuration directory',
34
+ status: 'pass',
35
+ message: '.ironbackend/ directory exists'
36
+ });
37
+ }
38
+ else {
39
+ checks.push({
40
+ name: 'Configuration directory',
41
+ status: 'fail',
42
+ message: '.ironbackend/ directory not found. Run: ironbackend init'
43
+ });
44
+ }
45
+ // Check 2: config.json exists and is valid
46
+ const configPath = path.join(ironbackendPath, CONFIG_FILE);
47
+ let config = null;
48
+ if (fs.existsSync(configPath)) {
49
+ try {
50
+ config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
51
+ checks.push({
52
+ name: 'Configuration file',
53
+ status: 'pass',
54
+ message: 'config.json is valid JSON'
55
+ });
56
+ }
57
+ catch (e) {
58
+ checks.push({
59
+ name: 'Configuration file',
60
+ status: 'fail',
61
+ message: 'config.json is invalid JSON'
62
+ });
63
+ }
64
+ }
65
+ else {
66
+ checks.push({
67
+ name: 'Configuration file',
68
+ status: 'fail',
69
+ message: 'config.json not found'
70
+ });
71
+ }
72
+ // Check 3: Version compatibility
73
+ if (config) {
74
+ if (config.version === VERSION) {
75
+ checks.push({
76
+ name: 'Version',
77
+ status: 'pass',
78
+ message: `Version ${config.version} is current`
79
+ });
80
+ }
81
+ else {
82
+ checks.push({
83
+ name: 'Version',
84
+ status: 'warn',
85
+ message: `Config version ${config.version} differs from CLI version ${VERSION}`
86
+ });
87
+ }
88
+ }
89
+ // Check 4: Style is valid
90
+ if (config && config.style) {
91
+ const style = getStyle(config.style);
92
+ if (style) {
93
+ checks.push({
94
+ name: 'Architecture style',
95
+ status: 'pass',
96
+ message: `Style "${style.name}" is valid`
97
+ });
98
+ }
99
+ else {
100
+ checks.push({
101
+ name: 'Architecture style',
102
+ status: 'fail',
103
+ message: `Unknown style: ${config.style}. Available: ${getStyleIds().join(', ')}`
104
+ });
105
+ }
106
+ }
107
+ else if (config) {
108
+ checks.push({
109
+ name: 'Architecture style',
110
+ status: 'warn',
111
+ message: 'No style selected. Run: ironbackend select style <name>'
112
+ });
113
+ }
114
+ // Check 5: Stack is valid
115
+ if (config && config.stack) {
116
+ const stack = getStack(config.stack);
117
+ if (stack) {
118
+ checks.push({
119
+ name: 'Tech stack',
120
+ status: 'pass',
121
+ message: `Stack "${stack.name}" is valid`
122
+ });
123
+ }
124
+ else {
125
+ checks.push({
126
+ name: 'Tech stack',
127
+ status: 'fail',
128
+ message: `Unknown stack: ${config.stack}. Available: ${getStackIds().join(', ')}`
129
+ });
130
+ }
131
+ }
132
+ else if (config) {
133
+ checks.push({
134
+ name: 'Tech stack',
135
+ status: 'warn',
136
+ message: 'No stack selected. Run: ironbackend select stack <name>'
137
+ });
138
+ }
139
+ // Check 6: Prompts directory exists
140
+ const promptsPath = path.join(ironbackendPath, 'prompts');
141
+ if (fs.existsSync(promptsPath)) {
142
+ const promptFiles = fs.readdirSync(promptsPath);
143
+ if (promptFiles.length > 0) {
144
+ checks.push({
145
+ name: 'Prompt files',
146
+ status: 'pass',
147
+ message: `${promptFiles.length} prompt files generated`
148
+ });
149
+ }
150
+ else {
151
+ checks.push({
152
+ name: 'Prompt files',
153
+ status: 'warn',
154
+ message: 'Prompts directory is empty. Run: ironbackend export prompts'
155
+ });
156
+ }
157
+ }
158
+ else {
159
+ checks.push({
160
+ name: 'Prompt files',
161
+ status: 'warn',
162
+ message: 'Prompts directory not found'
163
+ });
164
+ }
165
+ // Check 7: Cursor integration
166
+ const cursorRulesPath = path.join(cwd, '.cursor', 'rules', 'ironbackend.mdc');
167
+ if (fs.existsSync(cursorRulesPath)) {
168
+ checks.push({
169
+ name: 'Cursor integration',
170
+ status: 'pass',
171
+ message: '.cursor/rules/ironbackend.mdc exists'
172
+ });
173
+ }
174
+ else {
175
+ checks.push({
176
+ name: 'Cursor integration',
177
+ status: 'warn',
178
+ message: 'Cursor rules not found. Run: ironbackend export prompts'
179
+ });
180
+ }
181
+ // Check 8: Prompts are up to date
182
+ if (config && config.style && config.stack && config.updatedAt) {
183
+ const systemPromptPath = path.join(promptsPath, 'system-prompt.md');
184
+ if (fs.existsSync(systemPromptPath)) {
185
+ const promptStat = fs.statSync(systemPromptPath);
186
+ const configDate = new Date(config.updatedAt);
187
+ if (promptStat.mtime >= configDate) {
188
+ checks.push({
189
+ name: 'Prompt freshness',
190
+ status: 'pass',
191
+ message: 'Prompts are up to date'
192
+ });
193
+ }
194
+ else {
195
+ checks.push({
196
+ name: 'Prompt freshness',
197
+ status: 'warn',
198
+ message: 'Prompts may be outdated. Run: ironbackend export prompts'
199
+ });
200
+ }
201
+ }
202
+ }
203
+ // Print results
204
+ console.log(chalk.bold('Checks:\n'));
205
+ let passCount = 0;
206
+ let warnCount = 0;
207
+ let failCount = 0;
208
+ for (const check of checks) {
209
+ let icon;
210
+ let color;
211
+ switch (check.status) {
212
+ case 'pass':
213
+ icon = '✓';
214
+ color = chalk.green;
215
+ passCount++;
216
+ break;
217
+ case 'warn':
218
+ icon = '⚠';
219
+ color = chalk.yellow;
220
+ warnCount++;
221
+ break;
222
+ case 'fail':
223
+ icon = '✗';
224
+ color = chalk.red;
225
+ failCount++;
226
+ break;
227
+ }
228
+ console.log(color(` ${icon} ${check.name}`));
229
+ if (options.verbose || check.status !== 'pass') {
230
+ console.log(chalk.gray(` ${check.message}`));
231
+ }
232
+ }
233
+ // Summary
234
+ console.log(chalk.bold('\nSummary:'));
235
+ console.log(chalk.green(` ✓ ${passCount} passed`));
236
+ if (warnCount > 0)
237
+ console.log(chalk.yellow(` ⚠ ${warnCount} warnings`));
238
+ if (failCount > 0)
239
+ console.log(chalk.red(` ✗ ${failCount} failed`));
240
+ if (failCount > 0) {
241
+ console.log(chalk.red('\n❌ Some checks failed. Fix the issues above.'));
242
+ process.exit(1);
243
+ }
244
+ else if (warnCount > 0) {
245
+ console.log(chalk.yellow('\n⚠️ Some warnings found. Consider addressing them.'));
246
+ }
247
+ else {
248
+ console.log(chalk.green('\n✅ All checks passed!'));
249
+ }
250
+ }
251
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE1F,MAAM,eAAe,GAAG,cAAc,CAAC;AACvC,MAAM,WAAW,GAAG,aAAa,CAAC;AAQlC;;GAEG;AACH,MAAM,UAAU,mBAAmB;IAC/B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAElC,GAAG;SACE,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC;SAC/C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACtB,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEP,OAAO,GAAG,CAAC;AACf,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAA8B;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,yCAAyC;IACzC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACxD,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,yBAAyB;YAC/B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,gCAAgC;SAC5C,CAAC,CAAC;IACP,CAAC;SAAM,CAAC;QACJ,MAAM,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,yBAAyB;YAC/B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,0DAA0D;SACtE,CAAC,CAAC;IACP,CAAC;IAED,2CAA2C;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;IAC3D,IAAI,MAAM,GAAQ,IAAI,CAAC;IAEvB,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,2BAA2B;aACvC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,6BAA6B;aACzC,CAAC,CAAC;QACP,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,MAAM,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,uBAAuB;SACnC,CAAC,CAAC;IACP,CAAC;IAED,iCAAiC;IACjC,IAAI,MAAM,EAAE,CAAC;QACT,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,WAAW,MAAM,CAAC,OAAO,aAAa;aAClD,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,kBAAkB,MAAM,CAAC,OAAO,6BAA6B,OAAO,EAAE;aAClF,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,0BAA0B;IAC1B,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,KAAK,EAAE,CAAC;YACR,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,UAAU,KAAK,CAAC,IAAI,YAAY;aAC5C,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,oBAAoB;gBAC1B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,kBAAkB,MAAM,CAAC,KAAK,gBAAgB,WAAW,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACpF,CAAC,CAAC;QACP,CAAC;IACL,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,yDAAyD;SACrE,CAAC,CAAC;IACP,CAAC;IAED,0BAA0B;IAC1B,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,KAAK,EAAE,CAAC;YACR,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,UAAU,KAAK,CAAC,IAAI,YAAY;aAC5C,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,kBAAkB,MAAM,CAAC,KAAK,gBAAgB,WAAW,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACpF,CAAC,CAAC;QACP,CAAC;IACL,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,yDAAyD;SACrE,CAAC,CAAC;IACP,CAAC;IAED,oCAAoC;IACpC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,GAAG,WAAW,CAAC,MAAM,yBAAyB;aAC1D,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,6DAA6D;aACzE,CAAC,CAAC;QACP,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,MAAM,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,6BAA6B;SACzC,CAAC,CAAC;IACP,CAAC;IAED,8BAA8B;IAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAC9E,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,sCAAsC;SAClD,CAAC,CAAC;IACP,CAAC;SAAM,CAAC;QACJ,MAAM,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,yDAAyD;SACrE,CAAC,CAAC;IACP,CAAC;IAED,kCAAkC;IAClC,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QAC7D,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QACpE,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;YACjD,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAE9C,IAAI,UAAU,CAAC,KAAK,IAAI,UAAU,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC;oBACR,IAAI,EAAE,kBAAkB;oBACxB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,wBAAwB;iBACpC,CAAC,CAAC;YACP,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,IAAI,CAAC;oBACR,IAAI,EAAE,kBAAkB;oBACxB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,0DAA0D;iBACtE,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC;IAED,gBAAgB;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAErC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,IAAY,CAAC;QACjB,IAAI,KAAmB,CAAC;QAExB,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;YACnB,KAAK,MAAM;gBACP,IAAI,GAAG,GAAG,CAAC;gBACX,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;gBACpB,SAAS,EAAE,CAAC;gBACZ,MAAM;YACV,KAAK,MAAM;gBACP,IAAI,GAAG,GAAG,CAAC;gBACX,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;gBACrB,SAAS,EAAE,CAAC;gBACZ,MAAM;YACV,KAAK,MAAM;gBACP,IAAI,GAAG,GAAG,CAAC;gBACX,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC;gBAClB,SAAS,EAAE,CAAC;gBACZ,MAAM;QACd,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9C,IAAI,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;IAED,UAAU;IACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,SAAS,SAAS,CAAC,CAAC,CAAC;IACpD,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,SAAS,WAAW,CAAC,CAAC,CAAC;IAC1E,IAAI,SAAS,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,SAAS,SAAS,CAAC,CAAC,CAAC;IAErE,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;SAAM,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sDAAsD,CAAC,CAAC,CAAC;IACtF,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACvD,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Export Command
3
+ * Export prompts to various formats
4
+ */
5
+ import { Command } from 'commander';
6
+ /**
7
+ * Create the export command
8
+ */
9
+ export declare function createExportCommand(): Command;
10
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAyB7C"}