etymd 0.15.0 → 0.16.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.
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { VERSION } from './chunk-DBWDMIYO.js';
2
+ import { VERSION } from './chunk-UYCGP5BS.js';
3
3
  import { PACK_VERSION } from './chunk-YQZDYDAK.js';
4
4
  import { normalizeRelPath, isDirectory, readJson, git, matchesAnyGlob, pathExists, readText } from './chunk-4VPBP6K6.js';
5
5
  import path from 'path';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { runAudit } from './chunk-2RNQ6OLV.js';
3
- import { parseFailOnTier, meetsFailOn } from './chunk-IWG77WV3.js';
2
+ import { runAudit } from './chunk-UV3YIBDW.js';
3
+ import { parseFailOnTier, meetsFailOn } from './chunk-Y4E6ERCM.js';
4
4
  import { print, section, theme, renderLensCoverage, renderFindings, renderLedgerDiff } from './chunk-HI7NWPRA.js';
5
5
 
6
6
  // src/commands/audit.ts
@@ -168,7 +168,7 @@ function generatePreCommitHook(selfBuild = false) {
168
168
 
169
169
  ${localHookCall("pre-commit")}
170
170
 
171
- # Content screen \u2014 staged file bytes. Refuses to commit environment, employer or identity
171
+ # Content screen \u2014 staged file bytes. Refuses to commit environment, guarded-side or identity
172
172
  # detail into a repo whose history is (or could become) public. The checker and its patterns
173
173
  # are machine-local by design, so this is a NO-OP wherever no checker is installed: safe to
174
174
  # commit anywhere, active only where you opted in.
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import { stateFreshnessLens, rankFindings, listInstructionFiles, buildTruthEnv, emptyCounters, packageManagerUsage, checkDocRefs, listStateDocuments, loadDecisionLedger, checkDecisionRefs, checkTextClaims } from './chunk-IWG77WV3.js';
2
+ import { stateFreshnessLens, rankFindings, listInstructionFiles, buildTruthEnv, emptyCounters, packageManagerUsage, checkDocRefs, listStateDocuments, loadDecisionLedger, checkDecisionRefs, checkTextClaims } from './chunk-Y4E6ERCM.js';
3
3
  import { readLedger, reconcileLedger, writeLedger, visibleFindings } from './chunk-3E2IPCRY.js';
4
4
  import { measureContext, contextFileLabel } from './chunk-HI7NWPRA.js';
5
- import { scanProject } from './chunk-Y6RZRED3.js';
5
+ import { scanProject } from './chunk-EJM47PIF.js';
6
6
  import { DEFAULT_CONFIG, ETYMD_DIR, writeCachedFacts, readBaseline, readConfig, deriveProfile, baselineCarriesMachinePath, BASELINE_FILE, CONFIG_FILE } from './chunk-P6ATKV2R.js';
7
7
  import { PACK_VERSION } from './chunk-YQZDYDAK.js';
8
8
  import { pathExists, readText, readJson, isCiEnvironment, isExecutable } from './chunk-4VPBP6K6.js';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  // package.json
3
3
  var package_default = {
4
- version: "0.15.0"};
4
+ version: "0.16.0"};
5
5
 
6
6
  // src/version.ts
7
7
  var VERSION = package_default.version;
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { expandFileGlobs } from './chunk-Y6RZRED3.js';
2
+ import { expandFileGlobs } from './chunk-EJM47PIF.js';
3
3
  import { DEFAULT_CONFIG, CONFIG_FILE } from './chunk-P6ATKV2R.js';
4
4
  import { readText, isDirectory, matchesAnyGlob, normalizeRelPath, readJson, pathExists, git } from './chunk-4VPBP6K6.js';
5
5
  import path3 from 'path';
@@ -448,6 +448,13 @@ var PLACEHOLDER_PREFIX_RE = /^(?:my|your)-/i;
448
448
  function isPlaceholderClaim(token) {
449
449
  return token.split("/").some((seg) => PLACEHOLDER_PREFIX_RE.test(seg) || PLACEHOLDER_SEGMENTS.has(seg.toLowerCase()));
450
450
  }
451
+ var NAMESPACE_IDENT = "[A-Za-z][A-Za-z0-9-]{0,15}";
452
+ var NAMESPACE_STOP = new Set(
453
+ "note notes see warning caution caveat caveats example examples ex eg ie nb ps re per file files path paths hint tip tips todo fixme step steps rule rules ref refs fact facts output outputs input inputs result results summary status overview next prev then thus hence plus goal goals spec specs context".split(" ")
454
+ );
455
+ function isNamespace(ident) {
456
+ return Boolean(ident) && !NAMESPACE_STOP.has(ident.toLowerCase());
457
+ }
451
458
  function claimContext(text, index) {
452
459
  const start = text.lastIndexOf("\n", index) + 1;
453
460
  const endRaw = text.indexOf("\n", index);
@@ -467,8 +474,9 @@ ${line}`;
467
474
  }
468
475
  return line;
469
476
  }
470
- function extractPathClaims(text) {
477
+ function extractPathClaims(text, opts = {}) {
471
478
  const prospectiveOnly = /* @__PURE__ */ new Map();
479
+ const namespacedOnly = /* @__PURE__ */ new Map();
472
480
  const placeholder = /* @__PURE__ */ new Set();
473
481
  for (const m of text.matchAll(/`([^`\n]+)`/g)) {
474
482
  const token = m[1].trim();
@@ -490,14 +498,21 @@ function extractPathClaims(text) {
490
498
  }
491
499
  const prospective2 = CREATION_CONTEXT_RE.test(claimContext(text, m.index ?? 0));
492
500
  prospectiveOnly.set(claim, (prospectiveOnly.get(claim) ?? true) && prospective2);
501
+ if (opts.namespaces) {
502
+ const nsLead = new RegExp(`(${NAMESPACE_IDENT}):[ \\t]*$`).exec(text.slice(0, m.index ?? 0));
503
+ const prefixed = isNamespace(nsLead?.[1]);
504
+ namespacedOnly.set(claim, (namespacedOnly.get(claim) ?? true) && prefixed);
505
+ }
493
506
  }
494
507
  const paths = [];
495
508
  const prospective = [];
509
+ const namespaced = [];
496
510
  for (const [claim, only] of prospectiveOnly) {
497
511
  if (only) prospective.push(claim);
512
+ else if (namespacedOnly.get(claim)) namespaced.push(claim);
498
513
  else paths.push(claim);
499
514
  }
500
- return { paths, prospective, placeholder: [...placeholder] };
515
+ return { paths, prospective, namespaced, placeholder: [...placeholder] };
501
516
  }
502
517
  var LOCAL_REF_LEADINS = new Set(
503
518
  "decision decisions entry entries ruling rulings record records ledger id ids item items see per in of on at by to as is was are were the a an and or but not with under over from via vs than after before since between through against latest newest earliest only also still now supersedes superseded superseding amends amended extends extended cites cited citing adds added adding wrote written writes locked locks closed closes opened opens resolves resolved reopened recorded number numbers".split(" ")
@@ -604,7 +619,9 @@ function emptyCounters() {
604
619
  prospectiveSkipped: 0,
605
620
  placeholderSkipped: 0,
606
621
  qualifiedRefsSkipped: 0,
607
- unresolvableRefs: 0
622
+ unresolvableRefs: 0,
623
+ namespacedSkipped: 0,
624
+ outsideRepoSkipped: 0
608
625
  };
609
626
  }
610
627
  async function checkTextClaims(env, file, opts, counters) {
@@ -642,9 +659,12 @@ async function checkTextClaims(env, file, opts, counters) {
642
659
  confidence: "high"
643
660
  });
644
661
  }
645
- const { paths, prospective, placeholder } = extractPathClaims(file.text);
662
+ const { paths, prospective, placeholder, namespaced } = extractPathClaims(file.text, {
663
+ namespaces: opts.treatNamespacedPrefixes
664
+ });
646
665
  counters.prospectiveSkipped += prospective.length;
647
666
  counters.placeholderSkipped += placeholder.length;
667
+ counters.namespacedSkipped += namespaced.length;
648
668
  const missing = [];
649
669
  for (const claim of paths) {
650
670
  if (await env.pathResolves(claim)) examined.push({ kind: "path", value: claim, exists: true });
@@ -654,6 +674,11 @@ async function checkTextClaims(env, file, opts, counters) {
654
674
  const gitignored = new Set((ignoredOut ?? "").split("\n").filter(Boolean));
655
675
  let pathFindings = 0;
656
676
  for (const claim of missing) {
677
+ if (opts.rootedFirstSegments && !opts.rootedFirstSegments.has(claim.split("/")[0] ?? claim)) {
678
+ counters.outsideRepoSkipped += 1;
679
+ examined.push({ kind: "path", value: claim, exists: null });
680
+ continue;
681
+ }
657
682
  if (gitignored.has(claim)) {
658
683
  counters.gitignoredSkipped += 1;
659
684
  examined.push({ kind: "path", value: claim, exists: null });
@@ -755,4 +780,4 @@ function checkDecisionRefs(file, ledger, opts, counters) {
755
780
  return { findings, examined };
756
781
  }
757
782
 
758
- export { KNOWN_EXTENSIONS, PATH_TOKEN_RE, buildTruthEnv, checkDecisionRefs, checkDocRefs, checkTextClaims, emptyCounters, listInstructionFiles, listStateDocuments, loadDecisionLedger, meetsFailOn, packageManagerUsage, parseFailOnTier, rankFindings, stateFreshnessLens };
783
+ export { KNOWN_EXTENSIONS, NAMESPACE_IDENT, NAMESPACE_STOP, PATH_TOKEN_RE, buildTruthEnv, checkDecisionRefs, checkDocRefs, checkTextClaims, emptyCounters, listInstructionFiles, listStateDocuments, loadDecisionLedger, meetsFailOn, packageManagerUsage, parseFailOnTier, rankFindings, stateFreshnessLens };
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { VERSION } from './chunk-DBWDMIYO.js';
2
+ import { VERSION } from './chunk-UYCGP5BS.js';
3
3
  import path from 'path';
4
4
  import { Command } from 'commander';
5
5
  import pc from 'picocolors';
@@ -31,7 +31,7 @@ program.command("audit").description("Verify every instruction claim against the
31
31
  "exit non-zero when findings at/above this tier exist (risk|gap|polish)"
32
32
  ).action(
33
33
  (opts, cmd) => action(async () => {
34
- const { run } = await import('./audit-YSALDC2L.js');
34
+ const { run } = await import('./audit-HBNXNGD6.js');
35
35
  await run({
36
36
  cwd: resolveCwd(cmd),
37
37
  json: opts.json,
@@ -44,7 +44,7 @@ program.command("audit").description("Verify every instruction claim against the
44
44
  );
45
45
  program.command("init").description("Onboard the truth guard: approve the baseline; scaffold AGENTS.md only if asked").option("-y, --yes", "accept defaults without prompting (never overwrites)").option("--with-agents", "also scaffold a minimal AGENTS.md where none exists (off by default)").action(
46
46
  (opts, cmd) => action(async () => {
47
- const { run } = await import('./init-H57H2JBE.js');
47
+ const { run } = await import('./init-Z5O2WVRJ.js');
48
48
  await run({ cwd: resolveCwd(cmd), yes: opts.yes, withAgents: opts.withAgents });
49
49
  })
50
50
  );
@@ -52,19 +52,19 @@ program.command("approve").description(
52
52
  "Re-approve the committed baseline after intentional structural changes (non-interactive)"
53
53
  ).action(
54
54
  (_opts, cmd) => action(async () => {
55
- const { run } = await import('./approve-MA4Z3TBT.js');
55
+ const { run } = await import('./approve-K5FFTPA4.js');
56
56
  await run({ cwd: resolveCwd(cmd) });
57
57
  })
58
58
  );
59
59
  program.command("scan").description("Deterministically reckon the project into a facts index").option("--json", "print the raw facts as JSON").option("--no-save", "do not write the .etymd cache").action(
60
60
  (opts, cmd) => action(async () => {
61
- const { run } = await import('./scan-XBOHDXAH.js');
61
+ const { run } = await import('./scan-H3NF5IV5.js');
62
62
  await run({ cwd: resolveCwd(cmd), json: opts.json, save: opts.save });
63
63
  })
64
64
  );
65
65
  program.command("doctor").description('Alias for `audit --truth` \u2014 "are the recorded instructions still true?"').option("--json", "print findings as JSON").action(
66
66
  (opts, cmd) => action(async () => {
67
- const { run } = await import('./doctor-Y3DWDEBT.js');
67
+ const { run } = await import('./doctor-X6XAGKV7.js');
68
68
  await run({ cwd: resolveCwd(cmd), json: opts.json });
69
69
  })
70
70
  );
@@ -76,7 +76,7 @@ program.command("context").description("Measure the always-loaded context footpr
76
76
  );
77
77
  program.command("brief").description("Emit a grounded briefing for the in-repo agent to complete the semantic layer").option("--human", "write a human onboarding brief instead of the agent briefing").action(
78
78
  (opts, cmd) => action(async () => {
79
- const { run } = await import('./brief-DPZYSAMC.js');
79
+ const { run } = await import('./brief-DOQ2DQEG.js');
80
80
  await run({ cwd: resolveCwd(cmd), human: opts.human });
81
81
  })
82
82
  );
@@ -90,7 +90,7 @@ program.command("premise").argument("[task]", "the task you are about to hand an
90
90
  "exit non-zero when findings at/above this tier exist (risk|gap|polish)"
91
91
  ).action(
92
92
  (task, opts, cmd) => action(async () => {
93
- const { run } = await import('./premise-VMC3UUIB.js');
93
+ const { run } = await import('./premise-4QRU7LRI.js');
94
94
  await run({
95
95
  cwd: resolveCwd(cmd),
96
96
  task,
@@ -124,15 +124,15 @@ var fleet = program.command("fleet").description(
124
124
  ).option(
125
125
  "--manifest <file>",
126
126
  "the fleet manifest (registry.json / legacy sources.json) \u2014 required unless the cwd holds registry.json"
127
- ).option("--only <names...>", "sweep only these registered names").option("--profile <profile>", "sweep only entries with this profile (personal|corp)").option("--truth", "truth lenses only per repo (the doctor subset)").option(
127
+ ).option("--only <names...>", "sweep only these registered names").option("--profile <profile>", "sweep only entries with this profile (personal|guarded)").option("--truth", "truth lenses only per repo (the doctor subset)").option(
128
128
  "--persist-ledgers",
129
- "persist per-repo ledgers \u2014 personal-profile entries that already carry .etymd only; corp worktrees are never written"
129
+ "persist per-repo ledgers \u2014 personal-profile entries that already carry .etymd only; guarded worktrees are never written"
130
130
  ).option("--json", "print the machine schema (EXPERIMENTAL through 0.2.x, local-only)").option(
131
131
  "--fail-on <tier>",
132
132
  "exit non-zero when findings at/above this tier exist (risk|gap|polish)"
133
133
  ).action(
134
134
  (opts, cmd) => action(async () => {
135
- const { sweep } = await import('./fleet-4FYZ3GBK.js');
135
+ const { sweep } = await import('./fleet-UEFLKIRI.js');
136
136
  await sweep({
137
137
  cwd: resolveCwd(cmd),
138
138
  manifest: opts.manifest,
@@ -147,17 +147,32 @@ var fleet = program.command("fleet").description(
147
147
  );
148
148
  fleet.command("check").description("Validate the manifest pair only \u2014 no lenses: dangling mappings, duplicates, leaks").option("--manifest <file>", "the fleet manifest \u2014 required unless the cwd holds registry.json").option("--json", "print the findings as JSON (EXPERIMENTAL through 0.2.x)").action(
149
149
  (_opts, cmd) => action(async () => {
150
- const { check } = await import('./fleet-4FYZ3GBK.js');
150
+ const { check } = await import('./fleet-UEFLKIRI.js');
151
151
  const opts = cmd.optsWithGlobals();
152
152
  await check({ cwd: resolveCwd(cmd), manifest: opts.manifest, json: opts.json });
153
153
  })
154
154
  );
155
- fleet.command("add").argument("<dir>", "directory of the project to register").description("Register a project \u2014 refuses to write an entry missing a mandatory field").option("--name <name>", "registered name (defaults to the directory's basename)").option("--kind <kind>", "entry kind (defaults to a value derived from the scan)").option("--profile <profile>", "personal | corp (default: personal)").option(
155
+ fleet.command("board").description(
156
+ "Render the fleet board: every project's milestones (contract key `milestones`) plus a ranked initiatives table"
157
+ ).option("--manifest <file>", "the fleet manifest \u2014 required unless the cwd holds registry.json").option("--initiatives <file>", "the hand-edited initiatives table (rank | id | initiative | \u2026)").option("--out <file>", "write the Markdown board here instead of printing it").option("--json", "print the board as JSON (EXPERIMENTAL)").action(
158
+ (opts, cmd) => action(async () => {
159
+ const { board } = await import('./fleet-UEFLKIRI.js');
160
+ const shared = cmd.optsWithGlobals();
161
+ await board({
162
+ cwd: resolveCwd(cmd),
163
+ manifest: shared.manifest,
164
+ initiatives: opts.initiatives,
165
+ out: opts.out,
166
+ json: opts.json ?? shared.json
167
+ });
168
+ })
169
+ );
170
+ fleet.command("add").argument("<dir>", "directory of the project to register").description("Register a project \u2014 refuses to write an entry missing a mandatory field").option("--name <name>", "registered name (defaults to the directory's basename)").option("--kind <kind>", "entry kind (defaults to a value derived from the scan)").option("--profile <profile>", "personal | guarded (default: personal)").option(
156
171
  "--trust <level>",
157
172
  "public-repo | public-bound | private \u2014 mandatory for personal entries"
158
173
  ).option("-y, --yes", "skip prompts; every mandatory value must be passed as a flag").option("--manifest <file>", "the fleet manifest \u2014 required unless the cwd holds registry.json").action(
159
174
  (dir, opts, cmd) => action(async () => {
160
- const { add } = await import('./fleet-4FYZ3GBK.js');
175
+ const { add } = await import('./fleet-UEFLKIRI.js');
161
176
  const shared = cmd.optsWithGlobals();
162
177
  await add({
163
178
  cwd: resolveCwd(cmd),
@@ -167,9 +182,9 @@ fleet.command("add").argument("<dir>", "directory of the project to register").d
167
182
  kind: opts.kind,
168
183
  // `fleet` declares its own --profile (the sweep filter), and commander hands a
169
184
  // parent-declared option the value even when it is typed AFTER the subcommand — so
170
- // `fleet add <dir> --profile corp` left opts.profile undefined and the flag silently
171
- // did nothing, registering employer repos as personal. Reading the merged view is what
172
- // makes the flag work; the corp-remote guard in add() is what makes forgetting it safe.
185
+ // `fleet add <dir> --profile guarded` left opts.profile undefined and the flag silently
186
+ // did nothing, registering guarded repos as personal. Reading the merged view is what
187
+ // makes the flag work; the guarded-remote guard in add() is what makes forgetting it safe.
173
188
  profile: opts.profile ?? shared.profile,
174
189
  trust: opts.trust,
175
190
  yes: opts.yes
@@ -177,10 +192,10 @@ fleet.command("add").argument("<dir>", "directory of the project to register").d
177
192
  })
178
193
  );
179
194
  fleet.command("dismiss").argument("<name>", "the registered project name").argument("<finding-id>", "the finding id (from `etymd fleet`) to dismiss").description(
180
- "Dismiss a project's finding from any cwd \u2014 corp ledgers persist beside the manifest"
195
+ "Dismiss a project's finding from any cwd \u2014 guarded ledgers persist beside the manifest"
181
196
  ).requiredOption("--reason <text>", "why it is dismissed \u2014 recorded so the decision survives").option("--manifest <file>", "the fleet manifest \u2014 required unless the cwd holds registry.json").action(
182
197
  (name, id, _opts, cmd) => action(async () => {
183
- const { dismiss } = await import('./fleet-4FYZ3GBK.js');
198
+ const { dismiss } = await import('./fleet-UEFLKIRI.js');
184
199
  const opts = cmd.optsWithGlobals();
185
200
  await dismiss({
186
201
  cwd: resolveCwd(cmd),
@@ -192,14 +207,34 @@ fleet.command("dismiss").argument("<name>", "the registered project name").argum
192
207
  })
193
208
  );
194
209
  fleet.command("accept").argument("<name>", "the registered project name").argument("<finding-id>", "the finding id (from `etymd fleet`) to accept").description(
195
- "Accept a project's finding as a known trade-off \u2014 corp ledgers persist beside the manifest"
210
+ "Accept a project's finding as a known trade-off \u2014 guarded ledgers persist beside the manifest"
196
211
  ).option("--reason <text>", "optional note on why the trade-off is accepted").option("--manifest <file>", "the fleet manifest \u2014 required unless the cwd holds registry.json").action(
197
212
  (name, id, _opts, cmd) => action(async () => {
198
- const { accept } = await import('./fleet-4FYZ3GBK.js');
213
+ const { accept } = await import('./fleet-UEFLKIRI.js');
199
214
  const opts = cmd.optsWithGlobals();
200
215
  await accept({ cwd: resolveCwd(cmd), manifest: opts.manifest, name, id, reason: opts.reason });
201
216
  })
202
217
  );
218
+ program.command("propose").description(
219
+ "Score improvement findings + recurring classes against a fleet rubric \u2014 proposal records, read-only (schema proposal/1, EXPERIMENTAL)"
220
+ ).requiredOption(
221
+ "--rubric <file>",
222
+ "the rubric file \u2014 one `criterion: <weight>` line per criterion; etymd ships none"
223
+ ).option(
224
+ "--manifest <file>",
225
+ "the fleet manifest \u2014 runs a read-only sweep now (no delta baseline move)"
226
+ ).option("--from <file>", "read a stored `etymd fleet --json` output instead of sweeping").option("--json", "print the proposal/1 records as JSON (EXPERIMENTAL)").action(
227
+ (opts, cmd) => action(async () => {
228
+ const { run } = await import('./propose-IKE4CUIM.js');
229
+ await run({
230
+ cwd: resolveCwd(cmd),
231
+ manifest: opts.manifest,
232
+ from: opts.from,
233
+ rubric: opts.rubric,
234
+ json: opts.json
235
+ });
236
+ })
237
+ );
203
238
  program.command("screen").description(
204
239
  "Content screen: check for text that must never be published. Bring your own patterns \u2014 etymd ships none."
205
240
  ).option("--staged", "screen what a commit is about to add (default)").option("--tree", "screen every tracked file \u2014 what is about to leave the machine").option("--message <file>", "screen a commit message (the commit-msg hook's $1)").option("--dir <dir>", "screen an unpacked build artifact \u2014 what actually ships").option("--patterns <file>", "pattern file (default: ~/.config/etymd/screen-patterns)").option("--advisory", "report without failing").option(
@@ -221,7 +256,7 @@ program.command("screen").description(
221
256
  );
222
257
  program.command("gates").description("Install the local git-hook gates (process \u2192 pre-commit, correctness \u2192 pre-push)").option("--ci", "note about the CI review gate (ships later; local gates install now)").option("-y, --yes", "skip prompts; never overwrites a hand-edited hook").action(
223
258
  (opts, cmd) => action(async () => {
224
- const { run } = await import('./gates-IBQ7HCAN.js');
259
+ const { run } = await import('./gates-NVWWKMT2.js');
225
260
  await run({ cwd: resolveCwd(cmd), ci: opts.ci, yes: opts.yes });
226
261
  })
227
262
  );
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import { run } from './chunk-CEO3BXQB.js';
3
- import './chunk-2RNQ6OLV.js';
4
- import './chunk-IWG77WV3.js';
2
+ import { run } from './chunk-FKDT4RBP.js';
3
+ import './chunk-UV3YIBDW.js';
4
+ import './chunk-Y4E6ERCM.js';
5
5
  import './chunk-3E2IPCRY.js';
6
6
  import './chunk-HI7NWPRA.js';
7
- import './chunk-Y6RZRED3.js';
8
- import './chunk-DBWDMIYO.js';
7
+ import './chunk-EJM47PIF.js';
8
+ import './chunk-UYCGP5BS.js';
9
9
  import './chunk-P6ATKV2R.js';
10
10
  import './chunk-YQZDYDAK.js';
11
11
  import './chunk-4VPBP6K6.js';