← back to ClawCoder

src/lib/generator/bundle.ts

52 lines

import type { Profile } from '../profiles/types'
import { generateClaudeMd, type GeneratorVars } from './claude-md'
import { generateRulesFiles, type RuleFile } from './rules'
import { generateSettingsJson, serializeSettingsJson, type SettingsJson } from './hooks'

/**
 * A complete generated bundle for a profile.
 */
export interface GeneratedBundle {
  /** The rendered CLAUDE.md content */
  claudeMd: string
  /** Rule files to place in .claude/rules/ */
  rulesFiles: RuleFile[]
  /** The .claude/settings.json content (object form) */
  settings: SettingsJson
  /** The .claude/settings.json content (serialized JSON string) */
  settingsJson: string
  /** Profile metadata for reference */
  profile: {
    slug: string
    displayName: string
    ageGroup: string
    skillLevel: string
    persona: string
  }
}

/**
 * Generate a complete bundle of all Claude configuration files
 * for a given profile and user-provided variables.
 */
export function generateBundle(profile: Profile, vars: GeneratorVars): GeneratedBundle {
  const claudeMd = generateClaudeMd(profile, vars)
  const rulesFiles = generateRulesFiles(profile)
  const settings = generateSettingsJson(profile)
  const settingsJson = serializeSettingsJson(settings)

  return {
    claudeMd,
    rulesFiles,
    settings,
    settingsJson,
    profile: {
      slug: profile.slug,
      displayName: profile.displayName,
      ageGroup: profile.ageGroup,
      skillLevel: profile.skillLevel,
      persona: profile.persona,
    },
  }
}