@titan-design/style-profile 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema/style-rule.ts","../src/schema/profile.ts","../src/io.ts","../src/migrations/registry.ts","../src/migrations/migrate-profile.ts","../src/exporters/template-helpers.ts","../src/exporters/templates.ts","../src/exporters/skill.ts","../src/exporters/claude-rules.ts","../src/exporters/hooks.ts","../src/exporters/eslint-rules.ts","../src/exporters/eslint.ts","../src/exporters/ruff.ts","../src/exporters/markdown.ts","../src/exporters/editorconfig.ts","../src/exporters/export-index.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const ExampleSchema = z.object({\n good: z.string().optional(),\n bad: z.string().optional(),\n source: z.string().optional(),\n});\n\nexport const StabilitySchema = z.enum([\"high\", \"medium\", \"low\"]);\n\nexport const FixabilitySchema = z.enum([\n \"safe\",\n \"maybe-incorrect\",\n \"requires-input\",\n \"not-fixable\",\n]);\n\nexport const StyleRuleSchema = z.object({\n convention: z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.array(z.string()),\n ]),\n confidence: z.number().min(0).max(1),\n stability: StabilitySchema.optional(),\n fixability: FixabilitySchema.optional(),\n description: z.string().optional(),\n examples: z.array(ExampleSchema).optional(),\n extensions: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type StyleRule = z.infer<typeof StyleRuleSchema>;\nexport type Stability = z.infer<typeof StabilitySchema>;\nexport type Fixability = z.infer<typeof FixabilitySchema>;\n","import { z } from \"zod\";\nimport { StyleRuleSchema } from \"./style-rule.js\";\n\nexport const SCHEMA_VERSION = \"1.0.0\";\n\nconst CategorySchema = z.record(z.string(), StyleRuleSchema);\n\nconst IdiomSchema = z.object({\n name: z.string(),\n description: z.string(),\n frequency: z.number(),\n confidence: z.number().min(0).max(1),\n example: z.string().optional(),\n});\n\nconst AntiPatternSchema = z.object({\n pattern: z.string(),\n reason: z.string(),\n deprecated: z.boolean().optional(),\n});\n\nconst OverrideSchema = z.object({\n files: z.array(z.string()),\n naming: CategorySchema.optional(),\n structure: CategorySchema.optional(),\n documentation: CategorySchema.optional(),\n errorHandling: CategorySchema.optional(),\n formatting: CategorySchema.optional(),\n patterns: CategorySchema.optional(),\n});\n\nconst SeverityThresholdsSchema = z.object({\n error: z.number().min(0).max(1),\n warn: z.number().min(0).max(1),\n info: z.number().min(0).max(1),\n});\n\nexport const DEFAULT_SEVERITY_THRESHOLDS = {\n error: 0.85,\n warn: 0.60,\n info: 0.40,\n} as const;\n\nexport const ProfileSchema = z.object({\n $schema: z.string().optional(),\n schemaVersion: z.string(),\n author: z.string(),\n generated: z.string(),\n sources: z.array(z.string()),\n\n naming: CategorySchema,\n structure: CategorySchema,\n documentation: CategorySchema,\n errorHandling: CategorySchema,\n formatting: CategorySchema,\n patterns: CategorySchema,\n\n idioms: z.object({\n detected: z.array(IdiomSchema),\n }),\n\n antiPatterns: z.object({\n acknowledged: z.array(AntiPatternSchema),\n }),\n\n overrides: z.array(OverrideSchema),\n\n severityThresholds: SeverityThresholdsSchema.default(DEFAULT_SEVERITY_THRESHOLDS),\n});\n\nexport type Profile = z.infer<typeof ProfileSchema>;\nexport type SeverityThresholds = z.infer<typeof SeverityThresholdsSchema>;\n\nexport const PROFILE_CATEGORIES = [\n \"naming\",\n \"structure\",\n \"documentation\",\n \"errorHandling\",\n \"formatting\",\n \"patterns\",\n] as const;\n\nexport type ProfileCategory = (typeof PROFILE_CATEGORIES)[number];\n\nexport type Severity = \"error\" | \"warn\" | \"info\" | \"off\";\n","import * as fs from \"node:fs/promises\";\nimport { ProfileSchema, type Profile } from \"./schema/profile.js\";\n\nexport async function readProfile(filePath: string): Promise<Profile> {\n const raw = await fs.readFile(filePath, \"utf-8\");\n const json: unknown = JSON.parse(raw);\n return ProfileSchema.parse(json);\n}\n\nexport async function writeProfile(\n filePath: string,\n profile: unknown,\n): Promise<void> {\n const validated = ProfileSchema.parse(profile);\n await fs.writeFile(filePath, JSON.stringify(validated, null, 2) + \"\\n\");\n}\n\nexport function validateProfile(data: unknown) {\n return ProfileSchema.safeParse(data);\n}\n","export interface Migration {\n from: string;\n to: string;\n migrate: (profile: Record<string, unknown>) => Record<string, unknown>;\n}\n\nconst migrations: Migration[] = [];\n\nexport function registerMigration(migration: Migration): void {\n migrations.push(migration);\n migrations.sort((a, b) => a.from.localeCompare(b.from));\n}\n\nexport function getMigrations(): ReadonlyArray<Migration> {\n return migrations;\n}\n\nexport function clearMigrations(): void {\n migrations.length = 0;\n}\n","import { SCHEMA_VERSION } from \"../schema/profile.js\";\nimport { getMigrations, registerMigration, clearMigrations } from \"./registry.js\";\n\nexport { registerMigration, clearMigrations };\n\nexport function migrateProfile(\n profile: Record<string, unknown>,\n): Record<string, unknown> {\n let current = { ...profile };\n const version = current.schemaVersion as string;\n\n if (version === SCHEMA_VERSION) {\n return current;\n }\n\n const migrations = getMigrations();\n let currentVersion = version;\n\n for (const migration of migrations) {\n if (migration.from === currentVersion) {\n current = migration.migrate(current);\n currentVersion = migration.to;\n }\n }\n\n if (currentVersion !== SCHEMA_VERSION) {\n throw new Error(\n `No migration path from version ${version} to ${SCHEMA_VERSION}`,\n );\n }\n\n return current;\n}\n","import { PROFILE_CATEGORIES, type Profile } from \"../schema/profile.js\";\n\nexport interface RuleEntry {\n category: string;\n name: string;\n convention: unknown;\n confidence: number;\n stability?: string;\n description?: string;\n examples?: Array<{ good?: string; bad?: string; source?: string }>;\n extensions?: Record<string, unknown>;\n}\n\nexport type ExtractedRule = RuleEntry;\n\nexport function extractAllRules(profile: Profile): RuleEntry[] {\n const rules: RuleEntry[] = [];\n\n for (const category of PROFILE_CATEGORIES) {\n const section = profile[category];\n if (!section || typeof section !== \"object\") continue;\n\n for (const [name, rule] of Object.entries(section)) {\n if (!rule || typeof rule !== \"object\") continue;\n rules.push({\n category,\n name,\n convention: rule.convention,\n confidence: rule.confidence,\n stability: rule.stability,\n description: rule.description,\n examples: rule.examples,\n extensions: rule.extensions,\n });\n }\n }\n\n return rules;\n}\n\nexport function getTopRules(\n profile: Profile,\n count: number = 8,\n): RuleEntry[] {\n const errorThreshold = profile.severityThresholds?.error ?? 0.85;\n return extractAllRules(profile)\n .filter((r) => r.confidence >= errorThreshold)\n .sort((a, b) => b.confidence - a.confidence)\n .slice(0, count);\n}\n\nexport function getRulesForCategory(\n profile: Profile,\n category: string,\n): RuleEntry[] {\n return extractAllRules(profile).filter((r) => r.category === category);\n}\n\nexport function getRulesByCategory(\n profile: Profile,\n): Map<string, RuleEntry[]> {\n const grouped = new Map<string, RuleEntry[]>();\n for (const rule of extractAllRules(profile)) {\n const existing = grouped.get(rule.category) ?? [];\n existing.push(rule);\n grouped.set(rule.category, existing);\n }\n return grouped;\n}\n\nconst byConfidence = (a: RuleEntry, b: RuleEntry) =>\n b.confidence - a.confidence;\n\nexport function getRulesByTier(profile: Profile): {\n critical: RuleEntry[];\n strong: RuleEntry[];\n preferred: RuleEntry[];\n} {\n const allRules = extractAllRules(profile);\n const errorThreshold = profile.severityThresholds?.error ?? 0.85;\n const warnThreshold = profile.severityThresholds?.warn ?? 0.60;\n const infoThreshold = profile.severityThresholds?.info ?? 0.40;\n\n const critical: RuleEntry[] = [];\n const strong: RuleEntry[] = [];\n const preferred: RuleEntry[] = [];\n\n for (const rule of allRules) {\n if (rule.confidence >= errorThreshold) {\n critical.push(rule);\n } else if (rule.confidence >= warnThreshold) {\n strong.push(rule);\n } else if (rule.confidence >= infoThreshold) {\n preferred.push(rule);\n }\n }\n\n critical.sort(byConfidence);\n strong.sort(byConfidence);\n preferred.sort(byConfidence);\n\n return { critical, strong, preferred };\n}\n\nexport function readableConvention(rule: RuleEntry): string {\n if (\n typeof rule.convention === \"boolean\" ||\n typeof rule.convention === \"number\"\n ) {\n return rule.description ?? JSON.stringify(rule.convention);\n }\n if (Array.isArray(rule.convention)) {\n return rule.convention.join(\" → \");\n }\n return String(rule.convention);\n}\n\nexport function detectLanguages(profile: Profile): string[] {\n const langs: string[] = [];\n const hasTypescriptSignals =\n Object.keys(profile.naming).length > 0 ||\n Object.keys(profile.structure).length > 0;\n if (hasTypescriptSignals) langs.push(\"typescript\");\n return langs.length > 0 ? langs : [\"typescript\"];\n}\n","import Handlebars from \"handlebars\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n// tsup bundles into dist/index.js while tests load src/exporters, so the package root sits at different depths.\nfunction findPackageRoot(start: string): string {\n let dir = start;\n while (!existsSync(join(dir, \"package.json\"))) {\n const parent = dirname(dir);\n if (parent === dir) throw new Error(`style-profile package root not found above ${start}`);\n dir = parent;\n }\n return dir;\n}\n\nexport function loadTemplate(name: string): Handlebars.TemplateDelegate {\n const root = findPackageRoot(dirname(fileURLToPath(import.meta.url)));\n const source = readFileSync(join(root, \"templates\", name), \"utf-8\");\n return Handlebars.compile(source);\n}\n","import type { Profile } from \"../schema/profile.js\";\nimport type { GeneratedFile } from \"./types.js\";\nimport {\n getRulesByTier,\n readableConvention,\n detectLanguages,\n} from \"./template-helpers.js\";\nimport type { RuleEntry } from \"./template-helpers.js\";\nimport { loadTemplate } from \"./templates.js\";\n\nfunction buildTieredRulesContext(profile: Profile) {\n const tiers = getRulesByTier(profile);\n\n const mapRule = (r: RuleEntry) => ({\n name: `${r.category}.${r.name}`,\n readableConvention: readableConvention(r),\n confidencePercent: (r.confidence * 100).toFixed(0),\n });\n\n return {\n criticalRules: tiers.critical.map(mapRule),\n strongRules: tiers.strong.map(mapRule),\n preferredRules: tiers.preferred.map(mapRule),\n };\n}\n\nfunction buildNamingContext(profile: Profile) {\n const section = profile.naming;\n return Object.entries(section).map(([name, rule]) => ({\n label: name.charAt(0).toUpperCase() + name.slice(1),\n convention:\n typeof rule.convention === \"string\"\n ? rule.convention\n : JSON.stringify(rule.convention),\n confidencePercent: (rule.confidence * 100).toFixed(0),\n stability: rule.stability,\n fixability: rule.fixability,\n description: rule.description,\n examples: rule.examples,\n }));\n}\n\nfunction buildPatternsContext(profile: Profile) {\n const section = profile.patterns;\n const patternRules = Object.entries(section).map(([name, rule]) => ({\n name,\n strength:\n typeof rule.convention === \"string\" ? rule.convention : \"detected\",\n confidencePercent: (rule.confidence * 100).toFixed(0),\n description: rule.description,\n fixability: rule.fixability,\n examples: rule.examples,\n }));\n\n const preferredPatterns = profile.structure?.preferredPatterns;\n let preferredList: string[] | undefined;\n if (preferredPatterns && Array.isArray(preferredPatterns.convention)) {\n preferredList = preferredPatterns.convention as string[];\n }\n\n return { patterns: patternRules, preferredPatterns: preferredList };\n}\n\nfunction buildIdiomsContext(profile: Profile) {\n return profile.idioms.detected.map((idiom) => ({\n name: idiom.name,\n description: idiom.description,\n example: idiom.example,\n }));\n}\n\nfunction buildAntiPatternsContext(profile: Profile) {\n return profile.antiPatterns.acknowledged.map((ap) => ({\n pattern: ap.pattern,\n reason: ap.reason,\n }));\n}\n\nfunction buildLanguageContext(profile: Profile, lang: string) {\n const tiers = getRulesByTier(profile);\n const mapRule = (r: RuleEntry) => ({\n category: r.category,\n name: r.name,\n convention:\n typeof r.convention === \"string\"\n ? r.convention\n : JSON.stringify(r.convention),\n confidencePercent: (r.confidence * 100).toFixed(0),\n readableConvention: readableConvention(r),\n description: r.description,\n });\n\n return {\n language: lang.charAt(0).toUpperCase() + lang.slice(1),\n criticalRules: tiers.critical.map(mapRule),\n strongRules: tiers.strong.map(mapRule),\n preferredRules: tiers.preferred.map(mapRule),\n };\n}\n\nfunction renderSkillFile(profile: Profile, languages: string[]): GeneratedFile {\n const skillTemplate = loadTemplate(\"skill.md.hbs\");\n const idioms = buildIdiomsContext(profile);\n const antiPatterns = buildAntiPatternsContext(profile);\n return {\n path: \"skill.md\",\n content: skillTemplate({\n author: profile.author,\n ...buildTieredRulesContext(profile),\n languages,\n idioms: idioms.length > 0 ? idioms : undefined,\n antiPatterns: antiPatterns.length > 0 ? antiPatterns : undefined,\n }),\n };\n}\n\nexport function generateSkillFiles(profile: Profile): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n const languages = detectLanguages(profile);\n\n files.push(renderSkillFile(profile, languages));\n\n const namingTemplate = loadTemplate(\"naming.md.hbs\");\n files.push({\n path: \"references/naming.md\",\n content: namingTemplate({ rules: buildNamingContext(profile) }),\n });\n\n const patternsTemplate = loadTemplate(\"patterns.md.hbs\");\n files.push({\n path: \"references/patterns.md\",\n content: patternsTemplate(buildPatternsContext(profile)),\n });\n\n const langTemplate = loadTemplate(\"per-language.md.hbs\");\n for (const lang of languages) {\n files.push({\n path: `references/per-language/${lang}.md`,\n content: langTemplate(buildLanguageContext(profile, lang)),\n });\n }\n\n return files;\n}\n","import type { Profile } from \"../schema/profile.js\";\nimport { extractAllRules, type RuleEntry } from \"./template-helpers.js\";\nimport type { GeneratedFile } from \"./types.js\";\n\nfunction formatFrontmatter(globs: string[], description: string): string {\n return [\n \"---\",\n `description: \"${description}\"`,\n `globs: \"${globs.join(\", \")}\"`,\n \"alwaysApply: false\",\n \"---\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction formatRuleLine(\n category: string,\n name: string,\n convention: unknown,\n description?: string,\n): string {\n const value =\n typeof convention === \"string\"\n ? convention\n : JSON.stringify(convention);\n const desc = description ? ` -- ${description}` : \"\";\n return `- **${category}.${name}**: \\`${value}\\`${desc}`;\n}\n\nfunction formatBody(author: string, rules: RuleEntry[]): string {\n return [\n `# ${author}'s TypeScript Style`,\n \"\",\n ...rules\n .sort((a, b) => b.confidence - a.confidence)\n .map((r) =>\n formatRuleLine(r.category, r.name, r.convention, r.description),\n ),\n ].join(\"\\n\");\n}\n\nexport function generateClaudeRules(profile: Profile): GeneratedFile[] {\n const files: GeneratedFile[] = [];\n const allRules = extractAllRules(profile);\n const infoThreshold = profile.severityThresholds?.info ?? 0.40;\n\n const eligibleRules = allRules.filter(\n (r) => r.confidence >= infoThreshold,\n );\n\n if (eligibleRules.length > 0) {\n const frontmatter = formatFrontmatter(\n [\"**/*.ts\", \"**/*.tsx\"],\n `${profile.author}'s TypeScript coding style preferences`,\n );\n\n files.push({\n path: \".claude/rules/typescript.md\",\n content: frontmatter + formatBody(profile.author, eligibleRules) + \"\\n\",\n });\n }\n\n return files;\n}\n","import type { Profile } from \"../schema/profile.js\";\n\ninterface ClaudeHook {\n event: \"PreToolUse\" | \"PostToolUse\";\n matcher: string;\n command: string;\n}\n\ninterface ClaudeSettingsHooks {\n hooks: ClaudeHook[];\n}\n\nexport function generateHooksConfig(\n _profile: Profile,\n): ClaudeSettingsHooks {\n return {\n hooks: [\n {\n event: \"PostToolUse\",\n matcher: \"Write\",\n command: \"codewatch diff --fix $TOOL_INPUT_FILE_PATH\",\n },\n {\n event: \"PostToolUse\",\n matcher: \"Edit\",\n command: \"codewatch diff --fix $TOOL_INPUT_FILE_PATH\",\n },\n ],\n };\n}\n","import type { Profile, SeverityThresholds, Severity } from \"../schema/profile.js\";\nimport type { StyleRule } from \"../schema/style-rule.js\";\n\nexport function toEslintSeverity(\n confidence: number,\n thresholds: SeverityThresholds,\n): Severity | null {\n if (confidence >= thresholds.error) return \"error\";\n if (confidence >= thresholds.warn) return \"warn\";\n if (confidence >= thresholds.info) return \"info\";\n return null;\n}\n\nexport function severityRank(s: Severity): number {\n return s === \"error\" ? 3 : s === \"warn\" ? 2 : 1;\n}\n\nconst NAMING_SELECTORS: Record<string, string> = {\n variables: \"variable\",\n functions: \"function\",\n types: \"typeLike\",\n constants: \"variable\",\n};\n\nfunction eslintExtensionOptions(rule: StyleRule): unknown[] | undefined {\n const eslintExt = rule.extensions?.eslint;\n return eslintExt &&\n typeof eslintExt === \"object\" &&\n \"options\" in eslintExt &&\n Array.isArray((eslintExt as Record<string, unknown>).options)\n ? ((eslintExt as Record<string, unknown>).options as unknown[])\n : undefined;\n}\n\nfunction namingSelectors(rule: StyleRule, selectorName: string): unknown[] {\n const eslintOptions = eslintExtensionOptions(rule);\n if (eslintOptions) return eslintOptions;\n if (typeof rule.convention === \"string\") {\n return [{ selector: selectorName, format: [rule.convention] }];\n }\n return [];\n}\n\nexport function buildNamingConventionRule(\n profile: Profile,\n): [string, unknown] | null {\n const thresholds = profile.severityThresholds;\n const naming = profile.naming;\n if (!naming) return null;\n\n const selectors: unknown[] = [];\n let maxSeverity: Severity | null = null;\n\n for (const [key, rule] of Object.entries(naming)) {\n if (key === \"files\") continue;\n const selectorName = NAMING_SELECTORS[key];\n if (!selectorName) continue;\n\n const severity = toEslintSeverity(rule.confidence, thresholds);\n if (!severity) continue;\n if (!maxSeverity || severityRank(severity) > severityRank(maxSeverity)) {\n maxSeverity = severity;\n }\n\n selectors.push(...namingSelectors(rule, selectorName));\n }\n\n if (selectors.length === 0 || !maxSeverity) return null;\n return [\"@typescript-eslint/naming-convention\", [maxSeverity, ...selectors]];\n}\n\nexport function buildImportOrderRule(\n profile: Profile,\n): [string, unknown] | null {\n const importOrder = profile.structure?.importOrder;\n if (!importOrder) return null;\n const severity = toEslintSeverity(importOrder.confidence, profile.severityThresholds);\n if (!severity) return null;\n\n const convention = Array.isArray(importOrder.convention)\n ? importOrder.convention\n : [\"builtin\", \"external\", \"internal\", \"relative\"];\n\n return [\n \"perfectionist/sort-imports\",\n [\n severity,\n {\n type: \"natural\",\n groups: convention,\n },\n ],\n ];\n}\n\nexport function buildFunctionLengthRule(\n profile: Profile,\n): [string, unknown] | null {\n const maxLines = profile.structure?.functionMaxLines;\n if (!maxLines) return null;\n const severity = toEslintSeverity(maxLines.confidence, profile.severityThresholds);\n if (!severity) return null;\n if (typeof maxLines.convention !== \"number\") return null;\n\n return [\"max-lines-per-function\", [severity, { max: maxLines.convention }]];\n}\n\nexport function buildFileNamingRule(\n profile: Profile,\n): [string, unknown] | null {\n const files = profile.naming?.files;\n if (!files) return null;\n const severity = toEslintSeverity(files.confidence, profile.severityThresholds);\n if (!severity) return null;\n if (typeof files.convention !== \"string\") return null;\n\n const caseMap: Record<string, string> = {\n \"kebab-case\": \"kebabCase\",\n camelCase: \"camelCase\",\n PascalCase: \"pascalCase\",\n snake_case: \"snakeCase\",\n };\n\n return [\n \"unicorn/filename-case\",\n [severity, { case: { [caseMap[files.convention] ?? \"kebabCase\"]: true } }],\n ];\n}\n\nexport function buildJsdocRules(\n profile: Profile,\n): Array<[string, unknown]> {\n const rules: Array<[string, unknown]> = [];\n const docs = profile.documentation;\n if (!docs) return rules;\n\n const functionDocs = docs.functionDocs;\n if (!functionDocs) return rules;\n\n const severity = toEslintSeverity(functionDocs.confidence, profile.severityThresholds);\n if (!severity) return rules;\n\n if (functionDocs.convention === \"jsdoc-selective\") {\n rules.push([\"jsdoc/require-jsdoc\", [severity, { publicOnly: true }]]);\n } else if (functionDocs.convention === \"jsdoc-all\") {\n rules.push([\"jsdoc/require-jsdoc\", [severity]]);\n }\n\n return rules;\n}\n","import {\n PROFILE_CATEGORIES,\n type Profile,\n type SeverityThresholds,\n} from \"../schema/profile.js\";\nimport type { StyleRule } from \"../schema/style-rule.js\";\nimport type { GeneratedFile } from \"./types.js\";\nimport {\n toEslintSeverity,\n buildImportOrderRule,\n} from \"./eslint-rules.js\";\n\ninterface EslintRuleEntry {\n plugin: string;\n rule: string;\n severity: \"error\" | \"warn\" | \"off\";\n options?: unknown[];\n}\n\nfunction extensionEntry(\n rule: StyleRule,\n thresholds: SeverityThresholds,\n): EslintRuleEntry | null {\n const ext = rule.extensions?.eslint as\n | { rule: string; options?: unknown[] }\n | undefined;\n if (!ext) return null;\n\n const sev = toEslintSeverity(rule.confidence, thresholds);\n if (sev === null) return null;\n\n const plugin = ext.rule.includes(\"/\")\n ? ext.rule.split(\"/\").slice(0, -1).join(\"/\")\n : \"\";\n\n return {\n plugin,\n rule: ext.rule,\n severity: sev === \"info\" ? \"warn\" : sev,\n options: ext.options,\n };\n}\n\nfunction collectEslintExtensions(profile: Profile): EslintRuleEntry[] {\n const entries: EslintRuleEntry[] = [];\n\n for (const category of PROFILE_CATEGORIES) {\n const section = profile[category];\n if (!section) continue;\n\n for (const [, rule] of Object.entries(section)) {\n const entry = extensionEntry(rule, profile.severityThresholds);\n if (entry) entries.push(entry);\n }\n }\n\n return entries;\n}\n\nfunction addImportOrderRule(profile: Profile, entries: EslintRuleEntry[]): void {\n const result = buildImportOrderRule(profile);\n if (!result) return;\n\n const [ruleName, ruleConfig] = result;\n const configArray = ruleConfig as unknown[];\n const severity = configArray[0] as string;\n if (severity === \"info\") return;\n\n entries.push({\n plugin: \"perfectionist\",\n rule: ruleName,\n severity: severity as \"error\" | \"warn\",\n options: [configArray[1]],\n });\n}\n\nfunction detectRequiredPlugins(entries: EslintRuleEntry[]): Set<string> {\n const plugins = new Set<string>();\n for (const entry of entries) {\n if (entry.plugin.includes(\"@typescript-eslint\")) {\n plugins.add(\"@typescript-eslint\");\n }\n if (entry.plugin === \"perfectionist\") {\n plugins.add(\"perfectionist\");\n }\n if (entry.plugin.includes(\"unicorn\")) {\n plugins.add(\"unicorn\");\n }\n if (entry.plugin.includes(\"jsdoc\")) {\n plugins.add(\"jsdoc\");\n }\n }\n return plugins;\n}\n\nfunction generateImportStatements(plugins: Set<string>): string[] {\n const imports: string[] = [];\n if (plugins.has(\"@typescript-eslint\")) {\n imports.push(`import tseslint from \"@typescript-eslint/eslint-plugin\";`);\n imports.push(`import tsparser from \"@typescript-eslint/parser\";`);\n }\n if (plugins.has(\"perfectionist\")) {\n imports.push(`import perfectionist from \"eslint-plugin-perfectionist\";`);\n }\n if (plugins.has(\"unicorn\")) {\n imports.push(`import unicorn from \"eslint-plugin-unicorn\";`);\n }\n if (plugins.has(\"jsdoc\")) {\n imports.push(`import jsdoc from \"eslint-plugin-jsdoc\";`);\n }\n return imports;\n}\n\nfunction buildRulesObject(\n entries: EslintRuleEntry[],\n): Record<string, unknown> {\n const rules: Record<string, unknown> = {};\n for (const entry of entries) {\n if (entry.options && entry.options.length > 0) {\n rules[entry.rule] = [entry.severity, ...entry.options];\n } else {\n rules[entry.rule] = entry.severity;\n }\n }\n return rules;\n}\n\nexport function generateEslintExport(profile: Profile): GeneratedFile {\n const entries = collectEslintExtensions(profile);\n addImportOrderRule(profile, entries);\n\n const plugins = detectRequiredPlugins(entries);\n const imports = generateImportStatements(plugins);\n const rules = buildRulesObject(entries);\n\n const header = [\n `// Generated by codewatch for ${profile.author}`,\n `// Date: ${profile.generated}`,\n `// Do not edit manually - regenerate with: codewatch export --format eslint`,\n \"\",\n ].join(\"\\n\");\n\n const content = [\n header,\n ...imports,\n \"\",\n `export default ${JSON.stringify({ rules }, null, 2)};`,\n \"\",\n ].join(\"\\n\");\n\n return { path: \"eslint.config.js\", content };\n}\n","import type { Profile } from \"../schema/profile.js\";\nimport type { StyleRule } from \"../schema/style-rule.js\";\nimport type { GeneratedFile } from \"./types.js\";\n\ninterface RuffLintSubsections {\n mccabe?: { maxComplexity: number };\n pydocstyle?: { convention: string };\n isort?: { sectionOrder: string[] };\n}\n\ninterface RuffLint extends RuffLintSubsections {\n select: string[];\n ignore: string[];\n fixable: string[];\n}\n\ninterface RuffConfig {\n lineLength?: number;\n lint: RuffLint;\n}\n\ninterface RuffAccumulator extends RuffLintSubsections {\n select: Set<string>;\n}\n\nconst CATEGORY_KEYS = [\n \"naming\",\n \"structure\",\n \"documentation\",\n \"errorHandling\",\n \"formatting\",\n \"patterns\",\n] as const;\n\nfunction addExtensionCodes(rule: StyleRule, select: Set<string>): void {\n if (!rule.extensions?.ruff) return;\n const ext = rule.extensions.ruff as { codes?: string[] };\n if (!ext.codes) return;\n for (const code of ext.codes) {\n select.add(code.replace(/\\d+$/, \"\"));\n }\n}\n\nfunction applyFunctionMaxLines(\n category: string,\n name: string,\n rule: StyleRule,\n acc: RuffAccumulator,\n): void {\n if (category !== \"structure\" || name !== \"functionMaxLines\") return;\n acc.select.add(\"C90\");\n if (typeof rule.convention === \"number\") {\n acc.mccabe = { maxComplexity: rule.convention };\n }\n}\n\nfunction applyRule(\n category: string,\n name: string,\n rule: StyleRule,\n acc: RuffAccumulator,\n): void {\n addExtensionCodes(rule, acc.select);\n\n if (category === \"naming\") {\n acc.select.add(\"N\");\n }\n\n if (category === \"structure\" && name === \"importOrder\") {\n acc.select.add(\"I\");\n if (Array.isArray(rule.convention)) {\n acc.isort = { sectionOrder: rule.convention as string[] };\n }\n }\n\n if (category === \"documentation\" && name === \"functionDocs\") {\n acc.select.add(\"D\");\n if (typeof rule.convention === \"string\") {\n acc.pydocstyle = { convention: rule.convention };\n }\n }\n\n applyFunctionMaxLines(category, name, rule, acc);\n}\n\nfunction lineLengthOf(profile: Profile): number | undefined {\n const lineLengthRule = profile.formatting?.lineLength;\n if (lineLengthRule && typeof lineLengthRule.convention === \"number\") {\n return lineLengthRule.convention;\n }\n return undefined;\n}\n\nfunction buildRuffConfig(profile: Profile): RuffConfig {\n const thresholds = profile.severityThresholds;\n const acc: RuffAccumulator = { select: new Set<string>() };\n const fixable = new Set<string>([\"ALL\"]);\n\n for (const category of CATEGORY_KEYS) {\n const section = profile[category];\n if (!section) continue;\n\n for (const [name, rule] of Object.entries(\n section as Record<string, StyleRule>,\n )) {\n if (rule.confidence < thresholds.info) continue;\n applyRule(category, name, rule, acc);\n }\n }\n\n return {\n lineLength: lineLengthOf(profile),\n lint: {\n select: [...acc.select].sort(),\n ignore: [],\n fixable: [...fixable],\n mccabe: acc.mccabe,\n pydocstyle: acc.pydocstyle,\n isort: acc.isort,\n },\n };\n}\n\nfunction toTomlArray(items: string[]): string {\n return `[${items.map((s) => `\"${s}\"`).join(\", \")}]`;\n}\n\nfunction serializeLintTable(lint: RuffLint): string[] {\n const lines: string[] = [\"[lint]\"];\n if (lint.select.length > 0) {\n lines.push(`select = ${toTomlArray(lint.select)}`);\n }\n if (lint.ignore.length > 0) {\n lines.push(`ignore = ${toTomlArray(lint.ignore)}`);\n }\n if (lint.fixable.length > 0) {\n lines.push(`fixable = ${toTomlArray(lint.fixable)}`);\n }\n lines.push(\"\");\n return lines;\n}\n\nfunction serializeLintSubtables(lint: RuffLintSubsections): string[] {\n const lines: string[] = [];\n\n if (lint.mccabe) {\n lines.push(\"[lint.mccabe]\");\n lines.push(`max-complexity = ${lint.mccabe.maxComplexity}`);\n lines.push(\"\");\n }\n\n if (lint.pydocstyle) {\n lines.push(\"[lint.pydocstyle]\");\n lines.push(`convention = \"${lint.pydocstyle.convention}\"`);\n lines.push(\"\");\n }\n\n if (lint.isort) {\n lines.push(\"[lint.isort]\");\n lines.push(`section-order = ${toTomlArray(lint.isort.sectionOrder)}`);\n lines.push(\"\");\n }\n\n return lines;\n}\n\nfunction serializeToToml(config: RuffConfig): string {\n const lines: string[] = [];\n\n if (config.lineLength !== undefined) {\n lines.push(`line-length = ${config.lineLength}`);\n lines.push(\"\");\n }\n\n lines.push(...serializeLintTable(config.lint));\n lines.push(...serializeLintSubtables(config.lint));\n\n return lines.join(\"\\n\");\n}\n\nexport function generateRuffExport(profile: Profile): GeneratedFile {\n const config = buildRuffConfig(profile);\n\n const header = [\n `# Generated by codewatch for ${profile.author}`,\n `# Date: ${profile.generated}`,\n `# Do not edit manually - regenerate with: codewatch export --format ruff`,\n \"\",\n ].join(\"\\n\");\n\n return {\n path: \"ruff.toml\",\n content: header + serializeToToml(config),\n };\n}\n","import type { Profile } from \"../schema/profile.js\";\nimport type { GeneratedFile } from \"./types.js\";\nimport {\n extractAllRules,\n type RuleEntry,\n} from \"./template-helpers.js\";\n\nfunction capitalize(str: string): string {\n const spaced = str.replace(/([A-Z])/g, \" $1\");\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nfunction formatConvention(convention: unknown): string {\n if (typeof convention === \"string\") return convention;\n if (typeof convention === \"number\") return String(convention);\n if (typeof convention === \"boolean\") return String(convention);\n return JSON.stringify(convention);\n}\n\nfunction groupByCategory(rules: RuleEntry[]): Map<string, RuleEntry[]> {\n const byCategory = new Map<string, RuleEntry[]>();\n for (const rule of rules) {\n const existing = byCategory.get(rule.category) ?? [];\n existing.push(rule);\n byCategory.set(rule.category, existing);\n }\n return byCategory;\n}\n\nfunction exampleLines(examples: NonNullable<RuleEntry[\"examples\"]>): string[] {\n const lines: string[] = [];\n for (const example of examples) {\n if (example.good) {\n lines.push(\"```typescript\");\n lines.push(\"// Preferred\");\n lines.push(example.good);\n lines.push(\"```\");\n lines.push(\"\");\n }\n if (example.bad) {\n lines.push(\"```typescript\");\n lines.push(\"// Avoid\");\n lines.push(example.bad);\n lines.push(\"```\");\n lines.push(\"\");\n }\n }\n return lines;\n}\n\nfunction ruleLines(rule: RuleEntry): string[] {\n const lines: string[] = [];\n const confPct = (rule.confidence * 100).toFixed(0);\n const value = formatConvention(rule.convention);\n\n lines.push(`### ${capitalize(rule.name)}`);\n lines.push(\"\");\n lines.push(\n `**Convention**: \\`${value}\\` | **Confidence**: ${confPct}%${rule.stability ? ` | **Stability**: ${rule.stability}` : \"\"}`,\n );\n lines.push(\"\");\n\n if (rule.description) {\n lines.push(rule.description);\n lines.push(\"\");\n }\n\n if (rule.examples && rule.examples.length > 0) {\n lines.push(...exampleLines(rule.examples));\n }\n\n return lines;\n}\n\nexport function generateMarkdownExport(profile: Profile): GeneratedFile {\n const allRules = extractAllRules(profile);\n const byCategory = groupByCategory(allRules);\n const lines: string[] = [];\n\n lines.push(`# ${profile.author}'s Code Style Guide`);\n lines.push(\"\");\n lines.push(`> Generated by codewatch on ${profile.generated}`);\n lines.push(\n `> Sources: ${profile.sources.length > 0 ? profile.sources.join(\", \") : \"N/A\"}`,\n );\n lines.push(\"\");\n\n for (const [category, rules] of byCategory) {\n lines.push(`## ${capitalize(category)}`);\n lines.push(\"\");\n\n const sorted = [...rules].sort((a, b) => b.confidence - a.confidence);\n for (const rule of sorted) {\n lines.push(...ruleLines(rule));\n }\n }\n\n return {\n path: \"style-guide.md\",\n content: lines.join(\"\\n\"),\n };\n}\n","import type { Profile } from \"../schema/profile.js\";\nimport type { StyleRule } from \"../schema/style-rule.js\";\nimport type { GeneratedFile } from \"./types.js\";\n\nfunction getConvention<T>(\n section: Record<string, StyleRule>,\n key: string,\n): T | undefined {\n const rule = section[key];\n if (!rule) return undefined;\n return rule.convention as T;\n}\n\nfunction indentAndNewlineLines(formatting: Record<string, StyleRule>): string[] {\n const lines: string[] = [];\n\n const indentStyle = getConvention<string>(formatting, \"indentStyle\");\n if (indentStyle) {\n const value =\n indentStyle === \"spaces\"\n ? \"space\"\n : indentStyle === \"tabs\"\n ? \"tab\"\n : indentStyle;\n lines.push(`indent_style = ${value}`);\n }\n\n const indentSize = getConvention<number>(formatting, \"indentSize\");\n if (indentSize !== undefined) {\n lines.push(`indent_size = ${indentSize}`);\n }\n\n const trailingNewline = getConvention<boolean>(\n formatting,\n \"trailingNewline\",\n );\n if (trailingNewline !== undefined) {\n lines.push(`insert_final_newline = ${trailingNewline}`);\n }\n\n return lines;\n}\n\nexport function generateEditorConfigExport(\n profile: Profile,\n): GeneratedFile {\n const formatting = profile.formatting;\n const lines: string[] = [];\n\n lines.push(\"# Generated by codewatch\");\n lines.push(\"root = true\");\n lines.push(\"\");\n lines.push(\"[*]\");\n lines.push(...indentAndNewlineLines(formatting));\n\n lines.push(\"end_of_line = lf\");\n lines.push(\"charset = utf-8\");\n lines.push(\"trim_trailing_whitespace = true\");\n\n const lineLength = getConvention<number>(formatting, \"lineLength\");\n if (lineLength !== undefined) {\n lines.push(`max_line_length = ${lineLength}`);\n }\n\n lines.push(\"\");\n\n return {\n path: \".editorconfig\",\n content: lines.join(\"\\n\"),\n };\n}\n","import type { Profile } from \"../schema/profile.js\";\nimport type { GeneratedFile } from \"./types.js\";\nimport { generateSkillFiles } from \"./skill.js\";\nimport { generateClaudeRules } from \"./claude-rules.js\";\nimport { generateHooksConfig } from \"./hooks.js\";\nimport { generateEslintExport } from \"./eslint.js\";\nimport { generateRuffExport } from \"./ruff.js\";\nimport { generateMarkdownExport } from \"./markdown.js\";\nimport { generateEditorConfigExport } from \"./editorconfig.js\";\n\nexport type ExportFormat =\n | \"skill\"\n | \"claude-rules\"\n | \"hooks\"\n | \"eslint\"\n | \"ruff\"\n | \"markdown\"\n | \"editorconfig\";\n\nexport const SUPPORTED_FORMATS: ExportFormat[] = [\n \"skill\",\n \"claude-rules\",\n \"hooks\",\n \"eslint\",\n \"ruff\",\n \"markdown\",\n \"editorconfig\",\n];\n\nfunction hooksFiles(profile: Profile): GeneratedFile[] {\n const config = generateHooksConfig(profile);\n return [\n {\n path: \".claude/settings.json\",\n content: JSON.stringify(config, null, 2),\n },\n ];\n}\n\nexport function exportProfile(\n profile: Profile,\n format: ExportFormat,\n): GeneratedFile[] {\n switch (format) {\n case \"skill\":\n return generateSkillFiles(profile);\n case \"claude-rules\":\n return generateClaudeRules(profile);\n case \"hooks\":\n return hooksFiles(profile);\n case \"eslint\":\n return [generateEslintExport(profile)];\n case \"ruff\":\n return [generateRuffExport(profile)];\n case \"markdown\":\n return [generateMarkdownExport(profile)];\n case \"editorconfig\":\n return [generateEditorConfigExport(profile)];\n default:\n throw new Error(\n `Unsupported export format: \"${format as string}\". Supported formats: ${SUPPORTED_FORMATS.join(\", \")}`,\n );\n }\n}\n"],"mappings":";AAAA,SAAS,SAAS;AAEX,IAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,EACzB,QAAQ,EAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;AAEM,IAAM,kBAAkB,EAAE,KAAK,CAAC,QAAQ,UAAU,KAAK,CAAC;AAExD,IAAM,mBAAmB,EAAE,KAAK;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,kBAAkB,EAAE,OAAO;AAAA,EACtC,YAAY,EAAE,MAAM;AAAA,IAClB,EAAE,OAAO;AAAA,IACT,EAAE,OAAO;AAAA,IACT,EAAE,QAAQ;AAAA,IACV,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EACpB,CAAC;AAAA,EACD,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACnC,WAAW,gBAAgB,SAAS;AAAA,EACpC,YAAY,iBAAiB,SAAS;AAAA,EACtC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,UAAU,EAAE,MAAM,aAAa,EAAE,SAAS;AAAA,EAC1C,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS;AACzD,CAAC;;;AC9BD,SAAS,KAAAA,UAAS;AAGX,IAAM,iBAAiB;AAE9B,IAAM,iBAAiBC,GAAE,OAAOA,GAAE,OAAO,GAAG,eAAe;AAE3D,IAAM,cAAcA,GAAE,OAAO;AAAA,EAC3B,MAAMA,GAAE,OAAO;AAAA,EACf,aAAaA,GAAE,OAAO;AAAA,EACtB,WAAWA,GAAE,OAAO;AAAA,EACpB,YAAYA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACnC,SAASA,GAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAED,IAAM,oBAAoBA,GAAE,OAAO;AAAA,EACjC,SAASA,GAAE,OAAO;AAAA,EAClB,QAAQA,GAAE,OAAO;AAAA,EACjB,YAAYA,GAAE,QAAQ,EAAE,SAAS;AACnC,CAAC;AAED,IAAM,iBAAiBA,GAAE,OAAO;AAAA,EAC9B,OAAOA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EACzB,QAAQ,eAAe,SAAS;AAAA,EAChC,WAAW,eAAe,SAAS;AAAA,EACnC,eAAe,eAAe,SAAS;AAAA,EACvC,eAAe,eAAe,SAAS;AAAA,EACvC,YAAY,eAAe,SAAS;AAAA,EACpC,UAAU,eAAe,SAAS;AACpC,CAAC;AAED,IAAM,2BAA2BA,GAAE,OAAO;AAAA,EACxC,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EAC9B,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EAC7B,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAC/B,CAAC;AAEM,IAAM,8BAA8B;AAAA,EACzC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AACR;AAEO,IAAM,gBAAgBA,GAAE,OAAO;AAAA,EACpC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,eAAeA,GAAE,OAAO;AAAA,EACxB,QAAQA,GAAE,OAAO;AAAA,EACjB,WAAWA,GAAE,OAAO;AAAA,EACpB,SAASA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EAE3B,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,eAAe;AAAA,EACf,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,UAAU;AAAA,EAEV,QAAQA,GAAE,OAAO;AAAA,IACf,UAAUA,GAAE,MAAM,WAAW;AAAA,EAC/B,CAAC;AAAA,EAED,cAAcA,GAAE,OAAO;AAAA,IACrB,cAAcA,GAAE,MAAM,iBAAiB;AAAA,EACzC,CAAC;AAAA,EAED,WAAWA,GAAE,MAAM,cAAc;AAAA,EAEjC,oBAAoB,yBAAyB,QAAQ,2BAA2B;AAClF,CAAC;AAKM,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AChFA,YAAY,QAAQ;AAGpB,eAAsB,YAAY,UAAoC;AACpE,QAAM,MAAM,MAAS,YAAS,UAAU,OAAO;AAC/C,QAAM,OAAgB,KAAK,MAAM,GAAG;AACpC,SAAO,cAAc,MAAM,IAAI;AACjC;AAEA,eAAsB,aACpB,UACA,SACe;AACf,QAAM,YAAY,cAAc,MAAM,OAAO;AAC7C,QAAS,aAAU,UAAU,KAAK,UAAU,WAAW,MAAM,CAAC,IAAI,IAAI;AACxE;AAEO,SAAS,gBAAgB,MAAe;AAC7C,SAAO,cAAc,UAAU,IAAI;AACrC;;;ACbA,IAAM,aAA0B,CAAC;AAE1B,SAAS,kBAAkB,WAA4B;AAC5D,aAAW,KAAK,SAAS;AACzB,aAAW,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AACxD;AAEO,SAAS,gBAA0C;AACxD,SAAO;AACT;;;ACVO,SAAS,eACd,SACyB;AACzB,MAAI,UAAU,EAAE,GAAG,QAAQ;AAC3B,QAAM,UAAU,QAAQ;AAExB,MAAI,YAAY,gBAAgB;AAC9B,WAAO;AAAA,EACT;AAEA,QAAMC,cAAa,cAAc;AACjC,MAAI,iBAAiB;AAErB,aAAW,aAAaA,aAAY;AAClC,QAAI,UAAU,SAAS,gBAAgB;AACrC,gBAAU,UAAU,QAAQ,OAAO;AACnC,uBAAiB,UAAU;AAAA,IAC7B;AAAA,EACF;AAEA,MAAI,mBAAmB,gBAAgB;AACrC,UAAM,IAAI;AAAA,MACR,kCAAkC,OAAO,OAAO,cAAc;AAAA,IAChE;AAAA,EACF;AAEA,SAAO;AACT;;;ACjBO,SAAS,gBAAgB,SAA+B;AAC7D,QAAM,QAAqB,CAAC;AAE5B,aAAW,YAAY,oBAAoB;AACzC,UAAM,UAAU,QAAQ,QAAQ;AAChC,QAAI,CAAC,WAAW,OAAO,YAAY,SAAU;AAE7C,eAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,UAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,YAAM,KAAK;AAAA,QACT;AAAA,QACA;AAAA,QACA,YAAY,KAAK;AAAA,QACjB,YAAY,KAAK;AAAA,QACjB,WAAW,KAAK;AAAA,QAChB,aAAa,KAAK;AAAA,QAClB,UAAU,KAAK;AAAA,QACf,YAAY,KAAK;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,YACd,SACA,QAAgB,GACH;AACb,QAAM,iBAAiB,QAAQ,oBAAoB,SAAS;AAC5D,SAAO,gBAAgB,OAAO,EAC3B,OAAO,CAAC,MAAM,EAAE,cAAc,cAAc,EAC5C,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU,EAC1C,MAAM,GAAG,KAAK;AACnB;AAEO,SAAS,oBACd,SACA,UACa;AACb,SAAO,gBAAgB,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ;AACvE;AAEO,SAAS,mBACd,SAC0B;AAC1B,QAAM,UAAU,oBAAI,IAAyB;AAC7C,aAAW,QAAQ,gBAAgB,OAAO,GAAG;AAC3C,UAAM,WAAW,QAAQ,IAAI,KAAK,QAAQ,KAAK,CAAC;AAChD,aAAS,KAAK,IAAI;AAClB,YAAQ,IAAI,KAAK,UAAU,QAAQ;AAAA,EACrC;AACA,SAAO;AACT;AAEA,IAAM,eAAe,CAAC,GAAc,MAClC,EAAE,aAAa,EAAE;AAEZ,SAAS,eAAe,SAI7B;AACA,QAAM,WAAW,gBAAgB,OAAO;AACxC,QAAM,iBAAiB,QAAQ,oBAAoB,SAAS;AAC5D,QAAM,gBAAgB,QAAQ,oBAAoB,QAAQ;AAC1D,QAAM,gBAAgB,QAAQ,oBAAoB,QAAQ;AAE1D,QAAM,WAAwB,CAAC;AAC/B,QAAM,SAAsB,CAAC;AAC7B,QAAM,YAAyB,CAAC;AAEhC,aAAW,QAAQ,UAAU;AAC3B,QAAI,KAAK,cAAc,gBAAgB;AACrC,eAAS,KAAK,IAAI;AAAA,IACpB,WAAW,KAAK,cAAc,eAAe;AAC3C,aAAO,KAAK,IAAI;AAAA,IAClB,WAAW,KAAK,cAAc,eAAe;AAC3C,gBAAU,KAAK,IAAI;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,KAAK,YAAY;AAC1B,SAAO,KAAK,YAAY;AACxB,YAAU,KAAK,YAAY;AAE3B,SAAO,EAAE,UAAU,QAAQ,UAAU;AACvC;AAEO,SAAS,mBAAmB,MAAyB;AAC1D,MACE,OAAO,KAAK,eAAe,aAC3B,OAAO,KAAK,eAAe,UAC3B;AACA,WAAO,KAAK,eAAe,KAAK,UAAU,KAAK,UAAU;AAAA,EAC3D;AACA,MAAI,MAAM,QAAQ,KAAK,UAAU,GAAG;AAClC,WAAO,KAAK,WAAW,KAAK,UAAK;AAAA,EACnC;AACA,SAAO,OAAO,KAAK,UAAU;AAC/B;AAEO,SAAS,gBAAgB,SAA4B;AAC1D,QAAM,QAAkB,CAAC;AACzB,QAAM,uBACJ,OAAO,KAAK,QAAQ,MAAM,EAAE,SAAS,KACrC,OAAO,KAAK,QAAQ,SAAS,EAAE,SAAS;AAC1C,MAAI,qBAAsB,OAAM,KAAK,YAAY;AACjD,SAAO,MAAM,SAAS,IAAI,QAAQ,CAAC,YAAY;AACjD;;;AC5HA,OAAO,gBAAgB;AACvB,SAAS,YAAY,oBAAoB;AACzC,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAG9B,SAAS,gBAAgB,OAAuB;AAC9C,MAAI,MAAM;AACV,SAAO,CAAC,WAAW,KAAK,KAAK,cAAc,CAAC,GAAG;AAC7C,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,WAAW,IAAK,OAAM,IAAI,MAAM,8CAA8C,KAAK,EAAE;AACzF,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAEO,SAAS,aAAa,MAA2C;AACtE,QAAM,OAAO,gBAAgB,QAAQ,cAAc,YAAY,GAAG,CAAC,CAAC;AACpE,QAAM,SAAS,aAAa,KAAK,MAAM,aAAa,IAAI,GAAG,OAAO;AAClE,SAAO,WAAW,QAAQ,MAAM;AAClC;;;ACVA,SAAS,wBAAwB,SAAkB;AACjD,QAAM,QAAQ,eAAe,OAAO;AAEpC,QAAM,UAAU,CAAC,OAAkB;AAAA,IACjC,MAAM,GAAG,EAAE,QAAQ,IAAI,EAAE,IAAI;AAAA,IAC7B,oBAAoB,mBAAmB,CAAC;AAAA,IACxC,oBAAoB,EAAE,aAAa,KAAK,QAAQ,CAAC;AAAA,EACnD;AAEA,SAAO;AAAA,IACL,eAAe,MAAM,SAAS,IAAI,OAAO;AAAA,IACzC,aAAa,MAAM,OAAO,IAAI,OAAO;AAAA,IACrC,gBAAgB,MAAM,UAAU,IAAI,OAAO;AAAA,EAC7C;AACF;AAEA,SAAS,mBAAmB,SAAkB;AAC5C,QAAM,UAAU,QAAQ;AACxB,SAAO,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO;AAAA,IACpD,OAAO,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC;AAAA,IAClD,YACE,OAAO,KAAK,eAAe,WACvB,KAAK,aACL,KAAK,UAAU,KAAK,UAAU;AAAA,IACpC,oBAAoB,KAAK,aAAa,KAAK,QAAQ,CAAC;AAAA,IACpD,WAAW,KAAK;AAAA,IAChB,YAAY,KAAK;AAAA,IACjB,aAAa,KAAK;AAAA,IAClB,UAAU,KAAK;AAAA,EACjB,EAAE;AACJ;AAEA,SAAS,qBAAqB,SAAkB;AAC9C,QAAM,UAAU,QAAQ;AACxB,QAAM,eAAe,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO;AAAA,IAClE;AAAA,IACA,UACE,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa;AAAA,IAC1D,oBAAoB,KAAK,aAAa,KAAK,QAAQ,CAAC;AAAA,IACpD,aAAa,KAAK;AAAA,IAClB,YAAY,KAAK;AAAA,IACjB,UAAU,KAAK;AAAA,EACjB,EAAE;AAEF,QAAM,oBAAoB,QAAQ,WAAW;AAC7C,MAAI;AACJ,MAAI,qBAAqB,MAAM,QAAQ,kBAAkB,UAAU,GAAG;AACpE,oBAAgB,kBAAkB;AAAA,EACpC;AAEA,SAAO,EAAE,UAAU,cAAc,mBAAmB,cAAc;AACpE;AAEA,SAAS,mBAAmB,SAAkB;AAC5C,SAAO,QAAQ,OAAO,SAAS,IAAI,CAAC,WAAW;AAAA,IAC7C,MAAM,MAAM;AAAA,IACZ,aAAa,MAAM;AAAA,IACnB,SAAS,MAAM;AAAA,EACjB,EAAE;AACJ;AAEA,SAAS,yBAAyB,SAAkB;AAClD,SAAO,QAAQ,aAAa,aAAa,IAAI,CAAC,QAAQ;AAAA,IACpD,SAAS,GAAG;AAAA,IACZ,QAAQ,GAAG;AAAA,EACb,EAAE;AACJ;AAEA,SAAS,qBAAqB,SAAkB,MAAc;AAC5D,QAAM,QAAQ,eAAe,OAAO;AACpC,QAAM,UAAU,CAAC,OAAkB;AAAA,IACjC,UAAU,EAAE;AAAA,IACZ,MAAM,EAAE;AAAA,IACR,YACE,OAAO,EAAE,eAAe,WACpB,EAAE,aACF,KAAK,UAAU,EAAE,UAAU;AAAA,IACjC,oBAAoB,EAAE,aAAa,KAAK,QAAQ,CAAC;AAAA,IACjD,oBAAoB,mBAAmB,CAAC;AAAA,IACxC,aAAa,EAAE;AAAA,EACjB;AAEA,SAAO;AAAA,IACL,UAAU,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC;AAAA,IACrD,eAAe,MAAM,SAAS,IAAI,OAAO;AAAA,IACzC,aAAa,MAAM,OAAO,IAAI,OAAO;AAAA,IACrC,gBAAgB,MAAM,UAAU,IAAI,OAAO;AAAA,EAC7C;AACF;AAEA,SAAS,gBAAgB,SAAkB,WAAoC;AAC7E,QAAM,gBAAgB,aAAa,cAAc;AACjD,QAAM,SAAS,mBAAmB,OAAO;AACzC,QAAM,eAAe,yBAAyB,OAAO;AACrD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,cAAc;AAAA,MACrB,QAAQ,QAAQ;AAAA,MAChB,GAAG,wBAAwB,OAAO;AAAA,MAClC;AAAA,MACA,QAAQ,OAAO,SAAS,IAAI,SAAS;AAAA,MACrC,cAAc,aAAa,SAAS,IAAI,eAAe;AAAA,IACzD,CAAC;AAAA,EACH;AACF;AAEO,SAAS,mBAAmB,SAAmC;AACpE,QAAM,QAAyB,CAAC;AAChC,QAAM,YAAY,gBAAgB,OAAO;AAEzC,QAAM,KAAK,gBAAgB,SAAS,SAAS,CAAC;AAE9C,QAAM,iBAAiB,aAAa,eAAe;AACnD,QAAM,KAAK;AAAA,IACT,MAAM;AAAA,IACN,SAAS,eAAe,EAAE,OAAO,mBAAmB,OAAO,EAAE,CAAC;AAAA,EAChE,CAAC;AAED,QAAM,mBAAmB,aAAa,iBAAiB;AACvD,QAAM,KAAK;AAAA,IACT,MAAM;AAAA,IACN,SAAS,iBAAiB,qBAAqB,OAAO,CAAC;AAAA,EACzD,CAAC;AAED,QAAM,eAAe,aAAa,qBAAqB;AACvD,aAAW,QAAQ,WAAW;AAC5B,UAAM,KAAK;AAAA,MACT,MAAM,2BAA2B,IAAI;AAAA,MACrC,SAAS,aAAa,qBAAqB,SAAS,IAAI,CAAC;AAAA,IAC3D,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AC3IA,SAAS,kBAAkB,OAAiB,aAA6B;AACvE,SAAO;AAAA,IACL;AAAA,IACA,iBAAiB,WAAW;AAAA,IAC5B,WAAW,MAAM,KAAK,IAAI,CAAC;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,eACP,UACA,MACA,YACA,aACQ;AACR,QAAM,QACJ,OAAO,eAAe,WAClB,aACA,KAAK,UAAU,UAAU;AAC/B,QAAM,OAAO,cAAc,OAAO,WAAW,KAAK;AAClD,SAAO,OAAO,QAAQ,IAAI,IAAI,SAAS,KAAK,KAAK,IAAI;AACvD;AAEA,SAAS,WAAW,QAAgB,OAA4B;AAC9D,SAAO;AAAA,IACL,KAAK,MAAM;AAAA,IACX;AAAA,IACA,GAAG,MACA,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU,EAC1C;AAAA,MAAI,CAAC,MACJ,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW;AAAA,IAChE;AAAA,EACJ,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,oBAAoB,SAAmC;AACrE,QAAM,QAAyB,CAAC;AAChC,QAAM,WAAW,gBAAgB,OAAO;AACxC,QAAM,gBAAgB,QAAQ,oBAAoB,QAAQ;AAE1D,QAAM,gBAAgB,SAAS;AAAA,IAC7B,CAAC,MAAM,EAAE,cAAc;AAAA,EACzB;AAEA,MAAI,cAAc,SAAS,GAAG;AAC5B,UAAM,cAAc;AAAA,MAClB,CAAC,WAAW,UAAU;AAAA,MACtB,GAAG,QAAQ,MAAM;AAAA,IACnB;AAEA,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,SAAS,cAAc,WAAW,QAAQ,QAAQ,aAAa,IAAI;AAAA,IACrE,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;ACnDO,SAAS,oBACd,UACqB;AACrB,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,QACE,OAAO;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;;;AC1BO,SAAS,iBACd,YACA,YACiB;AACjB,MAAI,cAAc,WAAW,MAAO,QAAO;AAC3C,MAAI,cAAc,WAAW,KAAM,QAAO;AAC1C,MAAI,cAAc,WAAW,KAAM,QAAO;AAC1C,SAAO;AACT;AAEO,SAAS,aAAa,GAAqB;AAChD,SAAO,MAAM,UAAU,IAAI,MAAM,SAAS,IAAI;AAChD;AAEA,IAAM,mBAA2C;AAAA,EAC/C,WAAW;AAAA,EACX,WAAW;AAAA,EACX,OAAO;AAAA,EACP,WAAW;AACb;AAEA,SAAS,uBAAuB,MAAwC;AACtE,QAAM,YAAY,KAAK,YAAY;AACnC,SAAO,aACL,OAAO,cAAc,YACrB,aAAa,aACb,MAAM,QAAS,UAAsC,OAAO,IACxD,UAAsC,UACxC;AACN;AAEA,SAAS,gBAAgB,MAAiB,cAAiC;AACzE,QAAM,gBAAgB,uBAAuB,IAAI;AACjD,MAAI,cAAe,QAAO;AAC1B,MAAI,OAAO,KAAK,eAAe,UAAU;AACvC,WAAO,CAAC,EAAE,UAAU,cAAc,QAAQ,CAAC,KAAK,UAAU,EAAE,CAAC;AAAA,EAC/D;AACA,SAAO,CAAC;AACV;AAEO,SAAS,0BACd,SAC0B;AAC1B,QAAM,aAAa,QAAQ;AAC3B,QAAM,SAAS,QAAQ;AACvB,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,YAAuB,CAAC;AAC9B,MAAI,cAA+B;AAEnC,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,MAAM,GAAG;AAChD,QAAI,QAAQ,QAAS;AACrB,UAAM,eAAe,iBAAiB,GAAG;AACzC,QAAI,CAAC,aAAc;AAEnB,UAAM,WAAW,iBAAiB,KAAK,YAAY,UAAU;AAC7D,QAAI,CAAC,SAAU;AACf,QAAI,CAAC,eAAe,aAAa,QAAQ,IAAI,aAAa,WAAW,GAAG;AACtE,oBAAc;AAAA,IAChB;AAEA,cAAU,KAAK,GAAG,gBAAgB,MAAM,YAAY,CAAC;AAAA,EACvD;AAEA,MAAI,UAAU,WAAW,KAAK,CAAC,YAAa,QAAO;AACnD,SAAO,CAAC,wCAAwC,CAAC,aAAa,GAAG,SAAS,CAAC;AAC7E;AAEO,SAAS,qBACd,SAC0B;AAC1B,QAAM,cAAc,QAAQ,WAAW;AACvC,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,WAAW,iBAAiB,YAAY,YAAY,QAAQ,kBAAkB;AACpF,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,aAAa,MAAM,QAAQ,YAAY,UAAU,IACnD,YAAY,aACZ,CAAC,WAAW,YAAY,YAAY,UAAU;AAElD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,wBACd,SAC0B;AAC1B,QAAM,WAAW,QAAQ,WAAW;AACpC,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,WAAW,iBAAiB,SAAS,YAAY,QAAQ,kBAAkB;AACjF,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,OAAO,SAAS,eAAe,SAAU,QAAO;AAEpD,SAAO,CAAC,0BAA0B,CAAC,UAAU,EAAE,KAAK,SAAS,WAAW,CAAC,CAAC;AAC5E;AAEO,SAAS,oBACd,SAC0B;AAC1B,QAAM,QAAQ,QAAQ,QAAQ;AAC9B,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,WAAW,iBAAiB,MAAM,YAAY,QAAQ,kBAAkB;AAC9E,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,OAAO,MAAM,eAAe,SAAU,QAAO;AAEjD,QAAM,UAAkC;AAAA,IACtC,cAAc;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AAEA,SAAO;AAAA,IACL;AAAA,IACA,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,QAAQ,MAAM,UAAU,KAAK,WAAW,GAAG,KAAK,EAAE,CAAC;AAAA,EAC3E;AACF;AAEO,SAAS,gBACd,SAC0B;AAC1B,QAAM,QAAkC,CAAC;AACzC,QAAM,OAAO,QAAQ;AACrB,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,eAAe,KAAK;AAC1B,MAAI,CAAC,aAAc,QAAO;AAE1B,QAAM,WAAW,iBAAiB,aAAa,YAAY,QAAQ,kBAAkB;AACrF,MAAI,CAAC,SAAU,QAAO;AAEtB,MAAI,aAAa,eAAe,mBAAmB;AACjD,UAAM,KAAK,CAAC,uBAAuB,CAAC,UAAU,EAAE,YAAY,KAAK,CAAC,CAAC,CAAC;AAAA,EACtE,WAAW,aAAa,eAAe,aAAa;AAClD,UAAM,KAAK,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;AAAA,EAChD;AAEA,SAAO;AACT;;;AClIA,SAAS,eACP,MACA,YACwB;AACxB,QAAM,MAAM,KAAK,YAAY;AAG7B,MAAI,CAAC,IAAK,QAAO;AAEjB,QAAM,MAAM,iBAAiB,KAAK,YAAY,UAAU;AACxD,MAAI,QAAQ,KAAM,QAAO;AAEzB,QAAM,SAAS,IAAI,KAAK,SAAS,GAAG,IAChC,IAAI,KAAK,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,IACzC;AAEJ,SAAO;AAAA,IACL;AAAA,IACA,MAAM,IAAI;AAAA,IACV,UAAU,QAAQ,SAAS,SAAS;AAAA,IACpC,SAAS,IAAI;AAAA,EACf;AACF;AAEA,SAAS,wBAAwB,SAAqC;AACpE,QAAM,UAA6B,CAAC;AAEpC,aAAW,YAAY,oBAAoB;AACzC,UAAM,UAAU,QAAQ,QAAQ;AAChC,QAAI,CAAC,QAAS;AAEd,eAAW,CAAC,EAAE,IAAI,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC9C,YAAM,QAAQ,eAAe,MAAM,QAAQ,kBAAkB;AAC7D,UAAI,MAAO,SAAQ,KAAK,KAAK;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,SAAkB,SAAkC;AAC9E,QAAM,SAAS,qBAAqB,OAAO;AAC3C,MAAI,CAAC,OAAQ;AAEb,QAAM,CAAC,UAAU,UAAU,IAAI;AAC/B,QAAM,cAAc;AACpB,QAAM,WAAW,YAAY,CAAC;AAC9B,MAAI,aAAa,OAAQ;AAEzB,UAAQ,KAAK;AAAA,IACX,QAAQ;AAAA,IACR,MAAM;AAAA,IACN;AAAA,IACA,SAAS,CAAC,YAAY,CAAC,CAAC;AAAA,EAC1B,CAAC;AACH;AAEA,SAAS,sBAAsB,SAAyC;AACtE,QAAM,UAAU,oBAAI,IAAY;AAChC,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,OAAO,SAAS,oBAAoB,GAAG;AAC/C,cAAQ,IAAI,oBAAoB;AAAA,IAClC;AACA,QAAI,MAAM,WAAW,iBAAiB;AACpC,cAAQ,IAAI,eAAe;AAAA,IAC7B;AACA,QAAI,MAAM,OAAO,SAAS,SAAS,GAAG;AACpC,cAAQ,IAAI,SAAS;AAAA,IACvB;AACA,QAAI,MAAM,OAAO,SAAS,OAAO,GAAG;AAClC,cAAQ,IAAI,OAAO;AAAA,IACrB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,SAAgC;AAChE,QAAM,UAAoB,CAAC;AAC3B,MAAI,QAAQ,IAAI,oBAAoB,GAAG;AACrC,YAAQ,KAAK,0DAA0D;AACvE,YAAQ,KAAK,mDAAmD;AAAA,EAClE;AACA,MAAI,QAAQ,IAAI,eAAe,GAAG;AAChC,YAAQ,KAAK,0DAA0D;AAAA,EACzE;AACA,MAAI,QAAQ,IAAI,SAAS,GAAG;AAC1B,YAAQ,KAAK,8CAA8C;AAAA,EAC7D;AACA,MAAI,QAAQ,IAAI,OAAO,GAAG;AACxB,YAAQ,KAAK,0CAA0C;AAAA,EACzD;AACA,SAAO;AACT;AAEA,SAAS,iBACP,SACyB;AACzB,QAAM,QAAiC,CAAC;AACxC,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,WAAW,MAAM,QAAQ,SAAS,GAAG;AAC7C,YAAM,MAAM,IAAI,IAAI,CAAC,MAAM,UAAU,GAAG,MAAM,OAAO;AAAA,IACvD,OAAO;AACL,YAAM,MAAM,IAAI,IAAI,MAAM;AAAA,IAC5B;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB,SAAiC;AACpE,QAAM,UAAU,wBAAwB,OAAO;AAC/C,qBAAmB,SAAS,OAAO;AAEnC,QAAM,UAAU,sBAAsB,OAAO;AAC7C,QAAM,UAAU,yBAAyB,OAAO;AAChD,QAAM,QAAQ,iBAAiB,OAAO;AAEtC,QAAM,SAAS;AAAA,IACb,iCAAiC,QAAQ,MAAM;AAAA,IAC/C,YAAY,QAAQ,SAAS;AAAA,IAC7B;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,QAAM,UAAU;AAAA,IACd;AAAA,IACA,GAAG;AAAA,IACH;AAAA,IACA,kBAAkB,KAAK,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA,IACpD;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,SAAO,EAAE,MAAM,oBAAoB,QAAQ;AAC7C;;;AC9HA,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,kBAAkB,MAAiB,QAA2B;AACrE,MAAI,CAAC,KAAK,YAAY,KAAM;AAC5B,QAAM,MAAM,KAAK,WAAW;AAC5B,MAAI,CAAC,IAAI,MAAO;AAChB,aAAW,QAAQ,IAAI,OAAO;AAC5B,WAAO,IAAI,KAAK,QAAQ,QAAQ,EAAE,CAAC;AAAA,EACrC;AACF;AAEA,SAAS,sBACP,UACA,MACA,MACA,KACM;AACN,MAAI,aAAa,eAAe,SAAS,mBAAoB;AAC7D,MAAI,OAAO,IAAI,KAAK;AACpB,MAAI,OAAO,KAAK,eAAe,UAAU;AACvC,QAAI,SAAS,EAAE,eAAe,KAAK,WAAW;AAAA,EAChD;AACF;AAEA,SAAS,UACP,UACA,MACA,MACA,KACM;AACN,oBAAkB,MAAM,IAAI,MAAM;AAElC,MAAI,aAAa,UAAU;AACzB,QAAI,OAAO,IAAI,GAAG;AAAA,EACpB;AAEA,MAAI,aAAa,eAAe,SAAS,eAAe;AACtD,QAAI,OAAO,IAAI,GAAG;AAClB,QAAI,MAAM,QAAQ,KAAK,UAAU,GAAG;AAClC,UAAI,QAAQ,EAAE,cAAc,KAAK,WAAuB;AAAA,IAC1D;AAAA,EACF;AAEA,MAAI,aAAa,mBAAmB,SAAS,gBAAgB;AAC3D,QAAI,OAAO,IAAI,GAAG;AAClB,QAAI,OAAO,KAAK,eAAe,UAAU;AACvC,UAAI,aAAa,EAAE,YAAY,KAAK,WAAW;AAAA,IACjD;AAAA,EACF;AAEA,wBAAsB,UAAU,MAAM,MAAM,GAAG;AACjD;AAEA,SAAS,aAAa,SAAsC;AAC1D,QAAM,iBAAiB,QAAQ,YAAY;AAC3C,MAAI,kBAAkB,OAAO,eAAe,eAAe,UAAU;AACnE,WAAO,eAAe;AAAA,EACxB;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,SAA8B;AACrD,QAAM,aAAa,QAAQ;AAC3B,QAAM,MAAuB,EAAE,QAAQ,oBAAI,IAAY,EAAE;AACzD,QAAM,UAAU,oBAAI,IAAY,CAAC,KAAK,CAAC;AAEvC,aAAW,YAAY,eAAe;AACpC,UAAM,UAAU,QAAQ,QAAQ;AAChC,QAAI,CAAC,QAAS;AAEd,eAAW,CAAC,MAAM,IAAI,KAAK,OAAO;AAAA,MAChC;AAAA,IACF,GAAG;AACD,UAAI,KAAK,aAAa,WAAW,KAAM;AACvC,gBAAU,UAAU,MAAM,MAAM,GAAG;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAY,aAAa,OAAO;AAAA,IAChC,MAAM;AAAA,MACJ,QAAQ,CAAC,GAAG,IAAI,MAAM,EAAE,KAAK;AAAA,MAC7B,QAAQ,CAAC;AAAA,MACT,SAAS,CAAC,GAAG,OAAO;AAAA,MACpB,QAAQ,IAAI;AAAA,MACZ,YAAY,IAAI;AAAA,MAChB,OAAO,IAAI;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,YAAY,OAAyB;AAC5C,SAAO,IAAI,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC;AAClD;AAEA,SAAS,mBAAmB,MAA0B;AACpD,QAAM,QAAkB,CAAC,QAAQ;AACjC,MAAI,KAAK,OAAO,SAAS,GAAG;AAC1B,UAAM,KAAK,YAAY,YAAY,KAAK,MAAM,CAAC,EAAE;AAAA,EACnD;AACA,MAAI,KAAK,OAAO,SAAS,GAAG;AAC1B,UAAM,KAAK,YAAY,YAAY,KAAK,MAAM,CAAC,EAAE;AAAA,EACnD;AACA,MAAI,KAAK,QAAQ,SAAS,GAAG;AAC3B,UAAM,KAAK,aAAa,YAAY,KAAK,OAAO,CAAC,EAAE;AAAA,EACrD;AACA,QAAM,KAAK,EAAE;AACb,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAqC;AACnE,QAAM,QAAkB,CAAC;AAEzB,MAAI,KAAK,QAAQ;AACf,UAAM,KAAK,eAAe;AAC1B,UAAM,KAAK,oBAAoB,KAAK,OAAO,aAAa,EAAE;AAC1D,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,KAAK,YAAY;AACnB,UAAM,KAAK,mBAAmB;AAC9B,UAAM,KAAK,iBAAiB,KAAK,WAAW,UAAU,GAAG;AACzD,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,KAAK,OAAO;AACd,UAAM,KAAK,cAAc;AACzB,UAAM,KAAK,mBAAmB,YAAY,KAAK,MAAM,YAAY,CAAC,EAAE;AACpE,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,QAA4B;AACnD,QAAM,QAAkB,CAAC;AAEzB,MAAI,OAAO,eAAe,QAAW;AACnC,UAAM,KAAK,iBAAiB,OAAO,UAAU,EAAE;AAC/C,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,QAAM,KAAK,GAAG,mBAAmB,OAAO,IAAI,CAAC;AAC7C,QAAM,KAAK,GAAG,uBAAuB,OAAO,IAAI,CAAC;AAEjD,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,mBAAmB,SAAiC;AAClE,QAAM,SAAS,gBAAgB,OAAO;AAEtC,QAAM,SAAS;AAAA,IACb,gCAAgC,QAAQ,MAAM;AAAA,IAC9C,WAAW,QAAQ,SAAS;AAAA,IAC5B;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,SAAS,gBAAgB,MAAM;AAAA,EAC1C;AACF;;;AC3LA,SAAS,WAAW,KAAqB;AACvC,QAAM,SAAS,IAAI,QAAQ,YAAY,KAAK;AAC5C,SAAO,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AACxD;AAEA,SAAS,iBAAiB,YAA6B;AACrD,MAAI,OAAO,eAAe,SAAU,QAAO;AAC3C,MAAI,OAAO,eAAe,SAAU,QAAO,OAAO,UAAU;AAC5D,MAAI,OAAO,eAAe,UAAW,QAAO,OAAO,UAAU;AAC7D,SAAO,KAAK,UAAU,UAAU;AAClC;AAEA,SAAS,gBAAgB,OAA8C;AACrE,QAAM,aAAa,oBAAI,IAAyB;AAChD,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,WAAW,IAAI,KAAK,QAAQ,KAAK,CAAC;AACnD,aAAS,KAAK,IAAI;AAClB,eAAW,IAAI,KAAK,UAAU,QAAQ;AAAA,EACxC;AACA,SAAO;AACT;AAEA,SAAS,aAAa,UAAwD;AAC5E,QAAM,QAAkB,CAAC;AACzB,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,MAAM;AAChB,YAAM,KAAK,eAAe;AAC1B,YAAM,KAAK,cAAc;AACzB,YAAM,KAAK,QAAQ,IAAI;AACvB,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,EAAE;AAAA,IACf;AACA,QAAI,QAAQ,KAAK;AACf,YAAM,KAAK,eAAe;AAC1B,YAAM,KAAK,UAAU;AACrB,YAAM,KAAK,QAAQ,GAAG;AACtB,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,EAAE;AAAA,IACf;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,UAAU,MAA2B;AAC5C,QAAM,QAAkB,CAAC;AACzB,QAAM,WAAW,KAAK,aAAa,KAAK,QAAQ,CAAC;AACjD,QAAM,QAAQ,iBAAiB,KAAK,UAAU;AAE9C,QAAM,KAAK,OAAO,WAAW,KAAK,IAAI,CAAC,EAAE;AACzC,QAAM,KAAK,EAAE;AACb,QAAM;AAAA,IACJ,qBAAqB,KAAK,wBAAwB,OAAO,IAAI,KAAK,YAAY,qBAAqB,KAAK,SAAS,KAAK,EAAE;AAAA,EAC1H;AACA,QAAM,KAAK,EAAE;AAEb,MAAI,KAAK,aAAa;AACpB,UAAM,KAAK,KAAK,WAAW;AAC3B,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC7C,UAAM,KAAK,GAAG,aAAa,KAAK,QAAQ,CAAC;AAAA,EAC3C;AAEA,SAAO;AACT;AAEO,SAAS,uBAAuB,SAAiC;AACtE,QAAM,WAAW,gBAAgB,OAAO;AACxC,QAAM,aAAa,gBAAgB,QAAQ;AAC3C,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,KAAK,QAAQ,MAAM,qBAAqB;AACnD,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,+BAA+B,QAAQ,SAAS,EAAE;AAC7D,QAAM;AAAA,IACJ,cAAc,QAAQ,QAAQ,SAAS,IAAI,QAAQ,QAAQ,KAAK,IAAI,IAAI,KAAK;AAAA,EAC/E;AACA,QAAM,KAAK,EAAE;AAEb,aAAW,CAAC,UAAU,KAAK,KAAK,YAAY;AAC1C,UAAM,KAAK,MAAM,WAAW,QAAQ,CAAC,EAAE;AACvC,UAAM,KAAK,EAAE;AAEb,UAAM,SAAS,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AACpE,eAAW,QAAQ,QAAQ;AACzB,YAAM,KAAK,GAAG,UAAU,IAAI,CAAC;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,MAAM,KAAK,IAAI;AAAA,EAC1B;AACF;;;ACjGA,SAAS,cACP,SACA,KACe;AACf,QAAM,OAAO,QAAQ,GAAG;AACxB,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK;AACd;AAEA,SAAS,sBAAsB,YAAiD;AAC9E,QAAM,QAAkB,CAAC;AAEzB,QAAM,cAAc,cAAsB,YAAY,aAAa;AACnE,MAAI,aAAa;AACf,UAAM,QACJ,gBAAgB,WACZ,UACA,gBAAgB,SACd,QACA;AACR,UAAM,KAAK,kBAAkB,KAAK,EAAE;AAAA,EACtC;AAEA,QAAM,aAAa,cAAsB,YAAY,YAAY;AACjE,MAAI,eAAe,QAAW;AAC5B,UAAM,KAAK,iBAAiB,UAAU,EAAE;AAAA,EAC1C;AAEA,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,EACF;AACA,MAAI,oBAAoB,QAAW;AACjC,UAAM,KAAK,0BAA0B,eAAe,EAAE;AAAA,EACxD;AAEA,SAAO;AACT;AAEO,SAAS,2BACd,SACe;AACf,QAAM,aAAa,QAAQ;AAC3B,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,0BAA0B;AACrC,QAAM,KAAK,aAAa;AACxB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,GAAG,sBAAsB,UAAU,CAAC;AAE/C,QAAM,KAAK,kBAAkB;AAC7B,QAAM,KAAK,iBAAiB;AAC5B,QAAM,KAAK,iCAAiC;AAE5C,QAAM,aAAa,cAAsB,YAAY,YAAY;AACjE,MAAI,eAAe,QAAW;AAC5B,UAAM,KAAK,qBAAqB,UAAU,EAAE;AAAA,EAC9C;AAEA,QAAM,KAAK,EAAE;AAEb,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,MAAM,KAAK,IAAI;AAAA,EAC1B;AACF;;;ACnDO,IAAM,oBAAoC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,WAAW,SAAmC;AACrD,QAAM,SAAS,oBAAoB,OAAO;AAC1C,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,SAAS,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,IACzC;AAAA,EACF;AACF;AAEO,SAAS,cACd,SACA,QACiB;AACjB,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,mBAAmB,OAAO;AAAA,IACnC,KAAK;AACH,aAAO,oBAAoB,OAAO;AAAA,IACpC,KAAK;AACH,aAAO,WAAW,OAAO;AAAA,IAC3B,KAAK;AACH,aAAO,CAAC,qBAAqB,OAAO,CAAC;AAAA,IACvC,KAAK;AACH,aAAO,CAAC,mBAAmB,OAAO,CAAC;AAAA,IACrC,KAAK;AACH,aAAO,CAAC,uBAAuB,OAAO,CAAC;AAAA,IACzC,KAAK;AACH,aAAO,CAAC,2BAA2B,OAAO,CAAC;AAAA,IAC7C;AACE,YAAM,IAAI;AAAA,QACR,+BAA+B,MAAgB,yBAAyB,kBAAkB,KAAK,IAAI,CAAC;AAAA,MACtG;AAAA,EACJ;AACF;","names":["z","z","migrations"]}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@titan-design/style-profile",
3
+ "version": "0.0.0",
4
+ "description": "Declare one code-style profile and export it as enforcement artifacts: ESLint and ruff configs, EditorConfig, Claude rules, hooks, a skill, and markdown",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "templates",
17
+ "README.md"
18
+ ],
19
+ "author": "Henry Jewkes",
20
+ "license": "MIT",
21
+ "homepage": "https://github.com/HJewkes/titan-platform#readme",
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/HJewkes/titan-platform.git",
25
+ "directory": "packages/style-profile"
26
+ },
27
+ "bugs": "https://github.com/HJewkes/titan-platform/issues",
28
+ "engines": {
29
+ "node": ">=20"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "dependencies": {
35
+ "handlebars": "^4.7.8"
36
+ },
37
+ "peerDependencies": {
38
+ "zod": "^4.0.0"
39
+ },
40
+ "devDependencies": {
41
+ "zod": "^4.4.3"
42
+ },
43
+ "scripts": {
44
+ "build": "tsup",
45
+ "typecheck": "tsc --noEmit",
46
+ "lint": "eslint src"
47
+ }
48
+ }
@@ -0,0 +1,31 @@
1
+ # Naming Conventions
2
+
3
+ {{#each rules}}
4
+ ## {{label}}
5
+
6
+ **Convention**: `{{convention}}`
7
+ **Confidence**: {{confidencePercent}}%{{#if stability}} | **Stability**: {{stability}}{{/if}}{{#if fixability}} | **Fixability**: {{fixability}}{{/if}}
8
+
9
+ {{#if description}}
10
+ {{description}}
11
+ {{/if}}
12
+
13
+ {{#if examples}}
14
+ ### Examples
15
+ {{#each examples}}
16
+ {{#if good}}
17
+ ```typescript
18
+ // Good
19
+ {{good}}
20
+ ```
21
+ {{/if}}
22
+ {{#if bad}}
23
+ ```typescript
24
+ // Avoid
25
+ {{bad}}
26
+ ```
27
+ {{/if}}
28
+ {{/each}}
29
+ {{/if}}
30
+
31
+ {{/each}}
@@ -0,0 +1,38 @@
1
+ # Structural Patterns & Preferences
2
+
3
+ {{#each patterns}}
4
+ ## {{name}}
5
+
6
+ **Strength**: {{strength}} | **Confidence**: {{confidencePercent}}%{{#if fixability}} | **Fixability**: {{fixability}}{{/if}}
7
+
8
+ {{#if description}}
9
+ {{description}}
10
+ {{/if}}
11
+
12
+ {{#if examples}}
13
+ ### Examples
14
+ {{#each examples}}
15
+ {{#if good}}
16
+ ```typescript
17
+ // Good
18
+ {{good}}
19
+ ```
20
+ {{/if}}
21
+ {{#if bad}}
22
+ ```typescript
23
+ // Avoid
24
+ {{bad}}
25
+ ```
26
+ {{/if}}
27
+ {{/each}}
28
+ {{/if}}
29
+
30
+ {{/each}}
31
+
32
+ {{#if preferredPatterns}}
33
+ ## Preferred Code Patterns
34
+
35
+ {{#each preferredPatterns}}
36
+ - {{this}}
37
+ {{/each}}
38
+ {{/if}}
@@ -0,0 +1,46 @@
1
+ # {{language}} Style Rules
2
+
3
+ {{#if criticalRules}}
4
+ ## Critical Rules
5
+ {{#each criticalRules}}
6
+ ### {{category}}: {{name}}
7
+
8
+ **Convention**: `{{convention}}`
9
+ **Confidence**: {{confidencePercent}}%
10
+
11
+ {{#if description}}
12
+ {{description}}
13
+ {{/if}}
14
+
15
+ {{/each}}
16
+ {{/if}}
17
+
18
+ {{#if strongRules}}
19
+ ## Strong Conventions
20
+ {{#each strongRules}}
21
+ ### {{category}}: {{name}}
22
+
23
+ **Convention**: `{{convention}}`
24
+ **Confidence**: {{confidencePercent}}%
25
+
26
+ {{#if description}}
27
+ {{description}}
28
+ {{/if}}
29
+
30
+ {{/each}}
31
+ {{/if}}
32
+
33
+ {{#if preferredRules}}
34
+ ## Preferred Style
35
+ {{#each preferredRules}}
36
+ ### {{category}}: {{name}}
37
+
38
+ **Convention**: `{{convention}}`
39
+ **Confidence**: {{confidencePercent}}%
40
+
41
+ {{#if description}}
42
+ {{description}}
43
+ {{/if}}
44
+
45
+ {{/each}}
46
+ {{/if}}
@@ -0,0 +1,53 @@
1
+ ---
2
+ description: "Personal coding style for {{author}} -- enforces naming, structure, documentation, and pattern preferences detected from real code."
3
+ triggers:
4
+ - writing new code
5
+ - reviewing code
6
+ - refactoring
7
+ ---
8
+
9
+ # {{author}}'s Code Style
10
+
11
+ {{#if criticalRules}}
12
+ ## Critical Rules (always follow)
13
+ {{#each criticalRules}}
14
+ - **{{name}}**: {{readableConvention}} ({{confidencePercent}}%)
15
+ {{/each}}
16
+ {{/if}}
17
+
18
+ {{#if strongRules}}
19
+ ## Strong Conventions (follow when possible)
20
+ {{#each strongRules}}
21
+ - **{{name}}**: {{readableConvention}} ({{confidencePercent}}%)
22
+ {{/each}}
23
+ {{/if}}
24
+
25
+ {{#if preferredRules}}
26
+ ## Preferred Style (when it fits)
27
+ {{#each preferredRules}}
28
+ - **{{name}}**: {{readableConvention}} ({{confidencePercent}}%)
29
+ {{/each}}
30
+ {{/if}}
31
+
32
+ For full details see:
33
+ - [references/naming.md](references/naming.md) -- naming conventions
34
+ - [references/patterns.md](references/patterns.md) -- structural patterns and preferences
35
+ {{#each languages}}
36
+ - [references/per-language/{{this}}.md](references/per-language/{{this}}.md) -- {{this}}-specific rules
37
+ {{/each}}
38
+
39
+ {{#if idioms}}
40
+
41
+ ## Common Patterns
42
+ {{#each idioms}}
43
+ - **{{name}}**: {{description}}{{#if example}} — `{{example}}`{{/if}}
44
+ {{/each}}
45
+ {{/if}}
46
+
47
+ {{#if antiPatterns}}
48
+
49
+ ## Avoid
50
+ {{#each antiPatterns}}
51
+ - **{{pattern}}**: {{reason}}
52
+ {{/each}}
53
+ {{/if}}