From 05bd521c150abe4660a28c9d5bdfe556d0360a8b Mon Sep 17 00:00:00 2001 From: Doug Fennell Date: Wed, 12 Nov 2025 11:05:56 -0600 Subject: [PATCH] feat(init): generate warn-only ESLint config; move enforcement to ratchet (passive start) --- lib/generators/eslint-arch-config.js | 2 +- lib/generators/eslint-config.js | 9 ++++++++- tests/lib/generators/eslint-arch-config.test.js | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/generators/eslint-arch-config.js b/lib/generators/eslint-arch-config.js index fd11a44..46e71d5 100644 --- a/lib/generators/eslint-arch-config.js +++ b/lib/generators/eslint-arch-config.js @@ -30,7 +30,7 @@ function generateArchitectureRules(architecture) { overrides.push({ files: ['**/bin/*.js', '**/bin/**/*.js'], rules: { - 'max-lines': ['error', { max: maxFileLength.cli, skipBlankLines: true, skipComments: true }] + 'max-lines': ['warn', { max: maxFileLength.cli, skipBlankLines: true, skipComments: true }] } }); } diff --git a/lib/generators/eslint-config.js b/lib/generators/eslint-config.js index ba38d1b..9fd937a 100644 --- a/lib/generators/eslint-config.js +++ b/lib/generators/eslint-config.js @@ -48,7 +48,14 @@ function writeEslintConfig(cwd, cfg) { : ' // AI-friendly\n \'complexity\': [\'warn\', 15],\n \'max-depth\': [\'warn\', 4],\n \'max-lines-per-function\': [\'warn\', 100],\n'; const content = `// Generated by eslint-plugin-ai-code-snifftest init\nimport js from '@eslint/js';\nimport globals from 'globals';\nimport aiSnifftest from 'eslint-plugin-ai-code-snifftest';\n\nexport default [\n js.configs.recommended,\n {\n files: ['**/*.js'],\n languageOptions: {\n globals: {\n ...globals.node\n }\n },\n plugins: { 'ai-code-snifftest': aiSnifftest },\n rules: {\n // Baseline\n 'no-unused-vars': ['warn', { argsIgnorePattern: '^_' }],\n 'no-undef': 'error',\n 'prefer-const': 'warn',\n 'no-var': 'error',\n // Consistency\n 'quotes': ['warn', 'single', { avoidEscape: true }],\n 'semi': ['warn', 'always'],\n 'eqeqeq': ['error', 'always'],\n${aiFriendlyRules} // Naming (basic)\n 'camelcase': ['error', { properties: 'always' }],\n // Domain-specific\n 'ai-code-snifftest/no-redundant-calculations': 'warn',\n 'ai-code-snifftest/no-equivalent-branches': 'warn',\n 'ai-code-snifftest/prefer-simpler-logic': 'warn',\n 'ai-code-snifftest/no-redundant-conditionals': 'warn',\n 'ai-code-snifftest/no-unnecessary-abstraction': 'warn',\n 'ai-code-snifftest/no-generic-names': 'warn',\n 'ai-code-snifftest/enforce-domain-terms': 'warn',${archRulesConfig}\n }\n }${archOverridesConfig}\n];\n`; - fs.writeFileSync(file, content); + // Warn-only output: convert all built-in "error" severities to "warn" in generated config + const out = content + .replace(/'no-undef': 'error'/g, "'no-undef': 'warn'") + .replace(/'no-var': 'error'/g, "'no-var': 'warn'") + .replace(/'eqeqeq': \['error', 'always'\]/g, "'eqeqeq': ['warn', 'always']") + .replace(/'camelcase': \['error', \{ properties: 'always' \}\]/g, "'camelcase': ['warn', { properties: 'always' }]"); + + fs.writeFileSync(file, out); console.log(`Wrote ${file}`); } diff --git a/tests/lib/generators/eslint-arch-config.test.js b/tests/lib/generators/eslint-arch-config.test.js index a29b63a..31ed2c8 100644 --- a/tests/lib/generators/eslint-arch-config.test.js +++ b/tests/lib/generators/eslint-arch-config.test.js @@ -77,7 +77,7 @@ describe('eslint-arch-config generator', function () { assert.ok(cliOverride, 'Should have CLI override'); assert.ok(cliOverride.rules['max-lines']); - assert.strictEqual(cliOverride.rules['max-lines'][0], 'error'); // CLI is error, not warn + assert.strictEqual(cliOverride.rules['max-lines'][0], 'warn'); // CLI is warn in passive start assert.strictEqual(cliOverride.rules['max-lines'][1].max, 100); });