@usesidekick/cli 0.1.4 → 0.1.6

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/dist/index.js CHANGED
@@ -139,21 +139,52 @@ function isComponentName(name) {
139
139
  function isReactComponent(node) {
140
140
  return ts.isArrowFunction(node) || ts.isFunctionExpression(node);
141
141
  }
142
+ function resolvePropsTypeMap(param) {
143
+ const typeMap = /* @__PURE__ */ new Map();
144
+ if (!param.type) return typeMap;
145
+ let typeNode = param.type;
146
+ if (ts.isTypeReferenceNode(typeNode)) {
147
+ const typeName = typeNode.typeName.getText();
148
+ const sourceFile = param.getSourceFile();
149
+ ts.forEachChild(sourceFile, (child) => {
150
+ if (ts.isInterfaceDeclaration(child) && child.name.getText() === typeName) {
151
+ typeNode = child;
152
+ }
153
+ if (ts.isTypeAliasDeclaration(child) && child.name.getText() === typeName) {
154
+ typeNode = child.type;
155
+ }
156
+ });
157
+ }
158
+ const members = ts.isInterfaceDeclaration(typeNode) ? typeNode.members : ts.isTypeLiteralNode(typeNode) ? typeNode.members : void 0;
159
+ if (members) {
160
+ for (const member of members) {
161
+ if (ts.isPropertySignature(member) && member.name && member.type) {
162
+ typeMap.set(member.name.getText(), member.type.getText());
163
+ }
164
+ }
165
+ }
166
+ return typeMap;
167
+ }
142
168
  function extractPropsFromFunction(node) {
143
169
  const props = [];
144
170
  if (node.parameters.length > 0) {
145
171
  const firstParam = node.parameters[0];
172
+ const typeMap = resolvePropsTypeMap(firstParam);
146
173
  if (firstParam.type && ts.isTypeLiteralNode(firstParam.type)) {
147
174
  for (const member of firstParam.type.members) {
148
175
  if (ts.isPropertySignature(member) && member.name) {
149
- props.push(member.name.getText());
176
+ const name = member.name.getText();
177
+ const type = member.type?.getText();
178
+ props.push({ name, ...type && { type } });
150
179
  }
151
180
  }
152
181
  }
153
182
  if (ts.isObjectBindingPattern(firstParam.name)) {
154
183
  for (const element of firstParam.name.elements) {
155
184
  if (ts.isBindingElement(element) && ts.isIdentifier(element.name)) {
156
- props.push(element.name.getText());
185
+ const name = element.name.getText();
186
+ const type = typeMap.get(name);
187
+ props.push({ name, ...type && { type } });
157
188
  }
158
189
  }
159
190
  }
@@ -165,10 +196,13 @@ function extractPropsFromArrowFunction(node) {
165
196
  if (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) {
166
197
  if (node.parameters.length > 0) {
167
198
  const firstParam = node.parameters[0];
199
+ const typeMap = resolvePropsTypeMap(firstParam);
168
200
  if (ts.isObjectBindingPattern(firstParam.name)) {
169
201
  for (const element of firstParam.name.elements) {
170
202
  if (ts.isBindingElement(element) && ts.isIdentifier(element.name)) {
171
- props.push(element.name.getText());
203
+ const name = element.name.getText();
204
+ const type = typeMap.get(name);
205
+ props.push({ name, ...type && { type } });
172
206
  }
173
207
  }
174
208
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/analyze.ts","../src/types.ts","../src/validate.ts","../src/generate.ts","../src/init.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { analyze } from './analyze.js';\nimport { validate, validateFile } from './validate.js';\nimport { generate } from './generate.js';\nimport { init } from './init.js';\n\nconst program = new Command();\n\nprogram\n .name('sidekick')\n .description('Sidekick CLI - Generate and manage override modules')\n .version('0.1.0');\n\n// Analyze command\nprogram\n .command('analyze')\n .description('Analyze an app and generate schema.json')\n .option('-d, --dir <path>', 'Target directory to analyze', '.')\n .option('-o, --output <path>', 'Output path for schema.json', './sidekick/schema.json')\n .action(async (options) => {\n const targetDir = path.resolve(options.dir);\n const outputPath = path.resolve(options.output);\n\n console.log(`Analyzing ${targetDir}...`);\n\n try {\n const schema = await analyze({ targetDir, outputPath });\n\n console.log('\\nAnalysis complete!');\n console.log(` Components: ${schema.components.length}`);\n console.log(` Extension points: ${schema.extensionPoints.length}`);\n console.log(` Data models: ${schema.dataModels.length}`);\n console.log(` Design system: ${schema.designSystem.framework || 'plain CSS'}, ${schema.designSystem.componentStyles.length} component style samples`);\n console.log(`\\nSchema written to: ${outputPath}`);\n } catch (error) {\n console.error('Analysis failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// Generate command\nprogram\n .command('generate')\n .description('Generate an override module from a natural language request')\n .argument('<request>', 'Natural language description of the customization')\n .option('-s, --schema <path>', 'Path to schema.json', './sidekick/schema.json')\n .option('-o, --output <path>', 'Output directory for overrides', './sidekick/overrides')\n .option('-k, --api-key <key>', 'Anthropic API key (or set ANTHROPIC_API_KEY)')\n .action(async (request, options) => {\n const schemaPath = path.resolve(options.schema);\n const outputDir = path.resolve(options.output);\n\n console.log(`Generating override for: \"${request}\"`);\n console.log(`Using schema: ${schemaPath}`);\n\n try {\n const result = await generate({\n request,\n schemaPath,\n outputDir,\n apiKey: options.apiKey,\n });\n\n if (result.success) {\n console.log('\\nGeneration successful!');\n console.log(` Override ID: ${result.override?.manifest.id}`);\n console.log(` Name: ${result.override?.manifest.name}`);\n console.log(` Output: ${result.outputPath}`);\n console.log('\\nTo enable this override, add it to your flags.json or use the Sidekick panel.');\n } else {\n console.error('\\nGeneration failed:', result.error);\n if (result.validationErrors) {\n console.error('Validation errors:');\n result.validationErrors.forEach((e) => console.error(` - ${e}`));\n }\n process.exit(1);\n }\n } catch (error) {\n console.error('Generation failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// Validate command\nprogram\n .command('validate')\n .description('Validate an override module')\n .argument('<file>', 'Path to the override file to validate')\n .action(async (file) => {\n const filepath = path.resolve(file);\n\n console.log(`Validating ${filepath}...`);\n\n try {\n const code = await fs.readFile(filepath, 'utf-8');\n const result = validateFile(filepath, code);\n\n if (result.valid) {\n console.log('\\nValidation passed!');\n\n if (result.warnings.length > 0) {\n console.log('\\nWarnings:');\n result.warnings.forEach((w) => {\n const location = w.line ? ` (line ${w.line})` : '';\n console.log(` - ${w.type}${location}: ${w.message}`);\n });\n }\n } else {\n console.error('\\nValidation failed!');\n console.error('\\nErrors:');\n result.errors.forEach((e) => {\n const location = e.line ? ` (line ${e.line}${e.column ? `:${e.column}` : ''})` : '';\n console.error(` - ${e.type}${location}: ${e.message}`);\n });\n process.exit(1);\n }\n } catch (error) {\n console.error('Validation failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// Init command\nprogram\n .command('init')\n .description('Initialize Sidekick in the current project (installs deps, configures build, creates API routes, modifies layout)')\n .option('-d, --dir <path>', 'Target directory', '.')\n .option('--postgres', 'Use Drizzle + Neon Postgres for storage (default: JSON file storage)')\n .action(async (options) => {\n const targetDir = path.resolve(options.dir);\n try {\n await init(targetDir, { postgres: !!options.postgres });\n } catch (error) {\n console.error('Initialization failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram.parse();\n","import * as ts from 'typescript';\nimport * as path from 'path';\nimport { glob } from 'glob';\nimport * as fs from 'fs/promises';\nimport {\n AppSchema,\n ComponentInfo,\n ExtensionPointInfo,\n DataModelInfo,\n DataModelField,\n DesignSystem,\n ComponentStyleSample,\n SDK_PRIMITIVES,\n} from './types.js';\n\ninterface AnalyzeOptions {\n targetDir: string;\n outputPath?: string;\n}\n\nexport async function analyze(options: AnalyzeOptions): Promise<AppSchema> {\n const { targetDir, outputPath } = options;\n\n // Find all TypeScript/TSX files in the target directory\n const files = await glob('**/*.{ts,tsx}', {\n cwd: targetDir,\n ignore: ['**/node_modules/**', '**/dist/**', '**/.next/**', '**/sidekick/overrides/**'],\n absolute: true,\n });\n\n const components: ComponentInfo[] = [];\n const extensionPoints: ExtensionPointInfo[] = [];\n const dataModels: DataModelInfo[] = [];\n const componentStyles: ComponentStyleSample[] = [];\n\n for (const file of files) {\n const content = await fs.readFile(file, 'utf-8');\n const relPath = path.relative(targetDir, file);\n\n // Parse with TypeScript\n const sourceFile = ts.createSourceFile(\n file,\n content,\n ts.ScriptTarget.Latest,\n true,\n file.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n );\n\n // Extract components\n const fileComponents = extractComponents(sourceFile, relPath, content);\n components.push(...fileComponents);\n\n // Extract extension points from comments\n const fileExtensionPoints = extractExtensionPoints(content, relPath);\n extensionPoints.push(...fileExtensionPoints);\n\n // Extract data models (interfaces/types)\n const fileDataModels = extractDataModels(sourceFile, relPath);\n dataModels.push(...fileDataModels);\n\n // Extract style samples from components in TSX files\n if (file.endsWith('.tsx')) {\n const fileStyles = extractComponentStyles(sourceFile, relPath);\n componentStyles.push(...fileStyles);\n }\n }\n\n // Extract design system info from config files\n const designSystem = await extractDesignSystem(targetDir, componentStyles);\n\n const schema: AppSchema = {\n version: '1.0.0',\n generatedAt: new Date().toISOString(),\n designSystem,\n components,\n extensionPoints: [...new Set(extensionPoints.map((ep) => ep.id))],\n dataModels,\n primitives: SDK_PRIMITIVES,\n };\n\n // Write schema to file if outputPath is specified\n if (outputPath) {\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, JSON.stringify(schema, null, 2));\n }\n\n return schema;\n}\n\nfunction extractComponents(\n sourceFile: ts.SourceFile,\n relPath: string,\n content: string\n): ComponentInfo[] {\n const components: ComponentInfo[] = [];\n\n function visit(node: ts.Node) {\n // Look for function declarations or arrow functions that might be components\n if (ts.isFunctionDeclaration(node) && node.name) {\n const name = node.name.getText();\n if (isComponentName(name)) {\n const props = extractPropsFromFunction(node);\n const extensible = hasExtensibleMarker(content, node.pos);\n const renderStructure = extractRenderStructure(node) || undefined;\n components.push({ name, file: relPath, props, extensible, renderStructure });\n }\n }\n\n // Arrow function components: const Foo = () => { ... }\n if (ts.isVariableStatement(node)) {\n const declarations = node.declarationList.declarations;\n for (const decl of declarations) {\n if (ts.isIdentifier(decl.name) && decl.initializer) {\n const name = decl.name.getText();\n if (isComponentName(name) && isReactComponent(decl.initializer)) {\n const props = extractPropsFromArrowFunction(decl.initializer);\n const extensible = hasExtensibleMarker(content, node.pos);\n const renderStructure = extractRenderStructure(decl.initializer) || undefined;\n components.push({ name, file: relPath, props, extensible, renderStructure });\n }\n }\n }\n }\n\n ts.forEachChild(node, visit);\n }\n\n visit(sourceFile);\n return components;\n}\n\nfunction isComponentName(name: string): boolean {\n // React components start with uppercase letter\n return /^[A-Z]/.test(name);\n}\n\nfunction isReactComponent(node: ts.Node): boolean {\n // Check if it's an arrow function or function expression\n return ts.isArrowFunction(node) || ts.isFunctionExpression(node);\n}\n\nfunction extractPropsFromFunction(node: ts.FunctionDeclaration): string[] {\n const props: string[] = [];\n if (node.parameters.length > 0) {\n const firstParam = node.parameters[0];\n if (firstParam.type && ts.isTypeLiteralNode(firstParam.type)) {\n for (const member of firstParam.type.members) {\n if (ts.isPropertySignature(member) && member.name) {\n props.push(member.name.getText());\n }\n }\n }\n // Handle destructured props\n if (ts.isObjectBindingPattern(firstParam.name)) {\n for (const element of firstParam.name.elements) {\n if (ts.isBindingElement(element) && ts.isIdentifier(element.name)) {\n props.push(element.name.getText());\n }\n }\n }\n }\n return props;\n}\n\nfunction extractPropsFromArrowFunction(node: ts.Node): string[] {\n const props: string[] = [];\n if (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) {\n if (node.parameters.length > 0) {\n const firstParam = node.parameters[0];\n if (ts.isObjectBindingPattern(firstParam.name)) {\n for (const element of firstParam.name.elements) {\n if (ts.isBindingElement(element) && ts.isIdentifier(element.name)) {\n props.push(element.name.getText());\n }\n }\n }\n }\n }\n return props;\n}\n\nfunction hasExtensibleMarker(content: string, nodePos: number): boolean {\n // Look for @sidekick:extensible marker in comment before the node\n const beforeNode = content.substring(Math.max(0, nodePos - 200), nodePos);\n return /@sidekick:extensible/.test(beforeNode);\n}\n\n/**\n * Extract a compact text summary of the JSX tree a component returns.\n * Walks the function body to find return statements with JSX.\n * Output like: div > [div.mb-4 > button, div.bg-white > <TaskTable>]\n */\nfunction extractRenderStructure(node: ts.Node): string | null {\n // Find the function body\n let body: ts.Node | undefined;\n if (ts.isFunctionDeclaration(node) && node.body) {\n body = node.body;\n } else if (ts.isArrowFunction(node)) {\n body = node.body;\n } else if (ts.isFunctionExpression(node) && node.body) {\n body = node.body;\n }\n\n if (!body) return null;\n\n // If the body is directly a JSX expression (arrow with implicit return)\n if (ts.isJsxElement(body) || ts.isJsxSelfClosingElement(body) || ts.isJsxFragment(body) || ts.isParenthesizedExpression(body)) {\n const jsx = findJsxInExpression(body);\n if (jsx) return summarizeJsx(jsx, 0);\n }\n\n // Otherwise, find the first return statement with JSX\n const returnJsx = findReturnJsx(body);\n if (returnJsx) return summarizeJsx(returnJsx, 0);\n\n return null;\n}\n\nfunction findReturnJsx(node: ts.Node): ts.Node | null {\n if (ts.isReturnStatement(node) && node.expression) {\n const jsx = findJsxInExpression(node.expression);\n if (jsx) return jsx;\n }\n\n let result: ts.Node | null = null;\n ts.forEachChild(node, (child) => {\n if (!result) {\n // Don't descend into nested functions (those are different components/callbacks)\n if (ts.isFunctionDeclaration(child) || ts.isArrowFunction(child) || ts.isFunctionExpression(child)) {\n return;\n }\n result = findReturnJsx(child);\n }\n });\n return result;\n}\n\nfunction findJsxInExpression(node: ts.Node): ts.Node | null {\n if (ts.isJsxElement(node) || ts.isJsxSelfClosingElement(node) || ts.isJsxFragment(node)) {\n return node;\n }\n if (ts.isParenthesizedExpression(node)) {\n return findJsxInExpression(node.expression);\n }\n return null;\n}\n\nfunction summarizeJsx(node: ts.Node, depth: number): string {\n const MAX_DEPTH = 3;\n if (depth > MAX_DEPTH) return '...';\n\n if (ts.isJsxSelfClosingElement(node)) {\n const tag = node.tagName.getText();\n const cls = getClassNameAttr(node.attributes);\n if (isComponentName(tag)) return `<${tag}/>`;\n return cls ? `${tag}.${compactClass(cls)}` : tag;\n }\n\n if (ts.isJsxElement(node)) {\n const tag = node.openingElement.tagName.getText();\n const cls = getClassNameAttr(node.openingElement.attributes);\n const tagStr = isComponentName(tag) ? `<${tag}>` : (cls ? `${tag}.${compactClass(cls)}` : tag);\n\n const childSummaries: string[] = [];\n for (const child of node.children) {\n if (ts.isJsxElement(child) || ts.isJsxSelfClosingElement(child)) {\n childSummaries.push(summarizeJsx(child, depth + 1));\n } else if (ts.isJsxExpression(child) && child.expression) {\n // Conditional rendering: {condition && <Foo/>} or {condition ? <A/> : <B/>}\n const expr = child.expression;\n if (ts.isConditionalExpression(expr)) {\n const whenTrue = findJsxInExpression(expr.whenTrue);\n const whenFalse = findJsxInExpression(expr.whenFalse);\n if (whenTrue) childSummaries.push(`{cond: ${summarizeJsx(whenTrue, depth + 1)}}`);\n if (whenFalse) childSummaries.push(summarizeJsx(whenFalse, depth + 1));\n } else if (ts.isBinaryExpression(expr) && expr.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken) {\n const jsx = findJsxInExpression(expr.right);\n if (jsx) childSummaries.push(`{cond: ${summarizeJsx(jsx, depth + 1)}}`);\n } else {\n const jsx = findJsxInExpression(expr);\n if (jsx) childSummaries.push(summarizeJsx(jsx, depth + 1));\n }\n }\n }\n\n if (childSummaries.length === 0) return tagStr;\n if (childSummaries.length === 1) return `${tagStr} > ${childSummaries[0]}`;\n return `${tagStr} > [${childSummaries.join(', ')}]`;\n }\n\n if (ts.isJsxFragment(node)) {\n const childSummaries: string[] = [];\n for (const child of node.children) {\n if (ts.isJsxElement(child) || ts.isJsxSelfClosingElement(child)) {\n childSummaries.push(summarizeJsx(child, depth + 1));\n }\n }\n return childSummaries.length === 1 ? childSummaries[0] : `[${childSummaries.join(', ')}]`;\n }\n\n return '?';\n}\n\nfunction getClassNameAttr(attrs: ts.JsxAttributes): string | null {\n for (const attr of attrs.properties) {\n if (ts.isJsxAttribute(attr) && attr.name.getText() === 'className' && attr.initializer) {\n if (ts.isStringLiteral(attr.initializer)) {\n return attr.initializer.text;\n }\n }\n }\n return null;\n}\n\n/** Compact a className string to just the first 2-3 meaningful classes */\nfunction compactClass(cls: string): string {\n const parts = cls.split(/\\s+/).filter(c => !c.startsWith('dark:'));\n // Take just layout/semantic classes, skip utility minutiae\n const meaningful = parts.slice(0, 3);\n return meaningful.join('.');\n}\n\nfunction extractExtensionPoints(\n content: string,\n relPath: string\n): ExtensionPointInfo[] {\n const extensionPoints: ExtensionPointInfo[] = [];\n\n // Pattern 1: @sidekick:extension-point comment markers\n const commentRegex = /@sidekick:extension-point\\s+([a-z0-9-]+)/g;\n let match;\n\n while ((match = commentRegex.exec(content)) !== null) {\n const id = match[1];\n const line = content.substring(0, match.index).split('\\n').length;\n extensionPoints.push({ id, file: relPath, line });\n }\n\n // Pattern 2: <ExtensionPoint id=\"...\" /> JSX components\n const jsxRegex = /<ExtensionPoint\\s+[^>]*id=[\"']([a-z0-9-]+)[\"'][^>]*\\/?>/g;\n\n while ((match = jsxRegex.exec(content)) !== null) {\n const id = match[1];\n const line = content.substring(0, match.index).split('\\n').length;\n extensionPoints.push({ id, file: relPath, line });\n }\n\n return extensionPoints;\n}\n\nfunction extractDataModels(\n sourceFile: ts.SourceFile,\n relPath: string\n): DataModelInfo[] {\n const dataModels: DataModelInfo[] = [];\n\n function visit(node: ts.Node) {\n // Look for exported interfaces\n if (ts.isInterfaceDeclaration(node)) {\n const name = node.name.getText();\n // Only include data model interfaces (not props interfaces)\n if (!name.endsWith('Props') && !name.endsWith('State')) {\n const fields = extractFieldsFromInterface(node);\n if (fields.length > 0) {\n dataModels.push({ name, file: relPath, fields });\n }\n }\n }\n\n // Look for exported type aliases with object types\n if (ts.isTypeAliasDeclaration(node)) {\n const name = node.name.getText();\n if (!name.endsWith('Props') && !name.endsWith('State') && ts.isTypeLiteralNode(node.type)) {\n const fields = extractFieldsFromTypeLiteral(node.type);\n if (fields.length > 0) {\n dataModels.push({ name, file: relPath, fields });\n }\n }\n }\n\n ts.forEachChild(node, visit);\n }\n\n visit(sourceFile);\n return dataModels;\n}\n\nfunction extractFieldsFromInterface(node: ts.InterfaceDeclaration): DataModelField[] {\n const fields: DataModelField[] = [];\n\n for (const member of node.members) {\n if (ts.isPropertySignature(member) && member.name && member.type) {\n const name = member.name.getText();\n const type = member.type.getText();\n const optional = member.questionToken !== undefined;\n fields.push({ name, type, optional: optional || undefined });\n }\n }\n\n return fields;\n}\n\nfunction extractFieldsFromTypeLiteral(node: ts.TypeLiteralNode): DataModelField[] {\n const fields: DataModelField[] = [];\n\n for (const member of node.members) {\n if (ts.isPropertySignature(member) && member.name && member.type) {\n const name = member.name.getText();\n const type = member.type.getText();\n const optional = member.questionToken !== undefined;\n fields.push({ name, type, optional: optional || undefined });\n }\n }\n\n return fields;\n}\n\n// --- Design System Extraction ---\n\n/**\n * Extract className strings from JSX elements within component functions in a file.\n * Returns one ComponentStyleSample per component found, with deduplicated class strings.\n */\nfunction extractComponentStyles(\n sourceFile: ts.SourceFile,\n relPath: string\n): ComponentStyleSample[] {\n const results: ComponentStyleSample[] = [];\n\n function visitTopLevel(node: ts.Node) {\n let componentName: string | null = null;\n\n // Named function component: function Foo(props) { ... }\n if (ts.isFunctionDeclaration(node) && node.name) {\n const name = node.name.getText();\n if (isComponentName(name)) {\n componentName = name;\n }\n }\n\n // Arrow function component: const Foo = (...) => { ... }\n if (ts.isVariableStatement(node)) {\n for (const decl of node.declarationList.declarations) {\n if (ts.isIdentifier(decl.name) && decl.initializer) {\n const name = decl.name.getText();\n if (isComponentName(name) && isReactComponent(decl.initializer)) {\n componentName = name;\n }\n }\n }\n }\n\n if (componentName) {\n const classNames = new Set<string>();\n collectClassNames(node, classNames, sourceFile);\n if (classNames.size > 0) {\n results.push({\n component: componentName,\n file: relPath,\n classNames: Array.from(classNames),\n });\n }\n }\n\n ts.forEachChild(node, visitTopLevel);\n }\n\n visitTopLevel(sourceFile);\n return results;\n}\n\n/**\n * Walk a subtree collecting all string literal values from className={...} JSX attributes.\n * Handles: className=\"...\" and className={`...`} (static parts of template literals).\n */\nfunction collectClassNames(\n node: ts.Node,\n classNames: Set<string>,\n sourceFile: ts.SourceFile\n): void {\n // Match JSX attribute: className=\"...\" or className={...}\n if (ts.isJsxAttribute(node)) {\n const attrName = node.name.getText();\n if (attrName === 'className' && node.initializer) {\n // className=\"literal string\"\n if (ts.isStringLiteral(node.initializer)) {\n classNames.add(node.initializer.text);\n }\n // className={expression} — dig into the expression\n if (ts.isJsxExpression(node.initializer) && node.initializer.expression) {\n collectStringValues(node.initializer.expression, classNames);\n }\n }\n }\n\n ts.forEachChild(node, (child) => collectClassNames(child, classNames, sourceFile));\n}\n\n/**\n * Extract string literal values from an expression tree.\n * Handles string literals, template literals (static spans), and ternary expressions.\n * Filters out values that don't look like CSS class strings.\n */\nfunction collectStringValues(node: ts.Node, values: Set<string>): void {\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {\n const text = node.text.trim();\n if (text && looksLikeClassNames(text)) values.add(text);\n }\n\n if (ts.isTemplateExpression(node)) {\n // Collect static parts of template literals\n const head = node.head.text.trim();\n if (head && looksLikeClassNames(head)) values.add(head);\n for (const span of node.templateSpans) {\n const spanText = span.literal.text.trim();\n if (spanText && looksLikeClassNames(spanText)) values.add(spanText);\n }\n }\n\n // Ternary: condition ? 'a' : 'b' — only collect from then/else branches, not the condition\n if (ts.isConditionalExpression(node)) {\n collectStringValues(node.whenTrue, values);\n collectStringValues(node.whenFalse, values);\n return; // Don't recurse into condition\n }\n\n // Binary expression with + for string concatenation\n if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.PlusToken) {\n collectStringValues(node.left, values);\n collectStringValues(node.right, values);\n return;\n }\n\n ts.forEachChild(node, (child) => collectStringValues(child, values));\n}\n\n/**\n * Heuristic: does a string look like CSS class names?\n * Class names are space-separated identifiers with letters, hyphens, colons, dots, brackets, slashes.\n * Rejects strings that look like URLs, paths, or plain text.\n */\nfunction looksLikeClassNames(text: string): boolean {\n // Reject empty or very short\n if (text.length < 2) return false;\n // Reject URL-like strings\n if (text.startsWith('http') || text.startsWith('//')) return false;\n // Reject path-like strings (start with / and don't contain spaces)\n if (text.startsWith('/') && !text.includes(' ')) return false;\n // Reject strings that are mostly non-class characters (sentences, etc.)\n // Class names typically have hyphens, colons, and don't have many capital letters\n const words = text.split(/\\s+/);\n // If every \"word\" matches a CSS-class-like pattern, it's likely class names\n const classPattern = /^[a-zA-Z_\\-\\[\\]:.\\/][a-zA-Z0-9_\\-\\[\\]:.\\/%]*$/;\n const classLikeCount = words.filter(w => classPattern.test(w)).length;\n return classLikeCount / words.length >= 0.5;\n}\n\n/**\n * Detect CSS framework, font family, and global CSS from the project.\n */\nasync function extractDesignSystem(\n targetDir: string,\n componentStyles: ComponentStyleSample[]\n): Promise<DesignSystem> {\n let framework: string | null = null;\n let fontFamily: string | null = null;\n let globalCss: string | null = null;\n\n // Detect Tailwind — check target dir and up to 2 parent dirs\n // (handles cases like scanning src/ when tailwind.config is at project root)\n const dirsToCheck = [targetDir];\n const parent1 = path.dirname(targetDir);\n if (parent1 !== targetDir) dirsToCheck.push(parent1);\n const parent2 = path.dirname(parent1);\n if (parent2 !== parent1) dirsToCheck.push(parent2);\n\n let tailwindConfigs: string[] = [];\n for (const dir of dirsToCheck) {\n tailwindConfigs = await glob('tailwind.config.{js,ts,cjs,mjs}', {\n cwd: dir,\n absolute: true,\n });\n if (tailwindConfigs.length > 0) break;\n }\n if (tailwindConfigs.length > 0) {\n framework = 'Tailwind CSS';\n\n // Try to extract font family from tailwind config\n try {\n const configContent = await fs.readFile(tailwindConfigs[0], 'utf-8');\n const fontMatch = configContent.match(/fontFamily\\s*:\\s*\\{[^}]*sans\\s*:\\s*\\[([^\\]]+)\\]/);\n if (fontMatch) {\n fontFamily = fontMatch[1]\n .split(',')\n .map(s => s.trim().replace(/['\"]/g, ''))\n .join(', ');\n }\n } catch {\n // ignore\n }\n }\n\n // Find and read global CSS files\n const cssFiles = await glob('**/{globals,global,styles,style,app}.css', {\n cwd: targetDir,\n ignore: ['**/node_modules/**', '**/dist/**', '**/.next/**'],\n absolute: true,\n });\n if (cssFiles.length > 0) {\n try {\n const contents: string[] = [];\n for (const cssFile of cssFiles) {\n const content = await fs.readFile(cssFile, 'utf-8');\n // Strip Tailwind directives — they're not useful style info\n const stripped = content\n .replace(/@tailwind\\s+\\w+;/g, '')\n .trim();\n if (stripped) {\n contents.push(stripped);\n }\n }\n if (contents.length > 0) {\n globalCss = contents.join('\\n\\n');\n }\n } catch {\n // ignore\n }\n\n // Try to extract font from CSS if not found in tailwind config\n if (!fontFamily) {\n for (const cssFile of cssFiles) {\n try {\n const content = await fs.readFile(cssFile, 'utf-8');\n const fontMatch = content.match(/font-family\\s*:\\s*([^;]+)/);\n if (fontMatch) {\n fontFamily = fontMatch[1].trim();\n }\n } catch {\n // ignore\n }\n }\n }\n }\n\n return {\n framework,\n fontFamily,\n globalCss,\n componentStyles,\n };\n}\n","export interface ComponentInfo {\n name: string;\n file: string;\n props: string[];\n extensible: boolean;\n /** Compact summary of the JSX tree this component renders */\n renderStructure?: string;\n}\n\nexport interface ExtensionPointInfo {\n id: string;\n file: string;\n line: number;\n}\n\nexport interface DataModelField {\n name: string;\n type: string;\n optional?: boolean;\n}\n\nexport interface DataModelInfo {\n name: string;\n file: string;\n fields: DataModelField[];\n}\n\nexport interface ComponentStyleSample {\n component: string;\n file: string;\n classNames: string[];\n}\n\nexport interface DesignSystem {\n framework: string | null;\n fontFamily: string | null;\n globalCss: string | null;\n componentStyles: ComponentStyleSample[];\n}\n\nexport interface AppSchema {\n version: string;\n generatedAt: string;\n designSystem: DesignSystem;\n components: ComponentInfo[];\n extensionPoints: string[];\n dataModels: DataModelInfo[];\n primitives: string[];\n}\n\nexport interface OverrideManifest {\n id: string;\n name: string;\n description: string;\n version: string;\n primitives: string[];\n}\n\nexport interface GeneratedOverride {\n manifest: OverrideManifest;\n code: string;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n warnings: ValidationWarning[];\n}\n\nexport interface ValidationError {\n type: 'forbidden-import' | 'forbidden-pattern' | 'syntax-error' | 'type-error';\n message: string;\n line?: number;\n column?: number;\n}\n\nexport interface ValidationWarning {\n type: 'unused-import' | 'complex-code';\n message: string;\n line?: number;\n}\n\nexport const ALLOWED_IMPORTS = [\n '@usesidekick/react',\n 'react',\n];\n\nexport const FORBIDDEN_PATTERNS = [\n /\\bfetch\\s*\\(/,\n /\\beval\\s*\\(/,\n /\\bFunction\\s*\\(/,\n /\\bdocument\\./,\n /\\bwindow\\./,\n /\\blocalStorage\\./,\n /\\bsessionStorage\\./,\n /\\bXMLHttpRequest/,\n /\\bWebSocket/,\n /\\bimport\\s*\\(/,\n /require\\s*\\(/,\n];\n\nexport const SDK_PRIMITIVES = [\n 'ui.wrap',\n 'ui.replace',\n 'ui.addColumn',\n 'ui.renameColumn',\n 'ui.reorderColumns',\n 'ui.hideColumn',\n 'ui.filterRows',\n 'ui.addStyles',\n 'ui.setText',\n 'ui.setAttribute',\n 'ui.setStyle',\n 'ui.addClass',\n 'ui.removeClass',\n 'ui.inject',\n 'data.computed',\n 'data.addFilter',\n 'data.transform',\n 'data.intercept',\n 'behavior.addKeyboardShortcut',\n 'behavior.onDOMEvent',\n 'behavior.modifyRoute',\n];\n","import * as ts from 'typescript';\nimport {\n ValidationResult,\n ValidationError,\n ValidationWarning,\n ALLOWED_IMPORTS,\n FORBIDDEN_PATTERNS,\n} from './types.js';\n\ninterface ValidateOptions {\n code: string;\n filename?: string;\n}\n\nexport function validate(options: ValidateOptions): ValidationResult {\n const { code, filename = 'override.tsx' } = options;\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Parse the code with TypeScript\n let sourceFile: ts.SourceFile;\n try {\n sourceFile = ts.createSourceFile(\n filename,\n code,\n ts.ScriptTarget.Latest,\n true,\n filename.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n );\n } catch (e) {\n errors.push({\n type: 'syntax-error',\n message: `Failed to parse code: ${e instanceof Error ? e.message : String(e)}`,\n });\n return { valid: false, errors, warnings };\n }\n\n // Check for parse errors in the AST (syntax errors only, not type errors)\n const parseErrors = checkParseErrors(sourceFile);\n errors.push(...parseErrors);\n\n // Check imports\n const importErrors = checkImports(sourceFile);\n errors.push(...importErrors);\n\n // Check for forbidden patterns\n const patternErrors = checkForbiddenPatterns(code);\n errors.push(...patternErrors);\n\n // Check for usage of SDK primitives\n const primitiveWarnings = checkPrimitiveUsage(sourceFile);\n warnings.push(...primitiveWarnings);\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nfunction checkParseErrors(sourceFile: ts.SourceFile): ValidationError[] {\n const errors: ValidationError[] = [];\n\n // Check for parse diagnostics (syntax errors only)\n // Note: We don't do full type checking here because that would require\n // a complete TypeScript project setup with node_modules\n const parseDiagnostics = (sourceFile as unknown as { parseDiagnostics?: ts.Diagnostic[] }).parseDiagnostics;\n\n if (parseDiagnostics) {\n for (const diagnostic of parseDiagnostics) {\n const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\\n');\n const pos = diagnostic.start;\n let line: number | undefined;\n let column: number | undefined;\n\n if (pos !== undefined) {\n const lineAndChar = sourceFile.getLineAndCharacterOfPosition(pos);\n line = lineAndChar.line + 1;\n column = lineAndChar.character + 1;\n }\n\n errors.push({\n type: 'syntax-error',\n message,\n line,\n column,\n });\n }\n }\n\n // Also check for obvious structural issues by walking the AST\n function visit(node: ts.Node) {\n // Check for incomplete nodes that indicate parse errors\n if (node.kind === ts.SyntaxKind.Unknown) {\n const pos = node.getStart(sourceFile);\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(pos);\n errors.push({\n type: 'syntax-error',\n message: 'Unknown or invalid syntax',\n line: line + 1,\n column: character + 1,\n });\n }\n ts.forEachChild(node, visit);\n }\n visit(sourceFile);\n\n return errors;\n}\n\nfunction checkImports(sourceFile: ts.SourceFile): ValidationError[] {\n const errors: ValidationError[] = [];\n\n function visit(node: ts.Node) {\n if (ts.isImportDeclaration(node)) {\n const moduleSpecifier = node.moduleSpecifier;\n if (ts.isStringLiteral(moduleSpecifier)) {\n const moduleName = moduleSpecifier.text;\n\n // Check if import is allowed\n const isAllowed = ALLOWED_IMPORTS.some((allowed) => {\n if (allowed === moduleName) return true;\n if (moduleName.startsWith(allowed + '/')) return true;\n return false;\n });\n\n if (!isAllowed) {\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(\n node.getStart()\n );\n errors.push({\n type: 'forbidden-import',\n message: `Import \"${moduleName}\" is not allowed. Only imports from ${ALLOWED_IMPORTS.join(', ')} are permitted.`,\n line: line + 1,\n column: character + 1,\n });\n }\n }\n }\n\n ts.forEachChild(node, visit);\n }\n\n visit(sourceFile);\n return errors;\n}\n\nfunction checkForbiddenPatterns(code: string): ValidationError[] {\n const errors: ValidationError[] = [];\n const lines = code.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n for (const pattern of FORBIDDEN_PATTERNS) {\n if (pattern.test(line)) {\n errors.push({\n type: 'forbidden-pattern',\n message: `Forbidden pattern detected: ${pattern.source}`,\n line: i + 1,\n });\n }\n }\n }\n\n return errors;\n}\n\nfunction checkPrimitiveUsage(sourceFile: ts.SourceFile): ValidationWarning[] {\n const warnings: ValidationWarning[] = [];\n\n // Check if the override uses at least one SDK primitive\n const code = sourceFile.getFullText();\n const usesSDKPrimitive =\n /sdk\\.ui\\./.test(code) || /sdk\\.data\\./.test(code);\n\n if (!usesSDKPrimitive) {\n warnings.push({\n type: 'unused-import',\n message: 'Override does not appear to use any SDK primitives (sdk.ui.* or sdk.data.*)',\n });\n }\n\n return warnings;\n}\n\nexport function validateFile(filepath: string, code: string): ValidationResult {\n return validate({ code, filename: filepath });\n}\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { AppSchema, GeneratedOverride, OverrideManifest } from './types.js';\nimport { validate } from './validate.js';\n\ninterface GenerateOptions {\n request: string;\n schemaPath: string;\n outputDir: string;\n apiKey?: string;\n}\n\ninterface GenerateResult {\n success: boolean;\n override?: GeneratedOverride;\n outputPath?: string;\n error?: string;\n validationErrors?: string[];\n}\n\nexport async function generate(options: GenerateOptions): Promise<GenerateResult> {\n const { request, schemaPath, outputDir, apiKey } = options;\n\n // Read the schema\n let schema: AppSchema;\n try {\n const schemaContent = await fs.readFile(schemaPath, 'utf-8');\n schema = JSON.parse(schemaContent);\n } catch (e) {\n return {\n success: false,\n error: `Failed to read schema: ${e instanceof Error ? e.message : String(e)}`,\n };\n }\n\n // Check for API key\n const key = apiKey || process.env.ANTHROPIC_API_KEY;\n if (!key) {\n return {\n success: false,\n error: 'No API key provided. Set ANTHROPIC_API_KEY environment variable or use --api-key flag.',\n };\n }\n\n // Generate override using AI\n const MAX_RETRIES = 3;\n let lastError: string | undefined;\n let lastValidationErrors: string[] | undefined;\n\n for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {\n try {\n const generated = await callAI(request, schema, key, lastValidationErrors);\n\n // Validate the generated code\n const validation = validate({ code: generated.code, filename: 'override.tsx' });\n\n if (!validation.valid) {\n lastValidationErrors = validation.errors.map((e) => e.message);\n lastError = `Validation failed: ${validation.errors.map((e) => e.message).join(', ')}`;\n\n if (attempt < MAX_RETRIES) {\n console.log(`Attempt ${attempt} failed validation, retrying...`);\n continue;\n }\n\n return {\n success: false,\n error: lastError,\n validationErrors: lastValidationErrors,\n };\n }\n\n // Write the override to disk\n const overrideDir = path.join(outputDir, generated.manifest.id);\n await fs.mkdir(overrideDir, { recursive: true });\n\n const codePath = path.join(overrideDir, 'index.tsx');\n await fs.writeFile(codePath, generated.code);\n\n return {\n success: true,\n override: generated,\n outputPath: codePath,\n };\n } catch (e) {\n lastError = e instanceof Error ? e.message : String(e);\n if (attempt === MAX_RETRIES) {\n return {\n success: false,\n error: `Failed after ${MAX_RETRIES} attempts: ${lastError}`,\n };\n }\n }\n }\n\n return {\n success: false,\n error: lastError || 'Unknown error',\n };\n}\n\nasync function callAI(\n request: string,\n schema: AppSchema,\n apiKey: string,\n previousErrors?: string[]\n): Promise<GeneratedOverride> {\n const systemPrompt = buildSystemPrompt(schema);\n const userPrompt = buildUserPrompt(request, previousErrors);\n\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: 'claude-sonnet-4-20250514',\n max_tokens: 4096,\n system: systemPrompt,\n messages: [\n { role: 'user', content: userPrompt },\n ],\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API request failed: ${response.status} ${error}`);\n }\n\n const result = await response.json() as {\n content: Array<{ type: string; text?: string }>;\n };\n\n const textContent = result.content.find((c) => c.type === 'text');\n if (!textContent || !textContent.text) {\n throw new Error('No text content in API response');\n }\n\n return parseAIResponse(textContent.text);\n}\n\nfunction buildSystemPrompt(schema: AppSchema): string {\n return `You are a code generator for Sidekick, an SDK that allows users to customize web applications.\nYour task is to generate override modules based on user requests.\n\n## SDK Primitives Available\n\nThe SDK provides these primitives that MUST be used:\n\nUI Primitives:\n- sdk.ui.inject(extensionPointId, Component) - Inject a component at an extension point\n- sdk.ui.wrap(componentName, wrapperFn) - Wrap an existing component with a HOC\n- sdk.ui.addColumn(tableId, config) - Add a column to a table (config: { header, accessor, render? })\n- sdk.ui.addStyles(css) - Add CSS styles\n- sdk.ui.replace(componentName, Component) - Replace a component entirely\n\nData Primitives:\n- sdk.data.computed(fieldName, computeFn) - Add a computed field\n- sdk.data.addFilter(name, filterFn) - Add a filter preset\n- sdk.data.transform(dataKey, transformFn) - Transform data\n\n## App Schema\n\nExtension Points: ${JSON.stringify(schema.extensionPoints)}\n\nComponents: ${JSON.stringify(schema.components.map((c) => ({ name: c.name, props: c.props })))}\n\nData Models: ${JSON.stringify(schema.dataModels)}\n\n## Example Overrides\n\n### Example 1: Inject a banner\n\\`\\`\\`tsx\nimport { createOverride, SDK } from '@usesidekick/react';\n\nconst Banner = () => (\n <div style={{ backgroundColor: '#10B981', color: 'white', padding: '12px', textAlign: 'center' }}>\n Welcome Banner!\n </div>\n);\n\nexport default createOverride(\n {\n id: 'welcome-banner',\n name: 'Welcome Banner',\n description: 'Adds a welcome banner',\n version: '1.0.0',\n primitives: ['ui.inject'],\n },\n (sdk: SDK) => {\n sdk.ui.inject('sidebar-header', Banner);\n }\n);\n\\`\\`\\`\n\n### Example 2: Add a table column\n\\`\\`\\`tsx\nimport { createOverride, SDK } from '@usesidekick/react';\n\nexport default createOverride(\n {\n id: 'days-left-column',\n name: 'Days Left Column',\n description: 'Shows days until due date',\n version: '1.0.0',\n primitives: ['ui.addColumn'],\n },\n (sdk: SDK) => {\n sdk.ui.addColumn('task-table', {\n header: 'Days Left',\n accessor: (row: Record<string, unknown>) => {\n const dueDate = row.dueDate as string | undefined;\n if (!dueDate) return null;\n const days = Math.ceil((new Date(dueDate).getTime() - Date.now()) / (1000 * 60 * 60 * 24));\n return days;\n },\n render: (value: unknown) => {\n if (value === null) return <span>-</span>;\n const days = value as number;\n const color = days < 0 ? 'red' : days <= 3 ? 'orange' : 'green';\n return <span style={{ color }}>{days}d</span>;\n },\n });\n }\n);\n\\`\\`\\`\n\n### Example 3: Add custom styles\n\\`\\`\\`tsx\nimport { createOverride, SDK } from '@usesidekick/react';\n\nexport default createOverride(\n {\n id: 'dark-theme',\n name: 'Dark Theme Override',\n description: 'Adds dark theme styles',\n version: '1.0.0',\n primitives: ['ui.addStyles'],\n },\n (sdk: SDK) => {\n sdk.ui.addStyles(\\`\n .custom-dark { background: #1a1a1a; color: white; }\n \\`);\n }\n);\n\\`\\`\\`\n\n## Rules\n\n1. ONLY import from '@usesidekick/react' or 'react' - NO other imports allowed\n2. DO NOT use fetch, eval, document.*, window.*, localStorage, etc.\n3. Use the createOverride function from @usesidekick/react\n4. The activate function receives an SDK object with ui and data primitives\n5. Generate React components using JSX with inline styles\n6. Keep code simple and focused on the user's request\n7. Use arrow functions for components\n\n## Output Format\n\nRespond with a JSON object containing:\n{\n \"manifest\": {\n \"id\": \"override-id-kebab-case\",\n \"name\": \"Human Readable Name\",\n \"description\": \"What this override does\",\n \"version\": \"1.0.0\",\n \"primitives\": [\"list\", \"of\", \"primitives\", \"used\"]\n },\n \"code\": \"// Full TypeScript/TSX code here\"\n}\n\nThe code should be a complete, valid TypeScript/TSX file that exports a default override module.`;\n}\n\nfunction buildUserPrompt(request: string, previousErrors?: string[]): string {\n let prompt = `Generate an override module for this request: \"${request}\"`;\n\n if (previousErrors && previousErrors.length > 0) {\n prompt += `\\n\\nIMPORTANT: Previous generation attempt failed validation with these errors:\\n`;\n prompt += previousErrors.map((e) => `- ${e}`).join('\\n');\n prompt += '\\n\\nPlease fix these issues in your response.';\n }\n\n return prompt;\n}\n\nfunction parseAIResponse(text: string): GeneratedOverride {\n // Try to extract JSON from the response\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error('No JSON found in AI response');\n }\n\n try {\n const parsed = JSON.parse(jsonMatch[0]) as {\n manifest: OverrideManifest;\n code: string;\n };\n\n if (!parsed.manifest || !parsed.code) {\n throw new Error('Invalid response structure');\n }\n\n return {\n manifest: parsed.manifest,\n code: parsed.code,\n };\n } catch (e) {\n throw new Error(`Failed to parse AI response: ${e instanceof Error ? e.message : String(e)}`);\n }\n}\n","import * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { execFileSync } from 'child_process';\nimport { analyze } from './analyze.js';\n\ninterface ProjectInfo {\n targetDir: string;\n packageManager: 'npm' | 'yarn' | 'pnpm';\n hasNextJs: boolean;\n nextVersion: string | null;\n hasTypeScript: boolean;\n appDir: string; // 'src/app' or 'app'\n srcDir: string; // 'src' or '.'\n hasSidekickReact: boolean;\n hasBabelrc: boolean;\n hasNextConfig: boolean;\n nextConfigFile: string | null; // filename like 'next.config.js', 'next.config.mjs', 'next.config.ts'\n}\n\nconst NEXT_CONFIG_FILES = ['next.config.js', 'next.config.mjs', 'next.config.ts', 'next.config.mts'];\n\nfunction findNextConfigFile(targetDir: string): string | null {\n for (const name of NEXT_CONFIG_FILES) {\n if (existsSync(path.join(targetDir, name))) return name;\n }\n return null;\n}\n\nfunction log(step: number, total: number, message: string) {\n console.log(`[${step}/${total}] ${message}`);\n}\n\nfunction warn(message: string) {\n console.log(` ⚠ ${message}`);\n}\n\nexport interface InitOptions {\n postgres?: boolean;\n}\n\nexport async function init(targetDir: string, options: InitOptions = {}) {\n const usePostgres = !!options.postgres;\n\n console.log('\\nSidekick Setup\\n');\n\n // Phase 1: Detect project\n const project = await detectProject(targetDir);\n if (!project.hasNextJs) {\n throw new Error('Next.js not found in package.json. Sidekick currently requires Next.js.');\n }\n\n const info = [\n `Next.js ${project.nextVersion || 'detected'}`,\n project.hasTypeScript ? 'TypeScript' : 'JavaScript',\n `App Router (${project.appDir}/)`,\n usePostgres ? 'Postgres storage' : 'JSON file storage',\n ].join(', ');\n console.log(` ${info}\\n`);\n\n const TOTAL_STEPS = usePostgres ? 7 : 6;\n let step = 0;\n\n // Step: Install dependencies\n log(++step, TOTAL_STEPS, 'Installing dependencies...');\n await installDependencies(project, usePostgres);\n console.log(' done');\n\n // Step: Configure Babel + Next.js\n log(++step, TOTAL_STEPS, 'Configuring JSX runtime (.babelrc, next.config.js)...');\n await configureBabel(project);\n await configureNextConfig(project);\n console.log(' done');\n\n // Step (postgres only): Setup database\n if (usePostgres) {\n log(++step, TOTAL_STEPS, 'Setting up database schema...');\n await setupDatabase(project);\n console.log(' done');\n }\n\n // Step: Create API route\n log(++step, TOTAL_STEPS, 'Creating API route...');\n await createApiRoute(project, usePostgres);\n console.log(' done');\n\n // Step: Create bootstrap + modify layout\n log(++step, TOTAL_STEPS, 'Adding Sidekick to app layout...');\n await setupBootstrap(project);\n console.log(' done');\n\n // Step: Analyze\n log(++step, TOTAL_STEPS, 'Analyzing app components...');\n const sidekickDir = path.join(targetDir, project.srcDir, 'sidekick');\n const overridesDir = path.join(sidekickDir, 'overrides');\n await fs.mkdir(overridesDir, { recursive: true });\n\n const schemaPath = path.join(sidekickDir, 'schema.json');\n try {\n const schema = await analyze({ targetDir, outputPath: schemaPath });\n console.log(` ${schema.components.length} components, ${schema.extensionPoints.length} extension points`);\n } catch {\n warn('Analysis had issues - you can re-run with: sidekick analyze');\n }\n\n // Step: Add .sidekick/overrides.json to .gitignore (JSON mode only)\n if (!usePostgres) {\n await addToGitignore(targetDir, '.sidekick/overrides.json');\n }\n\n // Done\n log(++step, TOTAL_STEPS, 'Done!\\n');\n\n if (usePostgres) {\n console.log('Remaining steps:');\n console.log(' 1. Add to .env.local:');\n console.log(' DATABASE_URL=your_neon_database_url');\n console.log(' ANTHROPIC_API_KEY=your_api_key');\n console.log(' 2. Run: npx drizzle-kit push');\n console.log(' 3. Run: npm run dev\\n');\n } else {\n console.log('Remaining steps:');\n console.log(' 1. Add to .env.local:');\n console.log(' ANTHROPIC_API_KEY=your_api_key');\n console.log(' 2. Run: npm run dev\\n');\n }\n}\n\nasync function detectProject(targetDir: string): Promise<ProjectInfo> {\n const pkgPath = path.join(targetDir, 'package.json');\n if (!existsSync(pkgPath)) {\n throw new Error('No package.json found. Run this from your project root.');\n }\n\n const pkg = JSON.parse(await fs.readFile(pkgPath, 'utf-8'));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n // Detect package manager\n let packageManager: 'npm' | 'yarn' | 'pnpm' = 'npm';\n if (existsSync(path.join(targetDir, 'pnpm-lock.yaml'))) {\n packageManager = 'pnpm';\n } else if (existsSync(path.join(targetDir, 'yarn.lock'))) {\n packageManager = 'yarn';\n }\n\n // Detect Next.js\n const nextVersion = deps['next'] || null;\n\n // Detect TypeScript\n const hasTypeScript = existsSync(path.join(targetDir, 'tsconfig.json'));\n\n // Detect app directory\n let appDir = 'app';\n let srcDir = '.';\n if (existsSync(path.join(targetDir, 'src/app'))) {\n appDir = 'src/app';\n srcDir = 'src';\n }\n\n return {\n targetDir,\n packageManager,\n hasNextJs: !!nextVersion,\n nextVersion: nextVersion ? nextVersion.replace(/[\\^~>=<]*/g, '') : null,\n hasTypeScript,\n appDir,\n srcDir,\n hasSidekickReact: !!deps['@usesidekick/react'],\n hasBabelrc: existsSync(path.join(targetDir, '.babelrc')),\n hasNextConfig: !!findNextConfigFile(targetDir),\n nextConfigFile: findNextConfigFile(targetDir),\n };\n}\n\nfunction runInstall(pm: string, packages: string[], dev: boolean, cwd: string) {\n const cmd = pm === 'yarn' ? 'add' : 'install';\n const flag = dev ? (pm === 'yarn' ? '--dev' : '-D') : '';\n const args = [cmd, ...(flag ? [flag] : []), ...packages];\n execFileSync(pm, args, { stdio: 'pipe', cwd, timeout: 120_000 });\n}\n\nasync function installDependencies(project: ProjectInfo, usePostgres: boolean) {\n const { targetDir, packageManager: pm } = project;\n const pkg = JSON.parse(await fs.readFile(path.join(targetDir, 'package.json'), 'utf-8'));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n // Runtime deps\n const runtimeDeps: string[] = [];\n if (!allDeps['@usesidekick/react']) runtimeDeps.push('@usesidekick/react');\n if (usePostgres) {\n if (!allDeps['drizzle-orm']) runtimeDeps.push('drizzle-orm');\n if (!allDeps['@neondatabase/serverless']) runtimeDeps.push('@neondatabase/serverless');\n }\n\n // Dev deps\n const devDeps: string[] = [];\n if (!allDeps['babel-plugin-add-react-displayname']) devDeps.push('babel-plugin-add-react-displayname');\n if (usePostgres) {\n if (!allDeps['drizzle-kit']) devDeps.push('drizzle-kit');\n }\n\n try {\n if (runtimeDeps.length > 0) {\n runInstall(pm, runtimeDeps, false, targetDir);\n }\n if (devDeps.length > 0) {\n runInstall(pm, devDeps, true, targetDir);\n }\n } catch (e) {\n warn(`Dependency install failed: ${e instanceof Error ? e.message : String(e)}`);\n warn('You may need to install manually: ' + [...runtimeDeps, ...devDeps].join(' '));\n }\n}\n\nasync function configureBabel(project: ProjectInfo) {\n const babelrcPath = path.join(project.targetDir, '.babelrc');\n\n const desiredConfig = {\n presets: [\n ['next/babel', {\n 'preset-env': {\n targets: { esmodules: true },\n exclude: ['transform-async-to-generator', 'transform-regenerator'],\n },\n 'preset-react': {\n runtime: 'automatic',\n importSource: '@usesidekick/react',\n },\n }],\n ],\n plugins: ['add-react-displayname'],\n };\n\n if (!project.hasBabelrc) {\n await fs.writeFile(babelrcPath, JSON.stringify(desiredConfig, null, 2) + '\\n');\n return;\n }\n\n // Merge into existing .babelrc\n try {\n const existing = JSON.parse(await fs.readFile(babelrcPath, 'utf-8'));\n\n // Check if already configured\n const presetStr = JSON.stringify(existing.presets || []);\n if (presetStr.includes('@usesidekick/react')) {\n // Already has sidekick importSource\n return;\n }\n\n // Find and update next/babel preset\n let foundNextBabel = false;\n if (existing.presets) {\n for (let i = 0; i < existing.presets.length; i++) {\n const preset = existing.presets[i];\n const presetName = Array.isArray(preset) ? preset[0] : preset;\n if (presetName === 'next/babel') {\n foundNextBabel = true;\n if (!Array.isArray(preset)) {\n existing.presets[i] = desiredConfig.presets[0];\n } else {\n const opts = preset[1] || {};\n opts['preset-react'] = {\n runtime: 'automatic',\n importSource: '@usesidekick/react',\n };\n if (!opts['preset-env']) {\n opts['preset-env'] = desiredConfig.presets[0][1]['preset-env'];\n }\n existing.presets[i] = ['next/babel', opts];\n }\n }\n }\n }\n\n if (!foundNextBabel) {\n existing.presets = existing.presets || [];\n existing.presets.unshift(desiredConfig.presets[0]);\n }\n\n // Add plugin if missing\n existing.plugins = existing.plugins || [];\n if (!existing.plugins.includes('add-react-displayname')) {\n existing.plugins.push('add-react-displayname');\n }\n\n await fs.writeFile(babelrcPath, JSON.stringify(existing, null, 2) + '\\n');\n } catch {\n warn('.babelrc exists but could not be parsed. Writing new config.');\n await fs.writeFile(babelrcPath, JSON.stringify(desiredConfig, null, 2) + '\\n');\n }\n}\n\nasync function configureNextConfig(project: ProjectInfo) {\n const newConfigTemplate = `const path = require('path');\n\n/** @type {import('next').NextConfig} */\nconst nextConfig = {\n webpack: (config, { isServer }) => {\n const sdkPath = path.dirname(require.resolve('@usesidekick/react/package.json'));\n config.resolve.alias = {\n ...config.resolve.alias,\n '@usesidekick/react/server': path.join(sdkPath, 'dist/server/index.mjs'),\n '@usesidekick/react/jsx-runtime': path.join(sdkPath, 'dist/jsx-runtime.mjs'),\n '@usesidekick/react/jsx-dev-runtime': path.join(sdkPath, 'dist/jsx-dev-runtime.mjs'),\n '@usesidekick/react': path.join(sdkPath, 'dist/index.mjs'),\n };\n return config;\n },\n};\n\nmodule.exports = nextConfig;\n`;\n\n if (!project.hasNextConfig) {\n // No config file exists — create next.config.js\n await fs.writeFile(path.join(project.targetDir, 'next.config.js'), newConfigTemplate);\n return;\n }\n\n const configFile = project.nextConfigFile!;\n const configPath = path.join(project.targetDir, configFile);\n\n // If it's .mjs, .ts, or .mts, we can't safely auto-modify — print manual instructions\n if (configFile !== 'next.config.js') {\n try {\n const existing = await fs.readFile(configPath, 'utf-8');\n if (existing.includes('@usesidekick/react')) return;\n } catch { /* ignore read errors */ }\n\n warn(`Found ${configFile} — cannot auto-modify. Please add webpack aliases manually:`);\n console.log(' Add to your webpack config:');\n console.log(\" const path = require('path'); // or import path from 'path'\");\n console.log(\" const sdkPath = path.dirname(require.resolve('@usesidekick/react/package.json'));\");\n console.log(\" config.resolve.alias['@usesidekick/react/server'] = path.join(sdkPath, 'dist/server/index.mjs');\");\n console.log(\" config.resolve.alias['@usesidekick/react/jsx-runtime'] = path.join(sdkPath, 'dist/jsx-runtime.mjs');\");\n console.log(\" config.resolve.alias['@usesidekick/react/jsx-dev-runtime'] = path.join(sdkPath, 'dist/jsx-dev-runtime.mjs');\");\n console.log(\" config.resolve.alias['@usesidekick/react'] = path.join(sdkPath, 'dist/index.mjs');\");\n return;\n }\n\n // Handle next.config.js\n try {\n const existing = await fs.readFile(configPath, 'utf-8');\n if (existing.includes('@usesidekick/react')) return;\n\n const backupPath = configPath + '.sidekick-backup';\n await fs.writeFile(backupPath, existing);\n warn(`Backed up existing next.config.js to ${path.basename(backupPath)}`);\n\n if (existing.includes('webpack')) {\n warn('next.config.js already has a webpack config. Please add the following aliases manually:');\n console.log(\" const sdkPath = path.dirname(require.resolve('@usesidekick/react/package.json'));\");\n console.log(\" config.resolve.alias['@usesidekick/react/server'] = path.join(sdkPath, 'dist/server/index.mjs');\");\n console.log(\" config.resolve.alias['@usesidekick/react/jsx-runtime'] = path.join(sdkPath, 'dist/jsx-runtime.mjs');\");\n console.log(\" config.resolve.alias['@usesidekick/react/jsx-dev-runtime'] = path.join(sdkPath, 'dist/jsx-dev-runtime.mjs');\");\n console.log(\" config.resolve.alias['@usesidekick/react'] = path.join(sdkPath, 'dist/index.mjs');\");\n } else {\n const modifiedConfig = existing.replace(\n /(const\\s+nextConfig\\s*=\\s*\\{)/,\n `$1\\n webpack: (config, { isServer }) => {\\n` +\n ` const sdkPath = path.dirname(require.resolve('@usesidekick/react/package.json'));\\n` +\n ` config.resolve.alias = {\\n` +\n ` ...config.resolve.alias,\\n` +\n ` '@usesidekick/react/server': path.join(sdkPath, 'dist/server/index.mjs'),\\n` +\n ` '@usesidekick/react/jsx-runtime': path.join(sdkPath, 'dist/jsx-runtime.mjs'),\\n` +\n ` '@usesidekick/react/jsx-dev-runtime': path.join(sdkPath, 'dist/jsx-dev-runtime.mjs'),\\n` +\n ` '@usesidekick/react': path.join(sdkPath, 'dist/index.mjs'),\\n` +\n ` };\\n` +\n ` return config;\\n` +\n ` },`\n );\n\n let finalConfig = modifiedConfig;\n if (!modifiedConfig.includes(\"require('path')\") && !modifiedConfig.includes('require(\"path\")')) {\n finalConfig = \"const path = require('path');\\n\" + finalConfig;\n }\n\n await fs.writeFile(configPath, finalConfig);\n }\n } catch {\n warn('Could not modify next.config.js. Writing new config.');\n await fs.writeFile(configPath, newConfigTemplate);\n }\n}\n\nasync function setupDatabase(project: ProjectInfo) {\n const { targetDir, srcDir } = project;\n const dbDir = path.join(targetDir, srcDir, 'lib', 'db');\n\n // Create db directory\n await fs.mkdir(dbDir, { recursive: true });\n\n // Schema file\n const schemaPath = path.join(dbDir, 'schema.ts');\n if (!existsSync(schemaPath)) {\n await fs.writeFile(schemaPath, `import { pgTable, text, timestamp, boolean } from 'drizzle-orm/pg-core';\n\n// Sidekick overrides table\nexport const overrides = pgTable('overrides', {\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n description: text('description').notNull(),\n version: text('version').notNull().default('1.0.0'),\n primitives: text('primitives').notNull(),\n code: text('code').notNull(),\n enabled: boolean('enabled').notNull().default(true),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n});\n\nexport type Override = typeof overrides.$inferSelect;\nexport type NewOverride = typeof overrides.$inferInsert;\n`);\n } else {\n // Check if overrides table already exists\n const existing = await fs.readFile(schemaPath, 'utf-8');\n if (!existing.includes('overrides') || !existing.includes(\"pgTable('overrides'\")) {\n warn('schema.ts exists but does not contain an overrides table. Please add it manually.');\n }\n }\n\n // DB connection file\n const dbIndexPath = path.join(dbDir, 'index.ts');\n if (!existsSync(dbIndexPath)) {\n await fs.writeFile(dbIndexPath, `import { neon } from '@neondatabase/serverless';\nimport { drizzle } from 'drizzle-orm/neon-http';\nimport * as schema from './schema';\n\nlet _db: ReturnType<typeof drizzle> | null = null;\n\nexport function getDb() {\n if (!_db) {\n const url = process.env.DATABASE_URL;\n if (!url) {\n throw new Error('DATABASE_URL environment variable is not set');\n }\n const sql = neon(url);\n _db = drizzle(sql, { schema });\n }\n return _db;\n}\n\nexport const db = new Proxy({} as ReturnType<typeof drizzle>, {\n get(_, prop) {\n return getDb()[prop as keyof ReturnType<typeof drizzle>];\n },\n});\n\nexport * from './schema';\n`);\n }\n\n // Drizzle config\n const drizzleConfigPath = path.join(targetDir, 'drizzle.config.ts');\n if (!existsSync(drizzleConfigPath)) {\n const schemaRelPath = srcDir === '.' ? './lib/db/schema.ts' : `./${srcDir}/lib/db/schema.ts`;\n await fs.writeFile(drizzleConfigPath, `import { config } from 'dotenv';\nimport { defineConfig } from 'drizzle-kit';\n\nconfig({ path: '.env.local' });\n\nif (!process.env.DATABASE_URL) {\n throw new Error('DATABASE_URL is not set in .env.local');\n}\n\nexport default defineConfig({\n schema: '${schemaRelPath}',\n out: './drizzle',\n dialect: 'postgresql',\n dbCredentials: {\n url: process.env.DATABASE_URL,\n },\n});\n`);\n }\n}\n\nasync function createApiRoute(project: ProjectInfo, usePostgres: boolean) {\n const { targetDir, appDir } = project;\n const routeDir = path.join(targetDir, appDir, 'api', 'sidekick', '[...action]');\n\n // Check if any existing sidekick routes exist\n const sidekickApiDir = path.join(targetDir, appDir, 'api', 'sidekick');\n if (existsSync(sidekickApiDir)) {\n try {\n const entries = await fs.readdir(sidekickApiDir);\n const existingRoutes = entries.filter(e => e !== '[...action]');\n if (existingRoutes.length > 0) {\n warn('Existing sidekick API routes found: ' + existingRoutes.join(', '));\n warn('Skipping API route creation to avoid conflicts. Please migrate manually.');\n return;\n }\n } catch {\n // Directory doesn't exist or isn't readable\n }\n }\n\n await fs.mkdir(routeDir, { recursive: true });\n\n const routePath = path.join(routeDir, 'route.ts');\n\n if (usePostgres) {\n await fs.writeFile(routePath, `import { createSidekickHandler } from '@usesidekick/react/server';\nimport { createDrizzleStorage } from '@usesidekick/react/server/drizzle';\nimport { db } from '@/lib/db';\nimport { overrides } from '@/lib/db/schema';\n\nexport const dynamic = 'force-dynamic';\n\nconst handler = createSidekickHandler({\n storage: createDrizzleStorage(db, overrides),\n});\n\nexport const GET = handler.GET;\nexport const POST = handler.POST;\n`);\n } else {\n await fs.writeFile(routePath, `import { createSidekickHandler, createJsonFileStorage } from '@usesidekick/react/server';\n\nexport const dynamic = 'force-dynamic';\n\nconst handler = createSidekickHandler({\n storage: createJsonFileStorage(),\n});\n\nexport const GET = handler.GET;\nexport const POST = handler.POST;\n`);\n }\n}\n\nasync function addToGitignore(targetDir: string, entry: string) {\n const gitignorePath = path.join(targetDir, '.gitignore');\n try {\n let content = '';\n if (existsSync(gitignorePath)) {\n content = await fs.readFile(gitignorePath, 'utf-8');\n }\n if (!content.split('\\n').some(line => line.trim() === entry)) {\n const separator = content.length > 0 && !content.endsWith('\\n') ? '\\n' : '';\n await fs.writeFile(gitignorePath, content + separator + entry + '\\n');\n }\n } catch {\n warn(`Could not update .gitignore. Please add \"${entry}\" manually.`);\n }\n}\n\nasync function setupBootstrap(project: ProjectInfo) {\n const { targetDir, srcDir, appDir } = project;\n const componentsDir = path.join(targetDir, srcDir, 'components');\n\n // Create components directory\n await fs.mkdir(componentsDir, { recursive: true });\n\n // Create SidekickBootstrap\n const bootstrapPath = path.join(componentsDir, 'SidekickBootstrap.tsx');\n if (!existsSync(bootstrapPath)) {\n await fs.writeFile(bootstrapPath, `'use client';\n\nimport { useEffect, useState, ReactNode } from 'react';\nimport { SidekickProvider, SidekickPanel } from '@usesidekick/react';\n\ninterface SidekickBootstrapProps {\n children: ReactNode;\n}\n\nexport function SidekickBootstrap({ children }: SidekickBootstrapProps) {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!mounted) {\n return <>{children}</>;\n }\n\n return (\n <SidekickProvider overridesEndpoint=\"/api/sidekick/overrides\">\n {children}\n <SidekickPanel\n apiEndpoint=\"/api/sidekick/generate\"\n toggleEndpoint=\"/api/sidekick/toggle\"\n />\n </SidekickProvider>\n );\n}\n`);\n }\n\n // Modify layout\n const layoutExts = ['layout.tsx', 'layout.jsx', 'layout.ts', 'layout.js'];\n let layoutPath: string | null = null;\n for (const ext of layoutExts) {\n const candidate = path.join(targetDir, appDir, ext);\n if (existsSync(candidate)) {\n layoutPath = candidate;\n break;\n }\n }\n if (!layoutPath) {\n warn('layout.tsx not found. Please add SidekickBootstrap to your layout manually.');\n return;\n }\n\n const layout = await fs.readFile(layoutPath, 'utf-8');\n\n // Check if already wrapped\n if (layout.includes('SidekickBootstrap')) {\n return;\n }\n\n // Back up layout\n const backupPath = layoutPath + '.sidekick-backup';\n await fs.writeFile(backupPath, layout);\n\n try {\n // Add import\n let modified = layout;\n const importLine = \"import { SidekickBootstrap } from '@/components/SidekickBootstrap';\";\n\n // Find a good place to add the import (after the last import)\n // Handles both single-line and multi-line imports (e.g. import {\\n Foo\\n} from '...')\n const importRegex = /^import\\s+(?:(?:\\{[^}]*\\}|[^;'\"]*)\\s+from\\s+)?['\"][^'\"]+['\"];?/gm;\n let lastImportEnd = 0;\n let match;\n while ((match = importRegex.exec(modified)) !== null) {\n lastImportEnd = match.index + match[0].length;\n }\n\n if (lastImportEnd > 0) {\n modified = modified.slice(0, lastImportEnd) + '\\n' + importLine + modified.slice(lastImportEnd);\n } else {\n modified = importLine + '\\n' + modified;\n }\n\n // Wrap {children} with <SidekickBootstrap>\n // Only target {children} in JSX context (preceded/followed by tags or whitespace inside JSX),\n // not in destructuring patterns like ({ children }) or type annotations.\n // Look for {children} that appears inside a JSX return body (between > and <).\n const jsxChildrenRegex = /(>[\\s]*)\\{children\\}([\\s]*<)/;\n if (jsxChildrenRegex.test(modified)) {\n modified = modified.replace(\n jsxChildrenRegex,\n '$1<SidekickBootstrap>{children}</SidekickBootstrap>$2'\n );\n } else if (modified.includes('{children}')) {\n // Fallback: there's a {children} but we can't confirm it's JSX — try simple replace\n // but only if it's indented (likely inside a return block, not in a function signature)\n const indentedChildrenRegex = /^(\\s{4,})\\{children\\}/m;\n if (indentedChildrenRegex.test(modified)) {\n modified = modified.replace(\n indentedChildrenRegex,\n '$1<SidekickBootstrap>{children}</SidekickBootstrap>'\n );\n } else {\n warn('Could not find {children} in JSX context in layout. Please wrap your content with <SidekickBootstrap> manually.');\n }\n } else {\n warn('Could not find {children} in layout. Please wrap your content with <SidekickBootstrap> manually.');\n }\n\n await fs.writeFile(layoutPath, modified);\n } catch {\n warn('Could not modify layout.tsx. Please add SidekickBootstrap manually:');\n console.log(\" 1. Import: import { SidekickBootstrap } from '@/components/SidekickBootstrap';\");\n console.log(' 2. Wrap {children} with <SidekickBootstrap>{children}</SidekickBootstrap>');\n }\n}\n"],"mappings":"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","names":["path","fs","ts","fs","path","path","fs"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/analyze.ts","../src/types.ts","../src/validate.ts","../src/generate.ts","../src/init.ts"],"sourcesContent":["import { Command } from 'commander';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { analyze } from './analyze.js';\nimport { validate, validateFile } from './validate.js';\nimport { generate } from './generate.js';\nimport { init } from './init.js';\n\nconst program = new Command();\n\nprogram\n .name('sidekick')\n .description('Sidekick CLI - Generate and manage override modules')\n .version('0.1.0');\n\n// Analyze command\nprogram\n .command('analyze')\n .description('Analyze an app and generate schema.json')\n .option('-d, --dir <path>', 'Target directory to analyze', '.')\n .option('-o, --output <path>', 'Output path for schema.json', './sidekick/schema.json')\n .action(async (options) => {\n const targetDir = path.resolve(options.dir);\n const outputPath = path.resolve(options.output);\n\n console.log(`Analyzing ${targetDir}...`);\n\n try {\n const schema = await analyze({ targetDir, outputPath });\n\n console.log('\\nAnalysis complete!');\n console.log(` Components: ${schema.components.length}`);\n console.log(` Extension points: ${schema.extensionPoints.length}`);\n console.log(` Data models: ${schema.dataModels.length}`);\n console.log(` Design system: ${schema.designSystem.framework || 'plain CSS'}, ${schema.designSystem.componentStyles.length} component style samples`);\n console.log(`\\nSchema written to: ${outputPath}`);\n } catch (error) {\n console.error('Analysis failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// Generate command\nprogram\n .command('generate')\n .description('Generate an override module from a natural language request')\n .argument('<request>', 'Natural language description of the customization')\n .option('-s, --schema <path>', 'Path to schema.json', './sidekick/schema.json')\n .option('-o, --output <path>', 'Output directory for overrides', './sidekick/overrides')\n .option('-k, --api-key <key>', 'Anthropic API key (or set ANTHROPIC_API_KEY)')\n .action(async (request, options) => {\n const schemaPath = path.resolve(options.schema);\n const outputDir = path.resolve(options.output);\n\n console.log(`Generating override for: \"${request}\"`);\n console.log(`Using schema: ${schemaPath}`);\n\n try {\n const result = await generate({\n request,\n schemaPath,\n outputDir,\n apiKey: options.apiKey,\n });\n\n if (result.success) {\n console.log('\\nGeneration successful!');\n console.log(` Override ID: ${result.override?.manifest.id}`);\n console.log(` Name: ${result.override?.manifest.name}`);\n console.log(` Output: ${result.outputPath}`);\n console.log('\\nTo enable this override, add it to your flags.json or use the Sidekick panel.');\n } else {\n console.error('\\nGeneration failed:', result.error);\n if (result.validationErrors) {\n console.error('Validation errors:');\n result.validationErrors.forEach((e) => console.error(` - ${e}`));\n }\n process.exit(1);\n }\n } catch (error) {\n console.error('Generation failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// Validate command\nprogram\n .command('validate')\n .description('Validate an override module')\n .argument('<file>', 'Path to the override file to validate')\n .action(async (file) => {\n const filepath = path.resolve(file);\n\n console.log(`Validating ${filepath}...`);\n\n try {\n const code = await fs.readFile(filepath, 'utf-8');\n const result = validateFile(filepath, code);\n\n if (result.valid) {\n console.log('\\nValidation passed!');\n\n if (result.warnings.length > 0) {\n console.log('\\nWarnings:');\n result.warnings.forEach((w) => {\n const location = w.line ? ` (line ${w.line})` : '';\n console.log(` - ${w.type}${location}: ${w.message}`);\n });\n }\n } else {\n console.error('\\nValidation failed!');\n console.error('\\nErrors:');\n result.errors.forEach((e) => {\n const location = e.line ? ` (line ${e.line}${e.column ? `:${e.column}` : ''})` : '';\n console.error(` - ${e.type}${location}: ${e.message}`);\n });\n process.exit(1);\n }\n } catch (error) {\n console.error('Validation failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// Init command\nprogram\n .command('init')\n .description('Initialize Sidekick in the current project (installs deps, configures build, creates API routes, modifies layout)')\n .option('-d, --dir <path>', 'Target directory', '.')\n .option('--postgres', 'Use Drizzle + Neon Postgres for storage (default: JSON file storage)')\n .action(async (options) => {\n const targetDir = path.resolve(options.dir);\n try {\n await init(targetDir, { postgres: !!options.postgres });\n } catch (error) {\n console.error('Initialization failed:', error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nprogram.parse();\n","import * as ts from 'typescript';\nimport * as path from 'path';\nimport { glob } from 'glob';\nimport * as fs from 'fs/promises';\nimport {\n AppSchema,\n ComponentInfo,\n ComponentProp,\n ExtensionPointInfo,\n DataModelInfo,\n DataModelField,\n DesignSystem,\n ComponentStyleSample,\n SDK_PRIMITIVES,\n} from './types.js';\n\ninterface AnalyzeOptions {\n targetDir: string;\n outputPath?: string;\n}\n\nexport async function analyze(options: AnalyzeOptions): Promise<AppSchema> {\n const { targetDir, outputPath } = options;\n\n // Find all TypeScript/TSX files in the target directory\n const files = await glob('**/*.{ts,tsx}', {\n cwd: targetDir,\n ignore: ['**/node_modules/**', '**/dist/**', '**/.next/**', '**/sidekick/overrides/**'],\n absolute: true,\n });\n\n const components: ComponentInfo[] = [];\n const extensionPoints: ExtensionPointInfo[] = [];\n const dataModels: DataModelInfo[] = [];\n const componentStyles: ComponentStyleSample[] = [];\n\n for (const file of files) {\n const content = await fs.readFile(file, 'utf-8');\n const relPath = path.relative(targetDir, file);\n\n // Parse with TypeScript\n const sourceFile = ts.createSourceFile(\n file,\n content,\n ts.ScriptTarget.Latest,\n true,\n file.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n );\n\n // Extract components\n const fileComponents = extractComponents(sourceFile, relPath, content);\n components.push(...fileComponents);\n\n // Extract extension points from comments\n const fileExtensionPoints = extractExtensionPoints(content, relPath);\n extensionPoints.push(...fileExtensionPoints);\n\n // Extract data models (interfaces/types)\n const fileDataModels = extractDataModels(sourceFile, relPath);\n dataModels.push(...fileDataModels);\n\n // Extract style samples from components in TSX files\n if (file.endsWith('.tsx')) {\n const fileStyles = extractComponentStyles(sourceFile, relPath);\n componentStyles.push(...fileStyles);\n }\n }\n\n // Extract design system info from config files\n const designSystem = await extractDesignSystem(targetDir, componentStyles);\n\n const schema: AppSchema = {\n version: '1.0.0',\n generatedAt: new Date().toISOString(),\n designSystem,\n components,\n extensionPoints: [...new Set(extensionPoints.map((ep) => ep.id))],\n dataModels,\n primitives: SDK_PRIMITIVES,\n };\n\n // Write schema to file if outputPath is specified\n if (outputPath) {\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.writeFile(outputPath, JSON.stringify(schema, null, 2));\n }\n\n return schema;\n}\n\nfunction extractComponents(\n sourceFile: ts.SourceFile,\n relPath: string,\n content: string\n): ComponentInfo[] {\n const components: ComponentInfo[] = [];\n\n function visit(node: ts.Node) {\n // Look for function declarations or arrow functions that might be components\n if (ts.isFunctionDeclaration(node) && node.name) {\n const name = node.name.getText();\n if (isComponentName(name)) {\n const props = extractPropsFromFunction(node);\n const extensible = hasExtensibleMarker(content, node.pos);\n const renderStructure = extractRenderStructure(node) || undefined;\n components.push({ name, file: relPath, props, extensible, renderStructure });\n }\n }\n\n // Arrow function components: const Foo = () => { ... }\n if (ts.isVariableStatement(node)) {\n const declarations = node.declarationList.declarations;\n for (const decl of declarations) {\n if (ts.isIdentifier(decl.name) && decl.initializer) {\n const name = decl.name.getText();\n if (isComponentName(name) && isReactComponent(decl.initializer)) {\n const props = extractPropsFromArrowFunction(decl.initializer);\n const extensible = hasExtensibleMarker(content, node.pos);\n const renderStructure = extractRenderStructure(decl.initializer) || undefined;\n components.push({ name, file: relPath, props, extensible, renderStructure });\n }\n }\n }\n }\n\n ts.forEachChild(node, visit);\n }\n\n visit(sourceFile);\n return components;\n}\n\nfunction isComponentName(name: string): boolean {\n // React components start with uppercase letter\n return /^[A-Z]/.test(name);\n}\n\nfunction isReactComponent(node: ts.Node): boolean {\n // Check if it's an arrow function or function expression\n return ts.isArrowFunction(node) || ts.isFunctionExpression(node);\n}\n\n/**\n * Resolve the property types from a parameter's type annotation.\n * Handles both inline type literals `{ data: Foo[] }` and type references `SummaryCardsProps`.\n * Returns a map of prop name -> type string.\n */\nfunction resolvePropsTypeMap(param: ts.ParameterDeclaration): Map<string, string> {\n const typeMap = new Map<string, string>();\n if (!param.type) return typeMap;\n\n let typeNode = param.type;\n\n // If it's a type reference (e.g., SummaryCardsProps), find the interface declaration in the same file\n if (ts.isTypeReferenceNode(typeNode)) {\n const typeName = typeNode.typeName.getText();\n const sourceFile = param.getSourceFile();\n ts.forEachChild(sourceFile, (child) => {\n if (ts.isInterfaceDeclaration(child) && child.name.getText() === typeName) {\n typeNode = child as unknown as ts.TypeNode;\n }\n if (ts.isTypeAliasDeclaration(child) && child.name.getText() === typeName) {\n typeNode = child.type;\n }\n });\n }\n\n // Extract members from interface or type literal\n const members: ts.NodeArray<ts.TypeElement> | undefined =\n ts.isInterfaceDeclaration(typeNode as ts.Node)\n ? (typeNode as unknown as ts.InterfaceDeclaration).members\n : ts.isTypeLiteralNode(typeNode)\n ? typeNode.members\n : undefined;\n\n if (members) {\n for (const member of members) {\n if (ts.isPropertySignature(member) && member.name && member.type) {\n typeMap.set(member.name.getText(), member.type.getText());\n }\n }\n }\n\n return typeMap;\n}\n\nfunction extractPropsFromFunction(node: ts.FunctionDeclaration): ComponentProp[] {\n const props: ComponentProp[] = [];\n if (node.parameters.length > 0) {\n const firstParam = node.parameters[0];\n const typeMap = resolvePropsTypeMap(firstParam);\n\n if (firstParam.type && ts.isTypeLiteralNode(firstParam.type)) {\n for (const member of firstParam.type.members) {\n if (ts.isPropertySignature(member) && member.name) {\n const name = member.name.getText();\n const type = member.type?.getText();\n props.push({ name, ...(type && { type }) });\n }\n }\n }\n // Handle destructured props\n if (ts.isObjectBindingPattern(firstParam.name)) {\n for (const element of firstParam.name.elements) {\n if (ts.isBindingElement(element) && ts.isIdentifier(element.name)) {\n const name = element.name.getText();\n const type = typeMap.get(name);\n props.push({ name, ...(type && { type }) });\n }\n }\n }\n }\n return props;\n}\n\nfunction extractPropsFromArrowFunction(node: ts.Node): ComponentProp[] {\n const props: ComponentProp[] = [];\n if (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) {\n if (node.parameters.length > 0) {\n const firstParam = node.parameters[0];\n const typeMap = resolvePropsTypeMap(firstParam);\n\n if (ts.isObjectBindingPattern(firstParam.name)) {\n for (const element of firstParam.name.elements) {\n if (ts.isBindingElement(element) && ts.isIdentifier(element.name)) {\n const name = element.name.getText();\n const type = typeMap.get(name);\n props.push({ name, ...(type && { type }) });\n }\n }\n }\n }\n }\n return props;\n}\n\nfunction hasExtensibleMarker(content: string, nodePos: number): boolean {\n // Look for @sidekick:extensible marker in comment before the node\n const beforeNode = content.substring(Math.max(0, nodePos - 200), nodePos);\n return /@sidekick:extensible/.test(beforeNode);\n}\n\n/**\n * Extract a compact text summary of the JSX tree a component returns.\n * Walks the function body to find return statements with JSX.\n * Output like: div > [div.mb-4 > button, div.bg-white > <TaskTable>]\n */\nfunction extractRenderStructure(node: ts.Node): string | null {\n // Find the function body\n let body: ts.Node | undefined;\n if (ts.isFunctionDeclaration(node) && node.body) {\n body = node.body;\n } else if (ts.isArrowFunction(node)) {\n body = node.body;\n } else if (ts.isFunctionExpression(node) && node.body) {\n body = node.body;\n }\n\n if (!body) return null;\n\n // If the body is directly a JSX expression (arrow with implicit return)\n if (ts.isJsxElement(body) || ts.isJsxSelfClosingElement(body) || ts.isJsxFragment(body) || ts.isParenthesizedExpression(body)) {\n const jsx = findJsxInExpression(body);\n if (jsx) return summarizeJsx(jsx, 0);\n }\n\n // Otherwise, find the first return statement with JSX\n const returnJsx = findReturnJsx(body);\n if (returnJsx) return summarizeJsx(returnJsx, 0);\n\n return null;\n}\n\nfunction findReturnJsx(node: ts.Node): ts.Node | null {\n if (ts.isReturnStatement(node) && node.expression) {\n const jsx = findJsxInExpression(node.expression);\n if (jsx) return jsx;\n }\n\n let result: ts.Node | null = null;\n ts.forEachChild(node, (child) => {\n if (!result) {\n // Don't descend into nested functions (those are different components/callbacks)\n if (ts.isFunctionDeclaration(child) || ts.isArrowFunction(child) || ts.isFunctionExpression(child)) {\n return;\n }\n result = findReturnJsx(child);\n }\n });\n return result;\n}\n\nfunction findJsxInExpression(node: ts.Node): ts.Node | null {\n if (ts.isJsxElement(node) || ts.isJsxSelfClosingElement(node) || ts.isJsxFragment(node)) {\n return node;\n }\n if (ts.isParenthesizedExpression(node)) {\n return findJsxInExpression(node.expression);\n }\n return null;\n}\n\nfunction summarizeJsx(node: ts.Node, depth: number): string {\n const MAX_DEPTH = 3;\n if (depth > MAX_DEPTH) return '...';\n\n if (ts.isJsxSelfClosingElement(node)) {\n const tag = node.tagName.getText();\n const cls = getClassNameAttr(node.attributes);\n if (isComponentName(tag)) return `<${tag}/>`;\n return cls ? `${tag}.${compactClass(cls)}` : tag;\n }\n\n if (ts.isJsxElement(node)) {\n const tag = node.openingElement.tagName.getText();\n const cls = getClassNameAttr(node.openingElement.attributes);\n const tagStr = isComponentName(tag) ? `<${tag}>` : (cls ? `${tag}.${compactClass(cls)}` : tag);\n\n const childSummaries: string[] = [];\n for (const child of node.children) {\n if (ts.isJsxElement(child) || ts.isJsxSelfClosingElement(child)) {\n childSummaries.push(summarizeJsx(child, depth + 1));\n } else if (ts.isJsxExpression(child) && child.expression) {\n // Conditional rendering: {condition && <Foo/>} or {condition ? <A/> : <B/>}\n const expr = child.expression;\n if (ts.isConditionalExpression(expr)) {\n const whenTrue = findJsxInExpression(expr.whenTrue);\n const whenFalse = findJsxInExpression(expr.whenFalse);\n if (whenTrue) childSummaries.push(`{cond: ${summarizeJsx(whenTrue, depth + 1)}}`);\n if (whenFalse) childSummaries.push(summarizeJsx(whenFalse, depth + 1));\n } else if (ts.isBinaryExpression(expr) && expr.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken) {\n const jsx = findJsxInExpression(expr.right);\n if (jsx) childSummaries.push(`{cond: ${summarizeJsx(jsx, depth + 1)}}`);\n } else {\n const jsx = findJsxInExpression(expr);\n if (jsx) childSummaries.push(summarizeJsx(jsx, depth + 1));\n }\n }\n }\n\n if (childSummaries.length === 0) return tagStr;\n if (childSummaries.length === 1) return `${tagStr} > ${childSummaries[0]}`;\n return `${tagStr} > [${childSummaries.join(', ')}]`;\n }\n\n if (ts.isJsxFragment(node)) {\n const childSummaries: string[] = [];\n for (const child of node.children) {\n if (ts.isJsxElement(child) || ts.isJsxSelfClosingElement(child)) {\n childSummaries.push(summarizeJsx(child, depth + 1));\n }\n }\n return childSummaries.length === 1 ? childSummaries[0] : `[${childSummaries.join(', ')}]`;\n }\n\n return '?';\n}\n\nfunction getClassNameAttr(attrs: ts.JsxAttributes): string | null {\n for (const attr of attrs.properties) {\n if (ts.isJsxAttribute(attr) && attr.name.getText() === 'className' && attr.initializer) {\n if (ts.isStringLiteral(attr.initializer)) {\n return attr.initializer.text;\n }\n }\n }\n return null;\n}\n\n/** Compact a className string to just the first 2-3 meaningful classes */\nfunction compactClass(cls: string): string {\n const parts = cls.split(/\\s+/).filter(c => !c.startsWith('dark:'));\n // Take just layout/semantic classes, skip utility minutiae\n const meaningful = parts.slice(0, 3);\n return meaningful.join('.');\n}\n\nfunction extractExtensionPoints(\n content: string,\n relPath: string\n): ExtensionPointInfo[] {\n const extensionPoints: ExtensionPointInfo[] = [];\n\n // Pattern 1: @sidekick:extension-point comment markers\n const commentRegex = /@sidekick:extension-point\\s+([a-z0-9-]+)/g;\n let match;\n\n while ((match = commentRegex.exec(content)) !== null) {\n const id = match[1];\n const line = content.substring(0, match.index).split('\\n').length;\n extensionPoints.push({ id, file: relPath, line });\n }\n\n // Pattern 2: <ExtensionPoint id=\"...\" /> JSX components\n const jsxRegex = /<ExtensionPoint\\s+[^>]*id=[\"']([a-z0-9-]+)[\"'][^>]*\\/?>/g;\n\n while ((match = jsxRegex.exec(content)) !== null) {\n const id = match[1];\n const line = content.substring(0, match.index).split('\\n').length;\n extensionPoints.push({ id, file: relPath, line });\n }\n\n return extensionPoints;\n}\n\nfunction extractDataModels(\n sourceFile: ts.SourceFile,\n relPath: string\n): DataModelInfo[] {\n const dataModels: DataModelInfo[] = [];\n\n function visit(node: ts.Node) {\n // Look for exported interfaces\n if (ts.isInterfaceDeclaration(node)) {\n const name = node.name.getText();\n // Only include data model interfaces (not props interfaces)\n if (!name.endsWith('Props') && !name.endsWith('State')) {\n const fields = extractFieldsFromInterface(node);\n if (fields.length > 0) {\n dataModels.push({ name, file: relPath, fields });\n }\n }\n }\n\n // Look for exported type aliases with object types\n if (ts.isTypeAliasDeclaration(node)) {\n const name = node.name.getText();\n if (!name.endsWith('Props') && !name.endsWith('State') && ts.isTypeLiteralNode(node.type)) {\n const fields = extractFieldsFromTypeLiteral(node.type);\n if (fields.length > 0) {\n dataModels.push({ name, file: relPath, fields });\n }\n }\n }\n\n ts.forEachChild(node, visit);\n }\n\n visit(sourceFile);\n return dataModels;\n}\n\nfunction extractFieldsFromInterface(node: ts.InterfaceDeclaration): DataModelField[] {\n const fields: DataModelField[] = [];\n\n for (const member of node.members) {\n if (ts.isPropertySignature(member) && member.name && member.type) {\n const name = member.name.getText();\n const type = member.type.getText();\n const optional = member.questionToken !== undefined;\n fields.push({ name, type, optional: optional || undefined });\n }\n }\n\n return fields;\n}\n\nfunction extractFieldsFromTypeLiteral(node: ts.TypeLiteralNode): DataModelField[] {\n const fields: DataModelField[] = [];\n\n for (const member of node.members) {\n if (ts.isPropertySignature(member) && member.name && member.type) {\n const name = member.name.getText();\n const type = member.type.getText();\n const optional = member.questionToken !== undefined;\n fields.push({ name, type, optional: optional || undefined });\n }\n }\n\n return fields;\n}\n\n// --- Design System Extraction ---\n\n/**\n * Extract className strings from JSX elements within component functions in a file.\n * Returns one ComponentStyleSample per component found, with deduplicated class strings.\n */\nfunction extractComponentStyles(\n sourceFile: ts.SourceFile,\n relPath: string\n): ComponentStyleSample[] {\n const results: ComponentStyleSample[] = [];\n\n function visitTopLevel(node: ts.Node) {\n let componentName: string | null = null;\n\n // Named function component: function Foo(props) { ... }\n if (ts.isFunctionDeclaration(node) && node.name) {\n const name = node.name.getText();\n if (isComponentName(name)) {\n componentName = name;\n }\n }\n\n // Arrow function component: const Foo = (...) => { ... }\n if (ts.isVariableStatement(node)) {\n for (const decl of node.declarationList.declarations) {\n if (ts.isIdentifier(decl.name) && decl.initializer) {\n const name = decl.name.getText();\n if (isComponentName(name) && isReactComponent(decl.initializer)) {\n componentName = name;\n }\n }\n }\n }\n\n if (componentName) {\n const classNames = new Set<string>();\n collectClassNames(node, classNames, sourceFile);\n if (classNames.size > 0) {\n results.push({\n component: componentName,\n file: relPath,\n classNames: Array.from(classNames),\n });\n }\n }\n\n ts.forEachChild(node, visitTopLevel);\n }\n\n visitTopLevel(sourceFile);\n return results;\n}\n\n/**\n * Walk a subtree collecting all string literal values from className={...} JSX attributes.\n * Handles: className=\"...\" and className={`...`} (static parts of template literals).\n */\nfunction collectClassNames(\n node: ts.Node,\n classNames: Set<string>,\n sourceFile: ts.SourceFile\n): void {\n // Match JSX attribute: className=\"...\" or className={...}\n if (ts.isJsxAttribute(node)) {\n const attrName = node.name.getText();\n if (attrName === 'className' && node.initializer) {\n // className=\"literal string\"\n if (ts.isStringLiteral(node.initializer)) {\n classNames.add(node.initializer.text);\n }\n // className={expression} — dig into the expression\n if (ts.isJsxExpression(node.initializer) && node.initializer.expression) {\n collectStringValues(node.initializer.expression, classNames);\n }\n }\n }\n\n ts.forEachChild(node, (child) => collectClassNames(child, classNames, sourceFile));\n}\n\n/**\n * Extract string literal values from an expression tree.\n * Handles string literals, template literals (static spans), and ternary expressions.\n * Filters out values that don't look like CSS class strings.\n */\nfunction collectStringValues(node: ts.Node, values: Set<string>): void {\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {\n const text = node.text.trim();\n if (text && looksLikeClassNames(text)) values.add(text);\n }\n\n if (ts.isTemplateExpression(node)) {\n // Collect static parts of template literals\n const head = node.head.text.trim();\n if (head && looksLikeClassNames(head)) values.add(head);\n for (const span of node.templateSpans) {\n const spanText = span.literal.text.trim();\n if (spanText && looksLikeClassNames(spanText)) values.add(spanText);\n }\n }\n\n // Ternary: condition ? 'a' : 'b' — only collect from then/else branches, not the condition\n if (ts.isConditionalExpression(node)) {\n collectStringValues(node.whenTrue, values);\n collectStringValues(node.whenFalse, values);\n return; // Don't recurse into condition\n }\n\n // Binary expression with + for string concatenation\n if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.PlusToken) {\n collectStringValues(node.left, values);\n collectStringValues(node.right, values);\n return;\n }\n\n ts.forEachChild(node, (child) => collectStringValues(child, values));\n}\n\n/**\n * Heuristic: does a string look like CSS class names?\n * Class names are space-separated identifiers with letters, hyphens, colons, dots, brackets, slashes.\n * Rejects strings that look like URLs, paths, or plain text.\n */\nfunction looksLikeClassNames(text: string): boolean {\n // Reject empty or very short\n if (text.length < 2) return false;\n // Reject URL-like strings\n if (text.startsWith('http') || text.startsWith('//')) return false;\n // Reject path-like strings (start with / and don't contain spaces)\n if (text.startsWith('/') && !text.includes(' ')) return false;\n // Reject strings that are mostly non-class characters (sentences, etc.)\n // Class names typically have hyphens, colons, and don't have many capital letters\n const words = text.split(/\\s+/);\n // If every \"word\" matches a CSS-class-like pattern, it's likely class names\n const classPattern = /^[a-zA-Z_\\-\\[\\]:.\\/][a-zA-Z0-9_\\-\\[\\]:.\\/%]*$/;\n const classLikeCount = words.filter(w => classPattern.test(w)).length;\n return classLikeCount / words.length >= 0.5;\n}\n\n/**\n * Detect CSS framework, font family, and global CSS from the project.\n */\nasync function extractDesignSystem(\n targetDir: string,\n componentStyles: ComponentStyleSample[]\n): Promise<DesignSystem> {\n let framework: string | null = null;\n let fontFamily: string | null = null;\n let globalCss: string | null = null;\n\n // Detect Tailwind — check target dir and up to 2 parent dirs\n // (handles cases like scanning src/ when tailwind.config is at project root)\n const dirsToCheck = [targetDir];\n const parent1 = path.dirname(targetDir);\n if (parent1 !== targetDir) dirsToCheck.push(parent1);\n const parent2 = path.dirname(parent1);\n if (parent2 !== parent1) dirsToCheck.push(parent2);\n\n let tailwindConfigs: string[] = [];\n for (const dir of dirsToCheck) {\n tailwindConfigs = await glob('tailwind.config.{js,ts,cjs,mjs}', {\n cwd: dir,\n absolute: true,\n });\n if (tailwindConfigs.length > 0) break;\n }\n if (tailwindConfigs.length > 0) {\n framework = 'Tailwind CSS';\n\n // Try to extract font family from tailwind config\n try {\n const configContent = await fs.readFile(tailwindConfigs[0], 'utf-8');\n const fontMatch = configContent.match(/fontFamily\\s*:\\s*\\{[^}]*sans\\s*:\\s*\\[([^\\]]+)\\]/);\n if (fontMatch) {\n fontFamily = fontMatch[1]\n .split(',')\n .map(s => s.trim().replace(/['\"]/g, ''))\n .join(', ');\n }\n } catch {\n // ignore\n }\n }\n\n // Find and read global CSS files\n const cssFiles = await glob('**/{globals,global,styles,style,app}.css', {\n cwd: targetDir,\n ignore: ['**/node_modules/**', '**/dist/**', '**/.next/**'],\n absolute: true,\n });\n if (cssFiles.length > 0) {\n try {\n const contents: string[] = [];\n for (const cssFile of cssFiles) {\n const content = await fs.readFile(cssFile, 'utf-8');\n // Strip Tailwind directives — they're not useful style info\n const stripped = content\n .replace(/@tailwind\\s+\\w+;/g, '')\n .trim();\n if (stripped) {\n contents.push(stripped);\n }\n }\n if (contents.length > 0) {\n globalCss = contents.join('\\n\\n');\n }\n } catch {\n // ignore\n }\n\n // Try to extract font from CSS if not found in tailwind config\n if (!fontFamily) {\n for (const cssFile of cssFiles) {\n try {\n const content = await fs.readFile(cssFile, 'utf-8');\n const fontMatch = content.match(/font-family\\s*:\\s*([^;]+)/);\n if (fontMatch) {\n fontFamily = fontMatch[1].trim();\n }\n } catch {\n // ignore\n }\n }\n }\n }\n\n return {\n framework,\n fontFamily,\n globalCss,\n componentStyles,\n };\n}\n","export interface ComponentProp {\n name: string;\n type?: string;\n}\n\nexport interface ComponentInfo {\n name: string;\n file: string;\n props: ComponentProp[];\n extensible: boolean;\n /** Compact summary of the JSX tree this component renders */\n renderStructure?: string;\n}\n\nexport interface ExtensionPointInfo {\n id: string;\n file: string;\n line: number;\n}\n\nexport interface DataModelField {\n name: string;\n type: string;\n optional?: boolean;\n}\n\nexport interface DataModelInfo {\n name: string;\n file: string;\n fields: DataModelField[];\n}\n\nexport interface ComponentStyleSample {\n component: string;\n file: string;\n classNames: string[];\n}\n\nexport interface DesignSystem {\n framework: string | null;\n fontFamily: string | null;\n globalCss: string | null;\n componentStyles: ComponentStyleSample[];\n}\n\nexport interface AppSchema {\n version: string;\n generatedAt: string;\n designSystem: DesignSystem;\n components: ComponentInfo[];\n extensionPoints: string[];\n dataModels: DataModelInfo[];\n primitives: string[];\n}\n\nexport interface OverrideManifest {\n id: string;\n name: string;\n description: string;\n version: string;\n primitives: string[];\n}\n\nexport interface GeneratedOverride {\n manifest: OverrideManifest;\n code: string;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n warnings: ValidationWarning[];\n}\n\nexport interface ValidationError {\n type: 'forbidden-import' | 'forbidden-pattern' | 'syntax-error' | 'type-error';\n message: string;\n line?: number;\n column?: number;\n}\n\nexport interface ValidationWarning {\n type: 'unused-import' | 'complex-code';\n message: string;\n line?: number;\n}\n\nexport const ALLOWED_IMPORTS = [\n '@usesidekick/react',\n 'react',\n];\n\nexport const FORBIDDEN_PATTERNS = [\n /\\bfetch\\s*\\(/,\n /\\beval\\s*\\(/,\n /\\bFunction\\s*\\(/,\n /\\bdocument\\./,\n /\\bwindow\\./,\n /\\blocalStorage\\./,\n /\\bsessionStorage\\./,\n /\\bXMLHttpRequest/,\n /\\bWebSocket/,\n /\\bimport\\s*\\(/,\n /require\\s*\\(/,\n];\n\nexport const SDK_PRIMITIVES = [\n 'ui.wrap',\n 'ui.replace',\n 'ui.addColumn',\n 'ui.renameColumn',\n 'ui.reorderColumns',\n 'ui.hideColumn',\n 'ui.filterRows',\n 'ui.addStyles',\n 'ui.setText',\n 'ui.setAttribute',\n 'ui.setStyle',\n 'ui.addClass',\n 'ui.removeClass',\n 'ui.inject',\n 'data.computed',\n 'data.addFilter',\n 'data.transform',\n 'data.intercept',\n 'behavior.addKeyboardShortcut',\n 'behavior.onDOMEvent',\n 'behavior.modifyRoute',\n];\n","import * as ts from 'typescript';\nimport {\n ValidationResult,\n ValidationError,\n ValidationWarning,\n ALLOWED_IMPORTS,\n FORBIDDEN_PATTERNS,\n} from './types.js';\n\ninterface ValidateOptions {\n code: string;\n filename?: string;\n}\n\nexport function validate(options: ValidateOptions): ValidationResult {\n const { code, filename = 'override.tsx' } = options;\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Parse the code with TypeScript\n let sourceFile: ts.SourceFile;\n try {\n sourceFile = ts.createSourceFile(\n filename,\n code,\n ts.ScriptTarget.Latest,\n true,\n filename.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n );\n } catch (e) {\n errors.push({\n type: 'syntax-error',\n message: `Failed to parse code: ${e instanceof Error ? e.message : String(e)}`,\n });\n return { valid: false, errors, warnings };\n }\n\n // Check for parse errors in the AST (syntax errors only, not type errors)\n const parseErrors = checkParseErrors(sourceFile);\n errors.push(...parseErrors);\n\n // Check imports\n const importErrors = checkImports(sourceFile);\n errors.push(...importErrors);\n\n // Check for forbidden patterns\n const patternErrors = checkForbiddenPatterns(code);\n errors.push(...patternErrors);\n\n // Check for usage of SDK primitives\n const primitiveWarnings = checkPrimitiveUsage(sourceFile);\n warnings.push(...primitiveWarnings);\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\nfunction checkParseErrors(sourceFile: ts.SourceFile): ValidationError[] {\n const errors: ValidationError[] = [];\n\n // Check for parse diagnostics (syntax errors only)\n // Note: We don't do full type checking here because that would require\n // a complete TypeScript project setup with node_modules\n const parseDiagnostics = (sourceFile as unknown as { parseDiagnostics?: ts.Diagnostic[] }).parseDiagnostics;\n\n if (parseDiagnostics) {\n for (const diagnostic of parseDiagnostics) {\n const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\\n');\n const pos = diagnostic.start;\n let line: number | undefined;\n let column: number | undefined;\n\n if (pos !== undefined) {\n const lineAndChar = sourceFile.getLineAndCharacterOfPosition(pos);\n line = lineAndChar.line + 1;\n column = lineAndChar.character + 1;\n }\n\n errors.push({\n type: 'syntax-error',\n message,\n line,\n column,\n });\n }\n }\n\n // Also check for obvious structural issues by walking the AST\n function visit(node: ts.Node) {\n // Check for incomplete nodes that indicate parse errors\n if (node.kind === ts.SyntaxKind.Unknown) {\n const pos = node.getStart(sourceFile);\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(pos);\n errors.push({\n type: 'syntax-error',\n message: 'Unknown or invalid syntax',\n line: line + 1,\n column: character + 1,\n });\n }\n ts.forEachChild(node, visit);\n }\n visit(sourceFile);\n\n return errors;\n}\n\nfunction checkImports(sourceFile: ts.SourceFile): ValidationError[] {\n const errors: ValidationError[] = [];\n\n function visit(node: ts.Node) {\n if (ts.isImportDeclaration(node)) {\n const moduleSpecifier = node.moduleSpecifier;\n if (ts.isStringLiteral(moduleSpecifier)) {\n const moduleName = moduleSpecifier.text;\n\n // Check if import is allowed\n const isAllowed = ALLOWED_IMPORTS.some((allowed) => {\n if (allowed === moduleName) return true;\n if (moduleName.startsWith(allowed + '/')) return true;\n return false;\n });\n\n if (!isAllowed) {\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(\n node.getStart()\n );\n errors.push({\n type: 'forbidden-import',\n message: `Import \"${moduleName}\" is not allowed. Only imports from ${ALLOWED_IMPORTS.join(', ')} are permitted.`,\n line: line + 1,\n column: character + 1,\n });\n }\n }\n }\n\n ts.forEachChild(node, visit);\n }\n\n visit(sourceFile);\n return errors;\n}\n\nfunction checkForbiddenPatterns(code: string): ValidationError[] {\n const errors: ValidationError[] = [];\n const lines = code.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n for (const pattern of FORBIDDEN_PATTERNS) {\n if (pattern.test(line)) {\n errors.push({\n type: 'forbidden-pattern',\n message: `Forbidden pattern detected: ${pattern.source}`,\n line: i + 1,\n });\n }\n }\n }\n\n return errors;\n}\n\nfunction checkPrimitiveUsage(sourceFile: ts.SourceFile): ValidationWarning[] {\n const warnings: ValidationWarning[] = [];\n\n // Check if the override uses at least one SDK primitive\n const code = sourceFile.getFullText();\n const usesSDKPrimitive =\n /sdk\\.ui\\./.test(code) || /sdk\\.data\\./.test(code);\n\n if (!usesSDKPrimitive) {\n warnings.push({\n type: 'unused-import',\n message: 'Override does not appear to use any SDK primitives (sdk.ui.* or sdk.data.*)',\n });\n }\n\n return warnings;\n}\n\nexport function validateFile(filepath: string, code: string): ValidationResult {\n return validate({ code, filename: filepath });\n}\n","import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { AppSchema, GeneratedOverride, OverrideManifest } from './types.js';\nimport { validate } from './validate.js';\n\ninterface GenerateOptions {\n request: string;\n schemaPath: string;\n outputDir: string;\n apiKey?: string;\n}\n\ninterface GenerateResult {\n success: boolean;\n override?: GeneratedOverride;\n outputPath?: string;\n error?: string;\n validationErrors?: string[];\n}\n\nexport async function generate(options: GenerateOptions): Promise<GenerateResult> {\n const { request, schemaPath, outputDir, apiKey } = options;\n\n // Read the schema\n let schema: AppSchema;\n try {\n const schemaContent = await fs.readFile(schemaPath, 'utf-8');\n schema = JSON.parse(schemaContent);\n } catch (e) {\n return {\n success: false,\n error: `Failed to read schema: ${e instanceof Error ? e.message : String(e)}`,\n };\n }\n\n // Check for API key\n const key = apiKey || process.env.ANTHROPIC_API_KEY;\n if (!key) {\n return {\n success: false,\n error: 'No API key provided. Set ANTHROPIC_API_KEY environment variable or use --api-key flag.',\n };\n }\n\n // Generate override using AI\n const MAX_RETRIES = 3;\n let lastError: string | undefined;\n let lastValidationErrors: string[] | undefined;\n\n for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {\n try {\n const generated = await callAI(request, schema, key, lastValidationErrors);\n\n // Validate the generated code\n const validation = validate({ code: generated.code, filename: 'override.tsx' });\n\n if (!validation.valid) {\n lastValidationErrors = validation.errors.map((e) => e.message);\n lastError = `Validation failed: ${validation.errors.map((e) => e.message).join(', ')}`;\n\n if (attempt < MAX_RETRIES) {\n console.log(`Attempt ${attempt} failed validation, retrying...`);\n continue;\n }\n\n return {\n success: false,\n error: lastError,\n validationErrors: lastValidationErrors,\n };\n }\n\n // Write the override to disk\n const overrideDir = path.join(outputDir, generated.manifest.id);\n await fs.mkdir(overrideDir, { recursive: true });\n\n const codePath = path.join(overrideDir, 'index.tsx');\n await fs.writeFile(codePath, generated.code);\n\n return {\n success: true,\n override: generated,\n outputPath: codePath,\n };\n } catch (e) {\n lastError = e instanceof Error ? e.message : String(e);\n if (attempt === MAX_RETRIES) {\n return {\n success: false,\n error: `Failed after ${MAX_RETRIES} attempts: ${lastError}`,\n };\n }\n }\n }\n\n return {\n success: false,\n error: lastError || 'Unknown error',\n };\n}\n\nasync function callAI(\n request: string,\n schema: AppSchema,\n apiKey: string,\n previousErrors?: string[]\n): Promise<GeneratedOverride> {\n const systemPrompt = buildSystemPrompt(schema);\n const userPrompt = buildUserPrompt(request, previousErrors);\n\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: 'claude-sonnet-4-20250514',\n max_tokens: 4096,\n system: systemPrompt,\n messages: [\n { role: 'user', content: userPrompt },\n ],\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`API request failed: ${response.status} ${error}`);\n }\n\n const result = await response.json() as {\n content: Array<{ type: string; text?: string }>;\n };\n\n const textContent = result.content.find((c) => c.type === 'text');\n if (!textContent || !textContent.text) {\n throw new Error('No text content in API response');\n }\n\n return parseAIResponse(textContent.text);\n}\n\nfunction buildSystemPrompt(schema: AppSchema): string {\n return `You are a code generator for Sidekick, an SDK that allows users to customize web applications.\nYour task is to generate override modules based on user requests.\n\n## SDK Primitives Available\n\nThe SDK provides these primitives that MUST be used:\n\nUI Primitives:\n- sdk.ui.inject(extensionPointId, Component) - Inject a component at an extension point\n- sdk.ui.wrap(componentName, wrapperFn) - Wrap an existing component with a HOC\n- sdk.ui.addColumn(tableId, config) - Add a column to a table (config: { header, accessor, render? })\n- sdk.ui.addStyles(css) - Add CSS styles\n- sdk.ui.replace(componentName, Component) - Replace a component entirely\n\nData Primitives:\n- sdk.data.computed(fieldName, computeFn) - Add a computed field\n- sdk.data.addFilter(name, filterFn) - Add a filter preset\n- sdk.data.transform(dataKey, transformFn) - Transform data\n\n## App Schema\n\nExtension Points: ${JSON.stringify(schema.extensionPoints)}\n\nComponents: ${JSON.stringify(schema.components.map((c) => ({ name: c.name, props: c.props })))}\n\nData Models: ${JSON.stringify(schema.dataModels)}\n\n## Example Overrides\n\n### Example 1: Inject a banner\n\\`\\`\\`tsx\nimport { createOverride, SDK } from '@usesidekick/react';\n\nconst Banner = () => (\n <div style={{ backgroundColor: '#10B981', color: 'white', padding: '12px', textAlign: 'center' }}>\n Welcome Banner!\n </div>\n);\n\nexport default createOverride(\n {\n id: 'welcome-banner',\n name: 'Welcome Banner',\n description: 'Adds a welcome banner',\n version: '1.0.0',\n primitives: ['ui.inject'],\n },\n (sdk: SDK) => {\n sdk.ui.inject('sidebar-header', Banner);\n }\n);\n\\`\\`\\`\n\n### Example 2: Add a table column\n\\`\\`\\`tsx\nimport { createOverride, SDK } from '@usesidekick/react';\n\nexport default createOverride(\n {\n id: 'days-left-column',\n name: 'Days Left Column',\n description: 'Shows days until due date',\n version: '1.0.0',\n primitives: ['ui.addColumn'],\n },\n (sdk: SDK) => {\n sdk.ui.addColumn('task-table', {\n header: 'Days Left',\n accessor: (row: Record<string, unknown>) => {\n const dueDate = row.dueDate as string | undefined;\n if (!dueDate) return null;\n const days = Math.ceil((new Date(dueDate).getTime() - Date.now()) / (1000 * 60 * 60 * 24));\n return days;\n },\n render: (value: unknown) => {\n if (value === null) return <span>-</span>;\n const days = value as number;\n const color = days < 0 ? 'red' : days <= 3 ? 'orange' : 'green';\n return <span style={{ color }}>{days}d</span>;\n },\n });\n }\n);\n\\`\\`\\`\n\n### Example 3: Add custom styles\n\\`\\`\\`tsx\nimport { createOverride, SDK } from '@usesidekick/react';\n\nexport default createOverride(\n {\n id: 'dark-theme',\n name: 'Dark Theme Override',\n description: 'Adds dark theme styles',\n version: '1.0.0',\n primitives: ['ui.addStyles'],\n },\n (sdk: SDK) => {\n sdk.ui.addStyles(\\`\n .custom-dark { background: #1a1a1a; color: white; }\n \\`);\n }\n);\n\\`\\`\\`\n\n## Rules\n\n1. ONLY import from '@usesidekick/react' or 'react' - NO other imports allowed\n2. DO NOT use fetch, eval, document.*, window.*, localStorage, etc.\n3. Use the createOverride function from @usesidekick/react\n4. The activate function receives an SDK object with ui and data primitives\n5. Generate React components using JSX with inline styles\n6. Keep code simple and focused on the user's request\n7. Use arrow functions for components\n\n## Output Format\n\nRespond with a JSON object containing:\n{\n \"manifest\": {\n \"id\": \"override-id-kebab-case\",\n \"name\": \"Human Readable Name\",\n \"description\": \"What this override does\",\n \"version\": \"1.0.0\",\n \"primitives\": [\"list\", \"of\", \"primitives\", \"used\"]\n },\n \"code\": \"// Full TypeScript/TSX code here\"\n}\n\nThe code should be a complete, valid TypeScript/TSX file that exports a default override module.`;\n}\n\nfunction buildUserPrompt(request: string, previousErrors?: string[]): string {\n let prompt = `Generate an override module for this request: \"${request}\"`;\n\n if (previousErrors && previousErrors.length > 0) {\n prompt += `\\n\\nIMPORTANT: Previous generation attempt failed validation with these errors:\\n`;\n prompt += previousErrors.map((e) => `- ${e}`).join('\\n');\n prompt += '\\n\\nPlease fix these issues in your response.';\n }\n\n return prompt;\n}\n\nfunction parseAIResponse(text: string): GeneratedOverride {\n // Try to extract JSON from the response\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error('No JSON found in AI response');\n }\n\n try {\n const parsed = JSON.parse(jsonMatch[0]) as {\n manifest: OverrideManifest;\n code: string;\n };\n\n if (!parsed.manifest || !parsed.code) {\n throw new Error('Invalid response structure');\n }\n\n return {\n manifest: parsed.manifest,\n code: parsed.code,\n };\n } catch (e) {\n throw new Error(`Failed to parse AI response: ${e instanceof Error ? e.message : String(e)}`);\n }\n}\n","import * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { execFileSync } from 'child_process';\nimport { analyze } from './analyze.js';\n\ninterface ProjectInfo {\n targetDir: string;\n packageManager: 'npm' | 'yarn' | 'pnpm';\n hasNextJs: boolean;\n nextVersion: string | null;\n hasTypeScript: boolean;\n appDir: string; // 'src/app' or 'app'\n srcDir: string; // 'src' or '.'\n hasSidekickReact: boolean;\n hasBabelrc: boolean;\n hasNextConfig: boolean;\n nextConfigFile: string | null; // filename like 'next.config.js', 'next.config.mjs', 'next.config.ts'\n}\n\nconst NEXT_CONFIG_FILES = ['next.config.js', 'next.config.mjs', 'next.config.ts', 'next.config.mts'];\n\nfunction findNextConfigFile(targetDir: string): string | null {\n for (const name of NEXT_CONFIG_FILES) {\n if (existsSync(path.join(targetDir, name))) return name;\n }\n return null;\n}\n\nfunction log(step: number, total: number, message: string) {\n console.log(`[${step}/${total}] ${message}`);\n}\n\nfunction warn(message: string) {\n console.log(` ⚠ ${message}`);\n}\n\nexport interface InitOptions {\n postgres?: boolean;\n}\n\nexport async function init(targetDir: string, options: InitOptions = {}) {\n const usePostgres = !!options.postgres;\n\n console.log('\\nSidekick Setup\\n');\n\n // Phase 1: Detect project\n const project = await detectProject(targetDir);\n if (!project.hasNextJs) {\n throw new Error('Next.js not found in package.json. Sidekick currently requires Next.js.');\n }\n\n const info = [\n `Next.js ${project.nextVersion || 'detected'}`,\n project.hasTypeScript ? 'TypeScript' : 'JavaScript',\n `App Router (${project.appDir}/)`,\n usePostgres ? 'Postgres storage' : 'JSON file storage',\n ].join(', ');\n console.log(` ${info}\\n`);\n\n const TOTAL_STEPS = usePostgres ? 7 : 6;\n let step = 0;\n\n // Step: Install dependencies\n log(++step, TOTAL_STEPS, 'Installing dependencies...');\n await installDependencies(project, usePostgres);\n console.log(' done');\n\n // Step: Configure Babel + Next.js\n log(++step, TOTAL_STEPS, 'Configuring JSX runtime (.babelrc, next.config.js)...');\n await configureBabel(project);\n await configureNextConfig(project);\n console.log(' done');\n\n // Step (postgres only): Setup database\n if (usePostgres) {\n log(++step, TOTAL_STEPS, 'Setting up database schema...');\n await setupDatabase(project);\n console.log(' done');\n }\n\n // Step: Create API route\n log(++step, TOTAL_STEPS, 'Creating API route...');\n await createApiRoute(project, usePostgres);\n console.log(' done');\n\n // Step: Create bootstrap + modify layout\n log(++step, TOTAL_STEPS, 'Adding Sidekick to app layout...');\n await setupBootstrap(project);\n console.log(' done');\n\n // Step: Analyze\n log(++step, TOTAL_STEPS, 'Analyzing app components...');\n const sidekickDir = path.join(targetDir, project.srcDir, 'sidekick');\n const overridesDir = path.join(sidekickDir, 'overrides');\n await fs.mkdir(overridesDir, { recursive: true });\n\n const schemaPath = path.join(sidekickDir, 'schema.json');\n try {\n const schema = await analyze({ targetDir, outputPath: schemaPath });\n console.log(` ${schema.components.length} components, ${schema.extensionPoints.length} extension points`);\n } catch {\n warn('Analysis had issues - you can re-run with: sidekick analyze');\n }\n\n // Step: Add .sidekick/overrides.json to .gitignore (JSON mode only)\n if (!usePostgres) {\n await addToGitignore(targetDir, '.sidekick/overrides.json');\n }\n\n // Done\n log(++step, TOTAL_STEPS, 'Done!\\n');\n\n if (usePostgres) {\n console.log('Remaining steps:');\n console.log(' 1. Add to .env.local:');\n console.log(' DATABASE_URL=your_neon_database_url');\n console.log(' ANTHROPIC_API_KEY=your_api_key');\n console.log(' 2. Run: npx drizzle-kit push');\n console.log(' 3. Run: npm run dev\\n');\n } else {\n console.log('Remaining steps:');\n console.log(' 1. Add to .env.local:');\n console.log(' ANTHROPIC_API_KEY=your_api_key');\n console.log(' 2. Run: npm run dev\\n');\n }\n}\n\nasync function detectProject(targetDir: string): Promise<ProjectInfo> {\n const pkgPath = path.join(targetDir, 'package.json');\n if (!existsSync(pkgPath)) {\n throw new Error('No package.json found. Run this from your project root.');\n }\n\n const pkg = JSON.parse(await fs.readFile(pkgPath, 'utf-8'));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n // Detect package manager\n let packageManager: 'npm' | 'yarn' | 'pnpm' = 'npm';\n if (existsSync(path.join(targetDir, 'pnpm-lock.yaml'))) {\n packageManager = 'pnpm';\n } else if (existsSync(path.join(targetDir, 'yarn.lock'))) {\n packageManager = 'yarn';\n }\n\n // Detect Next.js\n const nextVersion = deps['next'] || null;\n\n // Detect TypeScript\n const hasTypeScript = existsSync(path.join(targetDir, 'tsconfig.json'));\n\n // Detect app directory\n let appDir = 'app';\n let srcDir = '.';\n if (existsSync(path.join(targetDir, 'src/app'))) {\n appDir = 'src/app';\n srcDir = 'src';\n }\n\n return {\n targetDir,\n packageManager,\n hasNextJs: !!nextVersion,\n nextVersion: nextVersion ? nextVersion.replace(/[\\^~>=<]*/g, '') : null,\n hasTypeScript,\n appDir,\n srcDir,\n hasSidekickReact: !!deps['@usesidekick/react'],\n hasBabelrc: existsSync(path.join(targetDir, '.babelrc')),\n hasNextConfig: !!findNextConfigFile(targetDir),\n nextConfigFile: findNextConfigFile(targetDir),\n };\n}\n\nfunction runInstall(pm: string, packages: string[], dev: boolean, cwd: string) {\n const cmd = pm === 'yarn' ? 'add' : 'install';\n const flag = dev ? (pm === 'yarn' ? '--dev' : '-D') : '';\n const args = [cmd, ...(flag ? [flag] : []), ...packages];\n execFileSync(pm, args, { stdio: 'pipe', cwd, timeout: 120_000 });\n}\n\nasync function installDependencies(project: ProjectInfo, usePostgres: boolean) {\n const { targetDir, packageManager: pm } = project;\n const pkg = JSON.parse(await fs.readFile(path.join(targetDir, 'package.json'), 'utf-8'));\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n // Runtime deps\n const runtimeDeps: string[] = [];\n if (!allDeps['@usesidekick/react']) runtimeDeps.push('@usesidekick/react');\n if (usePostgres) {\n if (!allDeps['drizzle-orm']) runtimeDeps.push('drizzle-orm');\n if (!allDeps['@neondatabase/serverless']) runtimeDeps.push('@neondatabase/serverless');\n }\n\n // Dev deps\n const devDeps: string[] = [];\n if (!allDeps['babel-plugin-add-react-displayname']) devDeps.push('babel-plugin-add-react-displayname');\n if (usePostgres) {\n if (!allDeps['drizzle-kit']) devDeps.push('drizzle-kit');\n }\n\n try {\n if (runtimeDeps.length > 0) {\n runInstall(pm, runtimeDeps, false, targetDir);\n }\n if (devDeps.length > 0) {\n runInstall(pm, devDeps, true, targetDir);\n }\n } catch (e) {\n warn(`Dependency install failed: ${e instanceof Error ? e.message : String(e)}`);\n warn('You may need to install manually: ' + [...runtimeDeps, ...devDeps].join(' '));\n }\n}\n\nasync function configureBabel(project: ProjectInfo) {\n const babelrcPath = path.join(project.targetDir, '.babelrc');\n\n const desiredConfig = {\n presets: [\n ['next/babel', {\n 'preset-env': {\n targets: { esmodules: true },\n exclude: ['transform-async-to-generator', 'transform-regenerator'],\n },\n 'preset-react': {\n runtime: 'automatic',\n importSource: '@usesidekick/react',\n },\n }],\n ],\n plugins: ['add-react-displayname'],\n };\n\n if (!project.hasBabelrc) {\n await fs.writeFile(babelrcPath, JSON.stringify(desiredConfig, null, 2) + '\\n');\n return;\n }\n\n // Merge into existing .babelrc\n try {\n const existing = JSON.parse(await fs.readFile(babelrcPath, 'utf-8'));\n\n // Check if already configured\n const presetStr = JSON.stringify(existing.presets || []);\n if (presetStr.includes('@usesidekick/react')) {\n // Already has sidekick importSource\n return;\n }\n\n // Find and update next/babel preset\n let foundNextBabel = false;\n if (existing.presets) {\n for (let i = 0; i < existing.presets.length; i++) {\n const preset = existing.presets[i];\n const presetName = Array.isArray(preset) ? preset[0] : preset;\n if (presetName === 'next/babel') {\n foundNextBabel = true;\n if (!Array.isArray(preset)) {\n existing.presets[i] = desiredConfig.presets[0];\n } else {\n const opts = preset[1] || {};\n opts['preset-react'] = {\n runtime: 'automatic',\n importSource: '@usesidekick/react',\n };\n if (!opts['preset-env']) {\n opts['preset-env'] = desiredConfig.presets[0][1]['preset-env'];\n }\n existing.presets[i] = ['next/babel', opts];\n }\n }\n }\n }\n\n if (!foundNextBabel) {\n existing.presets = existing.presets || [];\n existing.presets.unshift(desiredConfig.presets[0]);\n }\n\n // Add plugin if missing\n existing.plugins = existing.plugins || [];\n if (!existing.plugins.includes('add-react-displayname')) {\n existing.plugins.push('add-react-displayname');\n }\n\n await fs.writeFile(babelrcPath, JSON.stringify(existing, null, 2) + '\\n');\n } catch {\n warn('.babelrc exists but could not be parsed. Writing new config.');\n await fs.writeFile(babelrcPath, JSON.stringify(desiredConfig, null, 2) + '\\n');\n }\n}\n\nasync function configureNextConfig(project: ProjectInfo) {\n const newConfigTemplate = `const path = require('path');\n\n/** @type {import('next').NextConfig} */\nconst nextConfig = {\n webpack: (config, { isServer }) => {\n const sdkPath = path.dirname(require.resolve('@usesidekick/react/package.json'));\n config.resolve.alias = {\n ...config.resolve.alias,\n '@usesidekick/react/server': path.join(sdkPath, 'dist/server/index.mjs'),\n '@usesidekick/react/jsx-runtime': path.join(sdkPath, 'dist/jsx-runtime.mjs'),\n '@usesidekick/react/jsx-dev-runtime': path.join(sdkPath, 'dist/jsx-dev-runtime.mjs'),\n '@usesidekick/react': path.join(sdkPath, 'dist/index.mjs'),\n };\n return config;\n },\n};\n\nmodule.exports = nextConfig;\n`;\n\n if (!project.hasNextConfig) {\n // No config file exists — create next.config.js\n await fs.writeFile(path.join(project.targetDir, 'next.config.js'), newConfigTemplate);\n return;\n }\n\n const configFile = project.nextConfigFile!;\n const configPath = path.join(project.targetDir, configFile);\n\n // If it's .mjs, .ts, or .mts, we can't safely auto-modify — print manual instructions\n if (configFile !== 'next.config.js') {\n try {\n const existing = await fs.readFile(configPath, 'utf-8');\n if (existing.includes('@usesidekick/react')) return;\n } catch { /* ignore read errors */ }\n\n warn(`Found ${configFile} — cannot auto-modify. Please add webpack aliases manually:`);\n console.log(' Add to your webpack config:');\n console.log(\" const path = require('path'); // or import path from 'path'\");\n console.log(\" const sdkPath = path.dirname(require.resolve('@usesidekick/react/package.json'));\");\n console.log(\" config.resolve.alias['@usesidekick/react/server'] = path.join(sdkPath, 'dist/server/index.mjs');\");\n console.log(\" config.resolve.alias['@usesidekick/react/jsx-runtime'] = path.join(sdkPath, 'dist/jsx-runtime.mjs');\");\n console.log(\" config.resolve.alias['@usesidekick/react/jsx-dev-runtime'] = path.join(sdkPath, 'dist/jsx-dev-runtime.mjs');\");\n console.log(\" config.resolve.alias['@usesidekick/react'] = path.join(sdkPath, 'dist/index.mjs');\");\n return;\n }\n\n // Handle next.config.js\n try {\n const existing = await fs.readFile(configPath, 'utf-8');\n if (existing.includes('@usesidekick/react')) return;\n\n const backupPath = configPath + '.sidekick-backup';\n await fs.writeFile(backupPath, existing);\n warn(`Backed up existing next.config.js to ${path.basename(backupPath)}`);\n\n if (existing.includes('webpack')) {\n warn('next.config.js already has a webpack config. Please add the following aliases manually:');\n console.log(\" const sdkPath = path.dirname(require.resolve('@usesidekick/react/package.json'));\");\n console.log(\" config.resolve.alias['@usesidekick/react/server'] = path.join(sdkPath, 'dist/server/index.mjs');\");\n console.log(\" config.resolve.alias['@usesidekick/react/jsx-runtime'] = path.join(sdkPath, 'dist/jsx-runtime.mjs');\");\n console.log(\" config.resolve.alias['@usesidekick/react/jsx-dev-runtime'] = path.join(sdkPath, 'dist/jsx-dev-runtime.mjs');\");\n console.log(\" config.resolve.alias['@usesidekick/react'] = path.join(sdkPath, 'dist/index.mjs');\");\n } else {\n const modifiedConfig = existing.replace(\n /(const\\s+nextConfig\\s*=\\s*\\{)/,\n `$1\\n webpack: (config, { isServer }) => {\\n` +\n ` const sdkPath = path.dirname(require.resolve('@usesidekick/react/package.json'));\\n` +\n ` config.resolve.alias = {\\n` +\n ` ...config.resolve.alias,\\n` +\n ` '@usesidekick/react/server': path.join(sdkPath, 'dist/server/index.mjs'),\\n` +\n ` '@usesidekick/react/jsx-runtime': path.join(sdkPath, 'dist/jsx-runtime.mjs'),\\n` +\n ` '@usesidekick/react/jsx-dev-runtime': path.join(sdkPath, 'dist/jsx-dev-runtime.mjs'),\\n` +\n ` '@usesidekick/react': path.join(sdkPath, 'dist/index.mjs'),\\n` +\n ` };\\n` +\n ` return config;\\n` +\n ` },`\n );\n\n let finalConfig = modifiedConfig;\n if (!modifiedConfig.includes(\"require('path')\") && !modifiedConfig.includes('require(\"path\")')) {\n finalConfig = \"const path = require('path');\\n\" + finalConfig;\n }\n\n await fs.writeFile(configPath, finalConfig);\n }\n } catch {\n warn('Could not modify next.config.js. Writing new config.');\n await fs.writeFile(configPath, newConfigTemplate);\n }\n}\n\nasync function setupDatabase(project: ProjectInfo) {\n const { targetDir, srcDir } = project;\n const dbDir = path.join(targetDir, srcDir, 'lib', 'db');\n\n // Create db directory\n await fs.mkdir(dbDir, { recursive: true });\n\n // Schema file\n const schemaPath = path.join(dbDir, 'schema.ts');\n if (!existsSync(schemaPath)) {\n await fs.writeFile(schemaPath, `import { pgTable, text, timestamp, boolean } from 'drizzle-orm/pg-core';\n\n// Sidekick overrides table\nexport const overrides = pgTable('overrides', {\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n description: text('description').notNull(),\n version: text('version').notNull().default('1.0.0'),\n primitives: text('primitives').notNull(),\n code: text('code').notNull(),\n enabled: boolean('enabled').notNull().default(true),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n});\n\nexport type Override = typeof overrides.$inferSelect;\nexport type NewOverride = typeof overrides.$inferInsert;\n`);\n } else {\n // Check if overrides table already exists\n const existing = await fs.readFile(schemaPath, 'utf-8');\n if (!existing.includes('overrides') || !existing.includes(\"pgTable('overrides'\")) {\n warn('schema.ts exists but does not contain an overrides table. Please add it manually.');\n }\n }\n\n // DB connection file\n const dbIndexPath = path.join(dbDir, 'index.ts');\n if (!existsSync(dbIndexPath)) {\n await fs.writeFile(dbIndexPath, `import { neon } from '@neondatabase/serverless';\nimport { drizzle } from 'drizzle-orm/neon-http';\nimport * as schema from './schema';\n\nlet _db: ReturnType<typeof drizzle> | null = null;\n\nexport function getDb() {\n if (!_db) {\n const url = process.env.DATABASE_URL;\n if (!url) {\n throw new Error('DATABASE_URL environment variable is not set');\n }\n const sql = neon(url);\n _db = drizzle(sql, { schema });\n }\n return _db;\n}\n\nexport const db = new Proxy({} as ReturnType<typeof drizzle>, {\n get(_, prop) {\n return getDb()[prop as keyof ReturnType<typeof drizzle>];\n },\n});\n\nexport * from './schema';\n`);\n }\n\n // Drizzle config\n const drizzleConfigPath = path.join(targetDir, 'drizzle.config.ts');\n if (!existsSync(drizzleConfigPath)) {\n const schemaRelPath = srcDir === '.' ? './lib/db/schema.ts' : `./${srcDir}/lib/db/schema.ts`;\n await fs.writeFile(drizzleConfigPath, `import { config } from 'dotenv';\nimport { defineConfig } from 'drizzle-kit';\n\nconfig({ path: '.env.local' });\n\nif (!process.env.DATABASE_URL) {\n throw new Error('DATABASE_URL is not set in .env.local');\n}\n\nexport default defineConfig({\n schema: '${schemaRelPath}',\n out: './drizzle',\n dialect: 'postgresql',\n dbCredentials: {\n url: process.env.DATABASE_URL,\n },\n});\n`);\n }\n}\n\nasync function createApiRoute(project: ProjectInfo, usePostgres: boolean) {\n const { targetDir, appDir } = project;\n const routeDir = path.join(targetDir, appDir, 'api', 'sidekick', '[...action]');\n\n // Check if any existing sidekick routes exist\n const sidekickApiDir = path.join(targetDir, appDir, 'api', 'sidekick');\n if (existsSync(sidekickApiDir)) {\n try {\n const entries = await fs.readdir(sidekickApiDir);\n const existingRoutes = entries.filter(e => e !== '[...action]');\n if (existingRoutes.length > 0) {\n warn('Existing sidekick API routes found: ' + existingRoutes.join(', '));\n warn('Skipping API route creation to avoid conflicts. Please migrate manually.');\n return;\n }\n } catch {\n // Directory doesn't exist or isn't readable\n }\n }\n\n await fs.mkdir(routeDir, { recursive: true });\n\n const routePath = path.join(routeDir, 'route.ts');\n\n if (usePostgres) {\n await fs.writeFile(routePath, `import { createSidekickHandler } from '@usesidekick/react/server';\nimport { createDrizzleStorage } from '@usesidekick/react/server/drizzle';\nimport { db } from '@/lib/db';\nimport { overrides } from '@/lib/db/schema';\n\nexport const dynamic = 'force-dynamic';\n\nconst handler = createSidekickHandler({\n storage: createDrizzleStorage(db, overrides),\n});\n\nexport const GET = handler.GET;\nexport const POST = handler.POST;\n`);\n } else {\n await fs.writeFile(routePath, `import { createSidekickHandler, createJsonFileStorage } from '@usesidekick/react/server';\n\nexport const dynamic = 'force-dynamic';\n\nconst handler = createSidekickHandler({\n storage: createJsonFileStorage(),\n});\n\nexport const GET = handler.GET;\nexport const POST = handler.POST;\n`);\n }\n}\n\nasync function addToGitignore(targetDir: string, entry: string) {\n const gitignorePath = path.join(targetDir, '.gitignore');\n try {\n let content = '';\n if (existsSync(gitignorePath)) {\n content = await fs.readFile(gitignorePath, 'utf-8');\n }\n if (!content.split('\\n').some(line => line.trim() === entry)) {\n const separator = content.length > 0 && !content.endsWith('\\n') ? '\\n' : '';\n await fs.writeFile(gitignorePath, content + separator + entry + '\\n');\n }\n } catch {\n warn(`Could not update .gitignore. Please add \"${entry}\" manually.`);\n }\n}\n\nasync function setupBootstrap(project: ProjectInfo) {\n const { targetDir, srcDir, appDir } = project;\n const componentsDir = path.join(targetDir, srcDir, 'components');\n\n // Create components directory\n await fs.mkdir(componentsDir, { recursive: true });\n\n // Create SidekickBootstrap\n const bootstrapPath = path.join(componentsDir, 'SidekickBootstrap.tsx');\n if (!existsSync(bootstrapPath)) {\n await fs.writeFile(bootstrapPath, `'use client';\n\nimport { useEffect, useState, ReactNode } from 'react';\nimport { SidekickProvider, SidekickPanel } from '@usesidekick/react';\n\ninterface SidekickBootstrapProps {\n children: ReactNode;\n}\n\nexport function SidekickBootstrap({ children }: SidekickBootstrapProps) {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!mounted) {\n return <>{children}</>;\n }\n\n return (\n <SidekickProvider overridesEndpoint=\"/api/sidekick/overrides\">\n {children}\n <SidekickPanel\n apiEndpoint=\"/api/sidekick/generate\"\n toggleEndpoint=\"/api/sidekick/toggle\"\n />\n </SidekickProvider>\n );\n}\n`);\n }\n\n // Modify layout\n const layoutExts = ['layout.tsx', 'layout.jsx', 'layout.ts', 'layout.js'];\n let layoutPath: string | null = null;\n for (const ext of layoutExts) {\n const candidate = path.join(targetDir, appDir, ext);\n if (existsSync(candidate)) {\n layoutPath = candidate;\n break;\n }\n }\n if (!layoutPath) {\n warn('layout.tsx not found. Please add SidekickBootstrap to your layout manually.');\n return;\n }\n\n const layout = await fs.readFile(layoutPath, 'utf-8');\n\n // Check if already wrapped\n if (layout.includes('SidekickBootstrap')) {\n return;\n }\n\n // Back up layout\n const backupPath = layoutPath + '.sidekick-backup';\n await fs.writeFile(backupPath, layout);\n\n try {\n // Add import\n let modified = layout;\n const importLine = \"import { SidekickBootstrap } from '@/components/SidekickBootstrap';\";\n\n // Find a good place to add the import (after the last import)\n // Handles both single-line and multi-line imports (e.g. import {\\n Foo\\n} from '...')\n const importRegex = /^import\\s+(?:(?:\\{[^}]*\\}|[^;'\"]*)\\s+from\\s+)?['\"][^'\"]+['\"];?/gm;\n let lastImportEnd = 0;\n let match;\n while ((match = importRegex.exec(modified)) !== null) {\n lastImportEnd = match.index + match[0].length;\n }\n\n if (lastImportEnd > 0) {\n modified = modified.slice(0, lastImportEnd) + '\\n' + importLine + modified.slice(lastImportEnd);\n } else {\n modified = importLine + '\\n' + modified;\n }\n\n // Wrap {children} with <SidekickBootstrap>\n // Only target {children} in JSX context (preceded/followed by tags or whitespace inside JSX),\n // not in destructuring patterns like ({ children }) or type annotations.\n // Look for {children} that appears inside a JSX return body (between > and <).\n const jsxChildrenRegex = /(>[\\s]*)\\{children\\}([\\s]*<)/;\n if (jsxChildrenRegex.test(modified)) {\n modified = modified.replace(\n jsxChildrenRegex,\n '$1<SidekickBootstrap>{children}</SidekickBootstrap>$2'\n );\n } else if (modified.includes('{children}')) {\n // Fallback: there's a {children} but we can't confirm it's JSX — try simple replace\n // but only if it's indented (likely inside a return block, not in a function signature)\n const indentedChildrenRegex = /^(\\s{4,})\\{children\\}/m;\n if (indentedChildrenRegex.test(modified)) {\n modified = modified.replace(\n indentedChildrenRegex,\n '$1<SidekickBootstrap>{children}</SidekickBootstrap>'\n );\n } else {\n warn('Could not find {children} in JSX context in layout. Please wrap your content with <SidekickBootstrap> manually.');\n }\n } else {\n warn('Could not find {children} in layout. Please wrap your content with <SidekickBootstrap> manually.');\n }\n\n await fs.writeFile(layoutPath, modified);\n } catch {\n warn('Could not modify layout.tsx. Please add SidekickBootstrap manually:');\n console.log(\" 1. Import: import { SidekickBootstrap } from '@/components/SidekickBootstrap';\");\n console.log(' 2. Wrap {children} with <SidekickBootstrap>{children}</SidekickBootstrap>');\n }\n}\n"],"mappings":"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","names":["path","fs","ts","fs","path","path","fs"]}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@usesidekick/cli",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
+ "author": "Zach Hendershot <zhendershot@gmail.com>",
4
5
  "type": "module",
5
6
  "bin": {
6
7
  "sidekick": "dist/index.js"