architect-ai 1.1.0
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 +182 -0
- package/dist/index.js +560 -0
- package/dist/index.js.map +1 -0
- package/dist/lib.d.ts +186 -0
- package/dist/lib.js +443 -0
- package/dist/lib.js.map +1 -0
- package/package.json +60 -0
package/dist/lib.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/index.ts","../src/utils/config.ts","../src/utils/git.ts","../src/utils/parser.ts","../src/utils/logger.ts","../src/config/prompts.ts","../src/services/ai.ts","../src/services/file.ts"],"names":["formatDuration","resolve","existsSync","readFile"],"mappings":"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","file":"lib.js","sourcesContent":["/**\r\n * Type definitions for architect-ai CLI\r\n */\r\n\r\nexport interface ProjectConfig {\r\n techStack?: string;\r\n rules?: string[];\r\n bypassKeyword?: string;\r\n commitFormat?: string;\r\n maxConcurrency?: number;\r\n cacheEnabled?: boolean;\r\n}\r\n\r\nexport interface AuditIssue {\r\n line: number;\r\n severity: 'CRITICAL' | 'WARNING' | 'INFO';\r\n message: string;\r\n suggestion: string;\r\n}\r\n\r\nexport interface AuditResult {\r\n status: 'PASS' | 'FAIL';\r\n issues?: AuditIssue[];\r\n message?: string;\r\n suggestion?: string;\r\n}\r\n\r\nexport interface FileAuditResult {\r\n filePath: string;\r\n result: AuditResult;\r\n duration: number;\r\n}\r\n\r\nexport interface CLIOptions {\r\n files?: string[];\r\n commit?: boolean;\r\n bypass?: boolean;\r\n verbose?: boolean;\r\n maxConcurrency?: number;\r\n targetBranch?: string;\r\n}\r\n\r\nexport const DEFAULT_CONFIG: Required<ProjectConfig> = {\r\n techStack: '',\r\n rules: [],\r\n bypassKeyword: 'skip:',\r\n commitFormat: '',\r\n maxConcurrency: 5,\r\n cacheEnabled: true,\r\n};\r\n","/**\r\n * Configuration loader with caching and validation\r\n */\r\n\r\nimport { readFile } from 'node:fs/promises';\r\nimport { existsSync } from 'node:fs';\r\nimport { resolve } from 'node:path';\r\nimport type { ProjectConfig } from '../types/index.js';\r\nimport { DEFAULT_CONFIG } from '../types/index.js';\r\n\r\nlet cachedConfig: ProjectConfig | null = null;\r\n\r\n/**\r\n * Load and validate project configuration\r\n */\r\nexport const loadProjectConfig = async (cwd: string = process.cwd()): Promise<ProjectConfig> => {\r\n if (cachedConfig) {\r\n return cachedConfig;\r\n }\r\n\r\n const configPath = resolve(cwd, '.architectrc.json');\r\n \r\n if (!existsSync(configPath)) {\r\n cachedConfig = { ...DEFAULT_CONFIG };\r\n return cachedConfig;\r\n }\r\n\r\n try {\r\n const content = await readFile(configPath, 'utf-8');\r\n const userConfig = JSON.parse(content) as Partial<ProjectConfig>;\r\n \r\n // Merge with defaults\r\n cachedConfig = {\r\n ...DEFAULT_CONFIG,\r\n ...userConfig,\r\n };\r\n \r\n console.log('⚙️ Loaded project-specific rules from .architectrc.json');\r\n return cachedConfig;\r\n } catch (error) {\r\n console.warn('⚠️ Found .architectrc.json but failed to parse it.');\r\n cachedConfig = { ...DEFAULT_CONFIG };\r\n return cachedConfig;\r\n }\r\n};\r\n\r\n/**\r\n * Clear config cache (useful for testing)\r\n */\r\nexport const clearConfigCache = (): void => {\r\n cachedConfig = null;\r\n};\r\n\r\n/**\r\n * Validate configuration schema\r\n */\r\nexport const validateConfig = (config: unknown): config is ProjectConfig => {\r\n if (typeof config !== 'object' || config === null) {\r\n return false;\r\n }\r\n\r\n const c = config as Record<string, unknown>;\r\n\r\n if (c.techStack !== undefined && typeof c.techStack !== 'string') {\r\n return false;\r\n }\r\n\r\n if (c.rules !== undefined && !Array.isArray(c.rules)) {\r\n return false;\r\n }\r\n\r\n if (c.bypassKeyword !== undefined && typeof c.bypassKeyword !== 'string') {\r\n return false;\r\n }\r\n\r\n if (c.commitFormat !== undefined && typeof c.commitFormat !== 'string') {\r\n return false;\r\n }\r\n\r\n if (c.maxConcurrency !== undefined && typeof c.maxConcurrency !== 'number') {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n","/**\r\n * Git utilities with async support and better error handling\r\n */\r\n\r\nimport { exec } from 'node:child_process';\r\nimport { promisify } from 'node:util';\r\n\r\nconst execAsync = promisify(exec);\r\n\r\nconst SUPPORTED_EXTENSIONS = /\\.(ts|tsx|js|jsx|mjs|cjs|py|cs|go|java|rs|kt|swift)$/;\r\n\r\nexport interface GitDiffOptions {\r\n targetBranch?: string;\r\n extensions?: RegExp;\r\n}\r\n\r\n/**\r\n * Get last commit message asynchronously\r\n */\r\nexport const getLastCommitMessage = async (): Promise<string> => {\r\n try {\r\n const { stdout } = await execAsync('git log -1 --pretty=%B');\r\n return stdout.trim();\r\n } catch {\r\n return '';\r\n }\r\n};\r\n\r\n/**\r\n * Get changed files against target branch with parallel execution\r\n */\r\nexport const getChangedFiles = async (options: GitDiffOptions = {}): Promise<string[]> => {\r\n const { targetBranch = 'origin/main', extensions = SUPPORTED_EXTENSIONS } = options;\r\n\r\n try {\r\n // Try three-dot diff first (for PR/MR scenarios)\r\n const command = `git diff --name-only --diff-filter=ACMR ${targetBranch}...HEAD`;\r\n const { stdout } = await execAsync(command);\r\n \r\n return parseAndFilterFiles(stdout, extensions);\r\n } catch {\r\n try {\r\n // Fallback to two-dot diff\r\n const command = `git diff --name-only --diff-filter=ACMR ${targetBranch}`;\r\n const { stdout } = await execAsync(command);\r\n return parseAndFilterFiles(stdout, extensions);\r\n } catch {\r\n console.warn('⚠️ Git diff failed. No files to audit.');\r\n return [];\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Check if current directory is a git repository\r\n */\r\nexport const isGitRepository = async (): Promise<boolean> => {\r\n try {\r\n await execAsync('git rev-parse --is-inside-work-tree');\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n};\r\n\r\n/**\r\n * Get current branch name\r\n */\r\nexport const getCurrentBranch = async (): Promise<string> => {\r\n try {\r\n const { stdout } = await execAsync('git branch --show-current');\r\n return stdout.trim();\r\n } catch {\r\n return 'unknown';\r\n }\r\n};\r\n\r\nconst parseAndFilterFiles = (output: string, extensions: RegExp): string[] => {\r\n return output\r\n .split('\\n')\r\n .map(file => file.trim())\r\n .filter(file => file.length > 0)\r\n .filter(file => extensions.test(file));\r\n};\r\n","/**\r\n * Parsing utilities for AI responses\r\n */\r\n\r\nimport type { AuditResult } from '../types/index.js';\r\n\r\n/**\r\n * Clean JSON from markdown code blocks\r\n */\r\nexport const cleanJSON = (text: string): string => {\r\n return text\r\n .replace(/```json\\s*/gi, '')\r\n .replace(/```\\s*/g, '')\r\n .trim();\r\n};\r\n\r\n/**\r\n * Parse AI response to AuditResult with error handling\r\n */\r\nexport const parseAuditResponse = (responseText: string): AuditResult => {\r\n const cleaned = cleanJSON(responseText);\r\n \r\n try {\r\n const parsed = JSON.parse(cleaned) as AuditResult;\r\n \r\n // Validate required fields\r\n if (!parsed.status || !['PASS', 'FAIL'].includes(parsed.status)) {\r\n return {\r\n status: 'FAIL',\r\n message: 'Invalid AI response format',\r\n issues: [],\r\n };\r\n }\r\n \r\n return parsed;\r\n } catch {\r\n // Try to extract JSON from the response\r\n const jsonMatch = cleaned.match(/\\{[\\s\\S]*\\}/);\r\n if (jsonMatch) {\r\n try {\r\n return JSON.parse(jsonMatch[0]) as AuditResult;\r\n } catch {\r\n // Fall through to error response\r\n }\r\n }\r\n \r\n return {\r\n status: 'FAIL',\r\n message: 'Failed to parse AI response',\r\n issues: [],\r\n };\r\n }\r\n};\r\n\r\n/**\r\n * Format file size for display\r\n */\r\nexport const formatBytes = (bytes: number): string => {\r\n if (bytes === 0) return '0 B';\r\n const k = 1024;\r\n const sizes = ['B', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\r\n};\r\n\r\n/**\r\n * Format duration for display\r\n */\r\nexport const formatDuration = (ms: number): string => {\r\n if (ms < 1000) return `${ms}ms`;\r\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\r\n return `${(ms / 60000).toFixed(1)}m`;\r\n};\r\n","/**\r\n * Console output utilities with colors\r\n */\r\n\r\n// ANSI color codes\r\nconst colors = {\r\n reset: '\\x1b[0m',\r\n bold: '\\x1b[1m',\r\n dim: '\\x1b[2m',\r\n red: '\\x1b[31m',\r\n green: '\\x1b[32m',\r\n yellow: '\\x1b[33m',\r\n blue: '\\x1b[34m',\r\n magenta: '\\x1b[35m',\r\n cyan: '\\x1b[36m',\r\n white: '\\x1b[37m',\r\n} as const;\r\n\r\nexport const log = {\r\n info: (msg: string) => console.log(`${colors.blue}ℹ${colors.reset} ${msg}`),\r\n success: (msg: string) => console.log(`${colors.green}✅${colors.reset} ${msg}`),\r\n warning: (msg: string) => console.warn(`${colors.yellow}⚠️${colors.reset} ${msg}`),\r\n error: (msg: string) => console.error(`${colors.red}❌${colors.reset} ${msg}`),\r\n critical: (msg: string) => console.error(`${colors.red}${colors.bold}🚨${colors.reset} ${msg}`),\r\n audit: (msg: string) => console.log(`${colors.cyan}🔍${colors.reset} ${msg}`),\r\n skip: (msg: string) => console.log(`${colors.magenta}⏩${colors.reset} ${msg}`),\r\n file: (msg: string) => console.log(`${colors.dim} ${msg}${colors.reset}`),\r\n \r\n // Issue formatting\r\n issue: (severity: string, line: number, message: string) => {\r\n const color = severity === 'CRITICAL' ? colors.red : \r\n severity === 'WARNING' ? colors.yellow : \r\n colors.blue;\r\n console.log(` ${color}[${severity}] Line ${line}: ${message}${colors.reset}`);\r\n },\r\n \r\n // Progress bar\r\n progress: (current: number, total: number, label: string) => {\r\n const percent = Math.round((current / total) * 100);\r\n const barLength = 20;\r\n const filled = Math.round((current / total) * barLength);\r\n const bar = '█'.repeat(filled) + '░'.repeat(barLength - filled);\r\n process.stdout.write(`\\r${colors.cyan}${bar}${colors.reset} ${percent}% | ${label}`);\r\n },\r\n \r\n progressEnd: () => {\r\n console.log(); // New line after progress\r\n },\r\n\r\n // Divider\r\n divider: () => console.log(`${colors.dim}${'─'.repeat(50)}${colors.reset}`),\r\n \r\n // Header\r\n header: (title: string) => {\r\n console.log();\r\n console.log(`${colors.bold}${colors.cyan}🏗️ ${title}${colors.reset}`);\r\n console.log(`${colors.dim}${'─'.repeat(50)}${colors.reset}`);\r\n },\r\n};\r\n\r\n/**\r\n * Format duration for display\r\n */\r\nexport const formatDuration = (ms: number): string => {\r\n if (ms < 1000) return `${Math.round(ms)}ms`;\r\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\r\n return `${(ms / 60000).toFixed(1)}m`;\r\n};\r\n","/**\r\n * Prompt templates for AI-powered code auditing\r\n */\r\n\r\nimport type { ProjectConfig } from '../types/index.js';\r\n\r\nexport const DEFAULT_COMMIT_PROMPT = `\r\n### ROLE\r\nYou are a Strict Release Manager. You enforce \"Conventional Commits\" standards.\r\n### RULES\r\n1. Format MUST be: \\`<type>(<scope>): <subject>\\`\r\n - Types: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert.\r\n - Example: \"feat(auth): add google login support\"\r\n2. Subject must be lowercase and imperative (e.g., \"add\" not \"added\").\r\n3. Message must be descriptive enough to understand the change context.\r\n`;\r\n\r\nexport const BASE_AUDIT_PROMPT = `\r\n### ROLE & OBJECTIVE\r\nYou are an Elite Software Architect. Your goal is to enforce \"Clean Code\", \"SOLID Principles\", and \"Maintainability\".\r\n### GLOBAL STANDARDS\r\n1. **Clean Code:** Variable/Function names must be semantic. No magic numbers.\r\n2. **Split Code:** Suggest splitting complex functions/components.\r\n3. **Performance:** Identify obvious bottlenecks.\r\n4. **Error Handling:** Ensure proper boundary checks.\r\n`;\r\n\r\nexport const buildSystemPrompt = (config: ProjectConfig): string => {\r\n const parts: string[] = [BASE_AUDIT_PROMPT];\r\n\r\n if (config.techStack) {\r\n parts.push(`\\n### TECH STACK CONTEXT\\nThe code is written in: ${config.techStack}\\n`);\r\n }\r\n\r\n if (config.rules && config.rules.length > 0) {\r\n parts.push(`\\n### PROJECT SPECIFIC RULES (HIGHEST PRIORITY)\\n`);\r\n config.rules.forEach((rule, index) => {\r\n parts.push(`${index + 1}. ${rule}\\n`);\r\n });\r\n }\r\n\r\n parts.push(`\\n### OUTPUT FORMAT (JSON ONLY)\\n{ \"status\": \"PASS\" | \"FAIL\", \"issues\": [{ \"line\": number, \"severity\": \"CRITICAL\" | \"WARNING\", \"message\": \"string\", \"suggestion\": \"string\" }] }`);\r\n \r\n return parts.join('');\r\n};\r\n\r\nexport const buildCommitPrompt = (customFormat?: string): string => {\r\n const parts: string[] = [];\r\n \r\n if (customFormat) {\r\n parts.push(`\r\n### ROLE\r\nYou are a Strict Release Manager. \r\n### RULES (CUSTOM COMPANY POLICY)\r\nYou must enforce the following strict commit message format:\r\n\"${customFormat}\"\r\n\r\nAny commit message NOT following this pattern must be REJECTED.\r\n `);\r\n } else {\r\n parts.push(DEFAULT_COMMIT_PROMPT);\r\n }\r\n \r\n parts.push(`\\n### OUTPUT (JSON ONLY)\\n{ \"status\": \"PASS\" | \"FAIL\", \"message\": \"Reason for failure\", \"suggestion\": \"Corrected example\" }`);\r\n \r\n return parts.join('');\r\n};\r\n","/**\r\n * Core AI service with singleton pattern and request pooling\r\n */\r\n\r\nimport { GoogleGenerativeAI, type GenerativeModel } from '@google/generative-ai';\r\nimport type { AuditResult, ProjectConfig, FileAuditResult } from '../types/index.js';\r\nimport { buildSystemPrompt, buildCommitPrompt } from '../config/prompts.js';\r\nimport { parseAuditResponse } from '../utils/parser.js';\r\nimport { log } from '../utils/logger.js';\r\n\r\nlet modelInstance: GenerativeModel | null = null;\r\n\r\n/**\r\n * Initialize AI model (singleton pattern)\r\n */\r\nconst getModel = (): GenerativeModel => {\r\n if (modelInstance) {\r\n return modelInstance;\r\n }\r\n\r\n const apiKey = process.env.GEMINI_API_KEY;\r\n if (!apiKey) {\r\n throw new Error('GEMINI_API_KEY environment variable is required');\r\n }\r\n\r\n const genAI = new GoogleGenerativeAI(apiKey);\r\n modelInstance = genAI.getGenerativeModel({\r\n model: 'gemini-1.5-pro',\r\n generationConfig: {\r\n temperature: 0.2,\r\n maxOutputTokens: 8192,\r\n },\r\n });\r\n\r\n return modelInstance;\r\n};\r\n\r\n/**\r\n * Audit commit message\r\n */\r\nexport const auditCommit = async (\r\n message: string,\r\n config: ProjectConfig\r\n): Promise<AuditResult> => {\r\n log.audit(`Auditing Commit Message: \"${message}\"...`);\r\n \r\n const systemPrompt = buildCommitPrompt(config.commitFormat);\r\n const model = getModel();\r\n\r\n try {\r\n const result = await model.generateContent([\r\n systemPrompt,\r\n `Commit Message: \"${message}\"`,\r\n ]);\r\n \r\n return parseAuditResponse(result.response.text());\r\n } catch (error) {\r\n log.warning('AI check failed. Skipping commit check.');\r\n return { status: 'PASS', message: 'AI unavailable - skipped' };\r\n }\r\n};\r\n\r\n/**\r\n * Audit single file\r\n */\r\nexport const auditFile = async (\r\n filePath: string,\r\n content: string,\r\n systemPrompt: string\r\n): Promise<AuditResult> => {\r\n const model = getModel();\r\n\r\n try {\r\n const result = await model.generateContent([\r\n systemPrompt,\r\n `Code to review:\\n${content}`,\r\n ]);\r\n \r\n return parseAuditResponse(result.response.text());\r\n } catch (error) {\r\n return {\r\n status: 'FAIL',\r\n message: `Error auditing file: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n issues: [],\r\n };\r\n }\r\n};\r\n\r\n/**\r\n * Audit multiple files with concurrency control\r\n */\r\nexport const auditFilesWithConcurrency = async (\r\n files: Array<{ path: string; content: string }>,\r\n config: ProjectConfig,\r\n maxConcurrency: number = 5\r\n): Promise<FileAuditResult[]> => {\r\n const systemPrompt = buildSystemPrompt(config);\r\n const results: FileAuditResult[] = [];\r\n \r\n // Process files in batches\r\n for (let i = 0; i < files.length; i += maxConcurrency) {\r\n const batch = files.slice(i, i + maxConcurrency);\r\n \r\n const batchPromises = batch.map(async (file) => {\r\n const startTime = performance.now();\r\n log.audit(`Auditing: ${file.path}`);\r\n \r\n const result = await auditFile(file.path, file.content, systemPrompt);\r\n const duration = performance.now() - startTime;\r\n \r\n return {\r\n filePath: file.path,\r\n result,\r\n duration,\r\n };\r\n });\r\n\r\n const batchResults = await Promise.all(batchPromises);\r\n results.push(...batchResults);\r\n \r\n // Progress feedback\r\n log.progress(Math.min(i + maxConcurrency, files.length), files.length, \r\n `${results.length}/${files.length} files audited`);\r\n }\r\n \r\n log.progressEnd();\r\n return results;\r\n};\r\n\r\n/**\r\n * Clear model cache (useful for testing)\r\n */\r\nexport const clearModelCache = (): void => {\r\n modelInstance = null;\r\n};\r\n","/**\r\n * File service with streaming support and memory optimization\r\n */\r\n\r\nimport { readFile, stat } from 'node:fs/promises';\r\nimport { existsSync } from 'node:fs';\r\nimport { resolve } from 'node:path';\r\nimport { log } from '../utils/logger.js';\r\nimport { formatBytes } from '../utils/parser.js';\r\n\r\nconst MAX_FILE_SIZE = 500 * 1024; // 500KB limit per file\r\n\r\nexport interface FileContent {\r\n path: string;\r\n content: string;\r\n size: number;\r\n}\r\n\r\ninterface SkippedFile {\r\n path: string;\r\n skipped: true;\r\n reason: string;\r\n}\r\n\r\ninterface ReadFile {\r\n path: string;\r\n content: string;\r\n size: number;\r\n skipped: false;\r\n}\r\n\r\ntype FileReadItem = SkippedFile | ReadFile;\r\n\r\nexport interface FileReadResult {\r\n success: FileContent[];\r\n skipped: Array<{ path: string; reason: string }>;\r\n}\r\n\r\n/**\r\n * Read multiple files efficiently with size limits\r\n */\r\nexport const readFilesForAudit = async (filePaths: string[]): Promise<FileReadResult> => {\r\n const result: FileReadResult = {\r\n success: [],\r\n skipped: [],\r\n };\r\n\r\n const readPromises = filePaths.map(async (filePath): Promise<FileReadItem> => {\r\n const absolutePath = resolve(filePath);\r\n \r\n // Check existence\r\n if (!existsSync(absolutePath)) {\r\n return { path: filePath, skipped: true, reason: 'File not found' };\r\n }\r\n\r\n try {\r\n // Check file size first\r\n const stats = await stat(absolutePath);\r\n \r\n if (stats.size > MAX_FILE_SIZE) {\r\n return { \r\n path: filePath, \r\n skipped: true, \r\n reason: `File too large (${formatBytes(stats.size)})` \r\n };\r\n }\r\n\r\n // Read file content\r\n const content = await readFile(absolutePath, 'utf-8');\r\n \r\n return {\r\n path: filePath,\r\n content,\r\n size: stats.size,\r\n skipped: false,\r\n };\r\n } catch (error) {\r\n return { \r\n path: filePath, \r\n skipped: true, \r\n reason: error instanceof Error ? error.message : 'Read error' \r\n };\r\n }\r\n });\r\n\r\n const results = await Promise.all(readPromises);\r\n\r\n for (const item of results) {\r\n if (item.skipped) {\r\n result.skipped.push({ path: item.path, reason: item.reason });\r\n } else {\r\n result.success.push({\r\n path: item.path,\r\n content: item.content,\r\n size: item.size,\r\n });\r\n }\r\n }\r\n\r\n // Log skipped files\r\n if (result.skipped.length > 0) {\r\n log.warning(`Skipped ${result.skipped.length} file(s):`);\r\n for (const { path, reason } of result.skipped) {\r\n log.file(`${path}: ${reason}`);\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Get file extension without dot\r\n */\r\nexport const getFileExtension = (filePath: string): string => {\r\n const match = filePath.match(/\\.([^.]+)$/);\r\n return match?.[1] ?? '';\r\n};\r\n\r\n/**\r\n * Check if file is a code file\r\n */\r\nexport const isCodeFile = (filePath: string): boolean => {\r\n const codeExtensions = new Set([\r\n 'ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs',\r\n 'py', 'cs', 'go', 'java', 'rs', 'kt', 'swift',\r\n 'cpp', 'c', 'h', 'hpp', 'rb', 'php'\r\n ]);\r\n return codeExtensions.has(getFileExtension(filePath));\r\n};\r\n\r\n// Re-export formatBytes for convenience\r\nexport { formatBytes };\r\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "architect-ai",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "AI-powered Code Guardian using Gemini Pro - High-performance CLI for code auditing",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/lib.js",
|
|
7
|
+
"types": "dist/lib.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/lib.js",
|
|
11
|
+
"types": "./dist/lib.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./cli": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"bin": {
|
|
16
|
+
"architect-ai": "dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsup",
|
|
24
|
+
"dev": "tsup --watch",
|
|
25
|
+
"start": "node dist/index.js",
|
|
26
|
+
"typecheck": "tsc --noEmit",
|
|
27
|
+
"prepublishOnly": "npm run build"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"code-review",
|
|
31
|
+
"gemini",
|
|
32
|
+
"clean-code",
|
|
33
|
+
"audit",
|
|
34
|
+
"cli",
|
|
35
|
+
"ai",
|
|
36
|
+
"linter",
|
|
37
|
+
"conventional-commits"
|
|
38
|
+
],
|
|
39
|
+
"author": "Nguyen Nhat Minh",
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=18.0.0"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@google/generative-ai": "^0.21.0",
|
|
46
|
+
"dotenv": "^16.4.5"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/node": "^22.0.0",
|
|
50
|
+
"tsup": "^8.3.5",
|
|
51
|
+
"typescript": "^5.7.0"
|
|
52
|
+
},
|
|
53
|
+
"publishConfig": {
|
|
54
|
+
"access": "public"
|
|
55
|
+
},
|
|
56
|
+
"repository": {
|
|
57
|
+
"type": "git",
|
|
58
|
+
"url": "git+https://github.com/peter-minhnn/architect-ai.git"
|
|
59
|
+
}
|
|
60
|
+
}
|