@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 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;AA0BpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAc3C"}
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"}
@@ -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
- fs.writeFileSync(path.join(ironbackendPath, CONFIG_FILE), JSON.stringify(config, null, 2));
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":"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"}
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.1",
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/ironbackend/ironbackend.git",
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
- "@ironbackend/core": "1.0.1",
37
- "@ironbackend/prompts": "1.0.1"
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"