@ironbackend/cli 1.0.1 → 1.0.2
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/README.md +2 -2
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +15 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/migrations/index.d.ts +47 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +128 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/utils/logger.d.ts +58 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +68 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/validation.d.ts +66 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +89 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +10 -5
package/README.md
CHANGED
|
@@ -13,10 +13,10 @@ A senior backend architect embedded inside your AI, installable via npm. IronBac
|
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
15
|
# Install globally
|
|
16
|
-
npm install -g ironbackend
|
|
16
|
+
npm install -g @ironbackend/cli
|
|
17
17
|
|
|
18
18
|
# Or use with npx
|
|
19
|
-
npx ironbackend init cursor
|
|
19
|
+
npx @ironbackend/cli init cursor
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
## Quick Start
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAc3C"}
|
package/dist/commands/init.js
CHANGED
|
@@ -8,11 +8,14 @@ import * as path from 'path';
|
|
|
8
8
|
import chalk from 'chalk';
|
|
9
9
|
import inquirer from 'inquirer';
|
|
10
10
|
import ora from 'ora';
|
|
11
|
-
import { getStyleIds, getStackIds, getStyle, getStack, VERSION } from '@ironbackend/core';
|
|
11
|
+
import { getStyleIds, getStackIds, getStyle, getStack, VERSION, safeValidateLocalConfig, formatValidationError } from '@ironbackend/core';
|
|
12
12
|
import { buildPromptSections } from '@ironbackend/prompts';
|
|
13
13
|
import { AI_TOOLS, getAITool, getAIToolIds, formatForAITool } from '../ai-tools.js';
|
|
14
|
+
import { log } from '../utils/logger.js';
|
|
15
|
+
// Note: sanitizeFilePath and sanitizeInput available in ../utils/validation.js for future use
|
|
14
16
|
const IRONBACKEND_DIR = '.ironbackend';
|
|
15
17
|
const CONFIG_FILE = 'config.json';
|
|
18
|
+
// Using ValidatedLocalConfig from @ironbackend/core instead of local interface
|
|
16
19
|
/**
|
|
17
20
|
* Create the init command
|
|
18
21
|
*/
|
|
@@ -132,7 +135,17 @@ async function runInit(toolArg, options) {
|
|
|
132
135
|
createdAt: new Date().toISOString(),
|
|
133
136
|
updatedAt: new Date().toISOString()
|
|
134
137
|
};
|
|
135
|
-
|
|
138
|
+
// Validate config before writing
|
|
139
|
+
log.debug('Validating configuration', { config });
|
|
140
|
+
const validationResult = safeValidateLocalConfig(config);
|
|
141
|
+
if (!validationResult.success) {
|
|
142
|
+
spinner.fail('Configuration validation failed');
|
|
143
|
+
console.error(chalk.red('Invalid configuration:'));
|
|
144
|
+
console.error(chalk.yellow(formatValidationError(validationResult.error)));
|
|
145
|
+
process.exit(1);
|
|
146
|
+
}
|
|
147
|
+
log.info('Configuration validated successfully', { version: config.version });
|
|
148
|
+
fs.writeFileSync(path.join(ironbackendPath, CONFIG_FILE), JSON.stringify(validationResult.data, null, 2));
|
|
136
149
|
// Generate prompts if style and stack are selected
|
|
137
150
|
if (selectedStyle && selectedStack) {
|
|
138
151
|
const prompts = buildPromptSections({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.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,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Migration System
|
|
3
|
+
* Handles version upgrades for .ironbackend/config.json
|
|
4
|
+
*/
|
|
5
|
+
import { ValidatedLocalConfig } from '@ironbackend/core';
|
|
6
|
+
export interface MigrationFn {
|
|
7
|
+
(config: Record<string, unknown>): Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
export interface Migration {
|
|
10
|
+
fromVersion: string;
|
|
11
|
+
toVersion: string;
|
|
12
|
+
migrate: MigrationFn;
|
|
13
|
+
description: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Registered migrations in version order
|
|
17
|
+
*/
|
|
18
|
+
export declare const migrations: Migration[];
|
|
19
|
+
/**
|
|
20
|
+
* Compare semantic versions
|
|
21
|
+
* @returns -1 if a < b, 0 if a === b, 1 if a > b
|
|
22
|
+
*/
|
|
23
|
+
export declare function compareVersions(a: string, b: string): number;
|
|
24
|
+
/**
|
|
25
|
+
* Get migrations needed to go from one version to another
|
|
26
|
+
*/
|
|
27
|
+
export declare function getMigrationPath(fromVersion: string, toVersion: string): Migration[];
|
|
28
|
+
/**
|
|
29
|
+
* Migrate config from one version to the latest
|
|
30
|
+
* @param config - Raw config object
|
|
31
|
+
* @param targetVersion - Target version to migrate to
|
|
32
|
+
* @returns Migrated and validated config
|
|
33
|
+
*/
|
|
34
|
+
export declare function migrateConfig(config: Record<string, unknown>, targetVersion?: string): Promise<{
|
|
35
|
+
config: ValidatedLocalConfig;
|
|
36
|
+
migrated: boolean;
|
|
37
|
+
appliedMigrations: string[];
|
|
38
|
+
}>;
|
|
39
|
+
/**
|
|
40
|
+
* Get the latest version from migrations
|
|
41
|
+
*/
|
|
42
|
+
export declare function getLatestVersion(): string;
|
|
43
|
+
/**
|
|
44
|
+
* Check if config needs migration
|
|
45
|
+
*/
|
|
46
|
+
export declare function needsMigration(config: Record<string, unknown>, targetVersion?: string): boolean;
|
|
47
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAA2B,MAAM,mBAAmB,CAAC;AAMlF,MAAM,WAAW,WAAW;IACxB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,SAAS;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACvB;AAMD;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,EAuBjC,CAAC;AAMF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAW5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,CAkBpF;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,aAAa,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC;IAAE,MAAM,EAAE,oBAAoB,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAkC3F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAUzC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAI/F"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Migration System
|
|
3
|
+
* Handles version upgrades for .ironbackend/config.json
|
|
4
|
+
*/
|
|
5
|
+
import { safeValidateLocalConfig } from '@ironbackend/core';
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// Migration Registry
|
|
8
|
+
// ============================================================================
|
|
9
|
+
/**
|
|
10
|
+
* Registered migrations in version order
|
|
11
|
+
*/
|
|
12
|
+
export const migrations = [
|
|
13
|
+
{
|
|
14
|
+
fromVersion: '1.0.0',
|
|
15
|
+
toVersion: '1.0.1',
|
|
16
|
+
description: 'Add security section support',
|
|
17
|
+
migrate: (config) => ({
|
|
18
|
+
...config,
|
|
19
|
+
version: '1.0.1',
|
|
20
|
+
updatedAt: new Date().toISOString()
|
|
21
|
+
})
|
|
22
|
+
},
|
|
23
|
+
// Future migrations will be added here:
|
|
24
|
+
// {
|
|
25
|
+
// fromVersion: '1.0.1',
|
|
26
|
+
// toVersion: '1.1.0',
|
|
27
|
+
// description: 'Add plugin support',
|
|
28
|
+
// migrate: (config) => ({
|
|
29
|
+
// ...config,
|
|
30
|
+
// version: '1.1.0',
|
|
31
|
+
// plugins: [],
|
|
32
|
+
// updatedAt: new Date().toISOString()
|
|
33
|
+
// })
|
|
34
|
+
// }
|
|
35
|
+
];
|
|
36
|
+
// ============================================================================
|
|
37
|
+
// Migration Functions
|
|
38
|
+
// ============================================================================
|
|
39
|
+
/**
|
|
40
|
+
* Compare semantic versions
|
|
41
|
+
* @returns -1 if a < b, 0 if a === b, 1 if a > b
|
|
42
|
+
*/
|
|
43
|
+
export function compareVersions(a, b) {
|
|
44
|
+
const partsA = a.split('.').map(Number);
|
|
45
|
+
const partsB = b.split('.').map(Number);
|
|
46
|
+
for (let i = 0; i < 3; i++) {
|
|
47
|
+
const valA = partsA[i] || 0;
|
|
48
|
+
const valB = partsB[i] || 0;
|
|
49
|
+
if (valA < valB)
|
|
50
|
+
return -1;
|
|
51
|
+
if (valA > valB)
|
|
52
|
+
return 1;
|
|
53
|
+
}
|
|
54
|
+
return 0;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get migrations needed to go from one version to another
|
|
58
|
+
*/
|
|
59
|
+
export function getMigrationPath(fromVersion, toVersion) {
|
|
60
|
+
const path = [];
|
|
61
|
+
let currentVersion = fromVersion;
|
|
62
|
+
// Sort migrations by fromVersion
|
|
63
|
+
const sortedMigrations = [...migrations].sort((a, b) => compareVersions(a.fromVersion, b.fromVersion));
|
|
64
|
+
while (compareVersions(currentVersion, toVersion) < 0) {
|
|
65
|
+
const nextMigration = sortedMigrations.find(m => m.fromVersion === currentVersion);
|
|
66
|
+
if (!nextMigration)
|
|
67
|
+
break;
|
|
68
|
+
path.push(nextMigration);
|
|
69
|
+
currentVersion = nextMigration.toVersion;
|
|
70
|
+
}
|
|
71
|
+
return path;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Migrate config from one version to the latest
|
|
75
|
+
* @param config - Raw config object
|
|
76
|
+
* @param targetVersion - Target version to migrate to
|
|
77
|
+
* @returns Migrated and validated config
|
|
78
|
+
*/
|
|
79
|
+
export async function migrateConfig(config, targetVersion) {
|
|
80
|
+
const currentVersion = config.version;
|
|
81
|
+
const target = targetVersion || getLatestVersion();
|
|
82
|
+
// No migration needed
|
|
83
|
+
if (compareVersions(currentVersion, target) >= 0) {
|
|
84
|
+
const result = safeValidateLocalConfig(config);
|
|
85
|
+
if (!result.success) {
|
|
86
|
+
throw new Error(`Config validation failed: ${result.error.message}`);
|
|
87
|
+
}
|
|
88
|
+
return { config: result.data, migrated: false, appliedMigrations: [] };
|
|
89
|
+
}
|
|
90
|
+
// Get and apply migrations
|
|
91
|
+
const migrationPath = getMigrationPath(currentVersion, target);
|
|
92
|
+
let migratedConfig = { ...config };
|
|
93
|
+
const appliedMigrations = [];
|
|
94
|
+
for (const migration of migrationPath) {
|
|
95
|
+
migratedConfig = migration.migrate(migratedConfig);
|
|
96
|
+
appliedMigrations.push(`${migration.fromVersion} → ${migration.toVersion}: ${migration.description}`);
|
|
97
|
+
}
|
|
98
|
+
// Validate final config
|
|
99
|
+
const result = safeValidateLocalConfig(migratedConfig);
|
|
100
|
+
if (!result.success) {
|
|
101
|
+
throw new Error(`Migrated config validation failed: ${result.error.message}`);
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
config: result.data,
|
|
105
|
+
migrated: appliedMigrations.length > 0,
|
|
106
|
+
appliedMigrations
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get the latest version from migrations
|
|
111
|
+
*/
|
|
112
|
+
export function getLatestVersion() {
|
|
113
|
+
if (migrations.length === 0) {
|
|
114
|
+
return '1.0.0';
|
|
115
|
+
}
|
|
116
|
+
// Get the highest toVersion
|
|
117
|
+
const versions = migrations.map(m => m.toVersion);
|
|
118
|
+
return versions.reduce((latest, v) => compareVersions(v, latest) > 0 ? v : latest);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Check if config needs migration
|
|
122
|
+
*/
|
|
123
|
+
export function needsMigration(config, targetVersion) {
|
|
124
|
+
const currentVersion = config.version;
|
|
125
|
+
const target = targetVersion || getLatestVersion();
|
|
126
|
+
return compareVersions(currentVersion, target) < 0;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Structured Logger
|
|
3
|
+
* Using Pino for production-grade logging
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Log levels supported by the CLI
|
|
7
|
+
*/
|
|
8
|
+
export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';
|
|
9
|
+
/**
|
|
10
|
+
* Logger interface for type safety
|
|
11
|
+
*/
|
|
12
|
+
interface LogFn {
|
|
13
|
+
(msg: string): void;
|
|
14
|
+
(obj: object, msg?: string): void;
|
|
15
|
+
}
|
|
16
|
+
interface ILogger {
|
|
17
|
+
trace: LogFn;
|
|
18
|
+
debug: LogFn;
|
|
19
|
+
info: LogFn;
|
|
20
|
+
warn: LogFn;
|
|
21
|
+
error: LogFn;
|
|
22
|
+
fatal: LogFn;
|
|
23
|
+
child: (bindings: object) => ILogger;
|
|
24
|
+
isLevelEnabled: (level: string) => boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Singleton logger instance
|
|
28
|
+
*/
|
|
29
|
+
export declare const logger: ILogger;
|
|
30
|
+
/**
|
|
31
|
+
* Create a child logger with additional context
|
|
32
|
+
* @param context - Additional context to bind to logger
|
|
33
|
+
* @returns Child logger instance
|
|
34
|
+
*/
|
|
35
|
+
export declare function createChildLogger(context: Record<string, unknown>): ILogger;
|
|
36
|
+
/**
|
|
37
|
+
* Log levels for programmatic access
|
|
38
|
+
*/
|
|
39
|
+
export declare const LOG_LEVELS: readonly ["trace", "debug", "info", "warn", "error", "fatal"];
|
|
40
|
+
/**
|
|
41
|
+
* Check if current log level allows logging at specified level
|
|
42
|
+
* @param level - Level to check
|
|
43
|
+
* @returns True if logging is enabled at this level
|
|
44
|
+
*/
|
|
45
|
+
export declare function isLevelEnabled(level: LogLevel): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Convenience logging functions with structured data
|
|
48
|
+
*/
|
|
49
|
+
export declare const log: {
|
|
50
|
+
trace: (msg: string, data?: Record<string, unknown>) => void;
|
|
51
|
+
debug: (msg: string, data?: Record<string, unknown>) => void;
|
|
52
|
+
info: (msg: string, data?: Record<string, unknown>) => void;
|
|
53
|
+
warn: (msg: string, data?: Record<string, unknown>) => void;
|
|
54
|
+
error: (msg: string, data?: Record<string, unknown>) => void;
|
|
55
|
+
fatal: (msg: string, data?: Record<string, unknown>) => void;
|
|
56
|
+
};
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAE/E;;GAEG;AACH,UAAU,KAAK;IACX,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,UAAU,OAAO;IACb,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IACrC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;CAC9C;AA+BD;;GAEG;AACH,eAAO,MAAM,MAAM,SAAiB,CAAC;AAErC;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAE3E;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,+DAAgE,CAAC;AAExF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,eAAO,MAAM,GAAG;iBACC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;iBAGtC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAGvC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAGtC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;iBAGrC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;iBAGtC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAEtD,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Structured Logger
|
|
3
|
+
* Using Pino for production-grade logging
|
|
4
|
+
*/
|
|
5
|
+
// @ts-ignore - ESM/CJS interop
|
|
6
|
+
import pinoModule from 'pino';
|
|
7
|
+
const pino = pinoModule.default || pinoModule;
|
|
8
|
+
/**
|
|
9
|
+
* Create a configured logger instance
|
|
10
|
+
*/
|
|
11
|
+
function createLogger() {
|
|
12
|
+
const level = process.env.LOG_LEVEL || 'info';
|
|
13
|
+
const isDev = process.env.NODE_ENV !== 'production';
|
|
14
|
+
const options = {
|
|
15
|
+
level,
|
|
16
|
+
base: {
|
|
17
|
+
app: 'ironbackend-cli'
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
// Only add transport in dev mode with pino-pretty available
|
|
21
|
+
if (isDev) {
|
|
22
|
+
options.transport = {
|
|
23
|
+
target: 'pino-pretty',
|
|
24
|
+
options: {
|
|
25
|
+
colorize: true,
|
|
26
|
+
translateTime: 'SYS:standard',
|
|
27
|
+
ignore: 'pid,hostname'
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
return pino(options);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Singleton logger instance
|
|
35
|
+
*/
|
|
36
|
+
export const logger = createLogger();
|
|
37
|
+
/**
|
|
38
|
+
* Create a child logger with additional context
|
|
39
|
+
* @param context - Additional context to bind to logger
|
|
40
|
+
* @returns Child logger instance
|
|
41
|
+
*/
|
|
42
|
+
export function createChildLogger(context) {
|
|
43
|
+
return logger.child(context);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Log levels for programmatic access
|
|
47
|
+
*/
|
|
48
|
+
export const LOG_LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];
|
|
49
|
+
/**
|
|
50
|
+
* Check if current log level allows logging at specified level
|
|
51
|
+
* @param level - Level to check
|
|
52
|
+
* @returns True if logging is enabled at this level
|
|
53
|
+
*/
|
|
54
|
+
export function isLevelEnabled(level) {
|
|
55
|
+
return logger.isLevelEnabled(level);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Convenience logging functions with structured data
|
|
59
|
+
*/
|
|
60
|
+
export const log = {
|
|
61
|
+
trace: (msg, data) => data ? logger.trace(data, msg) : logger.trace(msg),
|
|
62
|
+
debug: (msg, data) => data ? logger.debug(data, msg) : logger.debug(msg),
|
|
63
|
+
info: (msg, data) => data ? logger.info(data, msg) : logger.info(msg),
|
|
64
|
+
warn: (msg, data) => data ? logger.warn(data, msg) : logger.warn(msg),
|
|
65
|
+
error: (msg, data) => data ? logger.error(data, msg) : logger.error(msg),
|
|
66
|
+
fatal: (msg, data) => data ? logger.fatal(data, msg) : logger.fatal(msg)
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,+BAA+B;AAC/B,OAAO,UAAU,MAAM,MAAM,CAAC;AAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC;AA0B9C;;GAEG;AACH,SAAS,YAAY;IACjB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;IAEpD,MAAM,OAAO,GAA4B;QACrC,KAAK;QACL,IAAI,EAAE;YACF,GAAG,EAAE,iBAAiB;SACzB;KACJ,CAAC;IAEF,4DAA4D;IAC5D,IAAI,KAAK,EAAE,CAAC;QACR,OAAO,CAAC,SAAS,GAAG;YAChB,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE;gBACL,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,cAAc;gBAC7B,MAAM,EAAE,cAAc;aACzB;SACJ,CAAC;IACN,CAAC;IAED,OAAO,IAAI,CAAC,OAAO,CAAY,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;AAErC;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgC;IAC9D,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAU,CAAC;AAExF;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAe;IAC1C,OAAO,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG;IACf,KAAK,EAAE,CAAC,GAAW,EAAE,IAA8B,EAAE,EAAE,CACnD,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;IAEtD,KAAK,EAAE,CAAC,GAAW,EAAE,IAA8B,EAAE,EAAE,CACnD,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;IAEtD,IAAI,EAAE,CAAC,GAAW,EAAE,IAA8B,EAAE,EAAE,CAClD,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAEpD,IAAI,EAAE,CAAC,GAAW,EAAE,IAA8B,EAAE,EAAE,CAClD,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAEpD,KAAK,EAAE,CAAC,GAAW,EAAE,IAA8B,EAAE,EAAE,CACnD,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;IAEtD,KAAK,EAAE,CAAC,GAAW,EAAE,IAA8B,EAAE,EAAE,CACnD,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;CACzD,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Validation Utilities
|
|
3
|
+
* Security and input validation functions
|
|
4
|
+
*/
|
|
5
|
+
import { z, ZodError } from 'zod';
|
|
6
|
+
/**
|
|
7
|
+
* Sanitize file path to prevent path traversal attacks
|
|
8
|
+
* @param userPath - User-provided path
|
|
9
|
+
* @param baseDir - Base directory that paths must stay within
|
|
10
|
+
* @returns Resolved safe path
|
|
11
|
+
* @throws Error if path traversal is detected
|
|
12
|
+
*/
|
|
13
|
+
export declare function sanitizeFilePath(userPath: string, baseDir: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Sanitize user input string
|
|
16
|
+
* Removes potentially dangerous characters and trims whitespace
|
|
17
|
+
* @param input - Raw user input
|
|
18
|
+
* @returns Sanitized input string
|
|
19
|
+
*/
|
|
20
|
+
export declare function sanitizeInput(input: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Validate that a string is a valid identifier (alphanumeric, hyphens, underscores)
|
|
23
|
+
* @param identifier - String to validate
|
|
24
|
+
* @returns True if valid identifier
|
|
25
|
+
*/
|
|
26
|
+
export declare function isValidIdentifier(identifier: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Schema for validating CLI command arguments
|
|
29
|
+
*/
|
|
30
|
+
export declare const CliArgsSchema: z.ZodObject<{
|
|
31
|
+
styleId: z.ZodOptional<z.ZodString>;
|
|
32
|
+
stackId: z.ZodOptional<z.ZodString>;
|
|
33
|
+
toolId: z.ZodOptional<z.ZodString>;
|
|
34
|
+
outputPath: z.ZodOptional<z.ZodString>;
|
|
35
|
+
}, "strip", z.ZodTypeAny, {
|
|
36
|
+
styleId?: string | undefined;
|
|
37
|
+
stackId?: string | undefined;
|
|
38
|
+
toolId?: string | undefined;
|
|
39
|
+
outputPath?: string | undefined;
|
|
40
|
+
}, {
|
|
41
|
+
styleId?: string | undefined;
|
|
42
|
+
stackId?: string | undefined;
|
|
43
|
+
toolId?: string | undefined;
|
|
44
|
+
outputPath?: string | undefined;
|
|
45
|
+
}>;
|
|
46
|
+
export type CliArgs = z.infer<typeof CliArgsSchema>;
|
|
47
|
+
/**
|
|
48
|
+
* Validate CLI arguments
|
|
49
|
+
* @param args - Raw arguments to validate
|
|
50
|
+
* @returns Validated arguments
|
|
51
|
+
* @throws ZodError if validation fails
|
|
52
|
+
*/
|
|
53
|
+
export declare function validateCliArgs(args: unknown): CliArgs;
|
|
54
|
+
/**
|
|
55
|
+
* Format validation errors for CLI display
|
|
56
|
+
* @param error - Zod validation error
|
|
57
|
+
* @returns User-friendly error message
|
|
58
|
+
*/
|
|
59
|
+
export declare function formatCliError(error: ZodError): string;
|
|
60
|
+
/**
|
|
61
|
+
* Validate that a directory exists and is writable
|
|
62
|
+
* @param dirPath - Directory path to validate
|
|
63
|
+
* @returns True if directory exists and is accessible
|
|
64
|
+
*/
|
|
65
|
+
export declare function validateDirectory(dirPath: string): Promise<boolean>;
|
|
66
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAElC;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAW1E;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKnD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;EAKxB,CAAC;AAEH,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEpD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAEtD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAMtD;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQzE"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Validation Utilities
|
|
3
|
+
* Security and input validation functions
|
|
4
|
+
*/
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
/**
|
|
8
|
+
* Sanitize file path to prevent path traversal attacks
|
|
9
|
+
* @param userPath - User-provided path
|
|
10
|
+
* @param baseDir - Base directory that paths must stay within
|
|
11
|
+
* @returns Resolved safe path
|
|
12
|
+
* @throws Error if path traversal is detected
|
|
13
|
+
*/
|
|
14
|
+
export function sanitizeFilePath(userPath, baseDir) {
|
|
15
|
+
// Normalize paths to handle different separators
|
|
16
|
+
const normalizedBase = path.resolve(baseDir);
|
|
17
|
+
const resolved = path.resolve(baseDir, userPath);
|
|
18
|
+
// Check if resolved path is within the base directory
|
|
19
|
+
if (!resolved.startsWith(normalizedBase + path.sep) && resolved !== normalizedBase) {
|
|
20
|
+
throw new Error('Invalid file path: path traversal detected');
|
|
21
|
+
}
|
|
22
|
+
return resolved;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Sanitize user input string
|
|
26
|
+
* Removes potentially dangerous characters and trims whitespace
|
|
27
|
+
* @param input - Raw user input
|
|
28
|
+
* @returns Sanitized input string
|
|
29
|
+
*/
|
|
30
|
+
export function sanitizeInput(input) {
|
|
31
|
+
// Remove null bytes and other control characters
|
|
32
|
+
const cleaned = input.replace(/[\x00-\x1f\x7f]/g, '');
|
|
33
|
+
// Trim whitespace
|
|
34
|
+
return cleaned.trim();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Validate that a string is a valid identifier (alphanumeric, hyphens, underscores)
|
|
38
|
+
* @param identifier - String to validate
|
|
39
|
+
* @returns True if valid identifier
|
|
40
|
+
*/
|
|
41
|
+
export function isValidIdentifier(identifier) {
|
|
42
|
+
return /^[a-zA-Z][a-zA-Z0-9_-]*$/.test(identifier);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Schema for validating CLI command arguments
|
|
46
|
+
*/
|
|
47
|
+
export const CliArgsSchema = z.object({
|
|
48
|
+
styleId: z.string().regex(/^[a-z][a-z0-9-]*$/).optional(),
|
|
49
|
+
stackId: z.string().regex(/^[a-z][a-z0-9-]*$/).optional(),
|
|
50
|
+
toolId: z.string().regex(/^[a-z][a-z0-9-]*$/).optional(),
|
|
51
|
+
outputPath: z.string().optional()
|
|
52
|
+
});
|
|
53
|
+
/**
|
|
54
|
+
* Validate CLI arguments
|
|
55
|
+
* @param args - Raw arguments to validate
|
|
56
|
+
* @returns Validated arguments
|
|
57
|
+
* @throws ZodError if validation fails
|
|
58
|
+
*/
|
|
59
|
+
export function validateCliArgs(args) {
|
|
60
|
+
return CliArgsSchema.parse(args);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Format validation errors for CLI display
|
|
64
|
+
* @param error - Zod validation error
|
|
65
|
+
* @returns User-friendly error message
|
|
66
|
+
*/
|
|
67
|
+
export function formatCliError(error) {
|
|
68
|
+
const issues = error.issues.map(issue => {
|
|
69
|
+
const path = issue.path.join('.');
|
|
70
|
+
return ` • ${path}: ${issue.message}`;
|
|
71
|
+
});
|
|
72
|
+
return `Validation error:\n${issues.join('\n')}`;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Validate that a directory exists and is writable
|
|
76
|
+
* @param dirPath - Directory path to validate
|
|
77
|
+
* @returns True if directory exists and is accessible
|
|
78
|
+
*/
|
|
79
|
+
export async function validateDirectory(dirPath) {
|
|
80
|
+
try {
|
|
81
|
+
const fs = await import('fs/promises');
|
|
82
|
+
const stats = await fs.stat(dirPath);
|
|
83
|
+
return stats.isDirectory();
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,CAAC,EAAY,MAAM,KAAK,CAAC;AAElC;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,OAAe;IAC9D,iDAAiD;IACjD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEjD,sDAAsD;IACtD,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;QACjF,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACvC,iDAAiD;IACjD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IACtD,kBAAkB;IAClB,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAChD,OAAO,0BAA0B,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE;IACzD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE;IACzD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE;IACxD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAIH;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAa;IACzC,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAe;IAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,OAAO,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IACH,OAAO,sBAAsB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAe;IACnD,IAAI,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ironbackend/cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Backend Architecture Intelligence CLI for AI Coding Assistants",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"license": "MIT",
|
|
26
26
|
"repository": {
|
|
27
27
|
"type": "git",
|
|
28
|
-
"url": "https://github.com/
|
|
28
|
+
"url": "https://github.com/txqt/IronBackend.git",
|
|
29
29
|
"directory": "packages/cli"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
@@ -33,13 +33,18 @@
|
|
|
33
33
|
"chalk": "^5.3.0",
|
|
34
34
|
"inquirer": "^9.2.0",
|
|
35
35
|
"ora": "^8.0.0",
|
|
36
|
-
"
|
|
37
|
-
"
|
|
36
|
+
"pino": "^8.17.0",
|
|
37
|
+
"pino-pretty": "^10.3.0",
|
|
38
|
+
"zod": "^3.22.0",
|
|
39
|
+
"@ironbackend/core": "1.0.2",
|
|
40
|
+
"@ironbackend/prompts": "1.0.2"
|
|
38
41
|
},
|
|
39
42
|
"devDependencies": {
|
|
40
43
|
"@types/inquirer": "^9.0.0",
|
|
44
|
+
"@vitest/coverage-v8": "^4.0.17",
|
|
41
45
|
"typescript": "^5.3.0",
|
|
42
|
-
"tsx": "^4.7.0"
|
|
46
|
+
"tsx": "^4.7.0",
|
|
47
|
+
"vitest": "^4.0.17"
|
|
43
48
|
},
|
|
44
49
|
"engines": {
|
|
45
50
|
"node": ">=18.0.0"
|