@titan-design/style-profile 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +12 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -428,6 +428,9 @@ var NAMING_SELECTORS = {
|
|
|
428
428
|
types: "typeLike",
|
|
429
429
|
constants: "variable"
|
|
430
430
|
};
|
|
431
|
+
var NAMING_MODIFIERS = {
|
|
432
|
+
constants: ["const", "global"]
|
|
433
|
+
};
|
|
431
434
|
function eslintExtensionOptions(rule) {
|
|
432
435
|
const eslintExt = rule.extensions?.eslint;
|
|
433
436
|
return eslintExt && typeof eslintExt === "object" && "options" in eslintExt && Array.isArray(eslintExt.options) ? eslintExt.options : void 0;
|
|
@@ -459,18 +462,22 @@ function namingSelectors(key, rule, selectorName, skipped) {
|
|
|
459
462
|
const eslintOptions = eslintExtensionOptions(rule);
|
|
460
463
|
if (eslintOptions) return eslintOptions;
|
|
461
464
|
const format = typeof rule.convention === "string" ? toTsEslintFormat(rule.convention) : null;
|
|
462
|
-
if (format)
|
|
463
|
-
|
|
464
|
-
|
|
465
|
+
if (!format) {
|
|
466
|
+
skipped.push(skippedNaming(key, rule.convention));
|
|
467
|
+
return [];
|
|
468
|
+
}
|
|
469
|
+
const modifiers = NAMING_MODIFIERS[key];
|
|
470
|
+
return [{ selector: selectorName, format: [format], ...modifiers ? { modifiers } : {} }];
|
|
465
471
|
}
|
|
466
472
|
function buildNamingConvention(profile) {
|
|
467
473
|
const thresholds = profile.severityThresholds;
|
|
468
474
|
const selectors = [];
|
|
469
475
|
const skippedRules = [];
|
|
470
476
|
let maxSeverity = null;
|
|
471
|
-
for (const
|
|
477
|
+
for (const key of Object.keys(NAMING_SELECTORS)) {
|
|
478
|
+
const rule = profile.naming?.[key];
|
|
479
|
+
if (!rule) continue;
|
|
472
480
|
const selectorName = NAMING_SELECTORS[key];
|
|
473
|
-
if (!selectorName) continue;
|
|
474
481
|
const severity = toEslintSeverity(rule.confidence, thresholds);
|
|
475
482
|
if (!severity) continue;
|
|
476
483
|
const ruleSelectors = namingSelectors(key, rule, selectorName, skippedRules);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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\nconst NAMING_RULE = \"@typescript-eslint/naming-convention\";\n\n// Keys are profile vocabulary (style-analyzer emits SCREAMING_SNAKE); values are typescript-eslint's format enum.\nconst TS_ESLINT_FORMATS: Record<string, string> = {\n camelCase: \"camelCase\",\n strictCamelCase: \"strictCamelCase\",\n PascalCase: \"PascalCase\",\n StrictPascalCase: \"StrictPascalCase\",\n snake_case: \"snake_case\",\n UPPER_CASE: \"UPPER_CASE\",\n UPPER_SNAKE_CASE: \"UPPER_CASE\",\n SCREAMING_SNAKE: \"UPPER_CASE\",\n SCREAMING_SNAKE_CASE: \"UPPER_CASE\",\n};\n\n/** Same shape as style-checker's SkippedRule, so a consumer can forward it unchanged. */\nexport interface EslintSkippedRule {\n tool: \"eslint\";\n rule: string;\n plugin: string;\n reason: string;\n}\n\nexport interface NamingConventionResult {\n rule: [string, unknown] | null;\n skippedRules: EslintSkippedRule[];\n}\n\nexport function toTsEslintFormat(convention: string): string | null {\n return TS_ESLINT_FORMATS[convention] ?? null;\n}\n\nfunction skippedNaming(key: string, convention: unknown): EslintSkippedRule {\n return {\n tool: \"eslint\",\n rule: NAMING_RULE,\n plugin: \"@typescript-eslint\",\n reason: `naming.${key} convention ${JSON.stringify(convention)} has no typescript-eslint naming-convention format`,\n };\n}\n\nfunction namingSelectors(\n key: string,\n rule: StyleRule,\n selectorName: string,\n skipped: EslintSkippedRule[],\n): unknown[] {\n const eslintOptions = eslintExtensionOptions(rule);\n if (eslintOptions) return eslintOptions;\n const format = typeof rule.convention === \"string\" ? toTsEslintFormat(rule.convention) : null;\n if (format) return [{ selector: selectorName, format: [format] }];\n skipped.push(skippedNaming(key, rule.convention));\n return [];\n}\n\nexport function buildNamingConvention(profile: Profile): NamingConventionResult {\n const thresholds = profile.severityThresholds;\n const selectors: unknown[] = [];\n const skippedRules: EslintSkippedRule[] = [];\n let maxSeverity: Severity | null = null;\n\n for (const [key, rule] of Object.entries(profile.naming ?? {})) {\n const selectorName = NAMING_SELECTORS[key];\n if (!selectorName) continue;\n const severity = toEslintSeverity(rule.confidence, thresholds);\n if (!severity) continue;\n\n const ruleSelectors = namingSelectors(key, rule, selectorName, skippedRules);\n if (ruleSelectors.length === 0) continue;\n selectors.push(...ruleSelectors);\n if (!maxSeverity || severityRank(severity) > severityRank(maxSeverity)) maxSeverity = severity;\n }\n\n if (selectors.length === 0 || !maxSeverity) return { rule: null, skippedRules };\n return { rule: [NAMING_RULE, [maxSeverity, ...selectors]], skippedRules };\n}\n\nexport function buildNamingConventionRule(\n profile: Profile,\n): [string, unknown] | null {\n return buildNamingConvention(profile).rule;\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":"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","names":["z","z","migrations"]}
|
|
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\n// Key order is significant: typescript-eslint's last-matching-selector-wins rule needs \"variables\" before \"constants\".\nconst NAMING_SELECTORS: Record<string, string> = {\n variables: \"variable\",\n functions: \"function\",\n types: \"typeLike\",\n constants: \"variable\",\n};\n\n// Scopes \"constants\" to top-level const declarations, so it doesn't shadow the \"variables\" rule for every const.\nconst NAMING_MODIFIERS: Partial<Record<string, string[]>> = {\n constants: [\"const\", \"global\"],\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\nconst NAMING_RULE = \"@typescript-eslint/naming-convention\";\n\n// Keys are profile vocabulary (style-analyzer emits SCREAMING_SNAKE); values are typescript-eslint's format enum.\nconst TS_ESLINT_FORMATS: Record<string, string> = {\n camelCase: \"camelCase\",\n strictCamelCase: \"strictCamelCase\",\n PascalCase: \"PascalCase\",\n StrictPascalCase: \"StrictPascalCase\",\n snake_case: \"snake_case\",\n UPPER_CASE: \"UPPER_CASE\",\n UPPER_SNAKE_CASE: \"UPPER_CASE\",\n SCREAMING_SNAKE: \"UPPER_CASE\",\n SCREAMING_SNAKE_CASE: \"UPPER_CASE\",\n};\n\n/** Same shape as style-checker's SkippedRule, so a consumer can forward it unchanged. */\nexport interface EslintSkippedRule {\n tool: \"eslint\";\n rule: string;\n plugin: string;\n reason: string;\n}\n\nexport interface NamingConventionResult {\n rule: [string, unknown] | null;\n skippedRules: EslintSkippedRule[];\n}\n\nexport function toTsEslintFormat(convention: string): string | null {\n return TS_ESLINT_FORMATS[convention] ?? null;\n}\n\nfunction skippedNaming(key: string, convention: unknown): EslintSkippedRule {\n return {\n tool: \"eslint\",\n rule: NAMING_RULE,\n plugin: \"@typescript-eslint\",\n reason: `naming.${key} convention ${JSON.stringify(convention)} has no typescript-eslint naming-convention format`,\n };\n}\n\nfunction namingSelectors(\n key: string,\n rule: StyleRule,\n selectorName: string,\n skipped: EslintSkippedRule[],\n): unknown[] {\n const eslintOptions = eslintExtensionOptions(rule);\n if (eslintOptions) return eslintOptions;\n const format = typeof rule.convention === \"string\" ? toTsEslintFormat(rule.convention) : null;\n if (!format) {\n skipped.push(skippedNaming(key, rule.convention));\n return [];\n }\n const modifiers = NAMING_MODIFIERS[key];\n return [{ selector: selectorName, format: [format], ...(modifiers ? { modifiers } : {}) }];\n}\n\nexport function buildNamingConvention(profile: Profile): NamingConventionResult {\n const thresholds = profile.severityThresholds;\n const selectors: unknown[] = [];\n const skippedRules: EslintSkippedRule[] = [];\n let maxSeverity: Severity | null = null;\n\n for (const key of Object.keys(NAMING_SELECTORS)) {\n const rule = profile.naming?.[key];\n if (!rule) continue;\n const selectorName = NAMING_SELECTORS[key]!;\n const severity = toEslintSeverity(rule.confidence, thresholds);\n if (!severity) continue;\n\n const ruleSelectors = namingSelectors(key, rule, selectorName, skippedRules);\n if (ruleSelectors.length === 0) continue;\n selectors.push(...ruleSelectors);\n if (!maxSeverity || severityRank(severity) > severityRank(maxSeverity)) maxSeverity = severity;\n }\n\n if (selectors.length === 0 || !maxSeverity) return { rule: null, skippedRules };\n return { rule: [NAMING_RULE, [maxSeverity, ...selectors]], skippedRules };\n}\n\nexport function buildNamingConventionRule(\n profile: Profile,\n): [string, unknown] | null {\n return buildNamingConvention(profile).rule;\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":"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","names":["z","z","migrations"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@titan-design/style-profile",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
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
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|