youiyoux 0.1.18 → 0.1.20

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/README.md CHANGED
@@ -16,6 +16,8 @@ No config, no account. You get:
16
16
  - `youiyoux-card.png`: a 1200×630 card with the headline numbers.
17
17
  - `youiyoux-summary.md`: paste it into a PR or issue.
18
18
 
19
+ New to it? [Getting started](https://github.com/ap9000/youiyoux/blob/main/docs/getting-started.md): the report, the top fix, your agent and CI, in five steps.
20
+
19
21
  ## For your agent
20
22
 
21
23
  ```sh
@@ -1224,13 +1224,16 @@ var Theme = class {
1224
1224
  /** Project declarations only: excludes implicit Tailwind defaults. */
1225
1225
  declared;
1226
1226
  forms;
1227
+ /** Declared variables Tailwind makes utilities from (`--color-muted` → `text-muted`): an `@theme` block's, or the Tailwind config's. */
1228
+ utilities;
1227
1229
  vars;
1228
- constructor(vars, tailwind, warnings, declared = /* @__PURE__ */ new Map(), forms = null) {
1230
+ constructor(vars, tailwind, warnings, declared = /* @__PURE__ */ new Map(), forms = null, utilities = /* @__PURE__ */ new Set()) {
1229
1231
  this.vars = vars;
1230
1232
  this.declared = declared;
1231
1233
  this.tailwind = tailwind;
1232
1234
  this.warnings = warnings;
1233
1235
  this.forms = forms;
1236
+ this.utilities = utilities;
1234
1237
  }
1235
1238
  variable(name) {
1236
1239
  return this.vars.get(name);
@@ -1399,17 +1402,20 @@ async function buildTheme(root, sheets, usesTailwindPackage) {
1399
1402
  const version = v4 ? 4 : v3 || usesTailwindPackage ? 3 : null;
1400
1403
  const vars = version ? defaults(version) : /* @__PURE__ */ new Map();
1401
1404
  const declared = new Map(config.vars);
1405
+ const utilities = new Set(version ? config.vars.keys() : []);
1402
1406
  for (const [name, value] of config.vars) vars.set(name, value);
1403
1407
  for (const sheet of sheets) {
1404
1408
  for (const rule of sheet.rules) {
1405
- if (rule.preludes.length !== 1 || !THEME_SCOPES.has(rule.preludes[0].replace(/\s+/g, " "))) continue;
1409
+ const scope = rule.preludes.length === 1 ? rule.preludes[0].replace(/\s+/g, " ") : null;
1410
+ if (!scope || !THEME_SCOPES.has(scope)) continue;
1406
1411
  for (const declaration of rule.declarations) if (declaration.property.startsWith("--")) {
1407
1412
  vars.set(declaration.property, declaration.value);
1408
1413
  declared.set(declaration.property, declaration.value);
1414
+ if (version === 4 && scope.startsWith("@theme")) utilities.add(declaration.property);
1409
1415
  }
1410
1416
  }
1411
1417
  }
1412
- return new Theme(vars, version, config.warnings, declared, version ? await formsPluginOf(root, sheets, config.file) : null);
1418
+ return new Theme(vars, version, config.warnings, declared, version ? await formsPluginOf(root, sheets, config.file) : null, utilities);
1413
1419
  }
1414
1420
 
1415
1421
  // ../scanner/src/inventory/style.ts
@@ -1900,7 +1906,6 @@ function nearDuplicates(input) {
1900
1906
  const { inventory, added, importOf } = input;
1901
1907
  const definitions = new Map(inventory.definitions.map((d) => [d.id, d]));
1902
1908
  const fresh = inventory.definitions.filter((d) => added(d.file, d.line));
1903
- if (fresh.length === 0) return [];
1904
1909
  const freshIds = new Set(fresh.map((d) => d.id));
1905
1910
  const ends = /* @__PURE__ */ new Map();
1906
1911
  for (const definition of fresh) {
@@ -1921,7 +1926,8 @@ function nearDuplicates(input) {
1921
1926
  if (root?.kind === "primitive" || root?.kind === "definition" && definitions.has(root.id) && !freshIds.has(root.id)) continue;
1922
1927
  const own = inventory.looks.filter((l) => hasShape(l.shape) && inside(l, definition) && l.definition !== definition.id);
1923
1928
  const roots = inventory.looks.filter((l) => hasShape(l.shape) && inside(l, definition) && l.definition === definition.id);
1924
- const looks = roots.length > 0 ? roots : own.length > 0 ? own : inventory.looks.filter((l) => hasShape(l.shape) && l.definition === definition.id);
1929
+ if (roots.length === 0 && own.length > 0) continue;
1930
+ const looks = roots.length > 0 ? roots : inventory.looks.filter((l) => hasShape(l.shape) && l.definition === definition.id);
1925
1931
  let best = null;
1926
1932
  for (const mine of looks) {
1927
1933
  const shape = clusterShapeOf(mine);
@@ -1944,6 +1950,39 @@ function nearDuplicates(input) {
1944
1950
  fix: reuse.fix
1945
1951
  });
1946
1952
  }
1953
+ const reported = fresh.filter((d) => findings.some((f) => f.file === d.file && f.line === d.line));
1954
+ const componentOf = (look) => look.recipe?.kind === "component" ? `${look.recipe.file}#${look.recipe.export}` : null;
1955
+ const uses = /* @__PURE__ */ new Map();
1956
+ for (const look of inventory.looks) if (look.recipe?.kind === "component" && look.file !== look.recipe.file && !look.story) uses.set(componentOf(look), (uses.get(componentOf(look)) ?? 0) + 1);
1957
+ const components = inventory.looks.filter((l) => hasShape(l.shape) && uses.has(componentOf(l) ?? "") && !(l.definition !== null && freshIds.has(l.definition)));
1958
+ const linkRoot = (look) => {
1959
+ const root = definitions.get(look.definition ?? "")?.root;
1960
+ return root?.kind === "intrinsic" ? root.tag === "a" : root?.kind === "primitive" ? /link/i.test(root.name === "default" ? root.module : root.name) : false;
1961
+ };
1962
+ for (const mine of inventory.looks) {
1963
+ if (mine.source !== "intrinsic" || mine.definition !== null || mine.story || !hasShape(mine.shape) || !added(mine.file, mine.line)) continue;
1964
+ if ([mine.shape.height, mine.shape.paddingX || null, mine.shape.radius, mine.shape.fontSize].filter((v) => v !== null).length < 3) continue;
1965
+ if (reported.some((d) => inside(mine, d))) continue;
1966
+ const shape = clusterShapeOf(mine);
1967
+ const mineClasses = classesOf(mine.recipe);
1968
+ let best = null;
1969
+ for (const other of components) {
1970
+ if (other.role !== mine.role || mine.tag === "a" !== linkRoot(other) || !compatible(shape, clusterShapeOf(other))) continue;
1971
+ const rank = [shapeDistance(shape, clusterShapeOf(other)), -uses.get(componentOf(other)), -overlap(mineClasses, classesOf(other.recipe))];
1972
+ if (!best || before(rank, best.rank)) best = { look: other, rank };
1973
+ }
1974
+ if (!best) continue;
1975
+ const reuse = reuseOf(best.look, definitions, importOf, mine.file);
1976
+ findings.push({
1977
+ kind: "near-duplicate",
1978
+ file: mine.file,
1979
+ line: mine.line,
1980
+ column: mine.column,
1981
+ text: `<${mine.tag}>`,
1982
+ message: `A hand-styled <${mine.tag}> that looks like the existing ${reuse.name} (${best.look.file}:${best.look.line}): ${describeShape(mine)}. Confirm it is the same role; if so, render ${reuse.name} instead.`,
1983
+ fix: reuse.fix
1984
+ });
1985
+ }
1947
1986
  return findings.sort(byPosition);
1948
1987
  }
1949
1988
  function importedNames(statement) {
@@ -4,7 +4,7 @@ import {
4
4
  loadPackage,
5
5
  readTryIndex,
6
6
  send
7
- } from "./chunk-NG73FB4O.js";
7
+ } from "./chunk-WBU7YJGZ.js";
8
8
  import {
9
9
  writeFileAtomic
10
10
  } from "./chunk-M56633DV.js";
@@ -9,7 +9,7 @@ import {
9
9
  startRuleEditor,
10
10
  style,
11
11
  truncate
12
- } from "./chunk-2F2HM7FE.js";
12
+ } from "./chunk-YQS2VF65.js";
13
13
  import {
14
14
  BASELINE_FILE,
15
15
  DEFAULT_EXCLUDE,
@@ -64,7 +64,7 @@ import {
64
64
  vendoredPath,
65
65
  whereUsed,
66
66
  withFile
67
- } from "./chunk-75LXBAYB.js";
67
+ } from "./chunk-3SXAQHHJ.js";
68
68
  import {
69
69
  escapingLinks,
70
70
  within
@@ -1382,6 +1382,8 @@ async function themeTokens(root, modules) {
1382
1382
  const theme = await buildTheme(root, sheets, false);
1383
1383
  const tokens = [];
1384
1384
  const byVar = /* @__PURE__ */ new Map();
1385
+ const themeKeys = /* @__PURE__ */ new Map();
1386
+ const ids = /* @__PURE__ */ new Set();
1385
1387
  for (const [name, raw] of theme.declared) {
1386
1388
  const value = substituteVars(raw, (key2) => theme.variable(key2));
1387
1389
  if (value === null) continue;
@@ -1390,11 +1392,16 @@ async function themeTokens(root, modules) {
1390
1392
  const px = kind ? theme.length(value) : null;
1391
1393
  if (!color && px === null) continue;
1392
1394
  const light = color ?? { value: px, unit: "px" };
1393
- const token = { id: `${color ? "color" : kind}.${name.slice(2)}`, type: color ? "color" : "dimension", cssName: name.slice(2), light, dark: light };
1395
+ const group = color ? "color" : kind;
1396
+ const short = `${group}.${name.slice(2).replace(new RegExp(`^${group}-`), "")}`;
1397
+ const id = ids.has(short) ? `${group}.${name.slice(2)}` : short;
1398
+ ids.add(id);
1399
+ const token = { id, type: color ? "color" : "dimension", cssName: name.slice(2), light, dark: light };
1394
1400
  tokens.push(token);
1395
1401
  byVar.set(name, token);
1402
+ if (theme.utilities.has(name)) themeKeys.set(id, [name.slice(2)]);
1396
1403
  }
1397
- return { prefix: "", tokens, byVar, themeKeys: /* @__PURE__ */ new Map() };
1404
+ return { prefix: "", tokens, byVar, themeKeys };
1398
1405
  }
1399
1406
  async function runRepoCheck(project2, change) {
1400
1407
  const target = await loadInventoryTarget(project2.root);
@@ -3249,16 +3256,20 @@ var BENIGN_ENV = /^(?:npm_|NPM_|PNPM_|NODE_|NVM_|TERM|COLORTERM|LANG$|LANGUAGE$|
3249
3256
  var PLAIN_WORD = /^[A-Za-z]+$/;
3250
3257
  var PLAIN = /^(?:true|false|yes|no|on|off|null|undefined|\d+(?:\.\d+)?)$/i;
3251
3258
  var escapeRegExp = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
3259
+ var PLACEHOLDERS = /\.env\.(?:example|sample|template)$/i;
3260
+ var PLAIN_NAME = /^[A-Za-z][A-Za-z0-9_.-]*$/;
3252
3261
  async function dotenvValues(root) {
3253
- const files = (await findFiles(root, [".env", ".env.*", "**/.env", "**/.env.*"]).catch(() => [])).filter((f) => !/\.env\.(?:example|sample|template|dist|defaults)$/i.test(f));
3262
+ const files = await findFiles(root, [".env", ".env.*", "**/.env", "**/.env.*"]).catch(() => []);
3254
3263
  const values = [];
3255
3264
  for (const file of files) {
3256
3265
  const text = await readFile7(join17(root, file), "utf8").catch(() => "");
3266
+ const placeholders = PLACEHOLDERS.test(file);
3257
3267
  for (const line of text.split(/\r?\n/)) {
3258
3268
  const match = /^\s*(?:export\s+)?[A-Za-z_][A-Za-z0-9_.-]*\s*=\s*(.*)$/.exec(line);
3259
3269
  if (!match) continue;
3260
3270
  const value = match[1].trim().replace(/^(['"`])(.*)\1$/, "$2").replace(/\s+#.*$/, "");
3261
- if (value.length >= MIN_VALUE) values.push(value);
3271
+ if (value.length < MIN_VALUE || placeholders && PLAIN_NAME.test(value) && !looksSecret(value)) continue;
3272
+ values.push(value);
3262
3273
  }
3263
3274
  }
3264
3275
  return values;
@@ -3405,7 +3416,7 @@ async function projectStatus(project2, cwd = process.cwd()) {
3405
3416
  const comparison = check.baseline?.comparison;
3406
3417
  const counted = comparison ? [...comparison.new, ...comparison.regressed] : check.violations;
3407
3418
  const usages = check.scan.report.usages;
3408
- const { RequestStore } = await import("./src-VSWKGVFT.js");
3419
+ const { RequestStore } = await import("./src-LESGEHOC.js");
3409
3420
  const requests = await new RequestStore(project2.root, project2.config.id).list();
3410
3421
  const status = {
3411
3422
  id: project2.config.id,
@@ -4731,17 +4742,23 @@ async function modulesOf(project2, target, failed3) {
4731
4742
  }
4732
4743
  return modules;
4733
4744
  }
4745
+ function groupKey(finding3) {
4746
+ if (finding3.kind === "off-library") return finding3.message;
4747
+ if (finding3.kind !== "hardcoded-value") return finding3.fix;
4748
+ const { word, value, tokens } = hardcodedValue(finding3);
4749
+ return `${word}\0${value}\0${tokens}`;
4750
+ }
4734
4751
  async function grouped(project2, found, lines, describe) {
4735
4752
  const groups = /* @__PURE__ */ new Map();
4736
4753
  for (const finding3 of found) {
4737
- const key2 = `${finding3.kind}\0${finding3.kind === "off-library" ? finding3.message : finding3.fix}`;
4754
+ const key2 = `${finding3.kind}\0${groupKey(finding3)}`;
4738
4755
  groups.set(key2, [...groups.get(key2) ?? [], finding3]);
4739
4756
  }
4740
4757
  const findings2 = [];
4741
4758
  for (const list of groups.values()) {
4742
4759
  const first = list[0];
4743
4760
  const sites = await Promise.all(list.slice(0, SITES_PER_FINDING).map((f) => lines.site(`${repoPath(project2.dir, f.file)}:${f.line}`, repoPath(project2.dir, f.file), f.line)));
4744
- const { title, next: next2 } = describe(first, list.length);
4761
+ const { title, next: next2 } = describe(first, list.length, list);
4745
4762
  findings2.push({ kind: first.kind, project: project2.dir, count: list.length, sites, title, detail: null, next: next2 });
4746
4763
  }
4747
4764
  return findings2.sort((a, b) => b.count - a.count || a.title.localeCompare(b.title));
@@ -4808,9 +4825,14 @@ async function analyseProject(project2, index, inventory, inventoryError, worksp
4808
4825
  if (tokens.tokens.length === 0) notes.push("No theme variables (CSS custom properties or Tailwind @theme) were found, so hardcoded values had nothing to be compared with");
4809
4826
  const usage = tokenUsage(modules);
4810
4827
  const found = (await Promise.all(modules.map((module) => reportTokens(module, tokens, usage)))).flat();
4811
- hardcoded = await grouped(project2, found, lines, (first, count) => {
4828
+ hardcoded = await grouped(project2, found, lines, (first, count, list) => {
4812
4829
  const { word, value, tokens: names } = hardcodedValue(first);
4813
- return { title: `${sentence(word)} ${value} is hardcoded in ${plural(count, "place")}; the theme already has it as ${names}`, next: `${sentence(first.fix)} in each place` };
4830
+ const fixes = [...new Map(list.map((f) => [f.fix, f.text]))];
4831
+ const tail = / \([^()]*\)$/.exec(first.fix)?.[0] ?? "";
4832
+ const shared = tail !== "" && fixes.every(([fix]) => fix.endsWith(tail));
4833
+ const each = fixes.slice(0, 3).map(([fix, text], i) => `${(shared ? fix.slice(0, -tail.length) : fix).replace(i > 0 ? /^use / : /^$/, "")} for ${text}`);
4834
+ const next2 = fixes.length === 1 ? `${sentence(first.fix)} in each place` : `${sentence(each.join(", "))}${fixes.length > 3 ? ", \u2026" : ""}${shared ? tail : ""}`;
4835
+ return { title: `${sentence(word)} ${value} is hardcoded in ${plural(count, "place")}; the theme already has it as ${names}`, next: next2 };
4814
4836
  });
4815
4837
  } catch (error) {
4816
4838
  incomplete.push(`Hardcoded values were not checked (${errorText(error)}); run ${NPX} check --diff to see why`);
@@ -6044,7 +6066,7 @@ async function cmdLibrary(values, positionals) {
6044
6066
  return 0;
6045
6067
  }
6046
6068
  if (action === "ingest" && query && positionals.length === 2) {
6047
- const { fileIngestDraft, readLink, renderIngest } = await import("./ingest-X4MIF5F6.js");
6069
+ const { fileIngestDraft, readLink, renderIngest } = await import("./ingest-IOFHL5VG.js");
6048
6070
  const p = values.draft ? await project(values) : null;
6049
6071
  const reading = await readLink(query, { allowLocal: true });
6050
6072
  const filed = p ? await fileIngestDraft(p, reading, values.state) : null;
@@ -6503,7 +6525,7 @@ async function cmdRequests(values, positionals) {
6503
6525
  const usage = "youiyoux requests [--status open|addressed|closed|all] [--route r] or youiyoux requests show <id> | reply <id> --message <text> | addressed <id> --message <what you changed>";
6504
6526
  const [action, id, ...rest] = positionals;
6505
6527
  if (rest.length > 0) throw new UsageError(usage);
6506
- const { RequestStore, requestBrief } = await import("./src-VSWKGVFT.js");
6528
+ const { RequestStore, requestBrief } = await import("./src-LESGEHOC.js");
6507
6529
  const { project: project2, root } = await product(values);
6508
6530
  const store = new RequestStore(root, project2?.config.id ?? basename5(root));
6509
6531
  const agent = { kind: "agent", name: "youiyoux CLI" };
@@ -6602,7 +6624,7 @@ async function cmdReport(values, positionals, io) {
6602
6624
  return result.code;
6603
6625
  }
6604
6626
  async function cmdMcp(values) {
6605
- const { startStdioServer } = await import("./src-LGHUKRL2.js");
6627
+ const { startStdioServer } = await import("./src-Z3LZMTHC.js");
6606
6628
  await startStdioServer({ projectRoot: values.project ?? process.cwd(), ...loadOptions(values), ...values.cache ? { discoverCache: values.cache } : {} });
6607
6629
  return -1;
6608
6630
  }
@@ -9,7 +9,7 @@ import {
9
9
  scanProject,
10
10
  screenSlug,
11
11
  tokenImpact
12
- } from "./chunk-75LXBAYB.js";
12
+ } from "./chunk-3SXAQHHJ.js";
13
13
  import {
14
14
  buildTokens,
15
15
  contrastText,
@@ -3,7 +3,7 @@ import { createRequire as __youiRequire } from "node:module"; import { dirname a
3
3
  // src/hub-packages.js
4
4
  var PACKAGES = {
5
5
  core: () => import("./src-AXF5XUQE.js"),
6
- scanner: () => import("./src-Q3ZJHEUQ.js"),
6
+ scanner: () => import("./src-CCB3D7EM.js"),
7
7
  discover: () => import("./src-ULAQV67E.js"),
8
8
  tokens: () => import("./src-HBKEBCH6.js")
9
9
  };
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __youiRequire } from "node:module"; import { dirname as __youiDir } from "node:path"; import { fileURLToPath as __youiPath } from "node:url"; const require = __youiRequire(import.meta.url); const __youiDirname = __youiDir(__youiPath(import.meta.url));
2
2
  import {
3
3
  loadProject
4
- } from "./chunk-75LXBAYB.js";
4
+ } from "./chunk-3SXAQHHJ.js";
5
5
  import {
6
6
  shortHash
7
7
  } from "./chunk-M56633DV.js";
@@ -79,11 +79,11 @@ function workflowStateDir(project, state) {
79
79
  return resolve(state ?? join(homedir(), ".youi", "workflow", shortHash(`${project.repo.root}\0${project.root}`)));
80
80
  }
81
81
  async function ingest(link) {
82
- const { readLink } = await import("./ingest-X4MIF5F6.js");
82
+ const { readLink } = await import("./ingest-IOFHL5VG.js");
83
83
  return readLink(link, { allowLocal: false });
84
84
  }
85
85
  async function startRuleEditor(options) {
86
- const { FileStore, RuleWorkflow, serveWorkflow } = await import("./src-VSWKGVFT.js");
86
+ const { FileStore, RuleWorkflow, serveWorkflow } = await import("./src-LESGEHOC.js");
87
87
  const projectRoot = resolve(options.project);
88
88
  const load = { ...options.config ? { configPath: resolve(options.config) } : {}, ...options.design ? { designRoot: resolve(options.design) } : {}, ...options.root ? { productRoot: resolve(options.root) } : {} };
89
89
  const project = await loadProject(projectRoot, load);
@@ -4,8 +4,8 @@ import {
4
4
  plural,
5
5
  style,
6
6
  workflowStateDir
7
- } from "./chunk-2F2HM7FE.js";
8
- import "./chunk-75LXBAYB.js";
7
+ } from "./chunk-YQS2VF65.js";
8
+ import "./chunk-3SXAQHHJ.js";
9
9
  import "./chunk-42YJX3W5.js";
10
10
  import "./chunk-4BQPCZLL.js";
11
11
  import "./chunk-M56633DV.js";
@@ -23,7 +23,7 @@ async function readLink(link, options) {
23
23
  return { link: result.link, source: result.source, license: result.license, fetchedAt: result.fetchedAt, entries: result.entries, skipped: result.skipped, notes: result.notes };
24
24
  }
25
25
  async function fileIngestDraft(project, reading, state) {
26
- const { FileStore, RuleWorkflow } = await import("./src-VSWKGVFT.js");
26
+ const { FileStore, RuleWorkflow } = await import("./src-LESGEHOC.js");
27
27
  const workflow = new RuleWorkflow({ projectRoot: project.root, store: new FileStore(workflowStateDir(project, state)), ...project.configFile ? { configPath: project.configFile } : {}, ...project.designOverride ? { designRoot: project.repo.root } : {}, ...project.rootOverride ? { productRoot: project.root } : {}, ingest: async () => reading });
28
28
  const draft = await workflow.create({ kind: "person", name: userInfo().username }, { kind: "ingest", link: reading.link });
29
29
  return { id: draft.id, problems: draft.problems };
@@ -188,7 +188,7 @@ import {
188
188
  whyNoLines,
189
189
  withFile,
190
190
  withoutCredentials
191
- } from "./chunk-75LXBAYB.js";
191
+ } from "./chunk-3SXAQHHJ.js";
192
192
  import {
193
193
  escapingLinks,
194
194
  relativeInside,
@@ -64,8 +64,8 @@ import {
64
64
  validateIngestContent,
65
65
  validateLibraryContent,
66
66
  validateStyleContent
67
- } from "./chunk-OE4RYJOS.js";
68
- import "./chunk-75LXBAYB.js";
67
+ } from "./chunk-TI3G57PX.js";
68
+ import "./chunk-3SXAQHHJ.js";
69
69
  import "./chunk-42YJX3W5.js";
70
70
  import "./chunk-4BQPCZLL.js";
71
71
  import "./chunk-M56633DV.js";
@@ -2,7 +2,7 @@ import { createRequire as __youiRequire } from "node:module"; import { dirname a
2
2
  import {
3
3
  RequestStore,
4
4
  requestBrief
5
- } from "./chunk-OE4RYJOS.js";
5
+ } from "./chunk-TI3G57PX.js";
6
6
  import {
7
7
  PROJECT_FILE,
8
8
  ScanCache,
@@ -30,7 +30,7 @@ import {
30
30
  shotsText,
31
31
  tokenRows,
32
32
  whereUsed
33
- } from "./chunk-75LXBAYB.js";
33
+ } from "./chunk-3SXAQHHJ.js";
34
34
  import "./chunk-42YJX3W5.js";
35
35
  import {
36
36
  SHADCN_SLOTS,
@@ -17,8 +17,8 @@ import {
17
17
  selectCandidates,
18
18
  thumbsDir,
19
19
  writeThumbIndex
20
- } from "./chunks/chunk-AFEQZT2N.js";
21
- import "./chunks/chunk-NG73FB4O.js";
20
+ } from "./chunks/chunk-6UHSXSS6.js";
21
+ import "./chunks/chunk-WBU7YJGZ.js";
22
22
  import "./chunks/chunk-FVVL5JCY.js";
23
23
  import "./chunks/chunk-M56633DV.js";
24
24
  import "./chunks/chunk-WNTS7ZO4.js";
@@ -2,7 +2,7 @@
2
2
  import { createRequire as __youiRequire } from "node:module"; import { dirname as __youiDir } from "node:path"; import { fileURLToPath as __youiPath } from "node:url"; const require = __youiRequire(import.meta.url); const __youiDirname = __youiDir(__youiPath(import.meta.url));
3
3
  import {
4
4
  discoverThumbsMiddleware
5
- } from "./chunks/chunk-AFEQZT2N.js";
5
+ } from "./chunks/chunk-6UHSXSS6.js";
6
6
  import {
7
7
  isLocalHost,
8
8
  loadPackage,
@@ -10,7 +10,7 @@ import {
10
10
  readTryIndex,
11
11
  send,
12
12
  tryMiddleware
13
- } from "./chunks/chunk-NG73FB4O.js";
13
+ } from "./chunks/chunk-WBU7YJGZ.js";
14
14
  import "./chunks/chunk-FVVL5JCY.js";
15
15
  import "./chunks/chunk-M56633DV.js";
16
16
  import "./chunks/chunk-WNTS7ZO4.js";
@@ -3,7 +3,7 @@ import { createRequire as __youiRequire } from "node:module"; import { dirname a
3
3
  import {
4
4
  loadPackage,
5
5
  tryProject
6
- } from "./chunks/chunk-NG73FB4O.js";
6
+ } from "./chunks/chunk-WBU7YJGZ.js";
7
7
  import "./chunks/chunk-FVVL5JCY.js";
8
8
  import "./chunks/chunk-WNTS7ZO4.js";
9
9
 
package/dist/youi.js CHANGED
@@ -2,9 +2,9 @@
2
2
  import { createRequire as __youiRequire } from "node:module"; import { dirname as __youiDir } from "node:path"; import { fileURLToPath as __youiPath } from "node:url"; const require = __youiRequire(import.meta.url); const __youiDirname = __youiDir(__youiPath(import.meta.url));
3
3
  import {
4
4
  main
5
- } from "./chunks/chunk-AONOTAF5.js";
6
- import "./chunks/chunk-2F2HM7FE.js";
7
- import "./chunks/chunk-75LXBAYB.js";
5
+ } from "./chunks/chunk-K2W23VI3.js";
6
+ import "./chunks/chunk-YQS2VF65.js";
7
+ import "./chunks/chunk-3SXAQHHJ.js";
8
8
  import "./chunks/chunk-42YJX3W5.js";
9
9
  import "./chunks/chunk-5D7PLY7A.js";
10
10
  import "./chunks/chunk-UJMXSTUF.js";
package/dist/youiyoux.js CHANGED
@@ -3,9 +3,9 @@ import { createRequire as __youiRequire } from "node:module"; import { dirname a
3
3
  import {
4
4
  COMMAND_NAMES,
5
5
  main
6
- } from "./chunks/chunk-AONOTAF5.js";
7
- import "./chunks/chunk-2F2HM7FE.js";
8
- import "./chunks/chunk-75LXBAYB.js";
6
+ } from "./chunks/chunk-K2W23VI3.js";
7
+ import "./chunks/chunk-YQS2VF65.js";
8
+ import "./chunks/chunk-3SXAQHHJ.js";
9
9
  import "./chunks/chunk-42YJX3W5.js";
10
10
  import "./chunks/chunk-5D7PLY7A.js";
11
11
  import "./chunks/chunk-UJMXSTUF.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "youiyoux",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "description": "Your agent rebuilds components you already have. youiyoux catches it: npx youiyoux turns any repo into a shareable report of near-duplicate components, hardcoded token values and off-library imports, with the fixes.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -46,9 +46,9 @@
46
46
  "typescript": "6.0.3"
47
47
  },
48
48
  "devDependencies": {
49
- "@youiyoux/core": "0.1.18",
50
- "@youiyoux/scanner": "0.1.18",
51
- "@youiyoux/cli": "0.1.18"
49
+ "@youiyoux/cli": "0.1.20",
50
+ "@youiyoux/core": "0.1.20",
51
+ "@youiyoux/scanner": "0.1.20"
52
52
  },
53
53
  "exports": {
54
54
  "./package.json": "./package.json"