@bensandee/tooling 0.67.0 → 0.69.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bensandee/tooling",
3
- "version": "0.67.0",
3
+ "version": "0.69.0",
4
4
  "description": "CLI tool to bootstrap and maintain standardized TypeScript project tooling",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -9,9 +9,10 @@
9
9
  "directory": "packages/tooling-cli"
10
10
  },
11
11
  "bin": {
12
- "bst": "./dist/bin.mjs"
12
+ "bst": "./bin/bst.mjs"
13
13
  },
14
14
  "files": [
15
+ "bin",
15
16
  "dist",
16
17
  "tooling.schema.json"
17
18
  ],
@@ -20,10 +21,6 @@
20
21
  "#src/*.ts": "./src/*.ts"
21
22
  },
22
23
  "exports": {
23
- ".": {
24
- "types": "./dist/index.d.mts",
25
- "default": "./dist/index.mjs"
26
- },
27
24
  "./bin": "./dist/bin.mjs",
28
25
  "./package.json": "./package.json",
29
26
  "./tooling.schema.json": "./tooling.schema.json"
@@ -33,26 +30,27 @@
33
30
  },
34
31
  "dependencies": {
35
32
  "@bensandee/common": "0.1.4",
36
- "@clack/prompts": "^1.5.1",
33
+ "@clack/prompts": "^1.7.0",
37
34
  "citty": "^0.2.2",
38
- "dependency-cruiser": "^17.4.3",
35
+ "dependency-cruiser": "^18.1.1",
39
36
  "json5": "^2.2.3",
40
37
  "jsonc-parser": "^3.3.1",
41
- "picomatch": "^4.0.4",
38
+ "picomatch": "^4.0.5",
42
39
  "yaml": "^2.9.0",
43
40
  "zod": "^4.4.3"
44
41
  },
45
42
  "devDependencies": {
46
- "@bensandee/config": "0.13.1",
47
- "@changesets/cli": "2.31.0",
48
- "@release-it/bumper": "7.0.6",
49
- "@types/node": "24.13.2",
43
+ "@bensandee/config": "0.14.0",
44
+ "@changesets/cli": "2.31.1",
45
+ "@release-it/bumper": "8.0.0",
46
+ "@types/node": "24.13.3",
50
47
  "@types/picomatch": "4.0.3",
51
- "commit-and-tag-version": "12.7.3",
52
- "prettier": "3.8.4",
53
- "release-it": "20.2.0",
54
- "tsdown": "0.22.3",
55
- "@bensandee/claude-hooks": "0.10.1"
48
+ "commit-and-tag-version": "13.1.2",
49
+ "prettier": "3.9.6",
50
+ "release-it": "21.0.1",
51
+ "tsdown": "0.22.14",
52
+ "@bensandee/claude-hooks": "0.11.0",
53
+ "@bensandee/forgejo": "0.1.0"
56
54
  },
57
55
  "scripts": {
58
56
  "build": "tsdown",
@@ -58,7 +58,7 @@
58
58
  "type": "boolean"
59
59
  },
60
60
  "docker": {
61
- "description": "Docker package overrides (package name → partial config; any field may be omitted to fall back to convention)",
61
+ "description": "Docker image overrides, keyed by a package directory or a discovered image name (any field may be omitted to fall back to convention or discovery)",
62
62
  "type": "object",
63
63
  "propertyNames": {
64
64
  "type": "string"
@@ -85,9 +85,17 @@
85
85
  }
86
86
  },
87
87
  "imageName": {
88
- "description": "Image name used for docker:build tags, docker:publish refs, and docker:check cross-referencing. Falls back to the derived name: the package.json name for the root package (npm scope stripped), or {root-name}-{package-name} for a monorepo package.",
88
+ "description": "Image name used for docker:build tags, docker:publish refs, and docker:check cross-referencing. Falls back to the derived name: the package.json name for the root package (npm scope stripped), or {root-name}-{package-name} for a monorepo package. A value that already carries a registry host (e.g. 'ghcr.io/me/app') is used as written by docker:publish, with no registryNamespace prefix added, and must name the registry this run logs in to -- one naming any other host refuses before login.",
89
89
  "type": "string",
90
90
  "minLength": 1
91
+ },
92
+ "version": {
93
+ "description": "Version used for docker:publish tags; overrides the version resolved from the enclosing package.",
94
+ "type": "string"
95
+ },
96
+ "publish": {
97
+ "description": "Exclude this image from docker:publish while publishDocker stays true (default true).",
98
+ "type": "boolean"
91
99
  }
92
100
  },
93
101
  "additionalProperties": false
@@ -258,6 +266,20 @@
258
266
  "gateOnPullRequests": {
259
267
  "description": "Run coverage on PR builds too (default: false; deferred follow-up)",
260
268
  "type": "boolean"
269
+ },
270
+ "include": {
271
+ "description": "Glob patterns replacing the default coverage source scope (['src/**']) in the generated vitest.config.ts.",
272
+ "type": "array",
273
+ "items": {
274
+ "type": "string"
275
+ }
276
+ },
277
+ "exclude": {
278
+ "description": "Glob patterns appended to the universal coverage.exclude defaults in the generated vitest.config.ts, for project-specific untestable files (entrypoints, dev-only shims, icon barrels).",
279
+ "type": "array",
280
+ "items": {
281
+ "type": "string"
282
+ }
261
283
  }
262
284
  },
263
285
  "additionalProperties": false
@@ -278,6 +300,7 @@
278
300
  }
279
301
  },
280
302
  "exclude": {
303
+ "description": "Picomatch globs, matched against a repo-relative path and each of its ancestor directories (so a bare directory pattern like \"packages/legacy\" works). A matching path leaves the measured codebase entirely, for every gated metric and the linesOfCode observation alike: an excluded file is not counted, and its module and edges leave the dependency graph before any count is derived. Unlike exempt, an excluded module's contribution to other modules' fan-in/fan-out is also gone, not just its own listing. The list is additive -- each entry only ever excludes more -- and negation is not supported: a leading \"!\" is not an exception carved out of an earlier entry, and matches every path the negated pattern does not name.",
281
304
  "type": "array",
282
305
  "items": {
283
306
  "type": "string"
@@ -295,15 +318,27 @@
295
318
  "maximum": 9007199254740991
296
319
  },
297
320
  "fanInLimit": {
321
+ "description": "A module is a fan-in outlier above this many importers, and only when it also exceeds `moduleSizeLimit` source lines (defaults 10 and 200) -- popularity alone is not coupling. Only value edges are counted: a type-only import is erased before the graph is built and never moves this count, and a third-party import resolves outside the graph entirely. A cross-package import counts unless `crossPackage` is off (default on) -- see that setting. Never duplicate a type or fork a helper to stay under the limit -- prefer a justified `exempt` entry, which names the hub, over raising the limit, which hides it.",
298
322
  "type": "integer",
299
323
  "minimum": 0,
300
324
  "maximum": 9007199254740991
301
325
  },
302
326
  "fanOutLimit": {
327
+ "description": "A module is a fan-out outlier above this many first-party dependencies (default 10). Counted on the same value-edge basis as fanInLimit, `crossPackage` included, with the same consequence: an import you were about to inline or copy to protect this budget most likely costs nothing.",
328
+ "type": "integer",
329
+ "minimum": 0,
330
+ "maximum": 9007199254740991
331
+ },
332
+ "moduleSizeLimit": {
333
+ "description": "Source lines a module must exceed before its importer count can make it a fan-in outlier (default 200). A module with many importers and little surface is a leaf, not a junction: it has one job and no reason to change for any of its callers, so counting its importers reports popularity rather than coupling. Applies to fan-in only -- a small module with many dependencies is a barrel, which is a finding.",
303
334
  "type": "integer",
304
335
  "minimum": 0,
305
336
  "maximum": 9007199254740991
306
337
  },
338
+ "crossPackage": {
339
+ "description": "Count dependency edges that cross a workspace package boundary (default true). On by default because the alternative measures the wrong thing: with it off, moving a module into its own package removes its importers from every metric, so extracting a package hides a hub rather than fixing it. A monorepo adopting the default sees fan-in and fan-out rise once, and clears it with a one-time `health:check --update-baseline --reset`; a single-package repo has no workspace siblings to resolve, so no new edge enters its graph. Set it to false only where the package boundary is a curated API surface an edge across genuinely costs less, or to hold a baseline on the old measurement basis.",
340
+ "type": "boolean"
341
+ },
307
342
  "history": {
308
343
  "type": "string",
309
344
  "enum": ["orphan-branch", "none"]
@@ -315,12 +350,62 @@
315
350
  "type": "integer",
316
351
  "minimum": 0,
317
352
  "maximum": 9007199254740991
353
+ },
354
+ "exempt": {
355
+ "description": "Per-metric, per-module reporting suppression, keyed first by metric name (fanInOutliers or fanOutOutliers) then by the repo-relative module path exactly as `health:summary --explain` prints it. Each module maps to a required, non-empty justification string. An exempt module stays fully in the graph -- its edges still count toward every other module's fan-in/fan-out -- and only stops being listed as an outlier for that one metric.",
356
+ "type": "object",
357
+ "propertyNames": {
358
+ "type": "string",
359
+ "enum": ["fanInOutliers", "fanOutOutliers"]
360
+ },
361
+ "additionalProperties": {
362
+ "type": "object",
363
+ "propertyNames": {
364
+ "type": "string"
365
+ },
366
+ "additionalProperties": {
367
+ "type": "string",
368
+ "minLength": 1
369
+ }
370
+ }
371
+ }
372
+ },
373
+ "additionalProperties": false
374
+ },
375
+ "ascii": {
376
+ "description": "ASCII-only gate (bst ascii:check) configuration. Opt-in: set enabled true to scan tracked text files for curated non-ASCII offenders (curly quotes, ellipsis, dashes, box-drawing) and report a suggested ASCII replacement for each hit.",
377
+ "type": "object",
378
+ "properties": {
379
+ "enabled": {
380
+ "description": "Opt into the ascii:check gate (default false)",
381
+ "type": "boolean"
382
+ },
383
+ "exclude": {
384
+ "description": "Additional path globs to skip during scanning. Added to the built-in defaults (docs/**/retired/**, **/CHANGELOG.md, and the two generated .claude/hooks/bst-hook files), not a replacement for them.",
385
+ "type": "array",
386
+ "items": {
387
+ "type": "string"
388
+ }
389
+ },
390
+ "deny": {
391
+ "description": "Named offender categories to add to the default deny-list (e.g. \"math\")",
392
+ "type": "array",
393
+ "items": {
394
+ "type": "string"
395
+ }
396
+ },
397
+ "allow": {
398
+ "description": "Codepoints (as U+XXXX) to drop from the effective deny-list",
399
+ "type": "array",
400
+ "items": {
401
+ "type": "string"
402
+ }
318
403
  }
319
404
  },
320
405
  "additionalProperties": false
321
406
  },
322
407
  "docs": {
323
- "description": "Plan/spec lifecycle gate (`bst docs:check`). Overrides only — dirs are discovered by convention. Set to false to disable. Violations are advisory until a pair is named in `enforced`.",
408
+ "description": "Plan/spec lifecycle gate (`bst docs:check`). Overrides only -- dirs are discovered by convention. Set to false to disable. Violations are advisory until a pair is named in `enforced`.",
324
409
  "anyOf": [
325
410
  {
326
411
  "type": "boolean",
@@ -344,7 +429,7 @@
344
429
  ]
345
430
  },
346
431
  "dirs": {
347
- "description": "Extra active doc dirs beyond convention (e.g. [\"docs/rfcs\"]). Each retires into its own completed/ subdir.",
432
+ "description": "Extra active doc dirs beyond convention (e.g. [\"docs/rfcs\"]). Each retires into its own retired/ subdir.",
348
433
  "type": "array",
349
434
  "items": {
350
435
  "type": "string"
@@ -374,7 +459,7 @@
374
459
  "description": "Target repository (owner/repo) whose workflow the release dispatches to trigger a deploy"
375
460
  },
376
461
  "stack": {
377
- "description": "Deploy stack name passed as the `stack` input (default: package name, '-' → '_')",
462
+ "description": "Deploy stack name passed as the `stack` input (default: package name, '-' -> '_')",
378
463
  "type": "string"
379
464
  },
380
465
  "workflow": {
@@ -435,6 +520,93 @@
435
520
  }
436
521
  },
437
522
  "additionalProperties": false
523
+ },
524
+ "agent": {
525
+ "description": "agent:daemon behaviour overrides. Opt-in: see agent.autonomy for the interior-autonomy gate.",
526
+ "type": "object",
527
+ "properties": {
528
+ "autonomy": {
529
+ "description": "Opt into interior autonomy (default false). When a phase's latest rationale reports readiness \"ready\" with an empty openQuestions[] and the review phase is clean, the daemon applies the existing plan -> implement -> review -> park-at-mergeable advance itself instead of parking for a human. Never applies to the design/spec gate or the final merge from the mergeable terminal -- those always wait on a human.",
530
+ "type": "boolean"
531
+ },
532
+ "preRunRebase": {
533
+ "description": "Attempt a clean-only rebase of the work branch onto the default branch before the implement (execute) phase's container starts (default true). A clean rebase runs the container on the rebased branch; a conflicting one is aborted, reported on the run's ledger comment, and the run still proceeds on the un-rebased branch for a later agent/repair cycle to resolve -- it never fails the run. Set false to skip the attempt entirely for this repo: no fetch, no rebase, no abort, and the branch is worked exactly as cloned.",
534
+ "type": "boolean"
535
+ },
536
+ "priority": {
537
+ "description": "Map this repo's own issue-label names onto the daemon's four priority levels, e.g. {\"P1\": \"critical\", \"P4\": \"low\"}. The map UNIONS with the built-in priority/<level> names rather than replacing them, and the daemon does not create aliased labels -- the repo owns names the daemon did not choose. Priority affects claim order only: it never changes a run's model, effort, or any budget.",
538
+ "type": "object",
539
+ "propertyNames": {
540
+ "type": "string"
541
+ },
542
+ "additionalProperties": {
543
+ "type": "string",
544
+ "enum": ["critical", "high", "normal", "low"]
545
+ }
546
+ }
547
+ },
548
+ "additionalProperties": false
549
+ },
550
+ "branchPrune": {
551
+ "description": "bst branch:prune overrides: mergedDays/backupDays windows, and extra never-touch exclusions layered on top of the hard-coded list.",
552
+ "type": "object",
553
+ "properties": {
554
+ "mergedDays": {
555
+ "description": "Days after a work branch's PR merged before bst branch:prune deletes it (default 7). Zero is valid on purpose (an explicit 'delete everything merged already'), matching the --merged-days CLI flag's contract.",
556
+ "type": "integer",
557
+ "minimum": 0,
558
+ "maximum": 9007199254740991
559
+ },
560
+ "backupDays": {
561
+ "description": "Days before bst branch:prune deletes an agent/(repair|rebase)-backup/* ref whose parent branch has no merged PR to key on (default 30). Deliberately longer than mergedDays: a backup ref is the only surviving copy of history rebased away from its parent. Zero is valid on purpose, matching the --backup-days CLI flag's contract.",
562
+ "type": "integer",
563
+ "minimum": 0,
564
+ "maximum": 9007199254740991
565
+ },
566
+ "exclude": {
567
+ "description": "Branch-name globs added to bst branch:prune's built-in never-touch list (main, changeset-release/*, renovate/*, bst/coverage-metrics, bst/health-metrics, anything with an open PR or protected). Additive only -- there is no key that removes a built-in entry.",
568
+ "type": "array",
569
+ "items": {
570
+ "type": "string"
571
+ }
572
+ }
573
+ },
574
+ "additionalProperties": false
575
+ },
576
+ "labelSets": {
577
+ "description": "User-defined label sets for `bst forgejo:labels sync --set <name>`, keyed by set name. Read from the repo the command runs in, never from a --repo/--fleet target. A name that collides with a built-in set (e.g. the agent package's own 'agent' set) is a resolution-time error, not a silent override.",
578
+ "type": "object",
579
+ "propertyNames": {
580
+ "type": "string"
581
+ },
582
+ "additionalProperties": {
583
+ "type": "array",
584
+ "items": {
585
+ "type": "object",
586
+ "properties": {
587
+ "name": {
588
+ "type": "string",
589
+ "minLength": 1,
590
+ "description": "The label's full name, e.g. 'area/frontend'"
591
+ },
592
+ "color": {
593
+ "type": "string",
594
+ "pattern": "^#[0-9a-fA-F]{6}$",
595
+ "description": "Hex color with a leading '#', e.g. '#1f6feb'"
596
+ },
597
+ "description": {
598
+ "type": "string",
599
+ "description": "Shown in the forge UI beside the label"
600
+ },
601
+ "exclusive": {
602
+ "description": "Forgejo scoped-label exclusivity: at most one label of this set's scope per issue/PR (default false)",
603
+ "type": "boolean"
604
+ }
605
+ },
606
+ "required": ["name", "color", "description"],
607
+ "additionalProperties": false
608
+ }
609
+ }
438
610
  }
439
611
  },
440
612
  "additionalProperties": false
package/dist/bin.d.mts DELETED
@@ -1 +0,0 @@
1
- export { };
package/dist/index.d.mts DELETED
@@ -1,146 +0,0 @@
1
- import { z } from "zod";
2
-
3
- //#region src/utils/json.d.ts
4
- declare const PackageJsonSchema: z.ZodObject<{
5
- name: z.ZodOptional<z.ZodString>;
6
- version: z.ZodOptional<z.ZodString>;
7
- private: z.ZodOptional<z.ZodBoolean>;
8
- type: z.ZodOptional<z.ZodString>;
9
- scripts: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
10
- dependencies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
11
- devDependencies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
12
- peerDependencies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
13
- bin: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>>;
14
- exports: z.ZodOptional<z.ZodUnknown>;
15
- main: z.ZodOptional<z.ZodString>;
16
- types: z.ZodOptional<z.ZodString>;
17
- typings: z.ZodOptional<z.ZodString>;
18
- engines: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
19
- devEngines: z.ZodOptional<z.ZodObject<{
20
- runtime: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
21
- name: z.ZodString;
22
- version: z.ZodOptional<z.ZodString>;
23
- onFail: z.ZodOptional<z.ZodString>;
24
- }, z.core.$loose>, z.ZodArray<z.ZodObject<{
25
- name: z.ZodString;
26
- version: z.ZodOptional<z.ZodString>;
27
- onFail: z.ZodOptional<z.ZodString>;
28
- }, z.core.$loose>>]>>;
29
- }, z.core.$loose>>;
30
- repository: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
31
- url: z.ZodString;
32
- }, z.core.$loose>]>>;
33
- packageManager: z.ZodOptional<z.ZodString>;
34
- }, z.core.$loose>;
35
- type PackageJson = z.infer<typeof PackageJsonSchema>;
36
- //#endregion
37
- //#region src/types.d.ts
38
- type CiPlatform = "github" | "forgejo" | "none";
39
- type ReleaseStrategy = "release-it" | "simple" | "changesets" | "none";
40
- type Formatter = "oxfmt" | "prettier";
41
- /** Whether the repo has TS/JS source at all. Never inferred from absence. */
42
- type Stack = "typescript" | "javascript" | "none";
43
- /** What compiles the project, if anything. */
44
- type Builder = "tsdown" | "vite" | "custom" | "none";
45
- /** User's answers from the interactive prompt or CLI flags. */
46
- interface ProjectConfig {
47
- /** Project name (from package.json name or user input) */
48
- name: string;
49
- /** Project structure */
50
- structure: "single" | "monorepo";
51
- /** Include @bensandee/eslint-plugin oxlint plugin */
52
- useEslintPlugin: boolean;
53
- /** Formatter choice */
54
- formatter: Formatter;
55
- /** Whether the repo has TS/JS source at all */
56
- stack: Stack;
57
- /** What compiles the project */
58
- builder: Builder;
59
- /** Set up vitest with a starter test */
60
- setupVitest: boolean;
61
- /** CI platform choice */
62
- ci: CiPlatform;
63
- /** Set up Renovate for automated dependency updates */
64
- setupRenovate: boolean;
65
- /** Release management strategy */
66
- releaseStrategy: ReleaseStrategy;
67
- /** Opt-in: publish packages to npm registry */
68
- publishNpm: boolean;
69
- /** Opt-in: publish Docker images to a registry */
70
- publishDocker: boolean;
71
- /** Project type determines tsconfig base configuration */
72
- projectType: "default" | "node" | "react" | "library";
73
- /** Auto-detect and configure tsconfig bases for monorepo packages */
74
- detectPackageTypes: boolean;
75
- /** Target directory (default: cwd) */
76
- targetDir: string;
77
- }
78
- /** Result from a single generator: what file was written and how. */
79
- interface GeneratorResult {
80
- filePath: string;
81
- action: "created" | "updated" | "skipped" | "archived" | "removed";
82
- /** Human-readable description of what changed */
83
- description: string;
84
- }
85
- /** Context passed to each generator function. */
86
- interface GeneratorContext {
87
- config: ProjectConfig;
88
- /** Absolute path to target directory */
89
- targetDir: string;
90
- /** Pre-parsed package.json from the target directory, or undefined if missing/invalid */
91
- packageJson: PackageJson | undefined;
92
- /** Check whether a file exists in the target directory */
93
- exists: (relativePath: string) => boolean;
94
- /** Read an existing file from the target directory, returns undefined if not found */
95
- read: (relativePath: string) => string | undefined;
96
- /** Write a file to the target directory (creating directories as needed) */
97
- write: (relativePath: string, content: string) => void;
98
- /** Remove a file from the target directory (no-op if not found) */
99
- remove: (relativePath: string) => void;
100
- /**
101
- * Rewrite generated content the way the target repo's own formatter would — so a
102
- * generated file is a fixed point of `pnpm format` and can't drift against
103
- * `repo:sync --check`. Returns the content unchanged when the formatter isn't
104
- * installed yet. See `utils/format.ts`.
105
- */
106
- format: (relativePath: string, content: string) => string;
107
- /** Prompt user for conflict resolution on non-mergeable files */
108
- confirmOverwrite: (relativePath: string) => Promise<"overwrite" | "skip">;
109
- }
110
- /** Generator function signature. */
111
- type Generator = (ctx: GeneratorContext) => Promise<GeneratorResult>;
112
- /** State detected from an existing project directory. */
113
- interface DetectedProjectState {
114
- hasPackageJson: boolean;
115
- hasTsconfig: boolean;
116
- hasOxlintConfig: boolean;
117
- /** Existing oxlint.config.ts already imports @bensandee/config/oxlint/recommended */
118
- oxlintExtendsRecommended: boolean;
119
- /** Legacy .oxlintrc.json found (should be migrated to oxlint.config.ts) */
120
- hasLegacyOxlintJson: boolean;
121
- hasGitignore: boolean;
122
- hasVitestConfig: boolean;
123
- hasTsdownConfig: boolean;
124
- hasPnpmWorkspace: boolean;
125
- hasKnipConfig: boolean;
126
- hasRenovateConfig: boolean;
127
- hasReleaseItConfig: boolean;
128
- hasSimpleReleaseConfig: boolean;
129
- hasChangesetsConfig: boolean;
130
- /** Whether package.json has a repository field (needed for release workflows) */
131
- hasRepositoryField: boolean;
132
- /** Whether commit-and-tag-version is in root devDependencies (required for simple release strategy) */
133
- hasCommitAndTagVersion: boolean;
134
- /** Git remote origin URL (for inferring repository field) */
135
- gitRemoteUrl: string | null;
136
- /** Legacy tooling configs found */
137
- legacyConfigs: LegacyConfig[];
138
- }
139
- declare const LEGACY_TOOLS: readonly ["eslint", "prettier", "jest", "webpack", "rollup"];
140
- type LegacyTool = (typeof LEGACY_TOOLS)[number];
141
- interface LegacyConfig {
142
- tool: LegacyTool;
143
- files: string[];
144
- }
145
- //#endregion
146
- export type { DetectedProjectState, Generator, GeneratorContext, GeneratorResult, LegacyConfig, ProjectConfig };
package/dist/index.mjs DELETED
@@ -1 +0,0 @@
1
- export {};