@standards-kit/conform 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.
Files changed (35) hide show
  1. package/dist/{chunk-YGDEM6K5.js → chunk-FJZMUGYW.js} +13 -10
  2. package/dist/chunk-FJZMUGYW.js.map +1 -0
  3. package/dist/{chunk-NADY2H35.js → chunk-YKKWXHYS.js} +2 -2
  4. package/dist/{chunk-NADY2H35.js.map → chunk-YKKWXHYS.js.map} +1 -1
  5. package/dist/cli/index.d.ts +3 -0
  6. package/dist/cli/process.d.ts +2 -0
  7. package/dist/cli/utils.d.ts +19 -0
  8. package/dist/cli/validate.d.ts +2 -0
  9. package/dist/cli.js +3892 -3873
  10. package/dist/cli.js.map +1 -1
  11. package/dist/core/schema.d.ts +167 -1709
  12. package/dist/{core-QRFGIQ42.js → core-LFX2BFLG.js} +2 -2
  13. package/dist/index.js +3 -5
  14. package/dist/index.js.map +1 -1
  15. package/dist/infra/schemas.d.ts +41 -533
  16. package/dist/{infra-TO54IUSC.js → infra-RFEWGWPW.js} +2 -2
  17. package/dist/mcp/standards/parser.d.ts +2 -14
  18. package/dist/{mcp-73FZXT3P.js → mcp-T2JFU4E2.js} +3 -3
  19. package/dist/{registry-JRCQAIHR.js → registry-J2LVW3M2.js} +2 -2
  20. package/dist/{scan-RHQWHASY.js → scan-BZH5IR3Z.js} +3 -3
  21. package/dist/scan-BZH5IR3Z.js.map +1 -0
  22. package/dist/{standards-XAZKTKYJ.js → standards-ALMA4VIU.js} +2 -2
  23. package/dist/{sync-P3UZECLW.js → sync-EGJ2CSYK.js} +2 -2
  24. package/dist/sync-EGJ2CSYK.js.map +1 -0
  25. package/dist/{validate-J5E336GX.js → validate-X4K2SHYT.js} +4 -4
  26. package/dist/{validate-J5E336GX.js.map → validate-X4K2SHYT.js.map} +1 -1
  27. package/package.json +10 -6
  28. package/dist/chunk-YGDEM6K5.js.map +0 -1
  29. package/dist/scan-RHQWHASY.js.map +0 -1
  30. package/dist/sync-P3UZECLW.js.map +0 -1
  31. /package/dist/{core-QRFGIQ42.js.map → core-LFX2BFLG.js.map} +0 -0
  32. /package/dist/{infra-TO54IUSC.js.map → infra-RFEWGWPW.js.map} +0 -0
  33. /package/dist/{mcp-73FZXT3P.js.map → mcp-T2JFU4E2.js.map} +0 -0
  34. /package/dist/{registry-JRCQAIHR.js.map → registry-J2LVW3M2.js.map} +0 -0
  35. /package/dist/{standards-XAZKTKYJ.js.map → standards-ALMA4VIU.js.map} +0 -0
@@ -66,12 +66,15 @@ function isValidGlobPattern(pattern) {
66
66
  return { valid: false, error: message };
67
67
  }
68
68
  }
69
- var globPatternSchema = z.string().refine(
70
- (pattern) => isValidGlobPattern(pattern).valid,
71
- (pattern) => ({
72
- message: `Invalid glob pattern: "${pattern}" - ${isValidGlobPattern(pattern).error}`
73
- })
74
- );
69
+ var globPatternSchema = z.string().superRefine((pattern, ctx) => {
70
+ const result = isValidGlobPattern(pattern);
71
+ if (!result.valid) {
72
+ ctx.addIssue({
73
+ code: z.ZodIssueCode.custom,
74
+ message: `Invalid glob pattern: "${pattern}" - ${result.error}`
75
+ });
76
+ }
77
+ });
75
78
  var eslintRuleSeverity = z.enum(["off", "warn", "error"]);
76
79
  var eslintRuleWithOptions = z.object({
77
80
  severity: eslintRuleSeverity
@@ -701,7 +704,7 @@ function parseTomlFile(filePath) {
701
704
  function validateConfig(rawConfig) {
702
705
  const result = configSchema.safeParse(rawConfig);
703
706
  if (!result.success) {
704
- const errors = result.error.errors.map((e) => ` - ${e.path.join(".")}: ${e.message}`).join("\n");
707
+ const errors = result.error.issues.map((e) => ` - ${e.path.join(".")}: ${e.message}`).join("\n");
705
708
  throw new ConfigError(`Invalid ${CONFIG_FILE_NAME} configuration:
706
709
  ${errors}`);
707
710
  }
@@ -924,7 +927,7 @@ function detectCodeownersOverrides(registryConfig, projectConfig) {
924
927
  return projectRules.map((rule) => checkRuleOverride(rule, registryMap.get(rule.pattern))).filter((o) => o !== null);
925
928
  }
926
929
  async function loadRegistryConfig(extendsConfig, configDir) {
927
- const registryModule = await import("./registry-JRCQAIHR.js");
930
+ const registryModule = await import("./registry-J2LVW3M2.js");
928
931
  const loc = registryModule.parseRegistryUrl(extendsConfig.registry, configDir);
929
932
  const registryDir = await registryModule.fetchRegistry(loc);
930
933
  let config = {};
@@ -1079,7 +1082,7 @@ function loadRuleset(registryDir, rulesetName) {
1079
1082
  }
1080
1083
  const result = configSchema.safeParse(parsed);
1081
1084
  if (!result.success) {
1082
- const errors = result.error.errors.map((e) => `${e.path.join(".")}: ${e.message}`).join(", ");
1085
+ const errors = result.error.issues.map((e) => `${e.path.join(".")}: ${e.message}`).join(", ");
1083
1086
  throw new ConfigError(`Invalid ruleset ${rulesetName}: ${errors}`);
1084
1087
  }
1085
1088
  return result.data;
@@ -1378,4 +1381,4 @@ export {
1378
1381
  getProjectRoot,
1379
1382
  loadConfigWithOverrides
1380
1383
  };
1381
- //# sourceMappingURL=chunk-YGDEM6K5.js.map
1384
+ //# sourceMappingURL=chunk-FJZMUGYW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/registry.ts","../src/core/loader.ts","../src/core/schema.ts"],"sourcesContent":[" \nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\nimport * as toml from \"@iarna/toml\";\nimport { execa } from \"execa\";\n\nimport { CACHE, TIMEOUTS } from \"../constants.js\";\nimport { ConfigError } from \"./loader.js\";\nimport { type Config, configSchema } from \"./schema.js\";\n\n/** Authentication method for private registries */\ntype AuthMethod = \"token\" | \"ssh\" | \"none\";\n\ninterface RegistryLocation {\n type: \"github\" | \"local\";\n owner?: string;\n repo?: string;\n ref?: string;\n path: string;\n auth?: AuthMethod;\n}\n\n/**\n * Detect authentication method based on environment variables.\n * Priority: CONFORM_REGISTRY_TOKEN > GITHUB_TOKEN > SSH key detection > none\n */\nfunction detectAuthMethod(): AuthMethod {\n if (process.env.CONFORM_REGISTRY_TOKEN || process.env.GITHUB_TOKEN) {\n return \"token\";\n }\n // Check for SSH key - if SSH_AUTH_SOCK is set, SSH agent is available\n if (process.env.SSH_AUTH_SOCK) {\n return \"ssh\";\n }\n return \"none\";\n}\n\n/**\n * Get the authentication token from environment variables.\n */\nfunction getAuthToken(): string | undefined {\n return process.env.CONFORM_REGISTRY_TOKEN ?? process.env.GITHUB_TOKEN;\n}\n\n/**\n * Build the git URL for a GitHub repository based on auth method.\n */\nfunction buildGitHubUrl(owner: string, repo: string, auth: AuthMethod): string {\n switch (auth) {\n case \"ssh\":\n return `git@github.com:${owner}/${repo}.git`;\n case \"token\": {\n const token = getAuthToken();\n if (token) {\n return `https://x-access-token:${token}@github.com/${owner}/${repo}.git`;\n }\n // Fall back to regular HTTPS if no token found\n return `https://github.com/${owner}/${repo}.git`;\n }\n case \"none\":\n default:\n return `https://github.com/${owner}/${repo}.git`;\n }\n}\n\n/**\n * Parse explicit auth method from URL prefix.\n * Supports: github+ssh:, github+token:, github: (auto-detect)\n */\nfunction parseAuthFromUrl(url: string): { auth: AuthMethod | \"auto\"; rest: string } {\n if (url.startsWith(\"github+ssh:\")) {\n return { auth: \"ssh\", rest: url.slice(11) };\n }\n if (url.startsWith(\"github+token:\")) {\n return { auth: \"token\", rest: url.slice(13) };\n }\n if (url.startsWith(\"github:\")) {\n return { auth: \"auto\", rest: url.slice(7) };\n }\n throw new ConfigError(`Invalid GitHub registry URL: ${url}`);\n}\n\nfunction parseGitHubUrl(url: string): RegistryLocation {\n const { auth: explicitAuth, rest } = parseAuthFromUrl(url);\n const [repoPath, ref] = rest.split(\"@\");\n const [owner, repo] = repoPath.split(\"/\");\n\n if (!owner || !repo) {\n throw new ConfigError(\n `Invalid GitHub registry URL: ${url}. Expected format: github:owner/repo or github+ssh:owner/repo`\n );\n }\n\n const auth = explicitAuth === \"auto\" ? detectAuthMethod() : explicitAuth;\n\n return {\n type: \"github\",\n owner,\n repo,\n ref: ref || undefined,\n path: buildGitHubUrl(owner, repo, auth),\n auth,\n };\n}\n\nexport function parseRegistryUrl(url: string, configDir?: string): RegistryLocation {\n if (url.startsWith(\"github:\") || url.startsWith(\"github+\")) {\n return parseGitHubUrl(url);\n }\n\n const localPath = !path.isAbsolute(url) && configDir ? path.resolve(configDir, url) : url;\n return { type: \"local\", path: localPath };\n}\n\nasync function updateExistingRepo(repoDir: string, ref?: string): Promise<boolean> {\n try {\n if (ref) {\n await execa(\"git\", [\"fetch\", \"--all\"], { cwd: repoDir });\n await execa(\"git\", [\"checkout\", ref], { cwd: repoDir });\n } else {\n await execa(\"git\", [\"pull\", \"--ff-only\"], { cwd: repoDir });\n }\n return true;\n } catch {\n fs.rmSync(repoDir, { recursive: true, force: true });\n return false;\n }\n}\n\nasync function cloneRepo(location: RegistryLocation, repoDir: string): Promise<void> {\n const cacheDir = path.dirname(repoDir);\n fs.mkdirSync(cacheDir, { recursive: true });\n\n const cloneArgs = [\"clone\", \"--depth\", \"1\"];\n if (location.ref) {\n cloneArgs.push(\"--branch\", location.ref);\n }\n cloneArgs.push(location.path, repoDir);\n\n try {\n await execa(\"git\", cloneArgs, { timeout: TIMEOUTS.git });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"timed out\")) {\n throw new ConfigError(`Registry clone timed out after ${TIMEOUTS.git / 1000} seconds: ${location.path}`);\n }\n throw new ConfigError(`Failed to clone registry: ${message}`);\n }\n}\n\nexport async function fetchRegistry(location: RegistryLocation): Promise<string> {\n if (location.type === \"local\") {\n if (!fs.existsSync(location.path)) {\n throw new ConfigError(`Registry not found: ${location.path}`);\n }\n return location.path;\n }\n\n const cacheDir = path.join(os.tmpdir(), CACHE.registryCacheDir);\n const repoDir = path.join(cacheDir, `${location.owner}-${location.repo}`);\n\n if (fs.existsSync(repoDir)) {\n await updateExistingRepo(repoDir, location.ref);\n }\n\n if (!fs.existsSync(repoDir)) {\n await cloneRepo(location, repoDir);\n }\n\n return repoDir;\n}\n\nexport function loadRuleset(registryDir: string, rulesetName: string): Config {\n const rulesetPath = path.join(registryDir, \"rulesets\", `${rulesetName}.toml`);\n\n if (!fs.existsSync(rulesetPath)) {\n throw new ConfigError(`Ruleset not found: ${rulesetName} (expected at ${rulesetPath})`);\n }\n\n const content = fs.readFileSync(rulesetPath, \"utf-8\");\n\n let parsed: unknown;\n try {\n parsed = toml.parse(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new ConfigError(`Failed to parse ruleset ${rulesetName}: ${message}`);\n }\n\n const result = configSchema.safeParse(parsed);\n if (!result.success) {\n const errors = result.error.issues.map((e) => `${e.path.join(\".\")}: ${e.message}`).join(\", \");\n throw new ConfigError(`Invalid ruleset ${rulesetName}: ${errors}`);\n }\n\n return result.data;\n}\n\ntype CodeConfig = NonNullable<Config[\"code\"]>;\n\nfunction mergeToolConfig<T extends object>(base?: T, override?: T): T | undefined {\n if (!override) {\n return base;\n }\n return { ...base, ...override };\n}\n\nfunction mergeLinting(\n base: CodeConfig[\"linting\"],\n override: CodeConfig[\"linting\"]\n): CodeConfig[\"linting\"] {\n if (!override) {\n return base;\n }\n return {\n ...base,\n eslint: mergeToolConfig(base?.eslint, override.eslint),\n ruff: mergeToolConfig(base?.ruff, override.ruff),\n };\n}\n\nfunction mergeTypes(base: CodeConfig[\"types\"], override: CodeConfig[\"types\"]): CodeConfig[\"types\"] {\n if (!override) {\n return base;\n }\n return {\n ...base,\n tsc: mergeToolConfig(base?.tsc, override.tsc),\n ty: mergeToolConfig(base?.ty, override.ty),\n };\n}\n\nfunction mergeUnused(\n base: CodeConfig[\"unused\"],\n override: CodeConfig[\"unused\"]\n): CodeConfig[\"unused\"] {\n if (!override) {\n return base;\n }\n return {\n ...base,\n knip: mergeToolConfig(base?.knip, override.knip),\n vulture: mergeToolConfig(base?.vulture, override.vulture),\n };\n}\n\nfunction mergeSecurity(\n base: CodeConfig[\"security\"],\n override: CodeConfig[\"security\"]\n): CodeConfig[\"security\"] {\n if (!override) {\n return base;\n }\n return {\n ...base,\n secrets: mergeToolConfig(base?.secrets, override.secrets),\n pnpmaudit: mergeToolConfig(base?.pnpmaudit, override.pnpmaudit),\n pipaudit: mergeToolConfig(base?.pipaudit, override.pipaudit),\n };\n}\n\nfunction mergeNaming(\n base: CodeConfig[\"naming\"],\n override: CodeConfig[\"naming\"]\n): CodeConfig[\"naming\"] {\n if (!override) {\n return base;\n }\n // enabled has a default value from schema, so it's always defined after parsing\n return {\n enabled: override.enabled,\n rules: override.rules ?? base?.rules,\n };\n}\n\nfunction mergeQuality(\n base: CodeConfig[\"quality\"],\n override: CodeConfig[\"quality\"]\n): CodeConfig[\"quality\"] {\n if (!override) {\n return base;\n }\n return {\n ...base,\n \"disable-comments\": mergeToolConfig(base?.[\"disable-comments\"], override[\"disable-comments\"]),\n };\n}\n\nfunction mergeCodeSection(base: CodeConfig | undefined, override: CodeConfig): CodeConfig {\n return {\n linting: mergeLinting(base?.linting, override.linting),\n types: mergeTypes(base?.types, override.types),\n unused: mergeUnused(base?.unused, override.unused),\n coverage_run: mergeToolConfig(base?.coverage_run, override.coverage_run),\n security: mergeSecurity(base?.security, override.security),\n naming: mergeNaming(base?.naming, override.naming),\n quality: mergeQuality(base?.quality, override.quality),\n };\n}\n\ntype ProcessConfig = NonNullable<Config[\"process\"]>;\n\nfunction mergeHooksConfig(\n base: ProcessConfig[\"hooks\"],\n override: ProcessConfig[\"hooks\"]\n): ProcessConfig[\"hooks\"] {\n if (!override) {\n return base;\n }\n // enabled and require_husky have schema defaults, so they're always defined\n return {\n enabled: override.enabled,\n require_husky: override.require_husky,\n require_hooks: override.require_hooks ?? base?.require_hooks,\n commands: override.commands ?? base?.commands,\n };\n}\n\nfunction mergeCiConfig(\n base: ProcessConfig[\"ci\"],\n override: ProcessConfig[\"ci\"]\n): ProcessConfig[\"ci\"] {\n if (!override) {\n return base;\n }\n return {\n enabled: override.enabled,\n require_workflows: override.require_workflows ?? base?.require_workflows,\n jobs: override.jobs ?? base?.jobs,\n actions: override.actions ?? base?.actions,\n };\n}\n\nfunction mergeBranchesConfig(\n base: ProcessConfig[\"branches\"],\n override: ProcessConfig[\"branches\"]\n): ProcessConfig[\"branches\"] {\n if (!override) {\n return base;\n }\n return {\n enabled: override.enabled,\n require_issue: override.require_issue,\n pattern: override.pattern ?? base?.pattern,\n exclude: override.exclude ?? base?.exclude,\n issue_pattern: override.issue_pattern ?? base?.issue_pattern,\n };\n}\n\nfunction mergePrConfig(\n base: ProcessConfig[\"pr\"],\n override: ProcessConfig[\"pr\"]\n): ProcessConfig[\"pr\"] {\n if (!override) {\n return base;\n }\n return {\n enabled: override.enabled,\n require_issue: override.require_issue,\n max_files: override.max_files ?? base?.max_files,\n max_lines: override.max_lines ?? base?.max_lines,\n issue_keywords: override.issue_keywords ?? base?.issue_keywords,\n };\n}\n\nfunction mergeTicketsConfig(\n base: ProcessConfig[\"tickets\"],\n override: ProcessConfig[\"tickets\"]\n): ProcessConfig[\"tickets\"] {\n if (!override) {\n return base;\n }\n // require_in_commits and require_in_branch have schema defaults, so they're always defined after parsing\n return {\n enabled: override.enabled,\n pattern: override.pattern ?? base?.pattern,\n require_in_commits: override.require_in_commits,\n require_in_branch: override.require_in_branch,\n };\n}\n\nfunction mergeCoverageConfig(\n base: ProcessConfig[\"coverage\"],\n override: ProcessConfig[\"coverage\"]\n): ProcessConfig[\"coverage\"] {\n if (!override) {\n return base;\n }\n // enforce_in has schema default, so it's always defined after parsing\n return {\n enabled: override.enabled,\n min_threshold: override.min_threshold ?? base?.min_threshold,\n enforce_in: override.enforce_in,\n ci_workflow: override.ci_workflow ?? base?.ci_workflow,\n ci_job: override.ci_job ?? base?.ci_job,\n };\n}\n\nfunction mergeCommitsConfig(\n base: ProcessConfig[\"commits\"],\n override: ProcessConfig[\"commits\"]\n): ProcessConfig[\"commits\"] {\n if (!override) {\n return base;\n }\n // require_scope has schema default, so it's always defined after parsing\n return {\n enabled: override.enabled,\n pattern: override.pattern ?? base?.pattern,\n types: override.types ?? base?.types,\n require_scope: override.require_scope,\n max_subject_length: override.max_subject_length ?? base?.max_subject_length,\n };\n}\n\nfunction mergeChangesetsConfig(\n base: ProcessConfig[\"changesets\"],\n override: ProcessConfig[\"changesets\"]\n): ProcessConfig[\"changesets\"] {\n if (!override) {\n return base;\n }\n // validate_format and require_description have schema defaults, so they're always defined after parsing\n return {\n enabled: override.enabled,\n require_for_paths: override.require_for_paths ?? base?.require_for_paths,\n exclude_paths: override.exclude_paths ?? base?.exclude_paths,\n validate_format: override.validate_format,\n allowed_bump_types: override.allowed_bump_types ?? base?.allowed_bump_types,\n require_description: override.require_description,\n min_description_length: override.min_description_length ?? base?.min_description_length,\n };\n}\n\nfunction mergeRepoConfig(\n base: ProcessConfig[\"repo\"],\n override: ProcessConfig[\"repo\"]\n): ProcessConfig[\"repo\"] {\n if (!override) {\n return base;\n }\n // require_branch_protection and require_codeowners have schema defaults\n return {\n enabled: override.enabled,\n require_branch_protection: override.require_branch_protection,\n require_codeowners: override.require_codeowners,\n ruleset: override.ruleset ?? base?.ruleset,\n tag_protection: override.tag_protection ?? base?.tag_protection,\n };\n}\n\nfunction mergeBackupsConfig(\n base: ProcessConfig[\"backups\"],\n override: ProcessConfig[\"backups\"]\n): ProcessConfig[\"backups\"] {\n if (!override) {\n return base;\n }\n // max_age_hours has schema default\n return {\n enabled: override.enabled,\n bucket: override.bucket ?? base?.bucket,\n prefix: override.prefix ?? base?.prefix,\n max_age_hours: override.max_age_hours,\n region: override.region ?? base?.region,\n };\n}\n\nfunction mergeCodeownersConfig(\n base: ProcessConfig[\"codeowners\"],\n override: ProcessConfig[\"codeowners\"]\n): ProcessConfig[\"codeowners\"] {\n if (!override) {\n return base;\n }\n return {\n enabled: override.enabled,\n rules: override.rules ?? base?.rules,\n };\n}\n\n \nfunction mergeDocsConfig(\n base: ProcessConfig[\"docs\"],\n override: ProcessConfig[\"docs\"]\n): ProcessConfig[\"docs\"] {\n if (!override) {\n return base;\n }\n // Fields with schema defaults: enabled, path, enforcement, staleness_days\n return {\n enabled: override.enabled,\n path: override.path,\n enforcement: override.enforcement,\n allowlist: override.allowlist ?? base?.allowlist,\n max_files: override.max_files ?? base?.max_files,\n max_file_lines: override.max_file_lines ?? base?.max_file_lines,\n max_total_kb: override.max_total_kb ?? base?.max_total_kb,\n staleness_days: override.staleness_days,\n stale_mappings: override.stale_mappings ?? base?.stale_mappings,\n min_coverage: override.min_coverage ?? base?.min_coverage,\n coverage_paths: override.coverage_paths ?? base?.coverage_paths,\n exclude_patterns: override.exclude_patterns ?? base?.exclude_patterns,\n types: override.types ?? base?.types,\n };\n}\n\n \nfunction mergeProcessSection(\n base: ProcessConfig | undefined,\n override: ProcessConfig\n): ProcessConfig {\n return {\n hooks: mergeHooksConfig(base?.hooks, override.hooks),\n ci: mergeCiConfig(base?.ci, override.ci),\n branches: mergeBranchesConfig(base?.branches, override.branches),\n commits: mergeCommitsConfig(base?.commits, override.commits),\n changesets: mergeChangesetsConfig(base?.changesets, override.changesets),\n pr: mergePrConfig(base?.pr, override.pr),\n tickets: mergeTicketsConfig(base?.tickets, override.tickets),\n coverage: mergeCoverageConfig(base?.coverage, override.coverage),\n repo: mergeRepoConfig(base?.repo, override.repo),\n backups: mergeBackupsConfig(base?.backups, override.backups),\n codeowners: mergeCodeownersConfig(base?.codeowners, override.codeowners),\n docs: mergeDocsConfig(base?.docs, override.docs),\n };\n}\n\nexport function mergeConfigs(base: Config, override: Config): Config {\n const merged: Config = { ...base };\n\n if (override.code) {\n merged.code = mergeCodeSection(base.code, override.code);\n }\n\n if (override.process) {\n merged.process = mergeProcessSection(base.process, override.process);\n }\n\n if (override.infra) {\n merged.infra = override.infra;\n }\n\n if (override.monorepo) {\n merged.monorepo = override.monorepo;\n }\n\n return merged;\n}\n\nexport async function resolveExtends(config: Config, configDir: string): Promise<Config> {\n if (!config.extends) {\n return config;\n }\n\n const { registry, rulesets } = config.extends;\n const location = parseRegistryUrl(registry, configDir);\n const registryDir = await fetchRegistry(location);\n\n let mergedConfig: Config = {};\n for (const rulesetName of rulesets) {\n const ruleset = loadRuleset(registryDir, rulesetName);\n mergedConfig = mergeConfigs(mergedConfig, ruleset);\n }\n\n // Local config overrides registry config (include all domains)\n const localConfig: Config = {\n code: config.code,\n process: config.process,\n infra: config.infra,\n monorepo: config.monorepo,\n };\n return mergeConfigs(mergedConfig, localConfig);\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport TOML from \"@iarna/toml\";\n\nimport { resolveExtends } from \"./registry.js\";\nimport { type Config, configSchema, defaultConfig } from \"./schema.js\";\n\n/** Config file name */\nexport const CONFIG_FILE_NAME = \"standards.toml\";\n\ninterface LoadConfigResult {\n config: Config;\n configPath: string;\n}\n\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigError\";\n }\n}\n\n/**\n * Check if a path is a broken symlink\n */\nfunction isBrokenSymlink(filePath: string): boolean {\n try {\n const stats = fs.lstatSync(filePath);\n if (stats.isSymbolicLink()) {\n // It's a symlink - check if target exists\n try {\n fs.statSync(filePath);\n return false; // Target exists, not broken\n } catch {\n return true; // Target doesn't exist, broken symlink\n }\n }\n return false; // Not a symlink\n } catch {\n return false; // Path doesn't exist at all\n }\n}\n\n/**\n * Find standards.toml by walking up the directory tree\n */\nexport function findConfigFile(startDir: string = process.cwd()): string | null {\n let currentDir = path.resolve(startDir);\n const root = path.parse(currentDir).root;\n\n while (currentDir !== root) {\n const configPath = path.join(currentDir, CONFIG_FILE_NAME);\n if (isBrokenSymlink(configPath)) {\n throw new ConfigError(`${CONFIG_FILE_NAME} exists but is a broken symlink: ${configPath}`);\n }\n if (fs.existsSync(configPath)) {\n return configPath;\n }\n currentDir = path.dirname(currentDir);\n }\n\n // Check root directory too\n const rootConfig = path.join(root, CONFIG_FILE_NAME);\n if (isBrokenSymlink(rootConfig)) {\n throw new ConfigError(`${CONFIG_FILE_NAME} exists but is a broken symlink: ${rootConfig}`);\n }\n return fs.existsSync(rootConfig) ? rootConfig : null;\n}\n\n/**\n * Resolve and validate config file path\n * Always returns an absolute path to ensure consistent behavior\n */\nfunction resolveConfigPath(configPath?: string): string {\n const resolved = configPath ?? findConfigFile();\n if (!resolved) {\n throw new ConfigError(`No ${CONFIG_FILE_NAME} found. Create one or specify --config path.`);\n }\n // Convert to absolute path for consistent behavior across tools\n const absolutePath = path.resolve(resolved);\n if (!fs.existsSync(absolutePath)) {\n throw new ConfigError(`Config file not found: ${resolved}`);\n }\n return absolutePath;\n}\n\n/**\n * Parse TOML file content\n */\nfunction parseTomlFile(filePath: string): unknown {\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n return TOML.parse(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n throw new ConfigError(`Failed to parse ${CONFIG_FILE_NAME}: ${message}`);\n }\n}\n\n/**\n * Validate config against schema\n */\nfunction validateConfig(rawConfig: unknown): Config {\n const result = configSchema.safeParse(rawConfig);\n if (!result.success) {\n const errors = result.error.issues\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\");\n throw new ConfigError(`Invalid ${CONFIG_FILE_NAME} configuration:\\n${errors}`);\n }\n return result.data;\n}\n\n/**\n * Load and parse standards.toml configuration (sync version without extends resolution)\n * Use loadConfigAsync for full extends support\n */\nexport function loadConfig(configPath?: string): LoadConfigResult {\n const resolvedPath = resolveConfigPath(configPath);\n const rawConfig = parseTomlFile(resolvedPath);\n const validatedConfig = validateConfig(rawConfig);\n const config = mergeWithDefaults(validatedConfig);\n return { config, configPath: resolvedPath };\n}\n\n/**\n * Load and parse standards.toml configuration with extends resolution\n */\nexport async function loadConfigAsync(configPath?: string): Promise<LoadConfigResult> {\n const resolvedPath = resolveConfigPath(configPath);\n const rawConfig = parseTomlFile(resolvedPath);\n const validatedConfig = validateConfig(rawConfig);\n\n // Resolve extends if present\n const configDir = path.dirname(resolvedPath);\n const resolvedConfig = await resolveExtends(validatedConfig, configDir);\n\n const config = mergeWithDefaults(resolvedConfig);\n return { config, configPath: resolvedPath };\n}\n\n/** Merge two optional objects, with right side taking precedence */\nfunction merge<T extends object>(a: T | undefined, b: T | undefined): T {\n return { ...a, ...b } as T;\n}\n\ntype CodeConfig = NonNullable<Config[\"code\"]>;\n\nfunction mergeLinting(c: Config, dc: Config): CodeConfig[\"linting\"] {\n const cl = c.code?.linting;\n const dl = dc.code?.linting;\n return { eslint: merge(dl?.eslint, cl?.eslint), ruff: merge(dl?.ruff, cl?.ruff) };\n}\n\nfunction mergeSecurity(c: Config, dc: Config): CodeConfig[\"security\"] {\n const cs = c.code?.security;\n const ds = dc.code?.security;\n return {\n secrets: merge(ds?.secrets, cs?.secrets),\n pnpmaudit: merge(ds?.pnpmaudit, cs?.pnpmaudit),\n pipaudit: merge(ds?.pipaudit, cs?.pipaudit),\n };\n}\n\nfunction mergeTypes(c: Config, dc: Config): CodeConfig[\"types\"] {\n return {\n tsc: merge(dc.code?.types?.tsc, c.code?.types?.tsc),\n ty: merge(dc.code?.types?.ty, c.code?.types?.ty),\n };\n}\n\nfunction mergeUnused(c: Config, dc: Config): CodeConfig[\"unused\"] {\n return {\n knip: merge(dc.code?.unused?.knip, c.code?.unused?.knip),\n vulture: merge(dc.code?.unused?.vulture, c.code?.unused?.vulture),\n };\n}\n\nfunction mergeCoverageRun(c: Config, dc: Config): CodeConfig[\"coverage_run\"] {\n return merge(dc.code?.coverage_run, c.code?.coverage_run);\n}\n\nfunction mergeNaming(c: Config, dc: Config): CodeConfig[\"naming\"] {\n const cn = c.code?.naming;\n const dn = dc.code?.naming;\n // For naming, we want to preserve the rules array from user config\n return {\n enabled: cn?.enabled ?? dn?.enabled ?? false,\n rules: cn?.rules ?? dn?.rules,\n };\n}\n\nfunction mergeQuality(c: Config, dc: Config): CodeConfig[\"quality\"] {\n const cq = c.code?.quality;\n const dq = dc.code?.quality;\n return {\n \"disable-comments\": merge(dq?.[\"disable-comments\"], cq?.[\"disable-comments\"]),\n };\n}\n\nfunction mergeCode(c: Config, dc: Config): CodeConfig {\n return {\n linting: mergeLinting(c, dc),\n types: mergeTypes(c, dc),\n unused: mergeUnused(c, dc),\n coverage_run: mergeCoverageRun(c, dc),\n security: mergeSecurity(c, dc),\n naming: mergeNaming(c, dc),\n quality: mergeQuality(c, dc),\n };\n}\n\ntype ProcessConfig = NonNullable<Config[\"process\"]>;\ntype HooksConfig = NonNullable<ProcessConfig[\"hooks\"]>;\ntype CiConfig = NonNullable<ProcessConfig[\"ci\"]>;\ntype BranchesConfig = NonNullable<ProcessConfig[\"branches\"]>;\ntype CommitsConfig = NonNullable<ProcessConfig[\"commits\"]>;\ntype ChangesetsConfig = NonNullable<ProcessConfig[\"changesets\"]>;\ntype PrConfig = NonNullable<ProcessConfig[\"pr\"]>;\ntype TicketsConfig = NonNullable<ProcessConfig[\"tickets\"]>;\ntype CoverageConfig = NonNullable<ProcessConfig[\"coverage\"]>;\ntype RepoConfig = NonNullable<ProcessConfig[\"repo\"]>;\ntype BackupsConfig = NonNullable<ProcessConfig[\"backups\"]>;\ntype CodeownersConfig = NonNullable<ProcessConfig[\"codeowners\"]>;\ntype DocsConfig = NonNullable<ProcessConfig[\"docs\"]>;\ntype ForbiddenFilesConfig = NonNullable<ProcessConfig[\"forbidden_files\"]>;\n\nconst defaultHooks: HooksConfig = { enabled: false, require_husky: true };\nconst defaultCi: CiConfig = { enabled: false };\nconst defaultBranches: BranchesConfig = { enabled: false, require_issue: false };\nconst defaultCommits: CommitsConfig = { enabled: false, require_scope: false };\nconst defaultChangesets: ChangesetsConfig = {\n enabled: false,\n validate_format: true,\n require_description: true,\n};\nconst defaultPr: PrConfig = { enabled: false, require_issue: false };\nconst defaultTickets: TicketsConfig = {\n enabled: false,\n require_in_commits: true,\n require_in_branch: false,\n};\nconst defaultCoverage: CoverageConfig = { enabled: false, enforce_in: \"config\" };\nconst defaultRepo: RepoConfig = {\n enabled: false,\n require_branch_protection: false,\n require_codeowners: false,\n};\nconst defaultBackups: BackupsConfig = { enabled: false, max_age_hours: 24 };\nconst defaultCodeowners: CodeownersConfig = { enabled: false };\nconst defaultDocs: DocsConfig = {\n enabled: false,\n path: \"docs/\",\n enforcement: \"warn\",\n staleness_days: 30,\n};\nconst defaultForbiddenFiles: ForbiddenFilesConfig = { enabled: false };\n\n/** Merge a single process config section with defaults */\nfunction mergeProcessSection<T>(defaultVal: T, dcVal: T | undefined, cVal: T | undefined): T {\n return { ...defaultVal, ...dcVal, ...cVal };\n}\n\nfunction mergeProcessHooks(\n cp: ProcessConfig | undefined,\n dcp: ProcessConfig | undefined\n): HooksConfig {\n return mergeProcessSection(defaultHooks, dcp?.hooks, cp?.hooks);\n}\n\nfunction mergeProcessCi(cp: ProcessConfig | undefined, dcp: ProcessConfig | undefined): CiConfig {\n return mergeProcessSection(defaultCi, dcp?.ci, cp?.ci);\n}\n\nfunction mergeProcessBranches(\n cp: ProcessConfig | undefined,\n dcp: ProcessConfig | undefined\n): BranchesConfig {\n return mergeProcessSection(defaultBranches, dcp?.branches, cp?.branches);\n}\n\nfunction mergeProcessCommits(\n cp: ProcessConfig | undefined,\n dcp: ProcessConfig | undefined\n): CommitsConfig {\n return mergeProcessSection(defaultCommits, dcp?.commits, cp?.commits);\n}\n\nfunction mergeProcessChangesets(\n cp: ProcessConfig | undefined,\n dcp: ProcessConfig | undefined\n): ChangesetsConfig {\n return mergeProcessSection(defaultChangesets, dcp?.changesets, cp?.changesets);\n}\n\nfunction mergeProcessPr(cp: ProcessConfig | undefined, dcp: ProcessConfig | undefined): PrConfig {\n return mergeProcessSection(defaultPr, dcp?.pr, cp?.pr);\n}\n\nfunction mergeProcessTickets(\n cp: ProcessConfig | undefined,\n dcp: ProcessConfig | undefined\n): TicketsConfig {\n return mergeProcessSection(defaultTickets, dcp?.tickets, cp?.tickets);\n}\n\nfunction mergeProcessCoverage(\n cp: ProcessConfig | undefined,\n dcp: ProcessConfig | undefined\n): CoverageConfig {\n return mergeProcessSection(defaultCoverage, dcp?.coverage, cp?.coverage);\n}\n\nfunction mergeProcessRepo(\n cp: ProcessConfig | undefined,\n dcp: ProcessConfig | undefined\n): RepoConfig {\n return mergeProcessSection(defaultRepo, dcp?.repo, cp?.repo);\n}\n\nfunction mergeProcessBackups(\n cp: ProcessConfig | undefined,\n dcp: ProcessConfig | undefined\n): BackupsConfig {\n return mergeProcessSection(defaultBackups, dcp?.backups, cp?.backups);\n}\n\nfunction mergeProcessCodeowners(\n cp: ProcessConfig | undefined,\n dcp: ProcessConfig | undefined\n): CodeownersConfig {\n const cco = cp?.codeowners;\n const dco = dcp?.codeowners;\n // Merge rules arrays: registry rules + project rules (deduplicated by pattern)\n const registryRules = dco?.rules ?? [];\n const projectRules = cco?.rules ?? [];\n // Project rules can override registry rules for the same pattern\n const ruleMap = new Map<string, { pattern: string; owners: string[] }>();\n for (const rule of registryRules) {\n ruleMap.set(rule.pattern, rule);\n }\n for (const rule of projectRules) {\n ruleMap.set(rule.pattern, rule);\n }\n const mergedRules = Array.from(ruleMap.values());\n return {\n ...defaultCodeowners,\n ...dco,\n ...cco,\n rules: mergedRules.length > 0 ? mergedRules : undefined,\n };\n}\n\nfunction mergeProcessDocs(\n cp: ProcessConfig | undefined,\n dcp: ProcessConfig | undefined\n): DocsConfig {\n return mergeProcessSection(defaultDocs, dcp?.docs, cp?.docs);\n}\n\nfunction mergeProcessForbiddenFiles(\n cp: ProcessConfig | undefined,\n dcp: ProcessConfig | undefined\n): ForbiddenFilesConfig {\n return mergeProcessSection(defaultForbiddenFiles, dcp?.forbidden_files, cp?.forbidden_files);\n}\n\nfunction mergeProcess(c: Config, dc: Config): ProcessConfig {\n return {\n hooks: mergeProcessHooks(c.process, dc.process),\n ci: mergeProcessCi(c.process, dc.process),\n branches: mergeProcessBranches(c.process, dc.process),\n commits: mergeProcessCommits(c.process, dc.process),\n changesets: mergeProcessChangesets(c.process, dc.process),\n pr: mergeProcessPr(c.process, dc.process),\n tickets: mergeProcessTickets(c.process, dc.process),\n coverage: mergeProcessCoverage(c.process, dc.process),\n repo: mergeProcessRepo(c.process, dc.process),\n backups: mergeProcessBackups(c.process, dc.process),\n codeowners: mergeProcessCodeowners(c.process, dc.process),\n docs: mergeProcessDocs(c.process, dc.process),\n forbidden_files: mergeProcessForbiddenFiles(c.process, dc.process),\n };\n}\n\n/**\n * Deep merge config with defaults\n */\nfunction mergeWithDefaults(config: Config): Config {\n return {\n code: mergeCode(config, defaultConfig),\n process: mergeProcess(config, defaultConfig),\n infra: {\n enabled: config.infra?.enabled ?? defaultConfig.infra?.enabled ?? false,\n manifest: config.infra?.manifest ?? defaultConfig.infra?.manifest ?? \"infra-manifest.json\",\n },\n monorepo: config.monorepo,\n };\n}\n\n/**\n * Get the project root directory (where standards.toml is located)\n */\nexport function getProjectRoot(configPath: string): string {\n return path.dirname(configPath);\n}\n\n/** Information about a config override */\nexport interface ConfigOverride {\n section: string;\n key: string;\n registryValue: string;\n projectValue: string;\n}\n\n/** Check if a project rule overrides a registry rule */\nfunction checkRuleOverride(\n projectRule: { pattern: string; owners: string[] },\n registryOwners: string[] | undefined\n): ConfigOverride | null {\n if (!registryOwners) {\n return null;\n }\n const registryStr = registryOwners.join(\" \");\n const projectStr = projectRule.owners.join(\" \");\n if (registryStr === projectStr) {\n return null;\n }\n return {\n section: \"process.codeowners.rules\",\n key: projectRule.pattern,\n registryValue: registryStr,\n projectValue: projectStr,\n };\n}\n\n/** Detect CODEOWNERS rule overrides between registry and project config */\nfunction detectCodeownersOverrides(\n registryConfig: Config | undefined,\n projectConfig: Config | undefined\n): ConfigOverride[] {\n const registryRules = registryConfig?.process?.codeowners?.rules ?? [];\n const projectRules = projectConfig?.process?.codeowners?.rules ?? [];\n const registryMap = new Map(registryRules.map((r) => [r.pattern, r.owners]));\n\n return projectRules\n .map((rule) => checkRuleOverride(rule, registryMap.get(rule.pattern)))\n .filter((o): o is ConfigOverride => o !== null);\n}\n\n/** Load registry config from extends */\nasync function loadRegistryConfig(\n extendsConfig: NonNullable<Config[\"extends\"]>,\n configDir: string\n): Promise<Config> {\n const registryModule = await import(\"./registry.js\");\n const loc = registryModule.parseRegistryUrl(extendsConfig.registry, configDir);\n const registryDir = await registryModule.fetchRegistry(loc);\n\n let config: Config = {};\n for (const name of extendsConfig.rulesets) {\n config = registryModule.mergeConfigs(config, registryModule.loadRuleset(registryDir, name));\n }\n return config;\n}\n\n/**\n * Load config and detect any overrides from registry\n * Returns both the merged config and information about overrides\n */\nexport async function loadConfigWithOverrides(\n configPath?: string\n): Promise<LoadConfigResult & { overrides: ConfigOverride[] }> {\n const resolvedPath = resolveConfigPath(configPath);\n const validatedConfig = validateConfig(parseTomlFile(resolvedPath));\n\n let overrides: ConfigOverride[] = [];\n if (validatedConfig.extends) {\n const registryConfig = await loadRegistryConfig(\n validatedConfig.extends,\n path.dirname(resolvedPath)\n );\n overrides = detectCodeownersOverrides(registryConfig, validatedConfig);\n }\n\n const { config, configPath: finalPath } = await loadConfigAsync(configPath);\n return { config, configPath: finalPath, overrides };\n}\n"," \nimport { minimatch } from \"minimatch\";\nimport { z } from \"zod\";\n\n/**\n * Count unclosed brackets and braces in a pattern, respecting escapes.\n */\nfunction countUnclosedDelimiters(pattern: string): { brackets: number; braces: number } {\n let brackets = 0;\n let braces = 0;\n for (let i = 0; i < pattern.length; i++) {\n if (pattern[i] === \"\\\\\" && i + 1 < pattern.length) {\n i++; // Skip escaped character\n continue;\n }\n switch (pattern[i]) {\n case \"[\":\n brackets++;\n break;\n case \"]\":\n if (brackets > 0) {\n brackets--;\n }\n break;\n case \"{\":\n braces++;\n break;\n case \"}\":\n if (braces > 0) {\n braces--;\n }\n break;\n }\n }\n return { brackets, braces };\n}\n\n/**\n * Validate that a string is a valid glob pattern.\n * Checks for balanced brackets/braces since minimatch is too lenient.\n */\nfunction isValidGlobPattern(pattern: string): { valid: boolean; error?: string } {\n if (pattern.length === 0) {\n return { valid: false, error: \"empty pattern\" };\n }\n\n const unclosed = countUnclosedDelimiters(pattern);\n if (unclosed.brackets > 0) {\n return { valid: false, error: \"unclosed bracket '['\" };\n }\n if (unclosed.braces > 0) {\n return { valid: false, error: \"unclosed brace '{'\" };\n }\n\n try {\n const result = minimatch.makeRe(pattern);\n return result === false ? { valid: false, error: \"invalid pattern syntax\" } : { valid: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Invalid glob pattern\";\n return { valid: false, error: message };\n }\n}\n\n/**\n * Zod schema for a valid glob pattern string\n */\nconst globPatternSchema = z.string().superRefine((pattern, ctx) => {\n const result = isValidGlobPattern(pattern);\n if (!result.valid) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Invalid glob pattern: \"${pattern}\" - ${result.error}`,\n });\n }\n});\n\n/**\n * Zod schema for standards.toml configuration\n */\n\n// =============================================================================\n// ESLint Configuration\n// =============================================================================\n\n/** ESLint rule severity */\nconst eslintRuleSeverity = z.enum([\"off\", \"warn\", \"error\"]);\n\n/**\n * ESLint rule with options in TOML-friendly object format.\n * Example: { severity = \"error\", max = 10 }\n * The 'severity' key is required, all other keys are rule-specific options.\n */\nconst eslintRuleWithOptions = z\n .object({\n severity: eslintRuleSeverity,\n })\n .catchall(z.unknown()); // Allow any additional options (max, skipBlankLines, etc.)\n\n/**\n * ESLint rule value - can be:\n * - severity string: \"error\"\n * - object with severity and options: { severity: \"error\", max: 10 }\n */\nconst eslintRuleValue = z.union([eslintRuleSeverity, eslintRuleWithOptions]);\n\n/** ESLint rules configuration */\nconst eslintRulesSchema = z.record(z.string(), eslintRuleValue).optional();\n\n/** ESLint configuration */\nconst eslintConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(true),\n files: z.array(z.string()).optional(), // Glob patterns for files to lint\n ignore: z.array(z.string()).optional(), // Glob patterns to ignore\n \"max-warnings\": z.number().int().nonnegative().optional(), // Max warnings before failure\n rules: eslintRulesSchema, // Required rules for audit (verifies eslint.config.js)\n dependencies: z.array(z.string()).optional(), // Custom dependency files for drift tracking\n })\n .strict()\n .optional();\n\n// =============================================================================\n// Ruff Configuration\n// =============================================================================\n\n/** Ruff lint configuration */\nconst ruffLintSchema = z\n .object({\n select: z.array(z.string()).optional(),\n ignore: z.array(z.string()).optional(),\n })\n .strict()\n .optional();\n\n/** Ruff configuration */\nconst ruffConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(true),\n \"line-length\": z.number().int().positive().optional(),\n lint: ruffLintSchema,\n dependencies: z.array(z.string()).optional(), // Custom dependency files for drift tracking\n })\n .strict()\n .optional();\n\n// =============================================================================\n// TypeScript Configuration\n// =============================================================================\n\n/** TypeScript compiler options that can be required via audit */\nconst tscCompilerOptionsSchema = z\n .object({\n strict: z.boolean().optional(),\n noImplicitAny: z.boolean().optional(),\n strictNullChecks: z.boolean().optional(),\n noUnusedLocals: z.boolean().optional(),\n noUnusedParameters: z.boolean().optional(),\n noImplicitReturns: z.boolean().optional(),\n noFallthroughCasesInSwitch: z.boolean().optional(),\n esModuleInterop: z.boolean().optional(),\n skipLibCheck: z.boolean().optional(),\n forceConsistentCasingInFileNames: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/** TypeScript compiler configuration */\nconst tscConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n require: tscCompilerOptionsSchema, // Required compiler options for audit\n dependencies: z.array(z.string()).optional(), // Custom dependency files for drift tracking\n })\n .strict()\n .optional();\n\n// =============================================================================\n// ty Configuration (Python Type Checking)\n// =============================================================================\n\n/** ty Python type checker configuration */\nconst tyConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n dependencies: z.array(z.string()).optional(), // Custom dependency files for drift tracking\n })\n .strict()\n .optional();\n\n// =============================================================================\n// Knip Configuration (Unused Code Detection)\n// =============================================================================\n\n/** Knip configuration */\nconst knipConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n dependencies: z.array(z.string()).optional(), // Custom dependency files for drift tracking\n })\n .strict()\n .optional();\n\n// =============================================================================\n// Vulture Configuration (Python Dead Code Detection)\n// =============================================================================\n\n/** Vulture configuration */\nconst vultureConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n dependencies: z.array(z.string()).optional(), // Custom dependency files for drift tracking\n })\n .strict()\n .optional();\n\n// =============================================================================\n// Coverage Run Configuration\n// =============================================================================\n\n/** Coverage run test runner type */\nconst coverageRunnerSchema = z.enum([\"vitest\", \"jest\", \"pytest\", \"auto\"]);\n\n/** Coverage run configuration - runs tests and verifies coverage threshold */\nconst coverageRunConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n min_threshold: z.number().int().min(0).max(100).optional().default(80), // Minimum coverage percentage\n runner: coverageRunnerSchema.optional().default(\"auto\"), // Test runner to use\n command: z.string().optional(), // Custom command to run tests with coverage\n dependencies: z.array(z.string()).optional(), // Custom dependency files for drift tracking\n })\n .strict()\n .optional();\n\n// =============================================================================\n// Security Configuration\n// =============================================================================\n\n/** Secrets (Gitleaks) configuration */\nconst secretsConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n scan_mode: z\n .enum([\"branch\", \"files\", \"staged\", \"full\"])\n .optional()\n .default(\"branch\"), // branch: scan current branch commits, files: scan filesystem, staged: staged files only, full: entire git history\n base_branch: z.string().optional().default(\"main\"), // Branch to compare against for \"branch\" mode\n dependencies: z.array(z.string()).optional(), // Custom dependency files for drift tracking\n })\n .strict()\n .optional();\n\n/** pnpm audit configuration */\nconst pnpmauditConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n exclude_dev: z.boolean().optional().default(true),\n dependencies: z.array(z.string()).optional(), // Custom dependency files for drift tracking\n })\n .strict()\n .optional();\n\n/** pip-audit configuration */\nconst pipauditConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n dependencies: z.array(z.string()).optional(), // Custom dependency files for drift tracking\n })\n .strict()\n .optional();\n\n/** Code security configuration */\nconst codeSecuritySchema = z\n .object({\n secrets: secretsConfigSchema,\n pnpmaudit: pnpmauditConfigSchema,\n pipaudit: pipauditConfigSchema,\n })\n .strict()\n .optional();\n\n// =============================================================================\n// Naming Conventions Configuration\n// =============================================================================\n\n/** Supported case types for naming conventions */\nconst caseTypeSchema = z.enum([\"kebab-case\", \"snake_case\", \"camelCase\", \"PascalCase\"]);\n\n/** Helper to validate no duplicate values in array */\nconst uniqueArraySchema = <T extends z.ZodTypeAny>(schema: T) =>\n z.array(schema).refine((arr) => new Set(arr).size === arr.length, {\n message: \"Duplicate values not allowed\",\n });\n\n/** Helper to validate no duplicate values in array with minimum length */\nconst uniqueArraySchemaMin1 = <T extends z.ZodTypeAny>(schema: T) =>\n z\n .array(schema)\n .min(1, \"At least one value is required\")\n .refine((arr) => new Set(arr).size === arr.length, {\n message: \"Duplicate values not allowed\",\n });\n\n/** Single naming rule */\nconst namingRuleSchema = z\n .object({\n extensions: uniqueArraySchemaMin1(z.string()), // e.g., [\"ts\", \"tsx\"] - no duplicates allowed, at least one required\n file_case: caseTypeSchema,\n folder_case: caseTypeSchema,\n exclude: z.array(z.string()).optional(), // Glob patterns to exclude, e.g., [\"tests/**\"]\n allow_dynamic_routes: z.boolean().optional(), // Allow Next.js/Remix dynamic route folders: [id], [...slug], (group)\n })\n .strict();\n\n/** Naming conventions configuration */\nconst namingConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n rules: z.array(namingRuleSchema).optional(),\n })\n .strict()\n .superRefine((data, ctx) => {\n if (!data.rules || data.rules.length <= 1) {\n return;\n }\n\n const extensionToRuleIndex = new Map<string, number>();\n for (let i = 0; i < data.rules.length; i++) {\n for (const ext of data.rules[i].extensions) {\n const existing = extensionToRuleIndex.get(ext);\n if (existing !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Extension \"${ext}\" appears in multiple naming rules (rules ${existing + 1} and ${i + 1}). Each extension can only appear in one rule.`,\n path: [\"rules\", i, \"extensions\"],\n });\n } else {\n extensionToRuleIndex.set(ext, i);\n }\n }\n }\n })\n .optional();\n\n// =============================================================================\n// Quality Configuration (Disable Comments Detection)\n// =============================================================================\n\n/** Disable comments configuration */\nconst disableCommentsConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n patterns: z.array(z.string()).optional(), // Override default patterns\n extensions: uniqueArraySchema(z.string()).optional(), // File extensions to scan - no duplicates allowed\n exclude: z.array(z.string()).optional(), // Glob patterns to exclude\n })\n .strict()\n .optional();\n\n/** Code quality configuration */\nconst codeQualitySchema = z\n .object({\n \"disable-comments\": disableCommentsConfigSchema,\n })\n .strict()\n .optional();\n\n// =============================================================================\n// Code Domain Configuration\n// =============================================================================\n\n/** Code linting configuration */\nconst codeLintingSchema = z\n .object({\n eslint: eslintConfigSchema,\n ruff: ruffConfigSchema,\n })\n .strict()\n .optional();\n\n/** Code type checking configuration */\nconst codeTypesSchema = z\n .object({\n tsc: tscConfigSchema,\n ty: tyConfigSchema,\n })\n .strict()\n .optional();\n\n/** Code unused detection configuration */\nconst codeUnusedSchema = z\n .object({\n knip: knipConfigSchema,\n vulture: vultureConfigSchema,\n })\n .strict()\n .optional();\n\n/** Code domain configuration */\nconst codeSchema = z\n .object({\n linting: codeLintingSchema,\n types: codeTypesSchema,\n unused: codeUnusedSchema,\n coverage_run: coverageRunConfigSchema,\n security: codeSecuritySchema,\n naming: namingConfigSchema,\n quality: codeQualitySchema,\n })\n .strict()\n .optional();\n\n// =============================================================================\n// Process Domain Configuration\n// =============================================================================\n\n/** Hook commands configuration - maps hook name to required commands */\nconst hookCommandsSchema = z.record(z.string(), z.array(z.string())).optional();\n\n/** Git hooks (husky) configuration */\nconst hooksConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n require_husky: z.boolean().optional().default(true), // Require .husky/ directory\n require_hooks: z.array(z.string()).optional(), // e.g., [\"pre-commit\", \"pre-push\"]\n commands: hookCommandsSchema, // e.g., { \"pre-commit\": [\"lint-staged\"] }\n protected_branches: z.array(z.string()).optional(), // e.g., [\"main\", \"master\"] - verify pre-push prevents direct pushes\n })\n .strict()\n .optional();\n\n/**\n * CI commands configuration value - can be:\n * - Array of strings: commands required anywhere in workflow\n * - Record mapping job names to arrays: commands required in specific jobs\n */\nconst ciCommandsValueSchema = z.union([\n z.array(z.string()), // Workflow-level: [\"cmd1\", \"cmd2\"]\n z.record(z.string(), z.array(z.string())), // Job-level: { jobName: [\"cmd1\"] }\n]);\n\n/** CI commands schema - maps workflow file to required commands */\nconst ciCommandsSchema = z.record(z.string(), ciCommandsValueSchema).optional();\n\n/** CI/CD workflows configuration */\nconst ciConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n require_workflows: z.array(z.string()).optional(), // e.g., [\"ci.yml\", \"release.yml\"]\n jobs: z.record(z.string(), z.array(z.string())).optional(), // e.g., { \"ci.yml\": [\"test\", \"lint\"] }\n actions: z.record(z.string(), z.array(z.string())).optional(), // e.g., { \"ci.yml\": [\"actions/checkout\"] }\n commands: ciCommandsSchema, // e.g., { \"ci.yml\": [\"conform code check\"] } or { \"ci.yml\": { \"test\": [\"npm test\"] } }\n })\n .strict()\n .optional();\n\n/** Branch naming configuration */\nconst branchesConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n pattern: z.string().optional(), // Regex pattern for branch names\n exclude: z.array(z.string()).optional(), // Branches to skip (e.g., [\"main\", \"master\"])\n require_issue: z.boolean().optional().default(false), // Require issue number in branch name\n issue_pattern: z.string().optional(), // Regex to extract issue number (default: captures number after type/)\n })\n .strict()\n .optional();\n\n/** Commit message format configuration */\nconst commitsConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n pattern: z.string().optional(), // Regex pattern for commit messages (e.g., conventional commits)\n types: z.array(z.string()).optional(), // Allowed commit types (e.g., [\"feat\", \"fix\", \"chore\"])\n require_scope: z.boolean().optional().default(false), // Require scope like feat(api): ...\n max_subject_length: z.number().int().positive().optional(), // Max length of subject line\n })\n .strict()\n .optional();\n\n/** Changeset bump type */\nconst changesetBumpTypeSchema = z.enum([\"patch\", \"minor\", \"major\"]);\n\n/** Changeset validation configuration */\nconst changesetsConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n require_for_paths: z.array(z.string()).optional(), // Glob patterns that require changesets (e.g., [\"src/**\"])\n exclude_paths: z.array(z.string()).optional(), // Paths that don't require changesets (e.g., [\"**/*.test.ts\"])\n validate_format: z.boolean().optional().default(true), // Validate changeset file format (frontmatter, description)\n allowed_bump_types: z.array(changesetBumpTypeSchema).optional(), // Restrict allowed bump types (e.g., [\"patch\", \"minor\"])\n require_description: z.boolean().optional().default(true), // Require non-empty description\n min_description_length: z.number().int().positive().optional(), // Minimum description length\n })\n .strict()\n .optional();\n\n/** PR configuration */\nconst prConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n max_files: z.number().int().positive().optional(), // Max files changed in PR\n max_lines: z.number().int().positive().optional(), // Max lines changed (additions + deletions)\n require_issue: z.boolean().optional().default(false), // Require issue reference in PR description\n issue_keywords: z.array(z.string()).optional(), // Keywords that link to issues (e.g., [\"Closes\", \"Fixes\", \"Resolves\"])\n exclude: z.array(globPatternSchema).optional(), // Glob patterns to exclude from size calculation (e.g., [\"*.lock\", \"**/*.snap\"])\n })\n .strict()\n .optional();\n\n/** Ticket reference validation configuration */\nconst ticketsConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n pattern: z.string().optional(), // Regex pattern for ticket IDs (e.g., \"^(ABC|XYZ)-[0-9]+\")\n require_in_commits: z.boolean().optional().default(true), // Require ticket in commit messages\n require_in_branch: z.boolean().optional().default(false), // Require ticket in branch name\n })\n .strict()\n .optional();\n\n/** Coverage enforcement mode */\nconst coverageEnforceInSchema = z.enum([\"ci\", \"config\", \"both\"]);\n\n/** Coverage enforcement configuration */\nconst coverageConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n min_threshold: z.number().int().min(0).max(100).optional(), // Minimum coverage percentage\n enforce_in: coverageEnforceInSchema.optional().default(\"config\"), // Where to verify coverage\n ci_workflow: z.string().optional(), // Workflow file to check (e.g., \"ci.yml\")\n ci_job: z.string().optional(), // Job name to check (e.g., \"test\")\n })\n .strict()\n .optional();\n\n/** Bypass actor type for GitHub Rulesets */\nconst bypassActorTypeSchema = z.enum([\n \"Integration\", // GitHub App\n \"OrganizationAdmin\", // Org admin role\n \"RepositoryRole\", // Repository role (1=read, 2=triage, 3=write, 4=maintain, 5=admin)\n \"Team\", // GitHub team\n \"DeployKey\", // Deploy key\n]);\n\n/** Bypass mode - when the actor can bypass */\nconst bypassModeSchema = z.enum([\n \"always\", // Can always bypass\n \"pull_request\", // Can bypass only via pull request\n]);\n\n/** Single bypass actor configuration */\nconst bypassActorSchema = z\n .object({\n actor_type: bypassActorTypeSchema,\n actor_id: z.number().int().positive().optional(), // Actor ID (required except for DeployKey)\n bypass_mode: bypassModeSchema.optional().default(\"always\"),\n })\n .strict();\n\n/** Ruleset configuration (uses GitHub Rulesets API) */\nconst rulesetConfigSchema = z\n .object({\n name: z.string().optional().default(\"Branch Protection\"), // Ruleset name in GitHub\n branch: z.string().optional().default(\"main\"), // Branch to check (default: main)\n enforcement: z.enum([\"active\", \"evaluate\", \"disabled\"]).optional().default(\"active\"), // Ruleset enforcement\n required_reviews: z.number().int().min(0).optional(), // Minimum required reviews\n dismiss_stale_reviews: z.boolean().optional(), // Dismiss stale reviews on new commits\n require_code_owner_reviews: z.boolean().optional(), // Require CODEOWNER review\n require_status_checks: z.array(z.string()).optional(), // Required status checks\n require_branches_up_to_date: z.boolean().optional(), // Require branch to be up to date\n require_signed_commits: z.boolean().optional(), // Require signed commits\n enforce_admins: z.boolean().optional(), // Enforce rules for admins (no bypass actors when true)\n bypass_actors: z.array(bypassActorSchema).optional(), // Actors that can bypass rules\n })\n .strict()\n .optional();\n\n/** Tag protection ruleset configuration */\nconst tagProtectionConfigSchema = z\n .object({\n patterns: z.array(z.string()).optional(), // Tag patterns to protect (e.g., [\"v*\"])\n prevent_deletion: z.boolean().optional().default(true), // Prevent tag deletion\n prevent_update: z.boolean().optional().default(true), // Prevent tag updates (force-push)\n })\n .strict()\n .optional();\n\n/** Repository settings configuration */\nconst repoConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n require_branch_protection: z.boolean().optional().default(false), // Check branch protection exists\n require_codeowners: z.boolean().optional().default(false), // Check CODEOWNERS file exists\n ruleset: rulesetConfigSchema, // GitHub Ruleset configuration\n tag_protection: tagProtectionConfigSchema, // Tag protection via GitHub rulesets\n })\n .strict()\n .optional();\n\n/** S3 backup verification configuration */\nconst backupsConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n bucket: z.string().optional(), // S3 bucket name\n prefix: z.string().optional(), // S3 key prefix\n max_age_hours: z.number().int().positive().optional().default(24), // Max age of most recent backup\n region: z.string().optional(), // AWS region (defaults to AWS_REGION env)\n })\n .strict()\n .optional();\n\n/** Single CODEOWNERS rule */\nconst codeownersRuleSchema = z\n .object({\n pattern: z.string(), // File pattern (e.g., \"/standards.toml\", \"*.js\", \"/src/api/*\")\n owners: z.array(z.string()), // Owner handles (e.g., [\"@user\", \"@org/team\"])\n })\n .strict();\n\n/** CODEOWNERS validation configuration */\nconst codeownersConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n rules: z.array(codeownersRuleSchema).optional(), // Required rules in CODEOWNERS\n })\n .strict()\n .optional();\n\n/** Doc type configuration - defines required sections and frontmatter per doc type */\nconst docsTypeConfigSchema = z\n .object({\n required_sections: z.array(z.string()).optional(), // e.g., [\"Overview\", \"Parameters\", \"Returns\", \"Examples\"]\n frontmatter: z.array(z.string()).optional(), // e.g., [\"title\", \"tracks\"]\n })\n .strict();\n\n/** Documentation enforcement mode */\nconst docsEnforcementSchema = z.enum([\"block\", \"warn\"]);\n\n/** Documentation governance configuration */\nconst docsConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n path: z.string().optional().default(\"docs/\"), // Documentation directory\n enforcement: docsEnforcementSchema.optional().default(\"warn\"), // \"block\" or \"warn\"\n allowlist: z.array(z.string()).optional(), // Markdown files allowed outside docs/, e.g., [\"README.md\", \"CLAUDE.md\"]\n max_files: z.number().int().positive().optional(), // Max markdown files in docs/\n max_file_lines: z.number().int().positive().optional(), // Max lines per markdown file\n max_total_kb: z.number().int().positive().optional(), // Max total size of docs/\n staleness_days: z.number().int().positive().optional().default(30), // Days before doc is considered stale\n stale_mappings: z.record(z.string(), z.string()).optional(), // Override doc-to-source mappings\n min_coverage: z.number().int().min(0).max(100).optional(), // Minimum API coverage percentage\n coverage_paths: z.array(z.string()).optional(), // Glob patterns for source files, e.g., [\"src/**/*.ts\"]\n exclude_patterns: z.array(z.string()).optional(), // Exclude from coverage, e.g., [\"**/*.test.ts\"]\n types: z.record(z.string(), docsTypeConfigSchema).optional(), // Per-type config, e.g., { api: {...}, guide: {...} }\n })\n .strict()\n .optional();\n\n// =============================================================================\n// MCP Configuration\n// =============================================================================\n\n/** MCP standards source configuration */\nconst mcpStandardsSchema = z\n .object({\n source: z\n .string()\n .optional()\n .describe(\n 'Standards repository source: \"github:owner/repo\", \"github:owner/repo@ref\", or local path'\n ),\n })\n .strict()\n .optional();\n\n/** MCP configuration */\nconst mcpSchema = z\n .object({\n standards: mcpStandardsSchema,\n })\n .strict()\n .optional();\n\n// =============================================================================\n// Infra Domain Configuration\n// =============================================================================\n\n/** Infra domain configuration for AWS resource verification */\nconst infraSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n manifest: z.string().optional().default(\"infra-manifest.json\"), // Path to manifest file\n })\n .strict()\n .optional();\n\n/** Default ignore patterns for forbidden files scan */\nconst DEFAULT_FORBIDDEN_FILES_IGNORE = [\"**/node_modules/**\", \"**/.git/**\"];\n\n/** Forbidden files configuration - files that must NOT exist */\nconst forbiddenFilesConfigSchema = z\n .object({\n enabled: z.boolean().optional().default(false),\n files: z.array(globPatternSchema).optional(), // Glob patterns for files that must not exist (validated)\n ignore: z.array(globPatternSchema).optional(), // Glob patterns to ignore (validated, overrides defaults if provided)\n message: z.string().optional(), // Custom message explaining why these files are forbidden\n })\n .strict()\n .optional();\n\nexport { DEFAULT_FORBIDDEN_FILES_IGNORE };\n\n/** Process domain configuration */\nconst processSchema = z\n .object({\n hooks: hooksConfigSchema,\n ci: ciConfigSchema,\n branches: branchesConfigSchema,\n commits: commitsConfigSchema,\n changesets: changesetsConfigSchema,\n pr: prConfigSchema,\n tickets: ticketsConfigSchema,\n coverage: coverageConfigSchema,\n repo: repoConfigSchema,\n backups: backupsConfigSchema,\n codeowners: codeownersConfigSchema,\n docs: docsConfigSchema,\n forbidden_files: forbiddenFilesConfigSchema,\n })\n .strict()\n .optional();\n\n// =============================================================================\n// Metadata Configuration\n// =============================================================================\n\n/** Repository tier for standards enforcement level */\nconst tierSchema = z.enum([\"production\", \"internal\", \"prototype\"]);\n\n/** Repository status indicating lifecycle phase */\nconst statusSchema = z.enum([\"active\", \"pre-release\", \"deprecated\"]);\n\n/** Metadata configuration for repository tier, project, organisation, and status */\nconst metadataSchema = z\n .object({\n tier: tierSchema,\n project: z.string().optional(),\n organisation: z.string().optional(),\n status: statusSchema.optional().default(\"active\"),\n })\n .strict()\n .optional();\n\n// =============================================================================\n// Extends Configuration\n// =============================================================================\n\n/** Extends configuration for inheriting from registries */\nconst extendsSchema = z\n .object({\n registry: z.string(), // e.g., \"github:myorg/standards\" or local path\n rulesets: z.array(z.string()), // e.g., [\"base\", \"typescript\"]\n })\n .strict()\n .optional();\n\n// =============================================================================\n// Monorepo Configuration\n// =============================================================================\n\n/** Monorepo project detection configuration */\nconst monorepoSchema = z\n .object({\n exclude: z.array(globPatternSchema).optional(), // Glob patterns to exclude from project detection\n })\n .strict()\n .optional();\n\n// =============================================================================\n// Full Configuration\n// =============================================================================\n\n/** Full standards.toml schema */\nexport const configSchema = z\n .object({\n metadata: metadataSchema,\n extends: extendsSchema,\n code: codeSchema,\n process: processSchema,\n infra: infraSchema,\n mcp: mcpSchema,\n monorepo: monorepoSchema,\n })\n .strict();\n\n/** Inferred TypeScript type from schema */\nexport type Config = z.infer<typeof configSchema>;\n\n/** Default configuration */\nexport const defaultConfig: Config = {\n code: {\n linting: {\n eslint: { enabled: false },\n ruff: { enabled: false },\n },\n types: {\n tsc: { enabled: false },\n ty: { enabled: false },\n },\n unused: {\n knip: { enabled: false },\n vulture: { enabled: false },\n },\n coverage_run: {\n enabled: false,\n min_threshold: 80,\n runner: \"auto\",\n },\n security: {\n secrets: { enabled: false, scan_mode: \"branch\", base_branch: \"main\" },\n pnpmaudit: { enabled: false, exclude_dev: true },\n pipaudit: { enabled: false },\n },\n naming: {\n enabled: false,\n },\n quality: {\n \"disable-comments\": { enabled: false },\n },\n },\n monorepo: {},\n process: {\n hooks: {\n enabled: false,\n require_husky: true,\n },\n ci: {\n enabled: false,\n },\n branches: {\n enabled: false,\n require_issue: false,\n },\n commits: {\n enabled: false,\n require_scope: false,\n },\n changesets: {\n enabled: false,\n validate_format: true,\n require_description: true,\n },\n pr: {\n enabled: false,\n require_issue: false,\n },\n tickets: {\n enabled: false,\n require_in_commits: true,\n require_in_branch: false,\n },\n coverage: {\n enabled: false,\n enforce_in: \"config\",\n },\n repo: {\n enabled: false,\n require_branch_protection: false,\n require_codeowners: false,\n },\n backups: {\n enabled: false,\n max_age_hours: 24,\n },\n codeowners: {\n enabled: false,\n },\n docs: {\n enabled: false,\n path: \"docs/\",\n enforcement: \"warn\",\n staleness_days: 30,\n },\n forbidden_files: {\n enabled: false,\n },\n },\n infra: {\n enabled: false,\n manifest: \"infra-manifest.json\",\n },\n mcp: {\n standards: {\n source: undefined,\n },\n },\n};\n"],"mappings":";;;;;;AACA,YAAYA,SAAQ;AACpB,YAAY,QAAQ;AACpB,YAAYC,WAAU;AAEtB,YAAY,UAAU;AACtB,SAAS,aAAa;;;ACNtB,YAAY,QAAQ;AACpB,YAAY,UAAU;AAEtB,OAAO,UAAU;;;ACFjB,SAAS,iBAAiB;AAC1B,SAAS,SAAS;AAKlB,SAAS,wBAAwB,SAAuD;AACtF,MAAI,WAAW;AACf,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,QAAI,QAAQ,CAAC,MAAM,QAAQ,IAAI,IAAI,QAAQ,QAAQ;AACjD;AACA;AAAA,IACF;AACA,YAAQ,QAAQ,CAAC,GAAG;AAAA,MAClB,KAAK;AACH;AACA;AAAA,MACF,KAAK;AACH,YAAI,WAAW,GAAG;AAChB;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH;AACA;AAAA,MACF,KAAK;AACH,YAAI,SAAS,GAAG;AACd;AAAA,QACF;AACA;AAAA,IACJ;AAAA,EACF;AACA,SAAO,EAAE,UAAU,OAAO;AAC5B;AAMA,SAAS,mBAAmB,SAAqD;AAC/E,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,EAAE,OAAO,OAAO,OAAO,gBAAgB;AAAA,EAChD;AAEA,QAAM,WAAW,wBAAwB,OAAO;AAChD,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,EAAE,OAAO,OAAO,OAAO,uBAAuB;AAAA,EACvD;AACA,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO,EAAE,OAAO,OAAO,OAAO,qBAAqB;AAAA,EACrD;AAEA,MAAI;AACF,UAAM,SAAS,UAAU,OAAO,OAAO;AACvC,WAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,OAAO,yBAAyB,IAAI,EAAE,OAAO,KAAK;AAAA,EAC9F,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,WAAO,EAAE,OAAO,OAAO,OAAO,QAAQ;AAAA,EACxC;AACF;AAKA,IAAM,oBAAoB,EAAE,OAAO,EAAE,YAAY,CAAC,SAAS,QAAQ;AACjE,QAAM,SAAS,mBAAmB,OAAO;AACzC,MAAI,CAAC,OAAO,OAAO;AACjB,QAAI,SAAS;AAAA,MACX,MAAM,EAAE,aAAa;AAAA,MACrB,SAAS,0BAA0B,OAAO,OAAO,OAAO,KAAK;AAAA,IAC/D,CAAC;AAAA,EACH;AACF,CAAC;AAWD,IAAM,qBAAqB,EAAE,KAAK,CAAC,OAAO,QAAQ,OAAO,CAAC;AAO1D,IAAM,wBAAwB,EAC3B,OAAO;AAAA,EACN,UAAU;AACZ,CAAC,EACA,SAAS,EAAE,QAAQ,CAAC;AAOvB,IAAM,kBAAkB,EAAE,MAAM,CAAC,oBAAoB,qBAAqB,CAAC;AAG3E,IAAM,oBAAoB,EAAE,OAAO,EAAE,OAAO,GAAG,eAAe,EAAE,SAAS;AAGzE,IAAM,qBAAqB,EACxB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAC5C,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EACpC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EACrC,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS;AAAA;AAAA,EACxD,OAAO;AAAA;AAAA,EACP,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAC7C,CAAC,EACA,OAAO,EACP,SAAS;AAOZ,IAAM,iBAAiB,EACpB,OAAO;AAAA,EACN,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACrC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AACvC,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,mBAAmB,EACtB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAC5C,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACpD,MAAM;AAAA,EACN,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAC7C,CAAC,EACA,OAAO,EACP,SAAS;AAOZ,IAAM,2BAA2B,EAC9B,OAAO;AAAA,EACN,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,eAAe,EAAE,QAAQ,EAAE,SAAS;AAAA,EACpC,kBAAkB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACvC,gBAAgB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACrC,oBAAoB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACzC,mBAAmB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACxC,4BAA4B,EAAE,QAAQ,EAAE,SAAS;AAAA,EACjD,iBAAiB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACtC,cAAc,EAAE,QAAQ,EAAE,SAAS;AAAA,EACnC,kCAAkC,EAAE,QAAQ,EAAE,SAAS;AACzD,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,kBAAkB,EACrB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,SAAS;AAAA;AAAA,EACT,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAC7C,CAAC,EACA,OAAO,EACP,SAAS;AAOZ,IAAM,iBAAiB,EACpB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAC7C,CAAC,EACA,OAAO,EACP,SAAS;AAOZ,IAAM,mBAAmB,EACtB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAC7C,CAAC,EACA,OAAO,EACP,SAAS;AAOZ,IAAM,sBAAsB,EACzB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAC7C,CAAC,EACA,OAAO,EACP,SAAS;AAOZ,IAAM,uBAAuB,EAAE,KAAK,CAAC,UAAU,QAAQ,UAAU,MAAM,CAAC;AAGxE,IAAM,0BAA0B,EAC7B,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA;AAAA,EACrE,QAAQ,qBAAqB,SAAS,EAAE,QAAQ,MAAM;AAAA;AAAA,EACtD,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC7B,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAC7C,CAAC,EACA,OAAO,EACP,SAAS;AAOZ,IAAM,sBAAsB,EACzB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,WAAW,EACR,KAAK,CAAC,UAAU,SAAS,UAAU,MAAM,CAAC,EAC1C,SAAS,EACT,QAAQ,QAAQ;AAAA;AAAA,EACnB,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,MAAM;AAAA;AAAA,EACjD,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAC7C,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,wBAAwB,EAC3B,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAChD,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAC7C,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,uBAAuB,EAC1B,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAC7C,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,qBAAqB,EACxB,OAAO;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,UAAU;AACZ,CAAC,EACA,OAAO,EACP,SAAS;AAOZ,IAAM,iBAAiB,EAAE,KAAK,CAAC,cAAc,cAAc,aAAa,YAAY,CAAC;AAGrF,IAAM,oBAAoB,CAAyB,WACjD,EAAE,MAAM,MAAM,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,GAAG,EAAE,SAAS,IAAI,QAAQ;AAAA,EAChE,SAAS;AACX,CAAC;AAGH,IAAM,wBAAwB,CAAyB,WACrD,EACG,MAAM,MAAM,EACZ,IAAI,GAAG,gCAAgC,EACvC,OAAO,CAAC,QAAQ,IAAI,IAAI,GAAG,EAAE,SAAS,IAAI,QAAQ;AAAA,EACjD,SAAS;AACX,CAAC;AAGL,IAAM,mBAAmB,EACtB,OAAO;AAAA,EACN,YAAY,sBAAsB,EAAE,OAAO,CAAC;AAAA;AAAA,EAC5C,WAAW;AAAA,EACX,aAAa;AAAA,EACb,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EACtC,sBAAsB,EAAE,QAAQ,EAAE,SAAS;AAAA;AAC7C,CAAC,EACA,OAAO;AAGV,IAAM,qBAAqB,EACxB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,OAAO,EAAE,MAAM,gBAAgB,EAAE,SAAS;AAC5C,CAAC,EACA,OAAO,EACP,YAAY,CAAC,MAAM,QAAQ;AAC1B,MAAI,CAAC,KAAK,SAAS,KAAK,MAAM,UAAU,GAAG;AACzC;AAAA,EACF;AAEA,QAAM,uBAAuB,oBAAI,IAAoB;AACrD,WAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;AAC1C,eAAW,OAAO,KAAK,MAAM,CAAC,EAAE,YAAY;AAC1C,YAAM,WAAW,qBAAqB,IAAI,GAAG;AAC7C,UAAI,aAAa,QAAW;AAC1B,YAAI,SAAS;AAAA,UACX,MAAM,EAAE,aAAa;AAAA,UACrB,SAAS,cAAc,GAAG,6CAA6C,WAAW,CAAC,QAAQ,IAAI,CAAC;AAAA,UAChG,MAAM,CAAC,SAAS,GAAG,YAAY;AAAA,QACjC,CAAC;AAAA,MACH,OAAO;AACL,6BAAqB,IAAI,KAAK,CAAC;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AACF,CAAC,EACA,SAAS;AAOZ,IAAM,8BAA8B,EACjC,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EACvC,YAAY,kBAAkB,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EACnD,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AACxC,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,oBAAoB,EACvB,OAAO;AAAA,EACN,oBAAoB;AACtB,CAAC,EACA,OAAO,EACP,SAAS;AAOZ,IAAM,oBAAoB,EACvB,OAAO;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AACR,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,kBAAkB,EACrB,OAAO;AAAA,EACN,KAAK;AAAA,EACL,IAAI;AACN,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,mBAAmB,EACtB,OAAO;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AACX,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,aAAa,EAChB,OAAO;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,SAAS;AACX,CAAC,EACA,OAAO,EACP,SAAS;AAOZ,IAAM,qBAAqB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS;AAG9E,IAAM,oBAAoB,EACvB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA;AAAA,EAClD,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAC5C,UAAU;AAAA;AAAA,EACV,oBAAoB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AACnD,CAAC,EACA,OAAO,EACP,SAAS;AAOZ,IAAM,wBAAwB,EAAE,MAAM;AAAA,EACpC,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA;AAAA,EAClB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAAA;AAC1C,CAAC;AAGD,IAAM,mBAAmB,EAAE,OAAO,EAAE,OAAO,GAAG,qBAAqB,EAAE,SAAS;AAG9E,IAAM,iBAAiB,EACpB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,mBAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAChD,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS;AAAA;AAAA,EACzD,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS;AAAA;AAAA,EAC5D,UAAU;AAAA;AACZ,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,uBAAuB,EAC1B,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC7B,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EACtC,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA;AAAA,EACnD,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA;AACrC,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,sBAAsB,EACzB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC7B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EACpC,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA;AAAA,EACnD,oBAAoB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA;AAC3D,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,0BAA0B,EAAE,KAAK,CAAC,SAAS,SAAS,OAAO,CAAC;AAGlE,IAAM,yBAAyB,EAC5B,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,mBAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAChD,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAC5C,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA;AAAA,EACpD,oBAAoB,EAAE,MAAM,uBAAuB,EAAE,SAAS;AAAA;AAAA,EAC9D,qBAAqB,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA;AAAA,EACxD,wBAAwB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA;AAC/D,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,iBAAiB,EACpB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA;AAAA,EAChD,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA;AAAA,EAChD,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA;AAAA,EACnD,gBAAgB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAC7C,SAAS,EAAE,MAAM,iBAAiB,EAAE,SAAS;AAAA;AAC/C,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,sBAAsB,EACzB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC7B,oBAAoB,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA;AAAA,EACvD,mBAAmB,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA;AACzD,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,0BAA0B,EAAE,KAAK,CAAC,MAAM,UAAU,MAAM,CAAC;AAG/D,IAAM,uBAAuB,EAC1B,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA;AAAA,EACzD,YAAY,wBAAwB,SAAS,EAAE,QAAQ,QAAQ;AAAA;AAAA,EAC/D,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EACjC,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA;AAC9B,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,wBAAwB,EAAE,KAAK;AAAA,EACnC;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF,CAAC;AAGD,IAAM,mBAAmB,EAAE,KAAK;AAAA,EAC9B;AAAA;AAAA,EACA;AAAA;AACF,CAAC;AAGD,IAAM,oBAAoB,EACvB,OAAO;AAAA,EACN,YAAY;AAAA,EACZ,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA;AAAA,EAC/C,aAAa,iBAAiB,SAAS,EAAE,QAAQ,QAAQ;AAC3D,CAAC,EACA,OAAO;AAGV,IAAM,sBAAsB,EACzB,OAAO;AAAA,EACN,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,mBAAmB;AAAA;AAAA,EACvD,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,MAAM;AAAA;AAAA,EAC5C,aAAa,EAAE,KAAK,CAAC,UAAU,YAAY,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,QAAQ;AAAA;AAAA,EACnF,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,EACnD,uBAAuB,EAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,EAC5C,4BAA4B,EAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,EACjD,uBAAuB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EACpD,6BAA6B,EAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,EAClD,wBAAwB,EAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,EAC7C,gBAAgB,EAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,EACrC,eAAe,EAAE,MAAM,iBAAiB,EAAE,SAAS;AAAA;AACrD,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,4BAA4B,EAC/B,OAAO;AAAA,EACN,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EACvC,kBAAkB,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA;AAAA,EACrD,gBAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA;AACrD,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,mBAAmB,EACtB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,2BAA2B,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA;AAAA,EAC/D,oBAAoB,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA;AAAA,EACxD,SAAS;AAAA;AAAA,EACT,gBAAgB;AAAA;AAClB,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,sBAAsB,EACzB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC5B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC5B,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA;AAAA,EAChE,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA;AAC9B,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,uBAAuB,EAC1B,OAAO;AAAA,EACN,SAAS,EAAE,OAAO;AAAA;AAAA,EAClB,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA;AAC5B,CAAC,EACA,OAAO;AAGV,IAAM,yBAAyB,EAC5B,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,OAAO,EAAE,MAAM,oBAAoB,EAAE,SAAS;AAAA;AAChD,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,uBAAuB,EAC1B,OAAO;AAAA,EACN,mBAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAChD,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAC5C,CAAC,EACA,OAAO;AAGV,IAAM,wBAAwB,EAAE,KAAK,CAAC,SAAS,MAAM,CAAC;AAGtD,IAAM,mBAAmB,EACtB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,OAAO;AAAA;AAAA,EAC3C,aAAa,sBAAsB,SAAS,EAAE,QAAQ,MAAM;AAAA;AAAA,EAC5D,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EACxC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA;AAAA,EAChD,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA;AAAA,EACrD,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA;AAAA,EACnD,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA;AAAA,EACjE,gBAAgB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAC1D,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA;AAAA,EACxD,gBAAgB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAC7C,kBAAkB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAC/C,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,oBAAoB,EAAE,SAAS;AAAA;AAC7D,CAAC,EACA,OAAO,EACP,SAAS;AAOZ,IAAM,qBAAqB,EACxB,OAAO;AAAA,EACN,QAAQ,EACL,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EACF;AACJ,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,YAAY,EACf,OAAO;AAAA,EACN,WAAW;AACb,CAAC,EACA,OAAO,EACP,SAAS;AAOZ,IAAM,cAAc,EACjB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,qBAAqB;AAAA;AAC/D,CAAC,EACA,OAAO,EACP,SAAS;AAGZ,IAAM,iCAAiC,CAAC,sBAAsB,YAAY;AAG1E,IAAM,6BAA6B,EAChC,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,EAC7C,OAAO,EAAE,MAAM,iBAAiB,EAAE,SAAS;AAAA;AAAA,EAC3C,QAAQ,EAAE,MAAM,iBAAiB,EAAE,SAAS;AAAA;AAAA,EAC5C,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA;AAC/B,CAAC,EACA,OAAO,EACP,SAAS;AAKZ,IAAM,gBAAgB,EACnB,OAAO;AAAA,EACN,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,iBAAiB;AACnB,CAAC,EACA,OAAO,EACP,SAAS;AAOZ,IAAM,aAAa,EAAE,KAAK,CAAC,cAAc,YAAY,WAAW,CAAC;AAGjE,IAAM,eAAe,EAAE,KAAK,CAAC,UAAU,eAAe,YAAY,CAAC;AAGnE,IAAM,iBAAiB,EACpB,OAAO;AAAA,EACN,MAAM;AAAA,EACN,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,QAAQ,aAAa,SAAS,EAAE,QAAQ,QAAQ;AAClD,CAAC,EACA,OAAO,EACP,SAAS;AAOZ,IAAM,gBAAgB,EACnB,OAAO;AAAA,EACN,UAAU,EAAE,OAAO;AAAA;AAAA,EACnB,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA;AAC9B,CAAC,EACA,OAAO,EACP,SAAS;AAOZ,IAAM,iBAAiB,EACpB,OAAO;AAAA,EACN,SAAS,EAAE,MAAM,iBAAiB,EAAE,SAAS;AAAA;AAC/C,CAAC,EACA,OAAO,EACP,SAAS;AAOL,IAAM,eAAe,EACzB,OAAO;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,KAAK;AAAA,EACL,UAAU;AACZ,CAAC,EACA,OAAO;AAMH,IAAM,gBAAwB;AAAA,EACnC,MAAM;AAAA,IACJ,SAAS;AAAA,MACP,QAAQ,EAAE,SAAS,MAAM;AAAA,MACzB,MAAM,EAAE,SAAS,MAAM;AAAA,IACzB;AAAA,IACA,OAAO;AAAA,MACL,KAAK,EAAE,SAAS,MAAM;AAAA,MACtB,IAAI,EAAE,SAAS,MAAM;AAAA,IACvB;AAAA,IACA,QAAQ;AAAA,MACN,MAAM,EAAE,SAAS,MAAM;AAAA,MACvB,SAAS,EAAE,SAAS,MAAM;AAAA,IAC5B;AAAA,IACA,cAAc;AAAA,MACZ,SAAS;AAAA,MACT,eAAe;AAAA,MACf,QAAQ;AAAA,IACV;AAAA,IACA,UAAU;AAAA,MACR,SAAS,EAAE,SAAS,OAAO,WAAW,UAAU,aAAa,OAAO;AAAA,MACpE,WAAW,EAAE,SAAS,OAAO,aAAa,KAAK;AAAA,MAC/C,UAAU,EAAE,SAAS,MAAM;AAAA,IAC7B;AAAA,IACA,QAAQ;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,SAAS;AAAA,MACP,oBAAoB,EAAE,SAAS,MAAM;AAAA,IACvC;AAAA,EACF;AAAA,EACA,UAAU,CAAC;AAAA,EACX,SAAS;AAAA,IACP,OAAO;AAAA,MACL,SAAS;AAAA,MACT,eAAe;AAAA,IACjB;AAAA,IACA,IAAI;AAAA,MACF,SAAS;AAAA,IACX;AAAA,IACA,UAAU;AAAA,MACR,SAAS;AAAA,MACT,eAAe;AAAA,IACjB;AAAA,IACA,SAAS;AAAA,MACP,SAAS;AAAA,MACT,eAAe;AAAA,IACjB;AAAA,IACA,YAAY;AAAA,MACV,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,qBAAqB;AAAA,IACvB;AAAA,IACA,IAAI;AAAA,MACF,SAAS;AAAA,MACT,eAAe;AAAA,IACjB;AAAA,IACA,SAAS;AAAA,MACP,SAAS;AAAA,MACT,oBAAoB;AAAA,MACpB,mBAAmB;AAAA,IACrB;AAAA,IACA,UAAU;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IACA,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,2BAA2B;AAAA,MAC3B,oBAAoB;AAAA,IACtB;AAAA,IACA,SAAS;AAAA,MACP,SAAS;AAAA,MACT,eAAe;AAAA,IACjB;AAAA,IACA,YAAY;AAAA,MACV,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,MACb,gBAAgB;AAAA,IAClB;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AAAA,EACA,KAAK;AAAA,IACH,WAAW;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;ADz3BO,IAAM,mBAAmB;AAOzB,IAAM,cAAN,cAA0B,MAAM;AAAA,EACrC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAKA,SAAS,gBAAgB,UAA2B;AAClD,MAAI;AACF,UAAM,QAAW,aAAU,QAAQ;AACnC,QAAI,MAAM,eAAe,GAAG;AAE1B,UAAI;AACF,QAAG,YAAS,QAAQ;AACpB,eAAO;AAAA,MACT,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,eAAe,WAAmB,QAAQ,IAAI,GAAkB;AAC9E,MAAI,aAAkB,aAAQ,QAAQ;AACtC,QAAM,OAAY,WAAM,UAAU,EAAE;AAEpC,SAAO,eAAe,MAAM;AAC1B,UAAM,aAAkB,UAAK,YAAY,gBAAgB;AACzD,QAAI,gBAAgB,UAAU,GAAG;AAC/B,YAAM,IAAI,YAAY,GAAG,gBAAgB,oCAAoC,UAAU,EAAE;AAAA,IAC3F;AACA,QAAO,cAAW,UAAU,GAAG;AAC7B,aAAO;AAAA,IACT;AACA,iBAAkB,aAAQ,UAAU;AAAA,EACtC;AAGA,QAAM,aAAkB,UAAK,MAAM,gBAAgB;AACnD,MAAI,gBAAgB,UAAU,GAAG;AAC/B,UAAM,IAAI,YAAY,GAAG,gBAAgB,oCAAoC,UAAU,EAAE;AAAA,EAC3F;AACA,SAAU,cAAW,UAAU,IAAI,aAAa;AAClD;AAMA,SAAS,kBAAkB,YAA6B;AACtD,QAAM,WAAW,cAAc,eAAe;AAC9C,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,YAAY,MAAM,gBAAgB,8CAA8C;AAAA,EAC5F;AAEA,QAAM,eAAoB,aAAQ,QAAQ;AAC1C,MAAI,CAAI,cAAW,YAAY,GAAG;AAChC,UAAM,IAAI,YAAY,0BAA0B,QAAQ,EAAE;AAAA,EAC5D;AACA,SAAO;AACT;AAKA,SAAS,cAAc,UAA2B;AAChD,MAAI;AACF,UAAM,UAAa,gBAAa,UAAU,OAAO;AACjD,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,UAAM,IAAI,YAAY,mBAAmB,gBAAgB,KAAK,OAAO,EAAE;AAAA,EACzE;AACF;AAKA,SAAS,eAAe,WAA4B;AAClD,QAAM,SAAS,aAAa,UAAU,SAAS;AAC/C,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,SAAS,OAAO,MAAM,OACzB,IAAI,CAAC,MAAM,OAAO,EAAE,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAClD,KAAK,IAAI;AACZ,UAAM,IAAI,YAAY,WAAW,gBAAgB;AAAA,EAAoB,MAAM,EAAE;AAAA,EAC/E;AACA,SAAO,OAAO;AAChB;AAMO,SAAS,WAAW,YAAuC;AAChE,QAAM,eAAe,kBAAkB,UAAU;AACjD,QAAM,YAAY,cAAc,YAAY;AAC5C,QAAM,kBAAkB,eAAe,SAAS;AAChD,QAAM,SAAS,kBAAkB,eAAe;AAChD,SAAO,EAAE,QAAQ,YAAY,aAAa;AAC5C;AAKA,eAAsB,gBAAgB,YAAgD;AACpF,QAAM,eAAe,kBAAkB,UAAU;AACjD,QAAM,YAAY,cAAc,YAAY;AAC5C,QAAM,kBAAkB,eAAe,SAAS;AAGhD,QAAM,YAAiB,aAAQ,YAAY;AAC3C,QAAM,iBAAiB,MAAM,eAAe,iBAAiB,SAAS;AAEtE,QAAM,SAAS,kBAAkB,cAAc;AAC/C,SAAO,EAAE,QAAQ,YAAY,aAAa;AAC5C;AAGA,SAAS,MAAwB,GAAkB,GAAqB;AACtE,SAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AACtB;AAIA,SAAS,aAAa,GAAW,IAAmC;AAClE,QAAM,KAAK,EAAE,MAAM;AACnB,QAAM,KAAK,GAAG,MAAM;AACpB,SAAO,EAAE,QAAQ,MAAM,IAAI,QAAQ,IAAI,MAAM,GAAG,MAAM,MAAM,IAAI,MAAM,IAAI,IAAI,EAAE;AAClF;AAEA,SAAS,cAAc,GAAW,IAAoC;AACpE,QAAM,KAAK,EAAE,MAAM;AACnB,QAAM,KAAK,GAAG,MAAM;AACpB,SAAO;AAAA,IACL,SAAS,MAAM,IAAI,SAAS,IAAI,OAAO;AAAA,IACvC,WAAW,MAAM,IAAI,WAAW,IAAI,SAAS;AAAA,IAC7C,UAAU,MAAM,IAAI,UAAU,IAAI,QAAQ;AAAA,EAC5C;AACF;AAEA,SAAS,WAAW,GAAW,IAAiC;AAC9D,SAAO;AAAA,IACL,KAAK,MAAM,GAAG,MAAM,OAAO,KAAK,EAAE,MAAM,OAAO,GAAG;AAAA,IAClD,IAAI,MAAM,GAAG,MAAM,OAAO,IAAI,EAAE,MAAM,OAAO,EAAE;AAAA,EACjD;AACF;AAEA,SAAS,YAAY,GAAW,IAAkC;AAChE,SAAO;AAAA,IACL,MAAM,MAAM,GAAG,MAAM,QAAQ,MAAM,EAAE,MAAM,QAAQ,IAAI;AAAA,IACvD,SAAS,MAAM,GAAG,MAAM,QAAQ,SAAS,EAAE,MAAM,QAAQ,OAAO;AAAA,EAClE;AACF;AAEA,SAAS,iBAAiB,GAAW,IAAwC;AAC3E,SAAO,MAAM,GAAG,MAAM,cAAc,EAAE,MAAM,YAAY;AAC1D;AAEA,SAAS,YAAY,GAAW,IAAkC;AAChE,QAAM,KAAK,EAAE,MAAM;AACnB,QAAM,KAAK,GAAG,MAAM;AAEpB,SAAO;AAAA,IACL,SAAS,IAAI,WAAW,IAAI,WAAW;AAAA,IACvC,OAAO,IAAI,SAAS,IAAI;AAAA,EAC1B;AACF;AAEA,SAAS,aAAa,GAAW,IAAmC;AAClE,QAAM,KAAK,EAAE,MAAM;AACnB,QAAM,KAAK,GAAG,MAAM;AACpB,SAAO;AAAA,IACL,oBAAoB,MAAM,KAAK,kBAAkB,GAAG,KAAK,kBAAkB,CAAC;AAAA,EAC9E;AACF;AAEA,SAAS,UAAU,GAAW,IAAwB;AACpD,SAAO;AAAA,IACL,SAAS,aAAa,GAAG,EAAE;AAAA,IAC3B,OAAO,WAAW,GAAG,EAAE;AAAA,IACvB,QAAQ,YAAY,GAAG,EAAE;AAAA,IACzB,cAAc,iBAAiB,GAAG,EAAE;AAAA,IACpC,UAAU,cAAc,GAAG,EAAE;AAAA,IAC7B,QAAQ,YAAY,GAAG,EAAE;AAAA,IACzB,SAAS,aAAa,GAAG,EAAE;AAAA,EAC7B;AACF;AAiBA,IAAM,eAA4B,EAAE,SAAS,OAAO,eAAe,KAAK;AACxE,IAAM,YAAsB,EAAE,SAAS,MAAM;AAC7C,IAAM,kBAAkC,EAAE,SAAS,OAAO,eAAe,MAAM;AAC/E,IAAM,iBAAgC,EAAE,SAAS,OAAO,eAAe,MAAM;AAC7E,IAAM,oBAAsC;AAAA,EAC1C,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,qBAAqB;AACvB;AACA,IAAM,YAAsB,EAAE,SAAS,OAAO,eAAe,MAAM;AACnE,IAAM,iBAAgC;AAAA,EACpC,SAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,mBAAmB;AACrB;AACA,IAAM,kBAAkC,EAAE,SAAS,OAAO,YAAY,SAAS;AAC/E,IAAM,cAA0B;AAAA,EAC9B,SAAS;AAAA,EACT,2BAA2B;AAAA,EAC3B,oBAAoB;AACtB;AACA,IAAM,iBAAgC,EAAE,SAAS,OAAO,eAAe,GAAG;AAC1E,IAAM,oBAAsC,EAAE,SAAS,MAAM;AAC7D,IAAM,cAA0B;AAAA,EAC9B,SAAS;AAAA,EACT,MAAM;AAAA,EACN,aAAa;AAAA,EACb,gBAAgB;AAClB;AACA,IAAM,wBAA8C,EAAE,SAAS,MAAM;AAGrE,SAAS,oBAAuB,YAAe,OAAsB,MAAwB;AAC3F,SAAO,EAAE,GAAG,YAAY,GAAG,OAAO,GAAG,KAAK;AAC5C;AAEA,SAAS,kBACP,IACA,KACa;AACb,SAAO,oBAAoB,cAAc,KAAK,OAAO,IAAI,KAAK;AAChE;AAEA,SAAS,eAAe,IAA+B,KAA0C;AAC/F,SAAO,oBAAoB,WAAW,KAAK,IAAI,IAAI,EAAE;AACvD;AAEA,SAAS,qBACP,IACA,KACgB;AAChB,SAAO,oBAAoB,iBAAiB,KAAK,UAAU,IAAI,QAAQ;AACzE;AAEA,SAAS,oBACP,IACA,KACe;AACf,SAAO,oBAAoB,gBAAgB,KAAK,SAAS,IAAI,OAAO;AACtE;AAEA,SAAS,uBACP,IACA,KACkB;AAClB,SAAO,oBAAoB,mBAAmB,KAAK,YAAY,IAAI,UAAU;AAC/E;AAEA,SAAS,eAAe,IAA+B,KAA0C;AAC/F,SAAO,oBAAoB,WAAW,KAAK,IAAI,IAAI,EAAE;AACvD;AAEA,SAAS,oBACP,IACA,KACe;AACf,SAAO,oBAAoB,gBAAgB,KAAK,SAAS,IAAI,OAAO;AACtE;AAEA,SAAS,qBACP,IACA,KACgB;AAChB,SAAO,oBAAoB,iBAAiB,KAAK,UAAU,IAAI,QAAQ;AACzE;AAEA,SAAS,iBACP,IACA,KACY;AACZ,SAAO,oBAAoB,aAAa,KAAK,MAAM,IAAI,IAAI;AAC7D;AAEA,SAAS,oBACP,IACA,KACe;AACf,SAAO,oBAAoB,gBAAgB,KAAK,SAAS,IAAI,OAAO;AACtE;AAEA,SAAS,uBACP,IACA,KACkB;AAClB,QAAM,MAAM,IAAI;AAChB,QAAM,MAAM,KAAK;AAEjB,QAAM,gBAAgB,KAAK,SAAS,CAAC;AACrC,QAAM,eAAe,KAAK,SAAS,CAAC;AAEpC,QAAM,UAAU,oBAAI,IAAmD;AACvE,aAAW,QAAQ,eAAe;AAChC,YAAQ,IAAI,KAAK,SAAS,IAAI;AAAA,EAChC;AACA,aAAW,QAAQ,cAAc;AAC/B,YAAQ,IAAI,KAAK,SAAS,IAAI;AAAA,EAChC;AACA,QAAM,cAAc,MAAM,KAAK,QAAQ,OAAO,CAAC;AAC/C,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO,YAAY,SAAS,IAAI,cAAc;AAAA,EAChD;AACF;AAEA,SAAS,iBACP,IACA,KACY;AACZ,SAAO,oBAAoB,aAAa,KAAK,MAAM,IAAI,IAAI;AAC7D;AAEA,SAAS,2BACP,IACA,KACsB;AACtB,SAAO,oBAAoB,uBAAuB,KAAK,iBAAiB,IAAI,eAAe;AAC7F;AAEA,SAAS,aAAa,GAAW,IAA2B;AAC1D,SAAO;AAAA,IACL,OAAO,kBAAkB,EAAE,SAAS,GAAG,OAAO;AAAA,IAC9C,IAAI,eAAe,EAAE,SAAS,GAAG,OAAO;AAAA,IACxC,UAAU,qBAAqB,EAAE,SAAS,GAAG,OAAO;AAAA,IACpD,SAAS,oBAAoB,EAAE,SAAS,GAAG,OAAO;AAAA,IAClD,YAAY,uBAAuB,EAAE,SAAS,GAAG,OAAO;AAAA,IACxD,IAAI,eAAe,EAAE,SAAS,GAAG,OAAO;AAAA,IACxC,SAAS,oBAAoB,EAAE,SAAS,GAAG,OAAO;AAAA,IAClD,UAAU,qBAAqB,EAAE,SAAS,GAAG,OAAO;AAAA,IACpD,MAAM,iBAAiB,EAAE,SAAS,GAAG,OAAO;AAAA,IAC5C,SAAS,oBAAoB,EAAE,SAAS,GAAG,OAAO;AAAA,IAClD,YAAY,uBAAuB,EAAE,SAAS,GAAG,OAAO;AAAA,IACxD,MAAM,iBAAiB,EAAE,SAAS,GAAG,OAAO;AAAA,IAC5C,iBAAiB,2BAA2B,EAAE,SAAS,GAAG,OAAO;AAAA,EACnE;AACF;AAKA,SAAS,kBAAkB,QAAwB;AACjD,SAAO;AAAA,IACL,MAAM,UAAU,QAAQ,aAAa;AAAA,IACrC,SAAS,aAAa,QAAQ,aAAa;AAAA,IAC3C,OAAO;AAAA,MACL,SAAS,OAAO,OAAO,WAAW,cAAc,OAAO,WAAW;AAAA,MAClE,UAAU,OAAO,OAAO,YAAY,cAAc,OAAO,YAAY;AAAA,IACvE;AAAA,IACA,UAAU,OAAO;AAAA,EACnB;AACF;AAKO,SAAS,eAAe,YAA4B;AACzD,SAAY,aAAQ,UAAU;AAChC;AAWA,SAAS,kBACP,aACA,gBACuB;AACvB,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AACA,QAAM,cAAc,eAAe,KAAK,GAAG;AAC3C,QAAM,aAAa,YAAY,OAAO,KAAK,GAAG;AAC9C,MAAI,gBAAgB,YAAY;AAC9B,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,KAAK,YAAY;AAAA,IACjB,eAAe;AAAA,IACf,cAAc;AAAA,EAChB;AACF;AAGA,SAAS,0BACP,gBACA,eACkB;AAClB,QAAM,gBAAgB,gBAAgB,SAAS,YAAY,SAAS,CAAC;AACrE,QAAM,eAAe,eAAe,SAAS,YAAY,SAAS,CAAC;AACnE,QAAM,cAAc,IAAI,IAAI,cAAc,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAE3E,SAAO,aACJ,IAAI,CAAC,SAAS,kBAAkB,MAAM,YAAY,IAAI,KAAK,OAAO,CAAC,CAAC,EACpE,OAAO,CAAC,MAA2B,MAAM,IAAI;AAClD;AAGA,eAAe,mBACb,eACA,WACiB;AACjB,QAAM,iBAAiB,MAAM,OAAO,wBAAe;AACnD,QAAM,MAAM,eAAe,iBAAiB,cAAc,UAAU,SAAS;AAC7E,QAAM,cAAc,MAAM,eAAe,cAAc,GAAG;AAE1D,MAAI,SAAiB,CAAC;AACtB,aAAW,QAAQ,cAAc,UAAU;AACzC,aAAS,eAAe,aAAa,QAAQ,eAAe,YAAY,aAAa,IAAI,CAAC;AAAA,EAC5F;AACA,SAAO;AACT;AAMA,eAAsB,wBACpB,YAC6D;AAC7D,QAAM,eAAe,kBAAkB,UAAU;AACjD,QAAM,kBAAkB,eAAe,cAAc,YAAY,CAAC;AAElE,MAAI,YAA8B,CAAC;AACnC,MAAI,gBAAgB,SAAS;AAC3B,UAAM,iBAAiB,MAAM;AAAA,MAC3B,gBAAgB;AAAA,MACX,aAAQ,YAAY;AAAA,IAC3B;AACA,gBAAY,0BAA0B,gBAAgB,eAAe;AAAA,EACvE;AAEA,QAAM,EAAE,QAAQ,YAAY,UAAU,IAAI,MAAM,gBAAgB,UAAU;AAC1E,SAAO,EAAE,QAAQ,YAAY,WAAW,UAAU;AACpD;;;AD5cA,SAAS,mBAA+B;AACtC,MAAI,QAAQ,IAAI,0BAA0B,QAAQ,IAAI,cAAc;AAClE,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,IAAI,eAAe;AAC7B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAKA,SAAS,eAAmC;AAC1C,SAAO,QAAQ,IAAI,0BAA0B,QAAQ,IAAI;AAC3D;AAKA,SAAS,eAAe,OAAe,MAAc,MAA0B;AAC7E,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,kBAAkB,KAAK,IAAI,IAAI;AAAA,IACxC,KAAK,SAAS;AACZ,YAAM,QAAQ,aAAa;AAC3B,UAAI,OAAO;AACT,eAAO,0BAA0B,KAAK,eAAe,KAAK,IAAI,IAAI;AAAA,MACpE;AAEA,aAAO,sBAAsB,KAAK,IAAI,IAAI;AAAA,IAC5C;AAAA,IACA,KAAK;AAAA,IACL;AACE,aAAO,sBAAsB,KAAK,IAAI,IAAI;AAAA,EAC9C;AACF;AAMA,SAAS,iBAAiB,KAA0D;AAClF,MAAI,IAAI,WAAW,aAAa,GAAG;AACjC,WAAO,EAAE,MAAM,OAAO,MAAM,IAAI,MAAM,EAAE,EAAE;AAAA,EAC5C;AACA,MAAI,IAAI,WAAW,eAAe,GAAG;AACnC,WAAO,EAAE,MAAM,SAAS,MAAM,IAAI,MAAM,EAAE,EAAE;AAAA,EAC9C;AACA,MAAI,IAAI,WAAW,SAAS,GAAG;AAC7B,WAAO,EAAE,MAAM,QAAQ,MAAM,IAAI,MAAM,CAAC,EAAE;AAAA,EAC5C;AACA,QAAM,IAAI,YAAY,gCAAgC,GAAG,EAAE;AAC7D;AAEA,SAAS,eAAe,KAA+B;AACrD,QAAM,EAAE,MAAM,cAAc,KAAK,IAAI,iBAAiB,GAAG;AACzD,QAAM,CAAC,UAAU,GAAG,IAAI,KAAK,MAAM,GAAG;AACtC,QAAM,CAAC,OAAO,IAAI,IAAI,SAAS,MAAM,GAAG;AAExC,MAAI,CAAC,SAAS,CAAC,MAAM;AACnB,UAAM,IAAI;AAAA,MACR,gCAAgC,GAAG;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,OAAO,iBAAiB,SAAS,iBAAiB,IAAI;AAE5D,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,KAAK,OAAO;AAAA,IACZ,MAAM,eAAe,OAAO,MAAM,IAAI;AAAA,IACtC;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,KAAa,WAAsC;AAClF,MAAI,IAAI,WAAW,SAAS,KAAK,IAAI,WAAW,SAAS,GAAG;AAC1D,WAAO,eAAe,GAAG;AAAA,EAC3B;AAEA,QAAM,YAAY,CAAM,iBAAW,GAAG,KAAK,YAAiB,cAAQ,WAAW,GAAG,IAAI;AACtF,SAAO,EAAE,MAAM,SAAS,MAAM,UAAU;AAC1C;AAEA,eAAe,mBAAmB,SAAiB,KAAgC;AACjF,MAAI;AACF,QAAI,KAAK;AACP,YAAM,MAAM,OAAO,CAAC,SAAS,OAAO,GAAG,EAAE,KAAK,QAAQ,CAAC;AACvD,YAAM,MAAM,OAAO,CAAC,YAAY,GAAG,GAAG,EAAE,KAAK,QAAQ,CAAC;AAAA,IACxD,OAAO;AACL,YAAM,MAAM,OAAO,CAAC,QAAQ,WAAW,GAAG,EAAE,KAAK,QAAQ,CAAC;AAAA,IAC5D;AACA,WAAO;AAAA,EACT,QAAQ;AACN,IAAG,WAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACnD,WAAO;AAAA,EACT;AACF;AAEA,eAAe,UAAU,UAA4B,SAAgC;AACnF,QAAM,WAAgB,cAAQ,OAAO;AACrC,EAAG,cAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAE1C,QAAM,YAAY,CAAC,SAAS,WAAW,GAAG;AAC1C,MAAI,SAAS,KAAK;AAChB,cAAU,KAAK,YAAY,SAAS,GAAG;AAAA,EACzC;AACA,YAAU,KAAK,SAAS,MAAM,OAAO;AAErC,MAAI;AACF,UAAM,MAAM,OAAO,WAAW,EAAE,SAAS,SAAS,IAAI,CAAC;AAAA,EACzD,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,QAAI,QAAQ,SAAS,WAAW,GAAG;AACjC,YAAM,IAAI,YAAY,kCAAkC,SAAS,MAAM,GAAI,aAAa,SAAS,IAAI,EAAE;AAAA,IACzG;AACA,UAAM,IAAI,YAAY,6BAA6B,OAAO,EAAE;AAAA,EAC9D;AACF;AAEA,eAAsB,cAAc,UAA6C;AAC/E,MAAI,SAAS,SAAS,SAAS;AAC7B,QAAI,CAAI,eAAW,SAAS,IAAI,GAAG;AACjC,YAAM,IAAI,YAAY,uBAAuB,SAAS,IAAI,EAAE;AAAA,IAC9D;AACA,WAAO,SAAS;AAAA,EAClB;AAEA,QAAM,WAAgB,WAAQ,UAAO,GAAG,MAAM,gBAAgB;AAC9D,QAAM,UAAe,WAAK,UAAU,GAAG,SAAS,KAAK,IAAI,SAAS,IAAI,EAAE;AAExE,MAAO,eAAW,OAAO,GAAG;AAC1B,UAAM,mBAAmB,SAAS,SAAS,GAAG;AAAA,EAChD;AAEA,MAAI,CAAI,eAAW,OAAO,GAAG;AAC3B,UAAM,UAAU,UAAU,OAAO;AAAA,EACnC;AAEA,SAAO;AACT;AAEO,SAAS,YAAY,aAAqB,aAA6B;AAC5E,QAAM,cAAmB,WAAK,aAAa,YAAY,GAAG,WAAW,OAAO;AAE5E,MAAI,CAAI,eAAW,WAAW,GAAG;AAC/B,UAAM,IAAI,YAAY,sBAAsB,WAAW,iBAAiB,WAAW,GAAG;AAAA,EACxF;AAEA,QAAM,UAAa,iBAAa,aAAa,OAAO;AAEpD,MAAI;AACJ,MAAI;AACF,aAAc,WAAM,OAAO;AAAA,EAC7B,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,IAAI,YAAY,2BAA2B,WAAW,KAAK,OAAO,EAAE;AAAA,EAC5E;AAEA,QAAM,SAAS,aAAa,UAAU,MAAM;AAC5C,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,SAAS,OAAO,MAAM,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI;AAC5F,UAAM,IAAI,YAAY,mBAAmB,WAAW,KAAK,MAAM,EAAE;AAAA,EACnE;AAEA,SAAO,OAAO;AAChB;AAIA,SAAS,gBAAkC,MAAU,UAA6B;AAChF,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,SAAO,EAAE,GAAG,MAAM,GAAG,SAAS;AAChC;AAEA,SAASC,cACP,MACA,UACuB;AACvB,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,gBAAgB,MAAM,QAAQ,SAAS,MAAM;AAAA,IACrD,MAAM,gBAAgB,MAAM,MAAM,SAAS,IAAI;AAAA,EACjD;AACF;AAEA,SAASC,YAAW,MAA2B,UAAoD;AACjG,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,KAAK,gBAAgB,MAAM,KAAK,SAAS,GAAG;AAAA,IAC5C,IAAI,gBAAgB,MAAM,IAAI,SAAS,EAAE;AAAA,EAC3C;AACF;AAEA,SAASC,aACP,MACA,UACsB;AACtB,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,gBAAgB,MAAM,MAAM,SAAS,IAAI;AAAA,IAC/C,SAAS,gBAAgB,MAAM,SAAS,SAAS,OAAO;AAAA,EAC1D;AACF;AAEA,SAASC,eACP,MACA,UACwB;AACxB,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS,gBAAgB,MAAM,SAAS,SAAS,OAAO;AAAA,IACxD,WAAW,gBAAgB,MAAM,WAAW,SAAS,SAAS;AAAA,IAC9D,UAAU,gBAAgB,MAAM,UAAU,SAAS,QAAQ;AAAA,EAC7D;AACF;AAEA,SAASC,aACP,MACA,UACsB;AACtB,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,SAAS;AAAA,IAClB,OAAO,SAAS,SAAS,MAAM;AAAA,EACjC;AACF;AAEA,SAASC,cACP,MACA,UACuB;AACvB,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,oBAAoB,gBAAgB,OAAO,kBAAkB,GAAG,SAAS,kBAAkB,CAAC;AAAA,EAC9F;AACF;AAEA,SAAS,iBAAiB,MAA8B,UAAkC;AACxF,SAAO;AAAA,IACL,SAASL,cAAa,MAAM,SAAS,SAAS,OAAO;AAAA,IACrD,OAAOC,YAAW,MAAM,OAAO,SAAS,KAAK;AAAA,IAC7C,QAAQC,aAAY,MAAM,QAAQ,SAAS,MAAM;AAAA,IACjD,cAAc,gBAAgB,MAAM,cAAc,SAAS,YAAY;AAAA,IACvE,UAAUC,eAAc,MAAM,UAAU,SAAS,QAAQ;AAAA,IACzD,QAAQC,aAAY,MAAM,QAAQ,SAAS,MAAM;AAAA,IACjD,SAASC,cAAa,MAAM,SAAS,SAAS,OAAO;AAAA,EACvD;AACF;AAIA,SAAS,iBACP,MACA,UACwB;AACxB,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,SAAS;AAAA,IAClB,eAAe,SAAS;AAAA,IACxB,eAAe,SAAS,iBAAiB,MAAM;AAAA,IAC/C,UAAU,SAAS,YAAY,MAAM;AAAA,EACvC;AACF;AAEA,SAAS,cACP,MACA,UACqB;AACrB,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,SAAS,SAAS;AAAA,IAClB,mBAAmB,SAAS,qBAAqB,MAAM;AAAA,IACvD,MAAM,SAAS,QAAQ,MAAM;AAAA,IAC7B,SAAS,SAAS,WAAW,MAAM;AAAA,EACrC;AACF;AAEA,SAAS,oBACP,MACA,UAC2B;AAC3B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,SAAS,SAAS;AAAA,IAClB,eAAe,SAAS;AAAA,IACxB,SAAS,SAAS,WAAW,MAAM;AAAA,IACnC,SAAS,SAAS,WAAW,MAAM;AAAA,IACnC,eAAe,SAAS,iBAAiB,MAAM;AAAA,EACjD;AACF;AAEA,SAAS,cACP,MACA,UACqB;AACrB,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,SAAS,SAAS;AAAA,IAClB,eAAe,SAAS;AAAA,IACxB,WAAW,SAAS,aAAa,MAAM;AAAA,IACvC,WAAW,SAAS,aAAa,MAAM;AAAA,IACvC,gBAAgB,SAAS,kBAAkB,MAAM;AAAA,EACnD;AACF;AAEA,SAAS,mBACP,MACA,UAC0B;AAC1B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,SAAS;AAAA,IAClB,SAAS,SAAS,WAAW,MAAM;AAAA,IACnC,oBAAoB,SAAS;AAAA,IAC7B,mBAAmB,SAAS;AAAA,EAC9B;AACF;AAEA,SAAS,oBACP,MACA,UAC2B;AAC3B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,SAAS;AAAA,IAClB,eAAe,SAAS,iBAAiB,MAAM;AAAA,IAC/C,YAAY,SAAS;AAAA,IACrB,aAAa,SAAS,eAAe,MAAM;AAAA,IAC3C,QAAQ,SAAS,UAAU,MAAM;AAAA,EACnC;AACF;AAEA,SAAS,mBACP,MACA,UAC0B;AAC1B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,SAAS;AAAA,IAClB,SAAS,SAAS,WAAW,MAAM;AAAA,IACnC,OAAO,SAAS,SAAS,MAAM;AAAA,IAC/B,eAAe,SAAS;AAAA,IACxB,oBAAoB,SAAS,sBAAsB,MAAM;AAAA,EAC3D;AACF;AAEA,SAAS,sBACP,MACA,UAC6B;AAC7B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,SAAS;AAAA,IAClB,mBAAmB,SAAS,qBAAqB,MAAM;AAAA,IACvD,eAAe,SAAS,iBAAiB,MAAM;AAAA,IAC/C,iBAAiB,SAAS;AAAA,IAC1B,oBAAoB,SAAS,sBAAsB,MAAM;AAAA,IACzD,qBAAqB,SAAS;AAAA,IAC9B,wBAAwB,SAAS,0BAA0B,MAAM;AAAA,EACnE;AACF;AAEA,SAAS,gBACP,MACA,UACuB;AACvB,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,SAAS;AAAA,IAClB,2BAA2B,SAAS;AAAA,IACpC,oBAAoB,SAAS;AAAA,IAC7B,SAAS,SAAS,WAAW,MAAM;AAAA,IACnC,gBAAgB,SAAS,kBAAkB,MAAM;AAAA,EACnD;AACF;AAEA,SAAS,mBACP,MACA,UAC0B;AAC1B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,SAAS;AAAA,IAClB,QAAQ,SAAS,UAAU,MAAM;AAAA,IACjC,QAAQ,SAAS,UAAU,MAAM;AAAA,IACjC,eAAe,SAAS;AAAA,IACxB,QAAQ,SAAS,UAAU,MAAM;AAAA,EACnC;AACF;AAEA,SAAS,sBACP,MACA,UAC6B;AAC7B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,SAAS,SAAS;AAAA,IAClB,OAAO,SAAS,SAAS,MAAM;AAAA,EACjC;AACF;AAGA,SAAS,gBACP,MACA,UACuB;AACvB,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,SAAS;AAAA,IAClB,MAAM,SAAS;AAAA,IACf,aAAa,SAAS;AAAA,IACtB,WAAW,SAAS,aAAa,MAAM;AAAA,IACvC,WAAW,SAAS,aAAa,MAAM;AAAA,IACvC,gBAAgB,SAAS,kBAAkB,MAAM;AAAA,IACjD,cAAc,SAAS,gBAAgB,MAAM;AAAA,IAC7C,gBAAgB,SAAS;AAAA,IACzB,gBAAgB,SAAS,kBAAkB,MAAM;AAAA,IACjD,cAAc,SAAS,gBAAgB,MAAM;AAAA,IAC7C,gBAAgB,SAAS,kBAAkB,MAAM;AAAA,IACjD,kBAAkB,SAAS,oBAAoB,MAAM;AAAA,IACrD,OAAO,SAAS,SAAS,MAAM;AAAA,EACjC;AACF;AAGA,SAASC,qBACP,MACA,UACe;AACf,SAAO;AAAA,IACL,OAAO,iBAAiB,MAAM,OAAO,SAAS,KAAK;AAAA,IACnD,IAAI,cAAc,MAAM,IAAI,SAAS,EAAE;AAAA,IACvC,UAAU,oBAAoB,MAAM,UAAU,SAAS,QAAQ;AAAA,IAC/D,SAAS,mBAAmB,MAAM,SAAS,SAAS,OAAO;AAAA,IAC3D,YAAY,sBAAsB,MAAM,YAAY,SAAS,UAAU;AAAA,IACvE,IAAI,cAAc,MAAM,IAAI,SAAS,EAAE;AAAA,IACvC,SAAS,mBAAmB,MAAM,SAAS,SAAS,OAAO;AAAA,IAC3D,UAAU,oBAAoB,MAAM,UAAU,SAAS,QAAQ;AAAA,IAC/D,MAAM,gBAAgB,MAAM,MAAM,SAAS,IAAI;AAAA,IAC/C,SAAS,mBAAmB,MAAM,SAAS,SAAS,OAAO;AAAA,IAC3D,YAAY,sBAAsB,MAAM,YAAY,SAAS,UAAU;AAAA,IACvE,MAAM,gBAAgB,MAAM,MAAM,SAAS,IAAI;AAAA,EACjD;AACF;AAEO,SAAS,aAAa,MAAc,UAA0B;AACnE,QAAM,SAAiB,EAAE,GAAG,KAAK;AAEjC,MAAI,SAAS,MAAM;AACjB,WAAO,OAAO,iBAAiB,KAAK,MAAM,SAAS,IAAI;AAAA,EACzD;AAEA,MAAI,SAAS,SAAS;AACpB,WAAO,UAAUA,qBAAoB,KAAK,SAAS,SAAS,OAAO;AAAA,EACrE;AAEA,MAAI,SAAS,OAAO;AAClB,WAAO,QAAQ,SAAS;AAAA,EAC1B;AAEA,MAAI,SAAS,UAAU;AACrB,WAAO,WAAW,SAAS;AAAA,EAC7B;AAEA,SAAO;AACT;AAEA,eAAsB,eAAe,QAAgB,WAAoC;AACvF,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,UAAU,SAAS,IAAI,OAAO;AACtC,QAAM,WAAW,iBAAiB,UAAU,SAAS;AACrD,QAAM,cAAc,MAAM,cAAc,QAAQ;AAEhD,MAAI,eAAuB,CAAC;AAC5B,aAAW,eAAe,UAAU;AAClC,UAAM,UAAU,YAAY,aAAa,WAAW;AACpD,mBAAe,aAAa,cAAc,OAAO;AAAA,EACnD;AAGA,QAAM,cAAsB;AAAA,IAC1B,MAAM,OAAO;AAAA,IACb,SAAS,OAAO;AAAA,IAChB,OAAO,OAAO;AAAA,IACd,UAAU,OAAO;AAAA,EACnB;AACA,SAAO,aAAa,cAAc,WAAW;AAC/C;","names":["fs","path","mergeLinting","mergeTypes","mergeUnused","mergeSecurity","mergeNaming","mergeQuality","mergeProcessSection"]}
@@ -151,7 +151,7 @@ function parseGuideline(fileContent, filename) {
151
151
  const { data, content } = matter(fileContent);
152
152
  const result = frontmatterSchema.safeParse(data);
153
153
  if (!result.success) {
154
- const errors = result.error.errors.map((e) => `${e.path.join(".")}: ${e.message}`).join(", ");
154
+ const errors = result.error.issues.map((e) => `${e.path.join(".")}: ${e.message}`).join(", ");
155
155
  throw new StandardsError(`Invalid frontmatter in ${filename}: ${errors}`);
156
156
  }
157
157
  return {
@@ -280,4 +280,4 @@ export {
280
280
  matchGuidelines,
281
281
  composeGuidelines
282
282
  };
283
- //# sourceMappingURL=chunk-NADY2H35.js.map
283
+ //# sourceMappingURL=chunk-YKKWXHYS.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mcp/standards/fetcher.ts","../src/mcp/standards/parser.ts","../src/mcp/standards/matcher.ts"],"sourcesContent":["/**\n * Fetches the standards repository from GitHub or local filesystem\n */\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\nimport { execa } from \"execa\";\n\nimport { CACHE, STANDARDS_REPO, TIMEOUTS } from \"../../constants.js\";\n\nconst CACHE_DIR = path.join(os.tmpdir(), CACHE.standardsCacheDir);\n\n/** Parsed GitHub source */\ninterface GitHubSource {\n type: \"github\";\n owner: string;\n repo: string;\n ref?: string;\n}\n\n/** Parsed local source */\ninterface LocalSource {\n type: \"local\";\n path: string;\n}\n\n/** Parsed source type */\ntype ParsedSource = GitHubSource | LocalSource;\n\n/** Parse github:owner/repo[@ref] format */\nfunction parseGitHubSource(source: string): GitHubSource {\n const remainder = source.slice(7); // Remove \"github:\"\n const atIndex = remainder.indexOf(\"@\");\n const ownerRepo = atIndex !== -1 ? remainder.slice(0, atIndex) : remainder;\n const ref = atIndex !== -1 ? remainder.slice(atIndex + 1) : undefined;\n const slashIndex = ownerRepo.indexOf(\"/\");\n\n if (slashIndex === -1) {\n throw new StandardsError(`Invalid GitHub source format: ${source}. Expected github:owner/repo`);\n }\n\n const owner = ownerRepo.slice(0, slashIndex);\n const repo = ownerRepo.slice(slashIndex + 1);\n\n if (!owner || !repo) {\n throw new StandardsError(`Invalid GitHub source format: ${source}. Expected github:owner/repo`);\n }\n\n return { type: \"github\", owner, repo, ref };\n}\n\n/**\n * Parse a source string into owner/repo/ref or local path.\n * Formats:\n * - \"github:owner/repo\" - GitHub repository\n * - \"github:owner/repo@ref\" - GitHub with branch/tag\n * - Local filesystem path (absolute or relative)\n */\nfunction parseSource(source: string): ParsedSource {\n if (source.startsWith(\"github:\")) {\n return parseGitHubSource(source);\n }\n return { type: \"local\", path: source };\n}\n\n/** Error class for standards fetching failures */\nexport class StandardsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"StandardsError\";\n }\n}\n\n/** Authentication method for GitHub */\ntype AuthMethod = \"token\" | \"ssh\" | \"none\";\n\n/**\n * Detect authentication method based on environment variables.\n * Priority: CM_REGISTRY_TOKEN > GITHUB_TOKEN > SSH key detection > none\n */\nfunction detectAuthMethod(): AuthMethod {\n if (process.env.CM_REGISTRY_TOKEN || process.env.GITHUB_TOKEN) {\n return \"token\";\n }\n if (process.env.SSH_AUTH_SOCK) {\n return \"ssh\";\n }\n return \"none\";\n}\n\n/**\n * Get the authentication token from environment variables.\n */\nfunction getAuthToken(): string | undefined {\n return process.env.CM_REGISTRY_TOKEN ?? process.env.GITHUB_TOKEN;\n}\n\n/**\n * Build the git URL for a repository based on auth method.\n */\nfunction buildGitHubUrl(auth: AuthMethod, owner: string, repo: string): string {\n switch (auth) {\n case \"ssh\":\n return `git@github.com:${owner}/${repo}.git`;\n case \"token\": {\n const token = getAuthToken();\n if (token) {\n return `https://x-access-token:${token}@github.com/${owner}/${repo}.git`;\n }\n return `https://github.com/${owner}/${repo}.git`;\n }\n case \"none\":\n default:\n return `https://github.com/${owner}/${repo}.git`;\n }\n}\n\n/**\n * Update an existing cloned repository.\n */\nasync function updateExistingRepo(repoDir: string): Promise<boolean> {\n try {\n await execa(\"git\", [\"pull\", \"--ff-only\"], { cwd: repoDir, timeout: TIMEOUTS.git });\n return true;\n } catch {\n // If update fails, remove the directory so it will be re-cloned\n fs.rmSync(repoDir, { recursive: true, force: true });\n return false;\n }\n}\n\n/**\n * Clone a repository from GitHub.\n */\nasync function cloneRepo(repoDir: string, owner: string, repo: string, ref?: string): Promise<void> {\n fs.mkdirSync(CACHE_DIR, { recursive: true });\n\n const auth = detectAuthMethod();\n const url = buildGitHubUrl(auth, owner, repo);\n\n try {\n const args = [\"clone\", \"--depth\", \"1\"];\n if (ref) {\n args.push(\"--branch\", ref);\n }\n args.push(url, repoDir);\n\n await execa(\"git\", args, {\n timeout: TIMEOUTS.git,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"timed out\")) {\n throw new StandardsError(`Standards repo clone timed out after ${TIMEOUTS.git / 1000} seconds`);\n }\n throw new StandardsError(`Failed to clone standards repo: ${message}`);\n }\n}\n\n/**\n * Fetch a GitHub repository, caching it locally.\n * Returns the path to the cached repository.\n */\nasync function fetchGitHubRepo(owner: string, repo: string, ref?: string): Promise<string> {\n const cacheKey = ref ? `${owner}-${repo}-${ref}` : `${owner}-${repo}`;\n const repoDir = path.join(CACHE_DIR, cacheKey);\n\n // If repo exists, try to update it\n if (fs.existsSync(repoDir)) {\n await updateExistingRepo(repoDir);\n }\n\n // Clone if it doesn't exist (either first time or after failed update)\n if (!fs.existsSync(repoDir)) {\n await cloneRepo(repoDir, owner, repo, ref);\n }\n\n return repoDir;\n}\n\n/**\n * Resolve a local source path to an absolute path.\n */\nfunction resolveLocalPath(localPath: string, basePath?: string): string {\n if (path.isAbsolute(localPath)) {\n return localPath;\n }\n const base = basePath ?? process.cwd();\n return path.resolve(base, localPath);\n}\n\n/**\n * Fetch the standards repository from a source string.\n * Supports:\n * - \"github:owner/repo\" - GitHub repository\n * - \"github:owner/repo@ref\" - GitHub with branch/tag\n * - Local filesystem path (absolute or relative)\n *\n * @param source - Source string to fetch from\n * @param basePath - Base path for resolving relative local paths (defaults to cwd)\n * @returns Path to the standards repository\n */\nexport async function fetchStandardsRepoFromSource(\n source: string,\n basePath?: string\n): Promise<string> {\n const parsed = parseSource(source);\n\n if (parsed.type === \"local\") {\n const resolvedPath = resolveLocalPath(parsed.path, basePath);\n if (!fs.existsSync(resolvedPath)) {\n throw new StandardsError(`Local standards path does not exist: ${resolvedPath}`);\n }\n return resolvedPath;\n }\n\n return fetchGitHubRepo(parsed.owner, parsed.repo, parsed.ref);\n}\n\n/**\n * Fetch the default standards repository, caching it locally.\n * Returns the path to the cached repository.\n */\nexport async function fetchStandardsRepo(): Promise<string> {\n return fetchGitHubRepo(STANDARDS_REPO.owner, STANDARDS_REPO.repo);\n}\n\n/**\n * Get the path to the guidelines directory.\n */\nexport function getGuidelinesDir(repoPath: string): string {\n return path.join(repoPath, \"guidelines\");\n}\n\n/**\n * Get the path to the rulesets directory.\n */\nexport function getRulesetsDir(repoPath: string): string {\n return path.join(repoPath, \"rulesets\");\n}\n","/**\n * Parser for guideline markdown files with YAML frontmatter\n */\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport matter from \"gray-matter\";\nimport { z } from \"zod\";\n\nimport { type Guideline, type GuidelineListItem, type Ruleset } from \"./types.js\";\nimport { StandardsError } from \"./fetcher.js\";\n\n/** Zod schema for validating guideline frontmatter */\nexport const frontmatterSchema = z.object({\n id: z.string(),\n title: z.string(),\n category: z.string(),\n priority: z.number(),\n tags: z.array(z.string()),\n});\n\n/**\n * Parse a guideline markdown file content into a Guideline object.\n */\nexport function parseGuideline(fileContent: string, filename: string): Guideline {\n const { data, content } = matter(fileContent);\n\n const result = frontmatterSchema.safeParse(data);\n if (!result.success) {\n const errors = result.error.errors.map((e) => `${e.path.join(\".\")}: ${e.message}`).join(\", \");\n throw new StandardsError(`Invalid frontmatter in ${filename}: ${errors}`);\n }\n\n return {\n ...result.data,\n content: content.trim(),\n };\n}\n\n/**\n * Load all guidelines from a directory.\n */\nexport function loadAllGuidelines(guidelinesDir: string): Guideline[] {\n if (!fs.existsSync(guidelinesDir)) {\n throw new StandardsError(`Guidelines directory not found: ${guidelinesDir}`);\n }\n\n const files = fs.readdirSync(guidelinesDir).filter((f) => f.endsWith(\".md\"));\n const guidelines: Guideline[] = [];\n\n for (const file of files) {\n const filePath = path.join(guidelinesDir, file);\n const content = fs.readFileSync(filePath, \"utf-8\");\n\n try {\n guidelines.push(parseGuideline(content, file));\n } catch (error) {\n // Skip files that fail to parse, log warning\n console.warn(`Warning: Failed to parse guideline ${file}: ${error}`);\n }\n }\n\n return guidelines;\n}\n\n/**\n * Load a single guideline by ID.\n */\nexport function loadGuideline(guidelinesDir: string, id: string): Guideline | null {\n const filePath = path.join(guidelinesDir, `${id}.md`);\n\n if (!fs.existsSync(filePath)) {\n return null;\n }\n\n const content = fs.readFileSync(filePath, \"utf-8\");\n return parseGuideline(content, `${id}.md`);\n}\n\n/**\n * Convert guidelines to list items (summary format).\n */\nexport function toListItems(guidelines: Guideline[]): GuidelineListItem[] {\n return guidelines.map((g) => ({\n id: g.id,\n title: g.title,\n tags: g.tags,\n category: g.category,\n }));\n}\n\n/**\n * Load a ruleset file by ID.\n */\nexport function loadRuleset(rulesetsDir: string, id: string): Ruleset | null {\n const filePath = path.join(rulesetsDir, `${id}.toml`);\n\n if (!fs.existsSync(filePath)) {\n return null;\n }\n\n const content = fs.readFileSync(filePath, \"utf-8\");\n return { id, content };\n}\n\n/**\n * List all available ruleset IDs.\n */\nexport function listRulesets(rulesetsDir: string): string[] {\n if (!fs.existsSync(rulesetsDir)) {\n return [];\n }\n\n return fs\n .readdirSync(rulesetsDir)\n .filter((f) => f.endsWith(\".toml\"))\n .map((f) => f.replace(\".toml\", \"\"));\n}\n","/**\n * Smart keyword matching logic for guidelines\n */\nimport { type Guideline, type MatchedGuideline } from \"./types.js\";\n\n/**\n * Parse a context string into keywords.\n * Extracts words, lowercases them, and removes duplicates.\n */\nexport function parseContext(context: string): string[] {\n const words = context\n .toLowerCase()\n .split(/[\\s,.\\-_/]+/)\n .filter((word) => word.length > 1);\n\n return [...new Set(words)];\n}\n\n/**\n * Score a guideline based on how many keywords match its tags.\n */\nexport function scoreGuideline(guideline: Guideline, keywords: string[]): number {\n const tags = new Set(guideline.tags.map((t) => t.toLowerCase()));\n let score = 0;\n\n for (const keyword of keywords) {\n if (tags.has(keyword)) {\n score++;\n }\n }\n\n // Also check if keyword appears in category or id\n const category = guideline.category.toLowerCase();\n const id = guideline.id.toLowerCase();\n\n for (const keyword of keywords) {\n if (category.includes(keyword) || id.includes(keyword)) {\n score += 0.5; // Partial match bonus\n }\n }\n\n return score;\n}\n\n/**\n * Match guidelines against a context string.\n * Returns guidelines sorted by score (descending) then priority (ascending).\n */\nexport function matchGuidelines(\n guidelines: Guideline[],\n context: string,\n limit?: number\n): MatchedGuideline[] {\n const keywords = parseContext(context);\n\n if (keywords.length === 0) {\n return [];\n }\n\n const scored = guidelines\n .map((guideline) => ({\n guideline,\n score: scoreGuideline(guideline, keywords),\n }))\n .filter((m) => m.score > 0);\n\n // Sort by score descending, then by priority ascending\n scored.sort((a, b) => {\n if (b.score !== a.score) {\n return b.score - a.score;\n }\n return a.guideline.priority - b.guideline.priority;\n });\n\n return limit ? scored.slice(0, limit) : scored;\n}\n\n/**\n * Compose matched guidelines into a single markdown document.\n */\nexport function composeGuidelines(matches: MatchedGuideline[]): string {\n if (matches.length === 0) {\n return \"No matching guidelines found for the given context.\";\n }\n\n const sections = matches.map((m) => {\n const { guideline } = m;\n return `# ${guideline.title}\\n\\n**Category:** ${guideline.category} | **Priority:** ${guideline.priority}\\n**Tags:** ${guideline.tags.join(\", \")}\\n\\n${guideline.content}`;\n });\n\n return sections.join(\"\\n\\n---\\n\\n\");\n}\n"],"mappings":"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","names":["fs","path"]}
1
+ {"version":3,"sources":["../src/mcp/standards/fetcher.ts","../src/mcp/standards/parser.ts","../src/mcp/standards/matcher.ts"],"sourcesContent":["/**\n * Fetches the standards repository from GitHub or local filesystem\n */\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\nimport { execa } from \"execa\";\n\nimport { CACHE, STANDARDS_REPO, TIMEOUTS } from \"../../constants.js\";\n\nconst CACHE_DIR = path.join(os.tmpdir(), CACHE.standardsCacheDir);\n\n/** Parsed GitHub source */\ninterface GitHubSource {\n type: \"github\";\n owner: string;\n repo: string;\n ref?: string;\n}\n\n/** Parsed local source */\ninterface LocalSource {\n type: \"local\";\n path: string;\n}\n\n/** Parsed source type */\ntype ParsedSource = GitHubSource | LocalSource;\n\n/** Parse github:owner/repo[@ref] format */\nfunction parseGitHubSource(source: string): GitHubSource {\n const remainder = source.slice(7); // Remove \"github:\"\n const atIndex = remainder.indexOf(\"@\");\n const ownerRepo = atIndex !== -1 ? remainder.slice(0, atIndex) : remainder;\n const ref = atIndex !== -1 ? remainder.slice(atIndex + 1) : undefined;\n const slashIndex = ownerRepo.indexOf(\"/\");\n\n if (slashIndex === -1) {\n throw new StandardsError(`Invalid GitHub source format: ${source}. Expected github:owner/repo`);\n }\n\n const owner = ownerRepo.slice(0, slashIndex);\n const repo = ownerRepo.slice(slashIndex + 1);\n\n if (!owner || !repo) {\n throw new StandardsError(`Invalid GitHub source format: ${source}. Expected github:owner/repo`);\n }\n\n return { type: \"github\", owner, repo, ref };\n}\n\n/**\n * Parse a source string into owner/repo/ref or local path.\n * Formats:\n * - \"github:owner/repo\" - GitHub repository\n * - \"github:owner/repo@ref\" - GitHub with branch/tag\n * - Local filesystem path (absolute or relative)\n */\nfunction parseSource(source: string): ParsedSource {\n if (source.startsWith(\"github:\")) {\n return parseGitHubSource(source);\n }\n return { type: \"local\", path: source };\n}\n\n/** Error class for standards fetching failures */\nexport class StandardsError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"StandardsError\";\n }\n}\n\n/** Authentication method for GitHub */\ntype AuthMethod = \"token\" | \"ssh\" | \"none\";\n\n/**\n * Detect authentication method based on environment variables.\n * Priority: CM_REGISTRY_TOKEN > GITHUB_TOKEN > SSH key detection > none\n */\nfunction detectAuthMethod(): AuthMethod {\n if (process.env.CM_REGISTRY_TOKEN || process.env.GITHUB_TOKEN) {\n return \"token\";\n }\n if (process.env.SSH_AUTH_SOCK) {\n return \"ssh\";\n }\n return \"none\";\n}\n\n/**\n * Get the authentication token from environment variables.\n */\nfunction getAuthToken(): string | undefined {\n return process.env.CM_REGISTRY_TOKEN ?? process.env.GITHUB_TOKEN;\n}\n\n/**\n * Build the git URL for a repository based on auth method.\n */\nfunction buildGitHubUrl(auth: AuthMethod, owner: string, repo: string): string {\n switch (auth) {\n case \"ssh\":\n return `git@github.com:${owner}/${repo}.git`;\n case \"token\": {\n const token = getAuthToken();\n if (token) {\n return `https://x-access-token:${token}@github.com/${owner}/${repo}.git`;\n }\n return `https://github.com/${owner}/${repo}.git`;\n }\n case \"none\":\n default:\n return `https://github.com/${owner}/${repo}.git`;\n }\n}\n\n/**\n * Update an existing cloned repository.\n */\nasync function updateExistingRepo(repoDir: string): Promise<boolean> {\n try {\n await execa(\"git\", [\"pull\", \"--ff-only\"], { cwd: repoDir, timeout: TIMEOUTS.git });\n return true;\n } catch {\n // If update fails, remove the directory so it will be re-cloned\n fs.rmSync(repoDir, { recursive: true, force: true });\n return false;\n }\n}\n\n/**\n * Clone a repository from GitHub.\n */\nasync function cloneRepo(repoDir: string, owner: string, repo: string, ref?: string): Promise<void> {\n fs.mkdirSync(CACHE_DIR, { recursive: true });\n\n const auth = detectAuthMethod();\n const url = buildGitHubUrl(auth, owner, repo);\n\n try {\n const args = [\"clone\", \"--depth\", \"1\"];\n if (ref) {\n args.push(\"--branch\", ref);\n }\n args.push(url, repoDir);\n\n await execa(\"git\", args, {\n timeout: TIMEOUTS.git,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"timed out\")) {\n throw new StandardsError(`Standards repo clone timed out after ${TIMEOUTS.git / 1000} seconds`);\n }\n throw new StandardsError(`Failed to clone standards repo: ${message}`);\n }\n}\n\n/**\n * Fetch a GitHub repository, caching it locally.\n * Returns the path to the cached repository.\n */\nasync function fetchGitHubRepo(owner: string, repo: string, ref?: string): Promise<string> {\n const cacheKey = ref ? `${owner}-${repo}-${ref}` : `${owner}-${repo}`;\n const repoDir = path.join(CACHE_DIR, cacheKey);\n\n // If repo exists, try to update it\n if (fs.existsSync(repoDir)) {\n await updateExistingRepo(repoDir);\n }\n\n // Clone if it doesn't exist (either first time or after failed update)\n if (!fs.existsSync(repoDir)) {\n await cloneRepo(repoDir, owner, repo, ref);\n }\n\n return repoDir;\n}\n\n/**\n * Resolve a local source path to an absolute path.\n */\nfunction resolveLocalPath(localPath: string, basePath?: string): string {\n if (path.isAbsolute(localPath)) {\n return localPath;\n }\n const base = basePath ?? process.cwd();\n return path.resolve(base, localPath);\n}\n\n/**\n * Fetch the standards repository from a source string.\n * Supports:\n * - \"github:owner/repo\" - GitHub repository\n * - \"github:owner/repo@ref\" - GitHub with branch/tag\n * - Local filesystem path (absolute or relative)\n *\n * @param source - Source string to fetch from\n * @param basePath - Base path for resolving relative local paths (defaults to cwd)\n * @returns Path to the standards repository\n */\nexport async function fetchStandardsRepoFromSource(\n source: string,\n basePath?: string\n): Promise<string> {\n const parsed = parseSource(source);\n\n if (parsed.type === \"local\") {\n const resolvedPath = resolveLocalPath(parsed.path, basePath);\n if (!fs.existsSync(resolvedPath)) {\n throw new StandardsError(`Local standards path does not exist: ${resolvedPath}`);\n }\n return resolvedPath;\n }\n\n return fetchGitHubRepo(parsed.owner, parsed.repo, parsed.ref);\n}\n\n/**\n * Fetch the default standards repository, caching it locally.\n * Returns the path to the cached repository.\n */\nexport async function fetchStandardsRepo(): Promise<string> {\n return fetchGitHubRepo(STANDARDS_REPO.owner, STANDARDS_REPO.repo);\n}\n\n/**\n * Get the path to the guidelines directory.\n */\nexport function getGuidelinesDir(repoPath: string): string {\n return path.join(repoPath, \"guidelines\");\n}\n\n/**\n * Get the path to the rulesets directory.\n */\nexport function getRulesetsDir(repoPath: string): string {\n return path.join(repoPath, \"rulesets\");\n}\n","/**\n * Parser for guideline markdown files with YAML frontmatter\n */\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport matter from \"gray-matter\";\nimport { z } from \"zod\";\n\nimport { type Guideline, type GuidelineListItem, type Ruleset } from \"./types.js\";\nimport { StandardsError } from \"./fetcher.js\";\n\n/** Zod schema for validating guideline frontmatter */\nexport const frontmatterSchema = z.object({\n id: z.string(),\n title: z.string(),\n category: z.string(),\n priority: z.number(),\n tags: z.array(z.string()),\n});\n\n/**\n * Parse a guideline markdown file content into a Guideline object.\n */\nexport function parseGuideline(fileContent: string, filename: string): Guideline {\n const { data, content } = matter(fileContent);\n\n const result = frontmatterSchema.safeParse(data);\n if (!result.success) {\n const errors = result.error.issues.map((e) => `${e.path.join(\".\")}: ${e.message}`).join(\", \");\n throw new StandardsError(`Invalid frontmatter in ${filename}: ${errors}`);\n }\n\n return {\n ...result.data,\n content: content.trim(),\n };\n}\n\n/**\n * Load all guidelines from a directory.\n */\nexport function loadAllGuidelines(guidelinesDir: string): Guideline[] {\n if (!fs.existsSync(guidelinesDir)) {\n throw new StandardsError(`Guidelines directory not found: ${guidelinesDir}`);\n }\n\n const files = fs.readdirSync(guidelinesDir).filter((f) => f.endsWith(\".md\"));\n const guidelines: Guideline[] = [];\n\n for (const file of files) {\n const filePath = path.join(guidelinesDir, file);\n const content = fs.readFileSync(filePath, \"utf-8\");\n\n try {\n guidelines.push(parseGuideline(content, file));\n } catch (error) {\n // Skip files that fail to parse, log warning\n console.warn(`Warning: Failed to parse guideline ${file}: ${error}`);\n }\n }\n\n return guidelines;\n}\n\n/**\n * Load a single guideline by ID.\n */\nexport function loadGuideline(guidelinesDir: string, id: string): Guideline | null {\n const filePath = path.join(guidelinesDir, `${id}.md`);\n\n if (!fs.existsSync(filePath)) {\n return null;\n }\n\n const content = fs.readFileSync(filePath, \"utf-8\");\n return parseGuideline(content, `${id}.md`);\n}\n\n/**\n * Convert guidelines to list items (summary format).\n */\nexport function toListItems(guidelines: Guideline[]): GuidelineListItem[] {\n return guidelines.map((g) => ({\n id: g.id,\n title: g.title,\n tags: g.tags,\n category: g.category,\n }));\n}\n\n/**\n * Load a ruleset file by ID.\n */\nexport function loadRuleset(rulesetsDir: string, id: string): Ruleset | null {\n const filePath = path.join(rulesetsDir, `${id}.toml`);\n\n if (!fs.existsSync(filePath)) {\n return null;\n }\n\n const content = fs.readFileSync(filePath, \"utf-8\");\n return { id, content };\n}\n\n/**\n * List all available ruleset IDs.\n */\nexport function listRulesets(rulesetsDir: string): string[] {\n if (!fs.existsSync(rulesetsDir)) {\n return [];\n }\n\n return fs\n .readdirSync(rulesetsDir)\n .filter((f) => f.endsWith(\".toml\"))\n .map((f) => f.replace(\".toml\", \"\"));\n}\n","/**\n * Smart keyword matching logic for guidelines\n */\nimport { type Guideline, type MatchedGuideline } from \"./types.js\";\n\n/**\n * Parse a context string into keywords.\n * Extracts words, lowercases them, and removes duplicates.\n */\nexport function parseContext(context: string): string[] {\n const words = context\n .toLowerCase()\n .split(/[\\s,.\\-_/]+/)\n .filter((word) => word.length > 1);\n\n return [...new Set(words)];\n}\n\n/**\n * Score a guideline based on how many keywords match its tags.\n */\nexport function scoreGuideline(guideline: Guideline, keywords: string[]): number {\n const tags = new Set(guideline.tags.map((t) => t.toLowerCase()));\n let score = 0;\n\n for (const keyword of keywords) {\n if (tags.has(keyword)) {\n score++;\n }\n }\n\n // Also check if keyword appears in category or id\n const category = guideline.category.toLowerCase();\n const id = guideline.id.toLowerCase();\n\n for (const keyword of keywords) {\n if (category.includes(keyword) || id.includes(keyword)) {\n score += 0.5; // Partial match bonus\n }\n }\n\n return score;\n}\n\n/**\n * Match guidelines against a context string.\n * Returns guidelines sorted by score (descending) then priority (ascending).\n */\nexport function matchGuidelines(\n guidelines: Guideline[],\n context: string,\n limit?: number\n): MatchedGuideline[] {\n const keywords = parseContext(context);\n\n if (keywords.length === 0) {\n return [];\n }\n\n const scored = guidelines\n .map((guideline) => ({\n guideline,\n score: scoreGuideline(guideline, keywords),\n }))\n .filter((m) => m.score > 0);\n\n // Sort by score descending, then by priority ascending\n scored.sort((a, b) => {\n if (b.score !== a.score) {\n return b.score - a.score;\n }\n return a.guideline.priority - b.guideline.priority;\n });\n\n return limit ? scored.slice(0, limit) : scored;\n}\n\n/**\n * Compose matched guidelines into a single markdown document.\n */\nexport function composeGuidelines(matches: MatchedGuideline[]): string {\n if (matches.length === 0) {\n return \"No matching guidelines found for the given context.\";\n }\n\n const sections = matches.map((m) => {\n const { guideline } = m;\n return `# ${guideline.title}\\n\\n**Category:** ${guideline.category} | **Priority:** ${guideline.priority}\\n**Tags:** ${guideline.tags.join(\", \")}\\n\\n${guideline.content}`;\n });\n\n return sections.join(\"\\n\\n---\\n\\n\");\n}\n"],"mappings":"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","names":["fs","path"]}
@@ -0,0 +1,3 @@
1
+ export { createValidateCommand } from "./validate.js";
2
+ export { createProcessCommand } from "./process.js";
3
+ export { configureExitOverride, handleError, runCheck, runAudit, buildResult, type DomainFilter, } from "./utils.js";
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function createProcessCommand(version: string): Command;
@@ -0,0 +1,19 @@
1
+ import { Command } from "commander";
2
+ import { type DomainResult, type FullResult } from "../core/index.js";
3
+ /**
4
+ * Configure exitOverride for a Command to return proper exit codes.
5
+ * Must be called on parent commands that have subcommands with options.
6
+ */
7
+ export declare function configureExitOverride(cmd: Command): Command;
8
+ export type DomainFilter = "code" | "process" | undefined;
9
+ export declare function shouldRunDomain(filter: DomainFilter, domain: "code" | "process"): boolean;
10
+ export declare function buildResult(version: string, configPath: string, domains: Record<string, DomainResult>): FullResult;
11
+ export declare function handleError(error: unknown): never;
12
+ export declare function runCheck(version: string, options: {
13
+ config?: string;
14
+ format: string;
15
+ }, domain?: DomainFilter): Promise<void>;
16
+ export declare function runAudit(version: string, options: {
17
+ config?: string;
18
+ format: string;
19
+ }, domain?: DomainFilter): Promise<void>;
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare function createValidateCommand(): Command;