@dereekb/dbx-components-mcp 13.42.0 → 14.0.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.
@@ -10,7 +10,7 @@ var __export = (target, all) => {
10
10
  // packages/dbx-components-mcp/package.json
11
11
  var package_default = {
12
12
  name: "@dereekb/dbx-components-mcp",
13
- version: "13.42.0",
13
+ version: "14.0.0",
14
14
  type: "module",
15
15
  bin: {
16
16
  "dbx-components-mcp": "dbx-components-mcp.js"
@@ -21,8 +21,8 @@ var package_default = {
21
21
  "ts-morph": "^21.0.0"
22
22
  },
23
23
  peerDependencies: {
24
- "@dereekb/dbx-cli": "13.42.0",
25
- "@dereekb/util": "13.42.0"
24
+ "@dereekb/dbx-cli": "14.0.0",
25
+ "@dereekb/util": "14.0.0"
26
26
  }
27
27
  };
28
28
 
@@ -2003,6 +2003,269 @@ var FIREBASE_MODELS = [
2003
2003
  collectionKind: "root",
2004
2004
  archetypes: ["root-entity"]
2005
2005
  },
2006
+ {
2007
+ name: "FormSpace",
2008
+ identityConst: "formSpaceIdentity",
2009
+ modelType: "formSpace",
2010
+ collectionPrefix: "fsp",
2011
+ sourcePackage: "@dereekb/firebase",
2012
+ sourceFile: "packages/firebase/src/lib/model/formspace/formspace.ts",
2013
+ fields: [
2014
+ {
2015
+ name: "t",
2016
+ longName: "formSpaceType",
2017
+ converter: "firestoreString<FormSpaceType>()",
2018
+ tsType: "FormSpaceType",
2019
+ optional: false,
2020
+ description: "The kind of form this space holds, resolving its upload restrictions, expiration policy, and the server-side handler its submission is dispatched to."
2021
+ },
2022
+ {
2023
+ name: "n",
2024
+ longName: "displayName",
2025
+ converter: "optionalFirestoreString()",
2026
+ tsType: "Maybe<string>",
2027
+ optional: true,
2028
+ description: "Display name of the space, for the owner's own list of in-progress forms."
2029
+ },
2030
+ {
2031
+ name: "s",
2032
+ longName: "state",
2033
+ converter: "firestoreEnum<FormSpaceState>({ default: FormSpaceState.DRAFT })",
2034
+ tsType: "FormSpaceState",
2035
+ optional: false,
2036
+ description: "Lifecycle state. Only DRAFT is editable.",
2037
+ enumRef: "FormSpaceState"
2038
+ },
2039
+ {
2040
+ name: "ps",
2041
+ longName: "processingState",
2042
+ converter: "firestoreEnum<FormSpaceProcessingState>({ default: FormSpaceProcessingState.INIT_OR_NONE })",
2043
+ tsType: "FormSpaceProcessingState",
2044
+ optional: false,
2045
+ description: "Processing state of the submission.",
2046
+ enumRef: "FormSpaceProcessingState"
2047
+ },
2048
+ {
2049
+ name: "d",
2050
+ longName: "data",
2051
+ converter: "optionalFirestorePassthroughJsonField<FormSpaceData>({ dontStoreIfEmpty: true })",
2052
+ tsType: "Maybe<T>",
2053
+ optional: true,
2054
+ description: "The form's own values, stored as pass-through JSON."
2055
+ },
2056
+ {
2057
+ name: "u",
2058
+ longName: "userId",
2059
+ converter: "firestoreUID()",
2060
+ tsType: "FirebaseAuthUserId",
2061
+ optional: false,
2062
+ description: "The user the space belongs to. Set at creation and never changed."
2063
+ },
2064
+ {
2065
+ name: "o",
2066
+ longName: "ownerKey",
2067
+ converter: "optionalFirestoreString()",
2068
+ tsType: "Maybe<FirebaseAuthOwnershipKey>",
2069
+ optional: true,
2070
+ description: "Ownership key, if applicable. Drives read access in the security rules."
2071
+ },
2072
+ {
2073
+ name: "m",
2074
+ longName: "targetModelKey",
2075
+ converter: "optionalFirestoreString()",
2076
+ tsType: "Maybe<FirestoreModelKey>",
2077
+ optional: true,
2078
+ description: "Key of the model this space was opened against, when it was opened against one."
2079
+ },
2080
+ {
2081
+ name: "uc",
2082
+ longName: "uploadCount",
2083
+ converter: "firestoreNumber({ default: 0 })",
2084
+ tsType: "number",
2085
+ optional: false,
2086
+ description: "Monotonic count of uploads this space has ACCEPTED over its whole lifetime."
2087
+ },
2088
+ {
2089
+ name: "fi",
2090
+ longName: "nextFileIndex",
2091
+ converter: "firestoreNumber({ default: 0 })",
2092
+ tsType: "number",
2093
+ optional: false,
2094
+ description: "The next index a file's permanent storage path is keyed by."
2095
+ },
2096
+ {
2097
+ name: "f",
2098
+ longName: "files",
2099
+ converter: "firestoreObjectArray({ objectField: formSpaceFileSubObject })",
2100
+ tsType: "FormSpaceFile[]",
2101
+ optional: false,
2102
+ description: "Every file the space currently holds, across every slot."
2103
+ },
2104
+ {
2105
+ name: "pn",
2106
+ longName: "processingNotificationKey",
2107
+ converter: "optionalFirestoreString()",
2108
+ tsType: "Maybe<NotificationKey>",
2109
+ optional: true,
2110
+ description: "The NotificationTask key processing this space's submission."
2111
+ },
2112
+ {
2113
+ name: "pat",
2114
+ longName: "processingAt",
2115
+ converter: "optionalFirestoreDate()",
2116
+ tsType: "Maybe<Date>",
2117
+ optional: true,
2118
+ description: "The date `ps` was last moved to PROCESSING. Used to detect a stuck task."
2119
+ },
2120
+ {
2121
+ name: "cat",
2122
+ longName: "createdAt",
2123
+ converter: "firestoreDate({ saveDefaultAsNow: true })",
2124
+ tsType: "Date",
2125
+ optional: false,
2126
+ description: "Created at date."
2127
+ },
2128
+ {
2129
+ name: "uat",
2130
+ longName: "updatedAt",
2131
+ converter: "firestoreDate({ saveDefaultAsNow: true })",
2132
+ tsType: "Date",
2133
+ optional: false,
2134
+ description: "Updated at date. Moves on every content change."
2135
+ },
2136
+ {
2137
+ name: "sat",
2138
+ longName: "submittedAt",
2139
+ converter: "optionalFirestoreDate()",
2140
+ tsType: "Maybe<Date>",
2141
+ optional: true,
2142
+ description: "The date the CURRENT submission was made, if the space is submitted. Its presence IS the lock."
2143
+ },
2144
+ {
2145
+ name: "fsat",
2146
+ longName: "firstSubmittedAt",
2147
+ converter: "optionalFirestoreDate()",
2148
+ tsType: "Maybe<Date>",
2149
+ optional: true,
2150
+ description: "The date the space was FIRST submitted, if it ever was."
2151
+ },
2152
+ {
2153
+ name: "cpat",
2154
+ longName: "completedAt",
2155
+ converter: "optionalFirestoreDate()",
2156
+ tsType: "Maybe<Date>",
2157
+ optional: true,
2158
+ description: "The date processing of the submission concluded, if it has."
2159
+ },
2160
+ {
2161
+ name: "eat",
2162
+ longName: "expiresAt",
2163
+ converter: "optionalFirestoreDate()",
2164
+ tsType: "Maybe<Date>",
2165
+ optional: true,
2166
+ description: "The date this space becomes eligible for the expiration sweep, if it expires at all."
2167
+ },
2168
+ {
2169
+ name: "lat",
2170
+ longName: "locksAt",
2171
+ converter: "optionalFirestoreDate()",
2172
+ tsType: "Maybe<Date>",
2173
+ optional: true,
2174
+ description: "The date reopening stops being possible \u2014 the instant the submission becomes FULLY LOCKED."
2175
+ },
2176
+ {
2177
+ name: "lby",
2178
+ longName: "lockedBy",
2179
+ converter: "optionalFirestoreUID()",
2180
+ tsType: "Maybe<FirebaseAuthUserId>",
2181
+ optional: true,
2182
+ description: "The user who locked the submission early, when a caller did rather than the deadline passing."
2183
+ },
2184
+ {
2185
+ name: "rc",
2186
+ longName: "reopenCount",
2187
+ converter: "firestoreNumber({ default: 0 })",
2188
+ tsType: "number",
2189
+ optional: false,
2190
+ description: "Monotonic count of times this space has been REOPENED after a submission."
2191
+ },
2192
+ {
2193
+ name: "rat",
2194
+ longName: "reopenedAt",
2195
+ converter: "optionalFirestoreDate()",
2196
+ tsType: "Maybe<Date>",
2197
+ optional: true,
2198
+ description: "The date the space was last reopened, if it ever was."
2199
+ },
2200
+ {
2201
+ name: "rby",
2202
+ longName: "reopenedBy",
2203
+ converter: "optionalFirestoreUID()",
2204
+ tsType: "Maybe<FirebaseAuthUserId>",
2205
+ optional: true,
2206
+ description: "The user who last reopened the space."
2207
+ }
2208
+ ],
2209
+ enums: [
2210
+ {
2211
+ name: "FormSpaceState",
2212
+ values: [
2213
+ {
2214
+ name: "DRAFT",
2215
+ value: 0
2216
+ },
2217
+ {
2218
+ name: "SUBMITTED",
2219
+ value: 1
2220
+ },
2221
+ {
2222
+ name: "EXPIRED",
2223
+ value: 2
2224
+ },
2225
+ {
2226
+ name: "ARCHIVED",
2227
+ value: 3
2228
+ }
2229
+ ],
2230
+ description: "Lifecycle state of a {@link FormSpace}."
2231
+ },
2232
+ {
2233
+ name: "FormSpaceProcessingState",
2234
+ values: [
2235
+ {
2236
+ name: "INIT_OR_NONE",
2237
+ value: 0
2238
+ },
2239
+ {
2240
+ name: "QUEUED_FOR_PROCESSING",
2241
+ value: 1
2242
+ },
2243
+ {
2244
+ name: "PROCESSING",
2245
+ value: 2
2246
+ },
2247
+ {
2248
+ name: "FAILED",
2249
+ value: 3
2250
+ },
2251
+ {
2252
+ name: "SUCCESS",
2253
+ value: 4
2254
+ },
2255
+ {
2256
+ name: "DO_NOT_PROCESS",
2257
+ value: 5
2258
+ }
2259
+ ],
2260
+ description: "Processing state of a submitted {@link FormSpace}."
2261
+ }
2262
+ ],
2263
+ detectionHints: ["t", "n", "ps", "m", "uc", "f", "pn", "pat", "uat", "sat", "fsat", "cpat", "eat", "lat", "lby", "rc", "rat", "rby"],
2264
+ description: "A type-registered container for a client-side form: its in-progress JSON, its uploads, and its submission state.",
2265
+ modelGroup: "FormSpace",
2266
+ collectionKind: "root",
2267
+ archetypes: ["root-entity", "state-machine-item"]
2268
+ },
2006
2269
  {
2007
2270
  name: "NotificationBox",
2008
2271
  identityConst: "notificationBoxIdentity",
@@ -3132,6 +3395,11 @@ var RESERVED_MODEL_FOLDERS = [
3132
3395
  reason: "StorageFile is a canonical group from `@dereekb/firebase` with a richer layout than the base 5 files (group, upload, file, etc.); downstream projects extend rather than redeclare it.",
3133
3396
  recommendedTool: "dbx_storagefile_m_validate_folder"
3134
3397
  },
3398
+ {
3399
+ name: "formspace",
3400
+ reason: "FormSpace is a canonical group from `@dereekb/firebase` with a richer layout than the base 5 files (type, upload, task, util, etc.); a downstream project only registers its own types and does not redeclare the model.",
3401
+ recommendedTool: "dbx_model_validate_folder"
3402
+ },
3135
3403
  {
3136
3404
  name: "calendar",
3137
3405
  reason: "Calendar is a canonical group from `@dereekb/firebase` with a richer layout than the base 5 files (type, expand, ics, processing, etc.); downstream projects extend rather than redeclare it.",
@@ -9901,6 +10169,7 @@ var PropertyAccumulator = class {
9901
10169
  constructor(context) {
9902
10170
  this.context = context;
9903
10171
  }
10172
+ context;
9904
10173
  entries = [];
9905
10174
  index = /* @__PURE__ */ new Map();
9906
10175
  add(entry) {
@@ -21290,7 +21559,6 @@ import { DbxActionConfirmConfig } from '@dereekb/dbx-web';
21290
21559
 
21291
21560
  @Component({
21292
21561
  selector: 'app-danger-zone',
21293
- standalone: true,
21294
21562
  imports: [DbxCardBoxComponent, DbxBarDirective, DbxButtonComponent, DbxActionDirective, DbxActionConfirmDirective],
21295
21563
  template: \`
21296
21564
  <dbx-card-box header="Danger zone" icon="warning">
@@ -21307,8 +21575,7 @@ import { DbxActionConfirmConfig } from '@dereekb/dbx-web';
21307
21575
  </dbx-button>
21308
21576
  </dbx-bar>
21309
21577
  </dbx-card-box>
21310
- \`,
21311
- changeDetection: ChangeDetectionStrategy.OnPush
21578
+ \`
21312
21579
  })
21313
21580
  export class DangerZoneComponent {
21314
21581
  readonly deleteAccountAction = /* DbxActionContextStoreSourceInstance<...> */ null;
@@ -21359,7 +21626,6 @@ interface Item {
21359
21626
 
21360
21627
  @Component({
21361
21628
  selector: 'app-items-page',
21362
- standalone: true,
21363
21629
  imports: [DbxSectionPageComponent, DbxListComponent, DbxListEmptyContentComponent, DbxPagebarComponent, DbxButtonComponent, DbxActionDirective],
21364
21630
  template: \`
21365
21631
  <dbx-section-page header="Items" icon="list" scroll="body">
@@ -21374,8 +21640,7 @@ interface Item {
21374
21640
  </dbx-list-empty-content>
21375
21641
  </dbx-list>
21376
21642
  </dbx-section-page>
21377
- \`,
21378
- changeDetection: ChangeDetectionStrategy.OnPush
21643
+ \`
21379
21644
  })
21380
21645
  export class ItemsPageComponent {
21381
21646
  readonly items$: Observable<ListLoadingState<Item>> = /* ... */ null!;
@@ -21421,7 +21686,6 @@ interface Item {
21421
21686
 
21422
21687
  @Component({
21423
21688
  selector: 'app-items-loaded',
21424
- standalone: true,
21425
21689
  imports: [CommonModule, DbxLoadingComponent, DbxListComponent, DbxListEmptyContentComponent, DbxIntroActionSectionComponent],
21426
21690
  template: \`
21427
21691
  <dbx-loading [state]="state$ | async" text="Loading items...">
@@ -21437,8 +21701,7 @@ interface Item {
21437
21701
  </dbx-list>
21438
21702
  </dbx-intro-action-section>
21439
21703
  </dbx-loading>
21440
- \`,
21441
- changeDetection: ChangeDetectionStrategy.OnPush
21704
+ \`
21442
21705
  })
21443
21706
  export class ItemsLoadedComponent {
21444
21707
  readonly state$: Observable<ListLoadingState<Item>> = /* ... */ null!;
@@ -21487,7 +21750,6 @@ import { MatInputModule } from '@angular/material/input';
21487
21750
 
21488
21751
  @Component({
21489
21752
  selector: 'app-account-settings',
21490
- standalone: true,
21491
21753
  imports: [DbxSectionComponent, DbxBarDirective, DbxButtonComponent, DbxButtonSpacerDirective, DbxActionDirective, ReactiveFormsModule, MatFormFieldModule, MatInputModule],
21492
21754
  template: \`
21493
21755
  <dbx-section header="Account" icon="person" hint="Update your profile">
@@ -21504,8 +21766,7 @@ import { MatInputModule } from '@angular/material/input';
21504
21766
  <dbx-button text="Cancel" stroked (btnClick)="cancel()"></dbx-button>
21505
21767
  </dbx-bar>
21506
21768
  </dbx-section>
21507
- \`,
21508
- changeDetection: ChangeDetectionStrategy.OnPush
21769
+ \`
21509
21770
  })
21510
21771
  export class AccountSettingsComponent {
21511
21772
  private readonly fb = inject(FormBuilder);
@@ -21542,7 +21803,6 @@ import { UIRouterModule } from '@uirouter/angular';
21542
21803
 
21543
21804
  @Component({
21544
21805
  selector: 'app-shell',
21545
- standalone: true,
21546
21806
  imports: [DbxSidenavPageComponent, DbxSidenavComponent, DbxContentPageDirective, UIRouterModule],
21547
21807
  template: \`
21548
21808
  <dbx-sidenav-page>
@@ -21551,8 +21811,7 @@ import { UIRouterModule } from '@uirouter/angular';
21551
21811
  <ui-view></ui-view>
21552
21812
  </div>
21553
21813
  </dbx-sidenav-page>
21554
- \`,
21555
- changeDetection: ChangeDetectionStrategy.OnPush
21814
+ \`
21556
21815
  })
21557
21816
  export class AppShellComponent {
21558
21817
  readonly navAnchors: ClickableAnchor[] = [
@@ -21603,7 +21862,6 @@ interface Member {
21603
21862
 
21604
21863
  @Component({
21605
21864
  selector: 'app-members-page',
21606
- standalone: true,
21607
21865
  imports: [CommonModule, MatButtonModule, MatIconModule, DbxSectionPageComponent, DbxTwoColumnComponent, DbxTwoColumnRightComponent, DbxListComponent],
21608
21866
  template: \`
21609
21867
  <dbx-section-page header="Members" icon="group" scroll="body">
@@ -21615,8 +21873,7 @@ interface Member {
21615
21873
  </dbx-two-column-right>
21616
21874
  </dbx-two-column>
21617
21875
  </dbx-section-page>
21618
- \`,
21619
- changeDetection: ChangeDetectionStrategy.OnPush
21876
+ \`
21620
21877
  })
21621
21878
  export class MembersPageComponent {
21622
21879
  readonly members$: Observable<ListLoadingState<Member>> = /* ... */ null!;
@@ -25145,6 +25402,96 @@ var RULE_CATALOG = [
25145
25402
  whenItApplies: "When a key on `<app>SystemStateStoredDataConverterMap` is neither a local `<NAME>_SYSTEM_STATE_TYPE` constant nor an imported identifier.",
25146
25403
  whenItDoesNotApply: "Keys imported from upstream packages \u2014 those are detected via `importedIdentifiers` and skipped.",
25147
25404
  canonicalFix: "Either declare the missing constant locally or import it from the upstream package that owns it."
25405
+ },
25406
+ {
25407
+ code: "WORKSPACE_DEPLOY_ENVIRONMENT_FILE_MISSING",
25408
+ source: "dbx_workspace_validate",
25409
+ severity: "error",
25410
+ title: "A configuration's file-replacement or esbuild-config path does not exist on disk",
25411
+ whatItFlags: "A configuration's file-replacement or esbuild-config path does not exist on disk.",
25412
+ whenItApplies: "When a `fileReplacements` `replace` / `with` path, or a configuration's `esbuildConfig` path, names a file that is absent from the working tree.",
25413
+ whenItDoesNotApply: "Generated files produced by an earlier target in the same pipeline \u2014 declare them as that target's `outputs` so the dependency is explicit, or the reference is genuinely broken.",
25414
+ canonicalFix: "Create the missing file or correct the path. An Angular build fails loudly on a missing replacement, but an esbuild `additionalProperties: true` schema accepts a bad path silently."
25415
+ },
25416
+ {
25417
+ code: "WORKSPACE_DEPLOY_ENVIRONMENT_FILE_UNREFERENCED",
25418
+ source: "dbx_workspace_validate",
25419
+ severity: "warning",
25420
+ title: "An `environment.<name>.ts` file exists but no build configuration references it",
25421
+ whatItFlags: "An `environment.<name>.ts` file exists but no build configuration references it.",
25422
+ whenItApplies: "When a file matching `environment.*.ts` sits in a project's `src/environments/` directory and appears in no configuration's `fileReplacements`, and no `esbuildConfig` file references it.",
25423
+ whenItDoesNotApply: "The base `environment.ts` (always the replacement source, never a target), and environment files imported directly by application code rather than swapped in by the build.",
25424
+ canonicalFix: "Add the configuration that consumes it, or delete the file. An unreachable environment file reads as a working deploy lane that does not exist \u2014 the file is edited, reviewed, and never compiled."
25425
+ },
25426
+ {
25427
+ code: "WORKSPACE_DEPLOY_HOSTING_TARGET_MISSING",
25428
+ source: "dbx_workspace_validate",
25429
+ severity: "error",
25430
+ title: "A deploy command targets a firebase hosting target that `firebase.json` does not declare",
25431
+ whatItFlags: "A deploy command targets a firebase hosting target that `firebase.json` does not declare.",
25432
+ whenItApplies: "When a deploy command runs `firebase deploy --only hosting:<target>` and `<target>` matches no `target` (or `site`) entry under `hosting` in `firebase.json`.",
25433
+ whenItDoesNotApply: "Workspaces that resolve hosting targets through `.firebaserc` target aliases the scanner does not read \u2014 verify manually if this misfires.",
25434
+ canonicalFix: "Add the hosting entry to `firebase.json`, or point the command at a declared target. `firebase deploy` fails on an unknown hosting target, so this breaks the lane outright."
25435
+ },
25436
+ {
25437
+ code: "WORKSPACE_DEPLOY_LANE_ASYMMETRIC",
25438
+ source: "dbx_workspace_validate",
25439
+ severity: "warning",
25440
+ title: "A deploy lane is wired on one side of the app/api pair but not the other",
25441
+ whatItFlags: "A deploy lane is wired on one side of the app/api pair but not the other.",
25442
+ whenItApplies: "When one project in the workspace declares `ci-deploy-<lane>` and a sibling project that declares at least one other `ci-deploy-*` lane does not declare this one.",
25443
+ whenItDoesNotApply: "Projects deliberately deployed on their own cadence, and workspaces with a single deployable project. Suppress by giving the sibling the lane, or accept the warning.",
25444
+ canonicalFix: "Add the missing `ci-deploy-<lane>` target to the sibling project. A lane present on the API but not the web app (or vice versa) deploys half an application and leaves the two halves on different builds."
25445
+ },
25446
+ {
25447
+ code: "WORKSPACE_DEPLOY_LANE_NO_ENVIRONMENT_SELECTION",
25448
+ source: "dbx_workspace_validate",
25449
+ severity: "error",
25450
+ title: "A deploy lane builds a configuration that selects no environment file",
25451
+ whatItFlags: "A deploy lane builds a configuration that selects no environment file.",
25452
+ whenItApplies: "When a `ci-deploy-<lane>` target builds a configuration that provides no environment-selection mechanism for its executor \u2014 no `fileReplacements` for an Angular `application` build, or no lane-specific `esbuildConfig` for an `@nx/esbuild:esbuild` build.",
25453
+ whenItDoesNotApply: "Non-deploy configurations such as `development`, which are expected to compile the base `environment.ts`. Only configurations reachable from a `ci-deploy-*` target are checked.",
25454
+ canonicalFix: "Add the `fileReplacements` entry (or the lane's `esbuildConfig`) to the configuration. Without it the lane deploys the unreplaced `environment.ts` \u2014 localhost URLs, dev credentials, and any developer-only function map \u2014 to a live project."
25455
+ },
25456
+ {
25457
+ code: "WORKSPACE_TARGET_OUTPUT_ESCAPES_ROOT",
25458
+ source: "dbx_workspace_validate",
25459
+ severity: "error",
25460
+ title: "A target's `outputs` entry resolves outside the workspace root",
25461
+ whatItFlags: "A target's `outputs` entry resolves outside the workspace root.",
25462
+ whenItApplies: 'When an `outputs` entry \u2014 after `{options.<name>}` substitution from the target\'s own options \u2014 resolves to a path above the workspace root. The common shape is `outputs: ["{options.reportsDirectory}"]` with a `../../`-relative option value.',
25463
+ whenItDoesNotApply: "Entries anchored by `{workspaceRoot}` or `{projectRoot}`, and entries whose `{options.<name>}` token has no resolvable value (skipped rather than guessed).",
25464
+ canonicalFix: 'Anchor the entry explicitly, e.g. `"{workspaceRoot}/coverage/{projectRoot}"`. Nx refuses to cache an output it cannot place inside the workspace and will report the task as flaky instead of failing loudly.'
25465
+ },
25466
+ {
25467
+ code: "WORKSPACE_TARGET_REF_CONFIGURATION_MISSING",
25468
+ source: "dbx_workspace_validate",
25469
+ severity: "error",
25470
+ title: "An `nx run <project>:<target>:<configuration>` reference names a configuration the target does not declare",
25471
+ whatItFlags: "An `nx run <project>:<target>:<configuration>` reference names a configuration the target does not declare.",
25472
+ whenItApplies: "Whenever a reference carries a configuration segment and the target's `configurations` map has no such key.",
25473
+ whenItDoesNotApply: "Targets that declare no `configurations` at all \u2014 Nx tolerates a configuration argument there, so it is not reported.",
25474
+ canonicalFix: "Rename the reference to a declared configuration (a `prod` / `production` mismatch is the usual cause), or add the configuration to the target. Nx does NOT error on an unknown configuration: `create-task-graph.js` silently substitutes `defaultConfiguration`, so a mismatch here ships whatever that default builds \u2014 and ships the base options with no configuration merged at all when no default is set."
25475
+ },
25476
+ {
25477
+ code: "WORKSPACE_TARGET_REF_PROJECT_MISSING",
25478
+ source: "dbx_workspace_validate",
25479
+ severity: "error",
25480
+ title: "An `nx run <project>:...` reference names a project that does not exist in the workspace",
25481
+ whatItFlags: "An `nx run <project>:...` reference names a project that does not exist in the workspace.",
25482
+ whenItApplies: "When a target reference in a `project.json` command, CI config, shell script, or npm script names a project with no matching entry in the workspace project graph.",
25483
+ whenItDoesNotApply: "References built from shell variables or CI interpolation the scanner cannot resolve \u2014 those are skipped rather than reported.",
25484
+ canonicalFix: "Create the project, or update the reference to the project's real name. A renamed or deleted project leaves these references behind and they only fail at deploy time."
25485
+ },
25486
+ {
25487
+ code: "WORKSPACE_TARGET_REF_TARGET_MISSING",
25488
+ source: "dbx_workspace_validate",
25489
+ severity: "error",
25490
+ title: "An `nx run <project>:<target>` reference names a target the project does not declare",
25491
+ whatItFlags: "An `nx run <project>:<target>` reference names a target the project does not declare.",
25492
+ whenItApplies: "When the referenced project exists but has no target by that name (after `nx.json` `targetDefaults` are accounted for).",
25493
+ whenItDoesNotApply: "Targets contributed by an inferred-target plugin the scanner does not evaluate \u2014 declare the plugin's targets explicitly if this misfires.",
25494
+ canonicalFix: "Add the target to the project, or point the reference at an existing one. This is the single most common way a CI lane silently stops doing anything."
25148
25495
  }
25149
25496
  ];
25150
25497
 
@@ -38525,11 +38872,12 @@ function matchKindForRadius(exact, raw) {
38525
38872
  if (exact.defaults.light === raw || exact.defaults.dark === raw) return "(exact-match design-system corner token).";
38526
38873
  return "(idiomatic full / pill radius \u2014 design system token).";
38527
38874
  }
38528
- function findExactRoleToken(registry, raw, role) {
38875
+ function findExactRoleToken(params) {
38876
+ const { registry, raw, role, isAllowed } = params;
38529
38877
  const candidates = registry.byRole.get(role) ?? [];
38530
38878
  let result;
38531
38879
  for (const entry of candidates) {
38532
- if (entry.defaults.light === raw || entry.defaults.dark === raw) {
38880
+ if ((entry.defaults.light === raw || entry.defaults.dark === raw) && (isAllowed === void 0 || isAllowed(entry))) {
38533
38881
  result = entry;
38534
38882
  break;
38535
38883
  }
@@ -38674,7 +39022,7 @@ var hardcodedRadius = (input) => {
38674
39022
  const colonIndex = input.scss.indexOf(":", match.index);
38675
39023
  if (colonIndex !== -1 && isInsideScssVarDeclaration(input.scss, colonIndex)) continue;
38676
39024
  const raw = match[1];
38677
- let exact = findExactRoleToken(input.tokenRegistry, raw, "radius");
39025
+ let exact = findExactRoleToken({ registry: input.tokenRegistry, raw, role: "radius" });
38678
39026
  if (exact === void 0 && FULL_RADIUS_SYNONYMS.has(raw)) {
38679
39027
  exact = input.tokenRegistry.findByCssVariable("--mat-sys-corner-full");
38680
39028
  }
@@ -38705,7 +39053,7 @@ var hardcodedShadow = (input) => {
38705
39053
  if (match.index === void 0) continue;
38706
39054
  const raw = match[1].trim();
38707
39055
  if (raw.startsWith("var(") || raw === "none") continue;
38708
- const exact = findExactRoleToken(input.tokenRegistry, raw, "elevation");
39056
+ const exact = findExactRoleToken({ registry: input.tokenRegistry, raw, role: "elevation" });
38709
39057
  const fix = exact === void 0 ? 'Hardcoded `box-shadow:` declarations should map to one of the `--mat-sys-level0..5` elevation tokens, or wrap the surface in `<dbx-content-box [elevate]="true">` so the shadow comes from the design system.' : `Replace this hardcoded shadow with \`box-shadow: var(${exact.cssVariable})\` or use \`<dbx-content-box [elevate]="true">\` to apply the elevation through the wrapper component.`;
38710
39058
  matches.push({
38711
39059
  id: "hardcoded-shadow",
@@ -38750,12 +39098,13 @@ var hardcodedHintColor = (input) => {
38750
39098
  return matches;
38751
39099
  };
38752
39100
  var HARDCODED_PADDING_RE = /(?:padding|margin)\s*(?:-(?:top|right|bottom|left))?\s*:\s*(\d+(?:\.\d+)?px)(?!\s*\))/gi;
39101
+ var DBX_PADDING_SCALE_RE = /^--dbx-padding-\d+$/;
38753
39102
  var hardcodedPadding = (input) => {
38754
39103
  const matches = [];
38755
39104
  for (const match of input.scss.matchAll(HARDCODED_PADDING_RE)) {
38756
39105
  if (match.index === void 0) continue;
38757
39106
  const raw = match[1];
38758
- const exact = findExactRoleToken(input.tokenRegistry, raw, "spacing");
39107
+ const exact = findExactRoleToken({ registry: input.tokenRegistry, raw, role: "spacing", isAllowed: (entry) => DBX_PADDING_SCALE_RE.test(entry.cssVariable) });
38759
39108
  if (exact !== void 0) {
38760
39109
  const utility = exact.utilityClasses?.[0];
38761
39110
  const fix = ["Replace `" + match[0].trim() + "` with `var(" + exact.cssVariable + ")`" + (utility === void 0 ? "" : ` (or use the \`${utility}\` utility class on the host element)`) + "."].join("\n");
@@ -44985,8 +45334,7 @@ import { type Work } from '@dereekb/rxjs';
44985
45334
  dbxActionForm
44986
45335
  [dbxFormSource]="settings$"></my-settings-form>
44987
45336
  </div>
44988
- \`,
44989
- standalone: true
45337
+ \`
44990
45338
  })
44991
45339
  export class SettingsAutosaveComponent {
44992
45340
  private readonly store = inject(SettingsDocumentStore);
@@ -45030,8 +45378,7 @@ import { type Work } from '@dereekb/rxjs';
45030
45378
  icon="delete"
45031
45379
  dbxActionButton></dbx-button>
45032
45380
  </ng-container>
45033
- \`,
45034
- standalone: true
45381
+ \`
45035
45382
  })
45036
45383
  export class DeleteAccountButtonComponent {
45037
45384
  private readonly accountStore = inject(AccountDocumentStore);
@@ -45095,8 +45442,7 @@ import { type Work } from '@dereekb/rxjs';
45095
45442
  <dbx-button text="Archive" dbxActionButton></dbx-button>
45096
45443
  </ng-container>
45097
45444
  </div>
45098
- \`,
45099
- standalone: true
45445
+ \`
45100
45446
  })
45101
45447
  export class ContentToolbarComponent {
45102
45448
  private readonly store = inject(ArticleDocumentStore);
@@ -45150,8 +45496,7 @@ import { type WorkUsingContext } from '@dereekb/rxjs';
45150
45496
  <dbx-button [raised]="true" text="Save" dbxActionButton></dbx-button>
45151
45497
  <dbx-error dbxActionError></dbx-error>
45152
45498
  </form>
45153
- \`,
45154
- standalone: true
45499
+ \`
45155
45500
  })
45156
45501
  export class EditProfilePageComponent {
45157
45502
  private readonly profileStore = inject(ProfileDocumentStore);
@@ -45221,8 +45566,7 @@ type ConsentDecision = { readonly outcome: 'approved'; readonly value: ConsentFo
45221
45566
  }
45222
45567
  </div>
45223
45568
  }
45224
- \`,
45225
- standalone: true
45569
+ \`
45226
45570
  })
45227
45571
  export class ConsentPageComponent {
45228
45572
  readonly defaults$ = this.store.defaults$;
@@ -45269,8 +45613,7 @@ import { DbxActionContextMachine } from '@dereekb/dbx-core';
45269
45613
  <div [dbxActionSource]="actionSource()">
45270
45614
  <child-component></child-component>
45271
45615
  </div>
45272
- \`,
45273
- standalone: true
45616
+ \`
45274
45617
  })
45275
45618
  export class ParentComponent {
45276
45619
  readonly machine = new DbxActionContextMachine<MyValue, MyResult>();
@@ -45290,8 +45633,7 @@ export class ParentComponent {
45290
45633
  <ng-container dbxAction dbxActionValue="hello">
45291
45634
  <dbx-button [raised]="true" text="Submit" dbxActionButton></dbx-button>
45292
45635
  </ng-container>
45293
- \`,
45294
- standalone: true
45636
+ \`
45295
45637
  })
45296
45638
  export class ChildComponent {}`
45297
45639
  },
@@ -45334,8 +45676,7 @@ import { type IsEqualFunction } from '@dereekb/rxjs';
45334
45676
  <my-tag-form #form></my-tag-form>
45335
45677
  <dbx-button text="Save" dbxActionButton></dbx-button>
45336
45678
  </div>
45337
- \`,
45338
- standalone: true
45679
+ \`
45339
45680
  })
45340
45681
  export class TagEditorComponent {
45341
45682
  private readonly store = inject(TagCollectionStore);
@@ -52664,7 +53005,7 @@ function relativeOrAbsolute(from, target) {
52664
53005
  const rel = relative20(from, target);
52665
53006
  if (rel.length === 0) return ".";
52666
53007
  if (rel.startsWith("..")) return target;
52667
- return rel.split("\\").join("/");
53008
+ return rel.replaceAll("\\", "/");
52668
53009
  }
52669
53010
 
52670
53011
  // packages/dbx-components-mcp/src/tools/mcp-config/init.ts
@@ -52793,19 +53134,19 @@ async function planRootConfig(input) {
52793
53134
  }
52794
53135
  function defaultOutFor(input) {
52795
53136
  const targetAbs = resolve66(input.snapshot.workspaceRoot, ".tmp/dbx-mcp", `${input.slug}.${clusterFilenameSegment(input.cluster)}.json`);
52796
- return relative21(dirname22(input.scanConfigPath), targetAbs).split("\\").join("/");
53137
+ return relative21(dirname22(input.scanConfigPath), targetAbs).replaceAll("\\", "/");
52797
53138
  }
52798
53139
  function resolveScanOut(scanConfigPath, out) {
52799
53140
  return resolve66(dirname22(scanConfigPath), out);
52800
53141
  }
52801
53142
  function relativeFromConfig(snapshot, absolute) {
52802
53143
  const configDir = snapshot.configPath === null ? snapshot.workspaceRoot : dirname22(snapshot.configPath);
52803
- return relative21(configDir, absolute).split("\\").join("/");
53144
+ return relative21(configDir, absolute).replaceAll("\\", "/");
52804
53145
  }
52805
53146
  function workspaceRel(workspaceRoot, absolute) {
52806
53147
  const rel = relative21(workspaceRoot, absolute);
52807
53148
  if (rel.length === 0) return ".";
52808
- return rel.split("\\").join("/");
53149
+ return rel.replaceAll("\\", "/");
52809
53150
  }
52810
53151
  function serializeJson(value) {
52811
53152
  return `${JSON.stringify(value, null, 2)}