@titan-design/style-profile 0.0.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/index.d.ts +14 -1
- package/dist/index.js +41 -15
- package/dist/index.js.map +1 -1
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -57,6 +57,10 @@ Each format also has its own generator (`generateEslintExport`, `generateRuffExp
|
|
|
57
57
|
on). The rule builders in `eslint-rules` (`buildNamingConventionRule`,
|
|
58
58
|
`buildFunctionLengthRule`, `buildFileNamingRule`, `buildJsdocRules`, `buildImportOrderRule`)
|
|
59
59
|
return single `[ruleName, config]` pairs for callers that assemble their own ESLint config.
|
|
60
|
+
`buildNamingConvention` returns the naming rule plus `skippedRules`: profile naming values
|
|
61
|
+
are mapped to typescript-eslint formats (`UPPER_SNAKE_CASE` and `SCREAMING_SNAKE` become
|
|
62
|
+
`UPPER_CASE`), and a value with no typescript-eslint format, such as `kebab-case`, is left
|
|
63
|
+
out of the rule and reported there with a reason instead of making ESLint reject the config.
|
|
60
64
|
|
|
61
65
|
## Provenance
|
|
62
66
|
|
package/dist/index.d.ts
CHANGED
|
@@ -577,6 +577,19 @@ declare function generateEslintExport(profile: Profile): GeneratedFile;
|
|
|
577
577
|
|
|
578
578
|
declare function toEslintSeverity(confidence: number, thresholds: SeverityThresholds): Severity | null;
|
|
579
579
|
declare function severityRank(s: Severity): number;
|
|
580
|
+
/** Same shape as style-checker's SkippedRule, so a consumer can forward it unchanged. */
|
|
581
|
+
interface EslintSkippedRule {
|
|
582
|
+
tool: "eslint";
|
|
583
|
+
rule: string;
|
|
584
|
+
plugin: string;
|
|
585
|
+
reason: string;
|
|
586
|
+
}
|
|
587
|
+
interface NamingConventionResult {
|
|
588
|
+
rule: [string, unknown] | null;
|
|
589
|
+
skippedRules: EslintSkippedRule[];
|
|
590
|
+
}
|
|
591
|
+
declare function toTsEslintFormat(convention: string): string | null;
|
|
592
|
+
declare function buildNamingConvention(profile: Profile): NamingConventionResult;
|
|
580
593
|
declare function buildNamingConventionRule(profile: Profile): [string, unknown] | null;
|
|
581
594
|
declare function buildImportOrderRule(profile: Profile): [string, unknown] | null;
|
|
582
595
|
declare function buildFunctionLengthRule(profile: Profile): [string, unknown] | null;
|
|
@@ -614,4 +627,4 @@ declare function getRulesForCategory(profile: Profile, category: string): RuleEn
|
|
|
614
627
|
declare function getRulesByCategory(profile: Profile): Map<string, RuleEntry[]>;
|
|
615
628
|
declare function detectLanguages(profile: Profile): string[];
|
|
616
629
|
|
|
617
|
-
export { DEFAULT_SEVERITY_THRESHOLDS, ExampleSchema, type ExportFormat, type ExtractedRule, type Fixability, FixabilitySchema, type GeneratedFile, PROFILE_CATEGORIES, type Profile, type ProfileCategory, ProfileSchema, type RuleEntry, SCHEMA_VERSION, SUPPORTED_FORMATS, type Severity, type SeverityThresholds, type Stability, StabilitySchema, type StyleRule, StyleRuleSchema, buildFileNamingRule, buildFunctionLengthRule, buildImportOrderRule, buildJsdocRules, buildNamingConventionRule, detectLanguages, exportProfile, extractAllRules, generateClaudeRules, generateEditorConfigExport, generateEslintExport, generateHooksConfig, generateMarkdownExport, generateRuffExport, generateSkillFiles, getRulesByCategory, getRulesForCategory, getTopRules, migrateProfile, readProfile, registerMigration, severityRank, toEslintSeverity, validateProfile, writeProfile };
|
|
630
|
+
export { DEFAULT_SEVERITY_THRESHOLDS, type EslintSkippedRule, ExampleSchema, type ExportFormat, type ExtractedRule, type Fixability, FixabilitySchema, type GeneratedFile, type NamingConventionResult, PROFILE_CATEGORIES, type Profile, type ProfileCategory, ProfileSchema, type RuleEntry, SCHEMA_VERSION, SUPPORTED_FORMATS, type Severity, type SeverityThresholds, type Stability, StabilitySchema, type StyleRule, StyleRuleSchema, buildFileNamingRule, buildFunctionLengthRule, buildImportOrderRule, buildJsdocRules, buildNamingConvention, buildNamingConventionRule, detectLanguages, exportProfile, extractAllRules, generateClaudeRules, generateEditorConfigExport, generateEslintExport, generateHooksConfig, generateMarkdownExport, generateRuffExport, generateSkillFiles, getRulesByCategory, getRulesForCategory, getTopRules, migrateProfile, readProfile, registerMigration, severityRank, toEslintSeverity, toTsEslintFormat, validateProfile, writeProfile };
|
package/dist/index.js
CHANGED
|
@@ -432,33 +432,57 @@ function eslintExtensionOptions(rule) {
|
|
|
432
432
|
const eslintExt = rule.extensions?.eslint;
|
|
433
433
|
return eslintExt && typeof eslintExt === "object" && "options" in eslintExt && Array.isArray(eslintExt.options) ? eslintExt.options : void 0;
|
|
434
434
|
}
|
|
435
|
-
|
|
435
|
+
var NAMING_RULE = "@typescript-eslint/naming-convention";
|
|
436
|
+
var TS_ESLINT_FORMATS = {
|
|
437
|
+
camelCase: "camelCase",
|
|
438
|
+
strictCamelCase: "strictCamelCase",
|
|
439
|
+
PascalCase: "PascalCase",
|
|
440
|
+
StrictPascalCase: "StrictPascalCase",
|
|
441
|
+
snake_case: "snake_case",
|
|
442
|
+
UPPER_CASE: "UPPER_CASE",
|
|
443
|
+
UPPER_SNAKE_CASE: "UPPER_CASE",
|
|
444
|
+
SCREAMING_SNAKE: "UPPER_CASE",
|
|
445
|
+
SCREAMING_SNAKE_CASE: "UPPER_CASE"
|
|
446
|
+
};
|
|
447
|
+
function toTsEslintFormat(convention) {
|
|
448
|
+
return TS_ESLINT_FORMATS[convention] ?? null;
|
|
449
|
+
}
|
|
450
|
+
function skippedNaming(key, convention) {
|
|
451
|
+
return {
|
|
452
|
+
tool: "eslint",
|
|
453
|
+
rule: NAMING_RULE,
|
|
454
|
+
plugin: "@typescript-eslint",
|
|
455
|
+
reason: `naming.${key} convention ${JSON.stringify(convention)} has no typescript-eslint naming-convention format`
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
function namingSelectors(key, rule, selectorName, skipped) {
|
|
436
459
|
const eslintOptions = eslintExtensionOptions(rule);
|
|
437
460
|
if (eslintOptions) return eslintOptions;
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
461
|
+
const format = typeof rule.convention === "string" ? toTsEslintFormat(rule.convention) : null;
|
|
462
|
+
if (format) return [{ selector: selectorName, format: [format] }];
|
|
463
|
+
skipped.push(skippedNaming(key, rule.convention));
|
|
441
464
|
return [];
|
|
442
465
|
}
|
|
443
|
-
function
|
|
466
|
+
function buildNamingConvention(profile) {
|
|
444
467
|
const thresholds = profile.severityThresholds;
|
|
445
|
-
const naming = profile.naming;
|
|
446
|
-
if (!naming) return null;
|
|
447
468
|
const selectors = [];
|
|
469
|
+
const skippedRules = [];
|
|
448
470
|
let maxSeverity = null;
|
|
449
|
-
for (const [key, rule] of Object.entries(naming)) {
|
|
450
|
-
if (key === "files") continue;
|
|
471
|
+
for (const [key, rule] of Object.entries(profile.naming ?? {})) {
|
|
451
472
|
const selectorName = NAMING_SELECTORS[key];
|
|
452
473
|
if (!selectorName) continue;
|
|
453
474
|
const severity = toEslintSeverity(rule.confidence, thresholds);
|
|
454
475
|
if (!severity) continue;
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
476
|
+
const ruleSelectors = namingSelectors(key, rule, selectorName, skippedRules);
|
|
477
|
+
if (ruleSelectors.length === 0) continue;
|
|
478
|
+
selectors.push(...ruleSelectors);
|
|
479
|
+
if (!maxSeverity || severityRank(severity) > severityRank(maxSeverity)) maxSeverity = severity;
|
|
459
480
|
}
|
|
460
|
-
if (selectors.length === 0 || !maxSeverity) return null;
|
|
461
|
-
return [
|
|
481
|
+
if (selectors.length === 0 || !maxSeverity) return { rule: null, skippedRules };
|
|
482
|
+
return { rule: [NAMING_RULE, [maxSeverity, ...selectors]], skippedRules };
|
|
483
|
+
}
|
|
484
|
+
function buildNamingConventionRule(profile) {
|
|
485
|
+
return buildNamingConvention(profile).rule;
|
|
462
486
|
}
|
|
463
487
|
function buildImportOrderRule(profile) {
|
|
464
488
|
const importOrder = profile.structure?.importOrder;
|
|
@@ -949,6 +973,7 @@ export {
|
|
|
949
973
|
buildFunctionLengthRule,
|
|
950
974
|
buildImportOrderRule,
|
|
951
975
|
buildJsdocRules,
|
|
976
|
+
buildNamingConvention,
|
|
952
977
|
buildNamingConventionRule,
|
|
953
978
|
detectLanguages,
|
|
954
979
|
exportProfile,
|
|
@@ -968,6 +993,7 @@ export {
|
|
|
968
993
|
registerMigration,
|
|
969
994
|
severityRank,
|
|
970
995
|
toEslintSeverity,
|
|
996
|
+
toTsEslintFormat,
|
|
971
997
|
validateProfile,
|
|
972
998
|
writeProfile
|
|
973
999
|
};
|
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\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":"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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\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@titan-design/style-profile",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.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",
|
|
@@ -38,6 +38,9 @@
|
|
|
38
38
|
"zod": "^4.0.0"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
|
+
"@typescript-eslint/eslint-plugin": "^8.46.0",
|
|
42
|
+
"@typescript-eslint/parser": "^8.46.0",
|
|
43
|
+
"eslint": "^9.39.0",
|
|
41
44
|
"zod": "^4.4.3"
|
|
42
45
|
},
|
|
43
46
|
"scripts": {
|