diff --git a/eslint.config.mjs b/eslint.config.mjs index 17ae5f85..a08facb5 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -88,7 +88,15 @@ export default [ // → CWE-480, Security + Reliability + Maintainability 'no-cond-assign': 'error', // → CWE-597, Reliability - eqeqeq: 'error', + // + // `null: 'ignore'` is ESLint's documented option for the deliberate `x != null` + // idiom, which tests null AND undefined in one comparison. The three violations + // this rule reported in src/sdk/cli were all that idiom + // (output-formatter.service.ts:152,153,165) — correct code, flagged by a config + // that did not match it. Suppressing them into a baseline would have recorded + // correct code as debt; loosening the operator generally would have weakened + // CWE-597. This is the narrow option that does neither. + eqeqeq: ['error', 'always', { null: 'ignore' }], // → CWE-783, Security + Maintainability 'no-unsafe-negation': 'error', // → CWE-476, Reliability diff --git a/src/sdk/cli/eslint-suppressions.json b/src/sdk/cli/eslint-suppressions.json new file mode 100644 index 00000000..8c9c56a0 --- /dev/null +++ b/src/sdk/cli/eslint-suppressions.json @@ -0,0 +1,311 @@ +{ + "src/app.module.spec.ts": { + "max-lines": { + "count": 1 + } + }, + "src/commands/adr/adr.command.spec.ts": { + "max-lines": { + "count": 1 + } + }, + "src/commands/adr/adr.command.ts": { + "default-case": { + "count": 1 + }, + "max-lines": { + "count": 1 + }, + "max-params": { + "count": 6 + } + }, + "src/commands/agents/agents.command.spec.ts": { + "max-lines": { + "count": 1 + } + }, + "src/commands/agents/agents.command.ts": { + "complexity": { + "count": 1 + }, + "default-case": { + "count": 1 + }, + "max-lines": { + "count": 1 + } + }, + "src/commands/alias/alias.command.ts": { + "complexity": { + "count": 1 + } + }, + "src/commands/api/api.catalog.tool-schemas.generated.ts": { + "max-lines": { + "count": 1 + } + }, + "src/commands/api/api.command.ts": { + "max-params": { + "count": 1 + } + }, + "src/commands/architecture/scaffold.command.spec.ts": { + "max-lines": { + "count": 1 + } + }, + "src/commands/architecture/scaffold.command.ts": { + "complexity": { + "count": 1 + }, + "max-lines": { + "count": 1 + } + }, + "src/commands/chat/chat.command.ts": { + "complexity": { + "count": 1 + }, + "max-params": { + "count": 1 + } + }, + "src/commands/completion/completion.command.ts": { + "default-case": { + "count": 1 + } + }, + "src/commands/docs/docs.command.ts": { + "complexity": { + "count": 1 + } + }, + "src/commands/drift/drift.command.spec.ts": { + "max-lines": { + "count": 1 + } + }, + "src/commands/drift/drift.command.ts": { + "complexity": { + "count": 1 + } + }, + "src/commands/enforce/enforce.command.ts": { + "complexity": { + "count": 1 + }, + "max-lines": { + "count": 1 + } + }, + "src/commands/evaluate/evaluate.command.ts": { + "complexity": { + "count": 1 + }, + "max-lines": { + "count": 1 + }, + "max-params": { + "count": 1 + } + }, + "src/commands/fixtures/fixtures.command.ts": { + "complexity": { + "count": 1 + }, + "default-case": { + "count": 1 + }, + "max-lines": { + "count": 1 + } + }, + "src/commands/gate/gate.command.ts": { + "complexity": { + "count": 1 + } + }, + "src/commands/history/history.command.spec.ts": { + "max-lines": { + "count": 1 + } + }, + "src/commands/history/history.command.ts": { + "max-lines": { + "count": 1 + } + }, + "src/commands/init/init.command.spec.ts": { + "max-lines": { + "count": 1 + } + }, + "src/commands/init/init.command.ts": { + "complexity": { + "count": 1 + }, + "max-lines": { + "count": 1 + } + }, + "src/commands/init/init.wizard.ts": { + "complexity": { + "count": 1 + }, + "max-params": { + "count": 1 + } + }, + "src/commands/patterns/patterns.json-surface.spec.ts": { + "max-lines": { + "count": 1 + } + }, + "src/commands/patterns/patterns.shared.ts": { + "max-params": { + "count": 1 + } + }, + "src/commands/phase/phase-advance.command.ts": { + "complexity": { + "count": 1 + } + }, + "src/commands/satellite/satellite-adopt.command.spec.ts": { + "max-lines": { + "count": 1 + } + }, + "src/commands/satellite/satellite-adopt.command.ts": { + "complexity": { + "count": 1 + } + }, + "src/commands/satellite/satellite-create.command.ts": { + "complexity": { + "count": 1 + } + }, + "src/commands/sdlc/generate-domain.command.ts": { + "complexity": { + "count": 1 + } + }, + "src/commands/sdlc/handoff.command.spec.ts": { + "max-lines": { + "count": 1 + } + }, + "src/commands/sdlc/handoff.command.ts": { + "complexity": { + "count": 1 + } + }, + "src/commands/standards/standards.command.spec.ts": { + "max-lines": { + "count": 1 + } + }, + "src/commands/standards/standards.command.ts": { + "default-case": { + "count": 1 + }, + "max-lines": { + "count": 1 + }, + "max-params": { + "count": 6 + } + }, + "src/commands/topology/phase-artifacts.command.spec.ts": { + "max-lines": { + "count": 1 + } + }, + "src/commands/update/update.command.ts": { + "max-lines": { + "count": 1 + } + }, + "src/commands/upgrade/upgrade.command.spec.ts": { + "max-lines": { + "count": 1 + } + }, + "src/commands/upgrade/upgrade.command.ts": { + "complexity": { + "count": 1 + } + }, + "src/commands/validate/validate.command.spec.ts": { + "max-lines": { + "count": 1 + } + }, + "src/commands/validate/validate.command.ts": { + "complexity": { + "count": 1 + }, + "max-lines": { + "count": 1 + }, + "max-params": { + "count": 1 + } + }, + "src/commands/waiver/waiver.command.spec.ts": { + "max-lines": { + "count": 1 + } + }, + "src/commands/waiver/waiver.command.ts": { + "complexity": { + "count": 1 + }, + "max-params": { + "count": 2 + } + }, + "src/infrastructure/adapters/agent-registry.service.ts": { + "max-params": { + "count": 1 + } + }, + "src/infrastructure/cli/command-executor.ts": { + "max-params": { + "count": 1 + } + }, + "src/infrastructure/cli/machine-channel.ts": { + "max-params": { + "count": 1 + } + }, + "src/infrastructure/cli/providers/providers.spec.ts": { + "max-lines": { + "count": 1 + } + }, + "src/infrastructure/formatters/output-formatter.service.spec.ts": { + "max-lines": { + "count": 1 + } + }, + "src/infrastructure/observability/error-reporter.spec.ts": { + "max-lines": { + "count": 1 + } + }, + "src/infrastructure/prompts/non-interactive-contract.spec.ts": { + "max-params": { + "count": 1 + } + }, + "src/infrastructure/prompts/wizard.service.spec.ts": { + "max-lines": { + "count": 1 + } + } +} \ No newline at end of file