pm-ops 2026.9.13 → 2026.9.23

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.
@@ -0,0 +1,374 @@
1
+ /**
2
+ * Canonical TypeScript duplication analysis and fail-closed gate for the fleet.
3
+ *
4
+ * Two jscpd majors are supported, and their engines are structurally
5
+ * different, so the analyzer dispatches on the installed major:
6
+ *
7
+ * - jscpd 4 ships a Node.js programmatic API, used directly so consumer
8
+ * launchers stay small while preserving the detector's clone locations.
9
+ * - jscpd 5 replaced the Node.js API with a self-contained Rust binary, so
10
+ * the analyzer runs the binary with its JSON reporter and parses the report.
11
+ */
12
+ import fastGlob from "fast-glob";
13
+ import { createRequire } from "node:module";
14
+ import { existsSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
15
+ import { tmpdir } from "node:os";
16
+ import { dirname, join, relative, resolve, sep } from "node:path";
17
+ import { spawnSync } from "node:child_process";
18
+ /** Default TypeScript glob scanned by the duplication gate. */
19
+ export const DEFAULT_DUPLICATION_GLOBS = ["**/*.ts"];
20
+ const defaultRepoRoot = process.cwd();
21
+ const MAX_DUPLICATION_LINES = Number.MAX_SAFE_INTEGER;
22
+ const MAX_DUPLICATION_SIZE = `${Number.MAX_SAFE_INTEGER}b`;
23
+ const DUPLICATION_IGNORES = [
24
+ "**/node_modules/**",
25
+ "**/dist/**",
26
+ "**/dist-test/**",
27
+ "**/coverage/**",
28
+ "**/.git/**",
29
+ "**/*.d.ts",
30
+ ];
31
+ const require = createRequire(import.meta.url);
32
+ /** Return whether an unknown JSON value is a record with string keys. */
33
+ function isRecord(value) {
34
+ return typeof value === "object" && value !== null;
35
+ }
36
+ /** Require a record-shaped JSON value from jscpd's report, failing closed otherwise. */
37
+ function expectRecord(value, context) {
38
+ if (!isRecord(value))
39
+ throw new Error(`duplication: jscpd report ${context} is not an object`);
40
+ return value;
41
+ }
42
+ /** Require a finite number field of a jscpd report record, failing closed otherwise. */
43
+ function expectNumber(record, key, context) {
44
+ const value = record[key];
45
+ if (typeof value !== "number" || !Number.isFinite(value)) {
46
+ throw new Error(`duplication: jscpd report ${context} is not a number`);
47
+ }
48
+ return value;
49
+ }
50
+ /** Require a string field of a jscpd report record, failing closed otherwise. */
51
+ function expectString(record, key, context) {
52
+ const value = record[key];
53
+ if (typeof value !== "string")
54
+ throw new Error(`duplication: jscpd report ${context} is not a string`);
55
+ return value;
56
+ }
57
+ /** Require one cloned file end of a jscpd 5 report record. */
58
+ function expectCloneEnd(value, context) {
59
+ const record = expectRecord(value, context);
60
+ return {
61
+ name: expectString(record, "name", `${context}.name`),
62
+ start: expectNumber(record, "start", `${context}.start`),
63
+ end: expectNumber(record, "end", `${context}.end`),
64
+ };
65
+ }
66
+ /**
67
+ * Parse and validate a jscpd 5 JSON report.
68
+ *
69
+ * Every field the duplication gate consumes is checked, so a jscpd output
70
+ * format change fails the gate closed instead of silently reporting zero.
71
+ *
72
+ * @param report - The parsed `jscpd-report.json` value.
73
+ * @returns The clone pairs and aggregate line statistics, validated.
74
+ */
75
+ export function parseJscpdReport(report) {
76
+ const root = expectRecord(report, "root");
77
+ const duplicates = root.duplicates;
78
+ if (!Array.isArray(duplicates))
79
+ throw new Error("duplication: jscpd report duplicates is not an array");
80
+ const clones = duplicates.map((clone) => {
81
+ const record = expectRecord(clone, "clone");
82
+ return {
83
+ firstFile: expectCloneEnd(record.firstFile, "clone.firstFile"),
84
+ secondFile: expectCloneEnd(record.secondFile, "clone.secondFile"),
85
+ };
86
+ });
87
+ const statistics = expectRecord(root.statistics, "statistics");
88
+ const total = expectRecord(statistics.total, "statistics.total");
89
+ const lines = expectNumber(total, "lines", "statistics.total.lines");
90
+ const duplicatedLines = expectNumber(total, "duplicatedLines", "statistics.total.duplicatedLines");
91
+ // An impossible count (negative, fractional, or more duplicated than total lines)
92
+ // would compute a passing percentage, so it fails closed like a missing field.
93
+ if (!Number.isInteger(lines) ||
94
+ !Number.isInteger(duplicatedLines) ||
95
+ duplicatedLines < 0 ||
96
+ duplicatedLines > lines) {
97
+ throw new Error("duplication: jscpd report statistics.total contains impossible line counts");
98
+ }
99
+ return { duplicates: clones, statistics: { total: { lines, duplicatedLines } } };
100
+ }
101
+ /** Parse and validate the package-level duplication gate contract. */
102
+ function readDuplicationConfig(manifest) {
103
+ if (!isRecord(manifest.duplicationGate))
104
+ return undefined;
105
+ const block = manifest.duplicationGate;
106
+ const threshold = block.threshold;
107
+ const minTokens = block.minTokens;
108
+ if (typeof threshold !== "number" ||
109
+ !Number.isFinite(threshold) ||
110
+ threshold < 0 ||
111
+ threshold > 100)
112
+ return undefined;
113
+ if (minTokens !== undefined &&
114
+ (typeof minTokens !== "number" || !Number.isInteger(minTokens) || minTokens < 1))
115
+ return undefined;
116
+ return { threshold, minTokens: minTokens ?? 50 };
117
+ }
118
+ /** Convert jscpd's source identifier into a stable repository-relative path. */
119
+ function relativeSource(repoRoot, sourceId) {
120
+ return relative(repoRoot, resolve(repoRoot, sourceId)).split(sep).join("/");
121
+ }
122
+ /** Convert one cloned file end into the public report's file and line-range shape. */
123
+ function cloneEnd(repoRoot, sourceId, startLine, endLine) {
124
+ return { file: relativeSource(repoRoot, sourceId), startLine, endLine };
125
+ }
126
+ /** Convert one jscpd 4 clone into the public report's line-range shape. */
127
+ function mapProgrammaticClone(repoRoot, clone) {
128
+ return {
129
+ first: cloneEnd(repoRoot, clone.duplicationA.sourceId, clone.duplicationA.start.line, clone.duplicationA.end.line),
130
+ second: cloneEnd(repoRoot, clone.duplicationB.sourceId, clone.duplicationB.start.line, clone.duplicationB.end.line),
131
+ };
132
+ }
133
+ /** Convert one jscpd 5 clone into the public report's line-range shape. */
134
+ function mapReportedClone(repoRoot, clone) {
135
+ return {
136
+ first: cloneEnd(repoRoot, clone.firstFile.name, clone.firstFile.start, clone.firstFile.end),
137
+ second: cloneEnd(repoRoot, clone.secondFile.name, clone.secondFile.start, clone.secondFile.end),
138
+ };
139
+ }
140
+ /** Turn configured glob entries into the one fast-glob pattern jscpd accepts. */
141
+ function combineGlobs(globs) {
142
+ if (globs.length === 0)
143
+ throw new Error("duplication-gate: at least one source glob is required");
144
+ return globs.length === 1 ? globs[0] : `{${globs.join(",")}}`;
145
+ }
146
+ /** Match the files jscpd is expected to analyze with the same scope and ignores. */
147
+ function globMatchedSources(repoRoot, pattern) {
148
+ return fastGlob.sync(pattern, {
149
+ absolute: true,
150
+ cwd: repoRoot,
151
+ dot: true,
152
+ followSymbolicLinks: true,
153
+ ignore: [...DUPLICATION_IGNORES],
154
+ onlyFiles: true,
155
+ })
156
+ .filter((source) => source.endsWith(".ts") && !source.endsWith(".d.ts"))
157
+ .map((source) => relativeSource(repoRoot, source))
158
+ .sort();
159
+ }
160
+ /** Build the bounded jscpd 4 options shared by matching and actual analysis. */
161
+ function duplicationOptions(repoRoot, pattern, minTokens) {
162
+ return {
163
+ path: [repoRoot],
164
+ pattern,
165
+ minTokens,
166
+ minLines: 1,
167
+ maxLines: MAX_DUPLICATION_LINES,
168
+ maxSize: MAX_DUPLICATION_SIZE,
169
+ format: ["typescript"],
170
+ ignore: [...DUPLICATION_IGNORES],
171
+ absolute: true,
172
+ gitignore: false,
173
+ reporters: [],
174
+ silent: true,
175
+ };
176
+ }
177
+ /** Compute the duplicated-line percentage jscpd's own line counts imply. */
178
+ function percentageOf(duplicatedLines, totalLines) {
179
+ return totalLines > 0 ? (duplicatedLines / totalLines) * 100 : 0;
180
+ }
181
+ /**
182
+ * Resolve the installed jscpd package, preferring the repository root.
183
+ *
184
+ * Consumers install jscpd as their own (optional) peer dependency, so the
185
+ * repository root is where the analyzer must find it; this module's own
186
+ * directory keeps the gate working for this repository's runs. jscpd 4
187
+ * resolves through its programmatic entry point, while jscpd 5 exposes no
188
+ * entry at all and resolves through its package manifest; when jscpd is
189
+ * installed nowhere, the manifest lookup throws Node's own not-found error.
190
+ */
191
+ function resolveJscpdEntry(repoRoot) {
192
+ try {
193
+ const entryPath = require.resolve("jscpd", { paths: [repoRoot, import.meta.dirname] });
194
+ const packageDir = packageDirOf(entryPath);
195
+ return { major: majorOf(packageDir), packageDir, entryPath };
196
+ }
197
+ catch {
198
+ // jscpd 5 has no package entry point; its manifest is the only anchor.
199
+ const manifestPath = require.resolve("jscpd/package.json", { paths: [repoRoot, import.meta.dirname] });
200
+ const packageDir = dirname(manifestPath);
201
+ return { major: majorOf(packageDir), packageDir, entryPath: manifestPath };
202
+ }
203
+ }
204
+ /** Read the engine generation from a jscpd package's manifest. */
205
+ function majorOf(packageDir) {
206
+ const manifest = JSON.parse(readFileSync(join(packageDir, "package.json"), "utf8"));
207
+ return Number.parseInt(String(manifest.version), 10);
208
+ }
209
+ /** The directory of a package entry, walking up to the package manifest. */
210
+ function packageDirOf(entryPath) {
211
+ let directory = dirname(entryPath);
212
+ while (!existsSync(join(directory, "package.json")))
213
+ directory = dirname(directory);
214
+ return directory;
215
+ }
216
+ /**
217
+ * Analyze with jscpd 4's programmatic API.
218
+ *
219
+ * jscpd 4 publishes a per-file statistic, so files the globs matched but
220
+ * jscpd never analyzed fail the gate closed through `skippedSources`.
221
+ */
222
+ async function analyzeWithProgrammatic(installation, repoRoot, pattern, minTokens, matchedSources) {
223
+ const api = require(installation.entryPath);
224
+ const result = await api.detectClonesAndStatistic(duplicationOptions(repoRoot, pattern, minTokens));
225
+ const analyzedSources = Object.keys(result.statistic.formats.typescript?.sources ?? {})
226
+ .map((source) => relativeSource(repoRoot, source))
227
+ .sort();
228
+ const analyzed = new Set(analyzedSources);
229
+ return {
230
+ percentage: percentageOf(result.statistic.total.duplicatedLines, result.statistic.total.lines),
231
+ totalLines: result.statistic.total.lines,
232
+ duplicatedLines: result.statistic.total.duplicatedLines,
233
+ sources: result.statistic.total.sources,
234
+ skippedSources: matchedSources.filter((source) => !analyzed.has(source)),
235
+ cloneCount: result.clones.length,
236
+ clones: result.clones.map((clone) => mapProgrammaticClone(repoRoot, clone)),
237
+ };
238
+ }
239
+ /**
240
+ * Analyze with jscpd 5's binary through its JSON reporter.
241
+ *
242
+ * jscpd 5 is a self-contained Rust binary driven by `run-jscpd.js`, and its
243
+ * JSON report carries no per-file analysis record. The only files it drops
244
+ * from `statistics.total.sources` are those below the token floor, which
245
+ * cannot hold a clone of `minTokens` tokens, so the in-scope file set is the
246
+ * analyzed set and nothing in scope can be silently skipped.
247
+ */
248
+ function analyzeWithBinary(installation, repoRoot, pattern, minTokens, matchedSources) {
249
+ const outputDir = mkdtempSync(join(tmpdir(), "pm-ops-jscpd-"));
250
+ try {
251
+ const result = spawnSync(process.execPath, [
252
+ join(installation.packageDir, "run-jscpd.js"),
253
+ repoRoot,
254
+ "--pattern", pattern,
255
+ "--format", "typescript",
256
+ "--min-tokens", String(minTokens),
257
+ "--min-lines", "1",
258
+ "--max-lines", String(MAX_DUPLICATION_LINES),
259
+ "--max-size", MAX_DUPLICATION_SIZE,
260
+ "--ignore", DUPLICATION_IGNORES.join(","),
261
+ "--reporters", "json",
262
+ "--output", outputDir,
263
+ "--silent",
264
+ "--no-colors",
265
+ "--absolute",
266
+ "--no-gitignore",
267
+ ], { encoding: "utf8" });
268
+ if (result.status !== 0) {
269
+ throw new Error(`duplication: jscpd exited with status ${String(result.status)}: ${String(result.stderr)}`);
270
+ }
271
+ const rawReport = JSON.parse(readFileSync(join(outputDir, "jscpd-report.json"), "utf8"));
272
+ const reported = parseJscpdReport(rawReport);
273
+ return {
274
+ percentage: percentageOf(reported.statistics.total.duplicatedLines, reported.statistics.total.lines),
275
+ totalLines: reported.statistics.total.lines,
276
+ duplicatedLines: reported.statistics.total.duplicatedLines,
277
+ sources: matchedSources.length,
278
+ skippedSources: [],
279
+ cloneCount: reported.duplicates.length,
280
+ clones: reported.duplicates.map((clone) => mapReportedClone(repoRoot, clone)),
281
+ };
282
+ }
283
+ finally {
284
+ rmSync(outputDir, { recursive: true, force: true });
285
+ }
286
+ }
287
+ /** Return the fail-closed diagnostic for an empty or partially analyzed scope. */
288
+ export function duplicationGateDiagnostic(report) {
289
+ if (report.sources === 0)
290
+ return "duplication-gate: no TypeScript sources were analyzed for the configured glob scope.";
291
+ if (report.skippedSources.length > 0) {
292
+ return `duplication-gate: jscpd skipped ${report.skippedSources.length} in-scope file(s):\n`
293
+ + report.skippedSources.map((source) => ` ${source}`).join("\n");
294
+ }
295
+ return undefined;
296
+ }
297
+ /**
298
+ * Analyze a repository's TypeScript sources with the installed jscpd major.
299
+ *
300
+ * jscpd 4 runs through its Node.js API and jscpd 5 through its Rust binary,
301
+ * and both are resolved from the repository root so a consumer's own jscpd
302
+ * dependency is the engine that answers.
303
+ *
304
+ * @param options - Repository root and optional source globs.
305
+ * @returns Aggregate percentage and every clone pair found by jscpd.
306
+ */
307
+ export async function analyzeDuplication(options = {}) {
308
+ const repoRoot = options.repoRoot ?? defaultRepoRoot;
309
+ const pattern = combineGlobs(options.globs ?? DEFAULT_DUPLICATION_GLOBS);
310
+ const minTokens = options.minTokens ?? 50;
311
+ const matchedSources = globMatchedSources(repoRoot, pattern);
312
+ const installation = resolveJscpdEntry(repoRoot);
313
+ if (installation.major >= 5) {
314
+ return analyzeWithBinary(installation, repoRoot, pattern, minTokens, matchedSources);
315
+ }
316
+ return analyzeWithProgrammatic(installation, repoRoot, pattern, minTokens, matchedSources);
317
+ }
318
+ /**
319
+ * Run the configured duplication threshold gate and print every clone pair.
320
+ *
321
+ * A missing or malformed `duplicationGate` block fails closed with a
322
+ * remediation message. The default minimum token count is 50, matching jscpd.
323
+ *
324
+ * @param options - Repository, glob, logging, and process boundaries.
325
+ */
326
+ export async function runDuplicationGate(options = {}) {
327
+ const repoRoot = options.repoRoot ?? defaultRepoRoot;
328
+ const log = options.log ?? console.log;
329
+ const error = options.error ?? console.error;
330
+ const exit = options.exit ?? process.exit;
331
+ let manifest;
332
+ try {
333
+ manifest = JSON.parse(readFileSync(resolve(repoRoot, "package.json"), "utf8"));
334
+ }
335
+ catch (cause) {
336
+ error(`duplication-gate: could not read package.json: ${String(cause)}`);
337
+ return exit(1);
338
+ }
339
+ if (!isRecord(manifest) || !("duplicationGate" in manifest)) {
340
+ error("duplication-gate: package.json has no `duplicationGate` block; add { \"threshold\": <percent>, \"minTokens\": <n> }.");
341
+ return exit(1);
342
+ }
343
+ const config = readDuplicationConfig(manifest);
344
+ if (config === undefined) {
345
+ error("duplication-gate: invalid `duplicationGate`; threshold must be a number from 0 to 100 and minTokens must be a positive integer.");
346
+ return exit(1);
347
+ }
348
+ let report;
349
+ try {
350
+ report = await analyzeDuplication({
351
+ repoRoot,
352
+ globs: options.globs,
353
+ minTokens: config.minTokens,
354
+ });
355
+ }
356
+ catch (cause) {
357
+ error(`duplication-gate: jscpd analysis failed: ${String(cause)}`);
358
+ return exit(1);
359
+ }
360
+ log(`duplication-gate: ${report.percentage}% duplicated lines (${report.duplicatedLines}/${report.totalLines}), ${report.sources} source(s), ${report.cloneCount} clone pair(s), threshold ${config.threshold}%`);
361
+ const scopeDiagnostic = duplicationGateDiagnostic(report);
362
+ if (scopeDiagnostic) {
363
+ error(scopeDiagnostic);
364
+ return exit(1);
365
+ }
366
+ for (const clone of report.clones) {
367
+ log(` ${clone.first.file}:${clone.first.startLine}-${clone.first.endLine} <-> ${clone.second.file}:${clone.second.startLine}-${clone.second.endLine}`);
368
+ }
369
+ if (report.percentage > config.threshold) {
370
+ error(`duplication-gate: ${report.percentage}% exceeds the configured ${config.threshold}% threshold; remove the reported clone pairs or document a justified threshold change in package.json.`);
371
+ return exit(1);
372
+ }
373
+ }
374
+ //# sourceMappingURL=duplication.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplication.js","sourceRoot":"","sources":["../duplication.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Canonical strict flat configuration for every fleet TypeScript repository.
3
+ *
4
+ * Babel supplies the ESLint parser because typescript-eslint rejects the
5
+ * TypeScript 7 compiler peer range used by part of the fleet. TypeScript stays
6
+ * the authoritative compiler; Babel only supplies ESLint's ESTree syntax tree.
7
+ */
8
+ import type { Linter } from "eslint";
9
+ /** Inputs for constructing a reusable flat policy in a consumer package. */
10
+ export interface FleetEslintConfigOptions {
11
+ /** Additional repository-relative ignore globs appended to the fleet defaults. */
12
+ readonly ignores?: readonly string[];
13
+ }
14
+ /**
15
+ * Build the fleet's strict, TypeScript-aware ESLint flat configuration.
16
+ *
17
+ * The returned array is intentionally a fresh flat-config value, so a
18
+ * consumer can append its own project-specific config without mutating the
19
+ * canonical policy or another ESLint invocation.
20
+ *
21
+ * @param options - Optional additional ignore globs for generated files.
22
+ * @returns ESLint flat-config entries ready for `ESLint` or `eslint`.
23
+ */
24
+ export declare function fleetEslintConfig(options?: FleetEslintConfigOptions): Linter.Config[];
25
+ /** Inputs for the canonical lint launcher. */
26
+ export interface RunLintGateOptions {
27
+ /** Directory ESLint treats as the project root. */
28
+ readonly cwd?: string;
29
+ /** Files or directories to lint; defaults to the current project. */
30
+ readonly files?: readonly string[];
31
+ /** Additional repository-relative ignore globs. */
32
+ readonly ignores?: readonly string[];
33
+ }
34
+ /**
35
+ * Run the canonical lint policy, print stylish diagnostics, and return a status.
36
+ *
37
+ * @param options - Optional project root, lint paths, and additional ignores.
38
+ * @returns `0` for a clean result and `1` when ESLint reports findings.
39
+ */
40
+ export declare function runLintGate(options?: RunLintGateOptions): Promise<number>;
41
+ //# sourceMappingURL=eslint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eslint.d.ts","sourceRoot":"","sources":["../eslint.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,4EAA4E;AAC5E,MAAM,WAAW,wBAAwB;IACvC,kFAAkF;IAClF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AA6DD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAAC,MAAM,EAAE,CA4BjB;AAED,8CAA8C;AAC9C,MAAM,WAAW,kBAAkB;IACjC,mDAAmD;IACnD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,mDAAmD;IACnD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAWnF"}
package/dist/eslint.js ADDED
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Canonical strict flat configuration for every fleet TypeScript repository.
3
+ *
4
+ * Babel supplies the ESLint parser because typescript-eslint rejects the
5
+ * TypeScript 7 compiler peer range used by part of the fleet. TypeScript stays
6
+ * the authoritative compiler; Babel only supplies ESLint's ESTree syntax tree.
7
+ */
8
+ import babelParser from "@babel/eslint-parser";
9
+ import { ESLint } from "eslint";
10
+ import { defineConfig } from "eslint/config";
11
+ const forbiddenSyntax = [
12
+ { selector: "TSAnyKeyword", message: "Use a precise type instead of explicit any." },
13
+ { selector: "ImportExpression", message: "Dynamic imports are forbidden; use a top-level import." },
14
+ { selector: "TSImportType", message: "Inline type imports are forbidden; use a top-level type import." },
15
+ { selector: "TSParameterProperty", message: "Parameter properties require non-erasable emit." },
16
+ { selector: "TSEnumDeclaration", message: "Enums require non-erasable emit; use literal unions." },
17
+ { selector: "TSModuleDeclaration", message: "Namespaces and TypeScript modules are forbidden." },
18
+ { selector: "TSImportEqualsDeclaration", message: "Import-equals syntax is forbidden." },
19
+ { selector: "TSExportAssignment", message: "Export-equals syntax is forbidden." },
20
+ ];
21
+ const defaultIgnores = [
22
+ ".agents/**",
23
+ "coverage/**",
24
+ "dist/**",
25
+ "dist-test/**",
26
+ "node_modules/**",
27
+ ];
28
+ const rules = {
29
+ "constructor-super": "error",
30
+ "eqeqeq": ["error", "always"],
31
+ "no-array-constructor": "error",
32
+ "no-async-promise-executor": "error",
33
+ "no-constant-binary-expression": "error",
34
+ "no-constructor-return": "error",
35
+ "no-debugger": "error",
36
+ "no-dupe-args": "error",
37
+ "no-dupe-class-members": "error",
38
+ "no-dupe-else-if": "error",
39
+ "no-duplicate-imports": ["error", { allowSeparateTypeImports: true }],
40
+ "no-fallthrough": "error",
41
+ "no-import-assign": "error",
42
+ "no-new-native-nonconstructor": "error",
43
+ "no-promise-executor-return": "error",
44
+ "no-restricted-syntax": ["error", ...forbiddenSyntax],
45
+ "no-self-assign": "error",
46
+ "no-setter-return": "error",
47
+ "no-shadow-restricted-names": "error",
48
+ "no-sparse-arrays": "error",
49
+ "no-unexpected-multiline": "error",
50
+ "no-unmodified-loop-condition": "error",
51
+ "no-unreachable": "error",
52
+ "no-unreachable-loop": "error",
53
+ "no-unsafe-finally": "error",
54
+ "no-unsafe-negation": "error",
55
+ "no-unsafe-optional-chaining": "error",
56
+ "no-unused-private-class-members": "error",
57
+ "no-useless-backreference": "error",
58
+ "no-useless-catch": "error",
59
+ "no-useless-escape": "error",
60
+ "no-var": "error",
61
+ "prefer-const": "error",
62
+ "prefer-object-has-own": "error",
63
+ "require-atomic-updates": "error",
64
+ "use-isnan": "error",
65
+ "valid-typeof": "error",
66
+ };
67
+ /**
68
+ * Build the fleet's strict, TypeScript-aware ESLint flat configuration.
69
+ *
70
+ * The returned array is intentionally a fresh flat-config value, so a
71
+ * consumer can append its own project-specific config without mutating the
72
+ * canonical policy or another ESLint invocation.
73
+ *
74
+ * @param options - Optional additional ignore globs for generated files.
75
+ * @returns ESLint flat-config entries ready for `ESLint` or `eslint`.
76
+ */
77
+ export function fleetEslintConfig(options = {}) {
78
+ return defineConfig([
79
+ {
80
+ ignores: [...defaultIgnores, ...(options.ignores ?? [])],
81
+ },
82
+ {
83
+ files: ["**/*.ts"],
84
+ languageOptions: {
85
+ ecmaVersion: "latest",
86
+ sourceType: "module",
87
+ parser: babelParser,
88
+ parserOptions: {
89
+ requireConfigFile: false,
90
+ babelOptions: {
91
+ babelrc: false,
92
+ configFile: false,
93
+ parserOpts: {
94
+ plugins: [["typescript", { disallowAmbiguousJSXLike: true }]],
95
+ },
96
+ },
97
+ },
98
+ },
99
+ linterOptions: {
100
+ reportUnusedDisableDirectives: "error",
101
+ },
102
+ rules,
103
+ },
104
+ ]);
105
+ }
106
+ /**
107
+ * Run the canonical lint policy, print stylish diagnostics, and return a status.
108
+ *
109
+ * @param options - Optional project root, lint paths, and additional ignores.
110
+ * @returns `0` for a clean result and `1` when ESLint reports findings.
111
+ */
112
+ export async function runLintGate(options = {}) {
113
+ const eslint = new ESLint({
114
+ cwd: options.cwd,
115
+ overrideConfigFile: true,
116
+ overrideConfig: fleetEslintConfig({ ignores: options.ignores }),
117
+ });
118
+ const results = await eslint.lintFiles([...(options.files ?? ["."])]);
119
+ const formatter = await eslint.loadFormatter("stylish");
120
+ const output = formatter.format(results);
121
+ if (output)
122
+ console.error(output);
123
+ return results.some(({ errorCount, warningCount }) => errorCount + warningCount > 0) ? 1 : 0;
124
+ }
125
+ //# sourceMappingURL=eslint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eslint.js","sourceRoot":"","sources":["../eslint.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}