teamix-evo 0.6.0 → 0.6.1

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.
@@ -335,6 +335,61 @@ interface RunUiListResult {
335
335
  */
336
336
  declare function runUiList(options: RunUiListOptions): Promise<RunUiListResult>;
337
337
 
338
+ interface RunVariantUiAddOptions {
339
+ /** Absolute project root directory. */
340
+ projectRoot: string;
341
+ /** Variant id (e.g. `"opentrek"`). */
342
+ variant: string;
343
+ /** Entry ids to install. */
344
+ ids: string[];
345
+ /** When true, overwrite frozen entries that already exist on disk. */
346
+ overwrite?: boolean;
347
+ /** Override the package name. */
348
+ packageName?: string;
349
+ /**
350
+ * Override resolution of the package root. When set, skips
351
+ * `require.resolve("<packageName>/package.json")`.
352
+ */
353
+ packageRoot?: string;
354
+ }
355
+ interface RunVariantUiAddResult {
356
+ packageName: string;
357
+ variant: string;
358
+ orderedIds: string[];
359
+ written: number;
360
+ skipped: number;
361
+ npmDependencies: Record<string, string>;
362
+ resources: InstalledResource[];
363
+ }
364
+ /** `teamix-evo biz-ui add <ids...> --variant <name>`. */
365
+ declare function runBizUiAdd(options: RunVariantUiAddOptions): Promise<RunVariantUiAddResult>;
366
+ /** `teamix-evo templates add <ids...> --variant <name>`. */
367
+ declare function runTemplatesAdd(options: RunVariantUiAddOptions): Promise<RunVariantUiAddResult>;
368
+ interface ListVariantUiResult {
369
+ packageName: string;
370
+ variants: Array<{
371
+ name: string;
372
+ displayName: string;
373
+ version: string;
374
+ description?: string;
375
+ }>;
376
+ }
377
+ declare function listBizUiVariants(packageRoot?: string): Promise<ListVariantUiResult>;
378
+ declare function listTemplatesVariants(packageRoot?: string): Promise<ListVariantUiResult>;
379
+ interface ListVariantUiEntriesResult {
380
+ packageName: string;
381
+ variant: string;
382
+ entries: Array<{
383
+ id: string;
384
+ name: string;
385
+ type: string;
386
+ description?: string;
387
+ registryDependencies: string[];
388
+ }>;
389
+ }
390
+ declare function listBizUiEntries(variant: string, packageRoot?: string): Promise<ListVariantUiEntriesResult>;
391
+ declare function listTemplatesEntries(variant: string, packageRoot?: string): Promise<ListVariantUiEntriesResult>;
392
+
338
393
  interface RunLintInitOptions {
339
394
  /** Absolute project root directory. */
340
395
  projectRoot: string;
@@ -607,4 +662,4 @@ declare function readInstalledManifest(projectRoot: string): Promise<InstalledMa
607
662
  */
608
663
  declare function writeInstalledManifest(projectRoot: string, manifest: InstalledManifest): Promise<void>;
609
664
 
610
- export { DEFAULT_UI_ALIASES, DEFAULT_UI_ICON_LIBRARY, type InstallOptions, type InstallResult, type ListVariantsResult, type RunLintInitOptions, type RunLintInitResult, type RunSkillsAddOptions, type RunSkillsAddResult, type RunSkillsInitOptions, type RunSkillsInitResult, type RunSkillsUpdateOptions, type RunSkillsUpdateResult, type RunTokensInitOptions, type RunTokensInitResult, type RunUiAddOptions, type RunUiAddResult, type RunUiInitOptions, type RunUiInitResult, type RunUiListOptions, type RunUiListResult, type SkillInstallOptions, type SkillInstallResult, type SkillSyncOptions, type SkillSyncResult, type SkillUpdateOptions, type SkillUpdateResult, type UiEntryListItem, type UiInstallOptions, type UiInstallResult, type UpdatePlanItem, ensureTeamixDir, getTeamixDir, installResources, installSkills, installUiEntries, listTokenVariants, loadSkillsData, loadUiData, loadVariantData, readInstalledManifest, readProjectConfig, removeSkillFiles, removeUiFiles, runLintInit, runSkillsAdd, runSkillsInit, runSkillsUpdate, runTokensInit, runUiAdd, runUiInit, runUiList, syncSkillsToIdes, updateSkills, writeInstalledManifest, writeProjectConfig };
665
+ export { DEFAULT_UI_ALIASES, DEFAULT_UI_ICON_LIBRARY, type InstallOptions, type InstallResult, type ListVariantUiEntriesResult, type ListVariantUiResult, type ListVariantsResult, type RunLintInitOptions, type RunLintInitResult, type RunSkillsAddOptions, type RunSkillsAddResult, type RunSkillsInitOptions, type RunSkillsInitResult, type RunSkillsUpdateOptions, type RunSkillsUpdateResult, type RunTokensInitOptions, type RunTokensInitResult, type RunUiAddOptions, type RunUiAddResult, type RunUiInitOptions, type RunUiInitResult, type RunUiListOptions, type RunUiListResult, type RunVariantUiAddOptions, type RunVariantUiAddResult, type SkillInstallOptions, type SkillInstallResult, type SkillSyncOptions, type SkillSyncResult, type SkillUpdateOptions, type SkillUpdateResult, type UiEntryListItem, type UiInstallOptions, type UiInstallResult, type UpdatePlanItem, ensureTeamixDir, getTeamixDir, installResources, installSkills, installUiEntries, listBizUiEntries, listBizUiVariants, listTemplatesEntries, listTemplatesVariants, listTokenVariants, loadSkillsData, loadUiData, loadVariantData, readInstalledManifest, readProjectConfig, removeSkillFiles, removeUiFiles, runBizUiAdd, runLintInit, runSkillsAdd, runSkillsInit, runSkillsUpdate, runTemplatesAdd, runTokensInit, runUiAdd, runUiInit, runUiList, syncSkillsToIdes, updateSkills, writeInstalledManifest, writeProjectConfig };
@@ -1717,8 +1717,176 @@ async function runUiList(options) {
1717
1717
  };
1718
1718
  }
1719
1719
 
1720
- // src/core/lint-init.ts
1720
+ // src/core/variant-ui-add.ts
1721
1721
  import * as path12 from "path";
1722
+ import { createRequire as createRequire4 } from "module";
1723
+ import {
1724
+ loadUiPackageManifest as loadUiPackageManifest2,
1725
+ loadVariantUiPackageCatalog,
1726
+ loadVariantUiPackageManifest
1727
+ } from "@teamix-evo/registry";
1728
+ var require5 = createRequire4(import.meta.url);
1729
+ function resolvePackageRoot3(packageName) {
1730
+ const pkgJsonPath = require5.resolve(`${packageName}/package.json`);
1731
+ return path12.dirname(pkgJsonPath);
1732
+ }
1733
+ async function runVariantUiAdd(packageName, options) {
1734
+ const { projectRoot, variant, ids, overwrite } = options;
1735
+ const fullPackageName = options.packageName ?? `@teamix-evo/${packageName}`;
1736
+ if (ids.length === 0) {
1737
+ throw new Error("At least one entry id must be provided.");
1738
+ }
1739
+ const config = await readProjectConfig(projectRoot);
1740
+ const uiCfg = config?.packages?.ui;
1741
+ if (!config || !uiCfg?.aliases) {
1742
+ throw new Error(
1743
+ `UI not initialized. Run \`teamix-evo ui init\` first \u2014 \`${packageName} add\` writes into the same alias map (business / templates).`
1744
+ );
1745
+ }
1746
+ const packageRoot = options.packageRoot ?? resolvePackageRoot3(fullPackageName);
1747
+ const catalog = await loadVariantUiPackageCatalog(packageRoot);
1748
+ if (!catalog.variants.some((v) => v.name === variant)) {
1749
+ const known = catalog.variants.map((v) => v.name).join(", ");
1750
+ throw new Error(
1751
+ `Variant "${variant}" not found in ${fullPackageName}. Known variants: ${known}. Hint: \`teamix-evo ${packageName} list-variants\` shows all.`
1752
+ );
1753
+ }
1754
+ const variantDir = path12.join(packageRoot, "variants", variant);
1755
+ const variantManifest = await loadVariantUiPackageManifest(variantDir);
1756
+ const knownIds = new Set(variantManifest.entries.map((e) => e.id));
1757
+ const unknown = ids.filter((id) => !knownIds.has(id));
1758
+ if (unknown.length > 0) {
1759
+ throw new Error(
1760
+ `Unknown entry id(s) in ${packageName}#${variant}: ${unknown.map((s) => `"${s}"`).join(", ")}. Run \`teamix-evo ${packageName} list-variants\` to see this package's variants, or \`teamix-evo ${packageName} list --variant ${variant}\` for its entries.`
1761
+ );
1762
+ }
1763
+ const uiPackageRoot = resolvePackageRoot3("@teamix-evo/ui");
1764
+ const uiManifest = await loadUiPackageManifest2(uiPackageRoot);
1765
+ const entryPackageRoot = /* @__PURE__ */ new Map();
1766
+ const mergedEntries = [];
1767
+ for (const e of variantManifest.entries) {
1768
+ entryPackageRoot.set(e.id, variantDir);
1769
+ mergedEntries.push(e);
1770
+ }
1771
+ for (const e of uiManifest.entries) {
1772
+ if (entryPackageRoot.has(e.id)) continue;
1773
+ entryPackageRoot.set(e.id, uiPackageRoot);
1774
+ mergedEntries.push(e);
1775
+ }
1776
+ const adaptedManifest = {
1777
+ schemaVersion: 1,
1778
+ package: "ui",
1779
+ version: variantManifest.version,
1780
+ engines: variantManifest.engines,
1781
+ entries: mergedEntries
1782
+ };
1783
+ const result = await installUiEntries({
1784
+ projectRoot,
1785
+ manifest: adaptedManifest,
1786
+ packageRoot: variantDir,
1787
+ // default for variant entries
1788
+ entryPackageRoot,
1789
+ // ui entries resolve from uiPackageRoot
1790
+ aliases: uiCfg.aliases,
1791
+ requested: ids,
1792
+ skipExisting: !overwrite
1793
+ });
1794
+ const installed = await readInstalledManifest(
1795
+ projectRoot
1796
+ ) ?? { schemaVersion: 1, installed: [] };
1797
+ const idx = installed.installed.findIndex(
1798
+ (p) => p.package === fullPackageName && p.variant === variant
1799
+ );
1800
+ const prior = idx >= 0 ? installed.installed[idx] : null;
1801
+ const mergedResources = mergeResources2(
1802
+ prior?.resources ?? [],
1803
+ result.resources
1804
+ );
1805
+ const entry = {
1806
+ package: fullPackageName,
1807
+ variant,
1808
+ version: variantManifest.version,
1809
+ installedAt: (/* @__PURE__ */ new Date()).toISOString(),
1810
+ resources: mergedResources
1811
+ };
1812
+ if (idx >= 0) installed.installed[idx] = entry;
1813
+ else installed.installed.push(entry);
1814
+ await writeInstalledManifest(projectRoot, installed);
1815
+ return {
1816
+ packageName: fullPackageName,
1817
+ variant,
1818
+ orderedIds: result.orderedIds,
1819
+ written: result.written,
1820
+ skipped: result.skipped,
1821
+ npmDependencies: result.npmDependencies,
1822
+ resources: result.resources
1823
+ };
1824
+ }
1825
+ function mergeResources2(prior, next) {
1826
+ const merged = /* @__PURE__ */ new Map();
1827
+ for (const r of prior) merged.set(r.id, r);
1828
+ for (const r of next) merged.set(r.id, r);
1829
+ return Array.from(merged.values());
1830
+ }
1831
+ async function runBizUiAdd(options) {
1832
+ return runVariantUiAdd("biz-ui", options);
1833
+ }
1834
+ async function runTemplatesAdd(options) {
1835
+ return runVariantUiAdd("templates", options);
1836
+ }
1837
+ async function listVariantUi(packageName, packageRoot) {
1838
+ const fullPackageName = `@teamix-evo/${packageName}`;
1839
+ const root = packageRoot ?? resolvePackageRoot3(fullPackageName);
1840
+ const catalog = await loadVariantUiPackageCatalog(root);
1841
+ return {
1842
+ packageName: fullPackageName,
1843
+ variants: catalog.variants.map((v) => ({
1844
+ name: v.name,
1845
+ displayName: v.displayName,
1846
+ version: v.version,
1847
+ description: v.description
1848
+ }))
1849
+ };
1850
+ }
1851
+ async function listBizUiVariants(packageRoot) {
1852
+ return listVariantUi("biz-ui", packageRoot);
1853
+ }
1854
+ async function listTemplatesVariants(packageRoot) {
1855
+ return listVariantUi("templates", packageRoot);
1856
+ }
1857
+ async function listVariantUiEntries(packageName, variant, packageRoot) {
1858
+ const fullPackageName = `@teamix-evo/${packageName}`;
1859
+ const root = packageRoot ?? resolvePackageRoot3(fullPackageName);
1860
+ const catalog = await loadVariantUiPackageCatalog(root);
1861
+ if (!catalog.variants.some((v) => v.name === variant)) {
1862
+ const known = catalog.variants.map((v) => v.name).join(", ");
1863
+ throw new Error(
1864
+ `Variant "${variant}" not found in ${fullPackageName}. Known: ${known}.`
1865
+ );
1866
+ }
1867
+ const variantDir = path12.join(root, "variants", variant);
1868
+ const variantManifest = await loadVariantUiPackageManifest(variantDir);
1869
+ return {
1870
+ packageName: fullPackageName,
1871
+ variant,
1872
+ entries: variantManifest.entries.map((e) => ({
1873
+ id: e.id,
1874
+ name: e.name,
1875
+ type: e.type,
1876
+ description: e.description,
1877
+ registryDependencies: e.registryDependencies ?? []
1878
+ }))
1879
+ };
1880
+ }
1881
+ async function listBizUiEntries(variant, packageRoot) {
1882
+ return listVariantUiEntries("biz-ui", variant, packageRoot);
1883
+ }
1884
+ async function listTemplatesEntries(variant, packageRoot) {
1885
+ return listVariantUiEntries("templates", variant, packageRoot);
1886
+ }
1887
+
1888
+ // src/core/lint-init.ts
1889
+ import * as path13 from "path";
1722
1890
  import * as fs9 from "fs";
1723
1891
  import { execa } from "execa";
1724
1892
  var ESLINT_CONFIG_CONTENT = `/**
@@ -1747,8 +1915,8 @@ var ESLINT_DEPS = [
1747
1915
  var STYLELINT_DEPS = ["@teamix-evo/stylelint-config", "stylelint"];
1748
1916
  async function runLintInit(options) {
1749
1917
  const { projectRoot, skipInstall } = options;
1750
- const eslintConfigPath = path12.join(projectRoot, "eslint.config.js");
1751
- const stylelintConfigPath = path12.join(projectRoot, "stylelint.config.cjs");
1918
+ const eslintConfigPath = path13.join(projectRoot, "eslint.config.js");
1919
+ const stylelintConfigPath = path13.join(projectRoot, "stylelint.config.cjs");
1752
1920
  const eslintExists = await fileExists(eslintConfigPath);
1753
1921
  const stylelintExists = await fileExists(stylelintConfigPath);
1754
1922
  if (eslintExists && stylelintExists) {
@@ -1786,12 +1954,12 @@ async function runLintInit(options) {
1786
1954
  };
1787
1955
  }
1788
1956
  function detectPm(projectRoot) {
1789
- if (fs9.existsSync(path12.join(projectRoot, "pnpm-lock.yaml"))) return "pnpm";
1790
- if (fs9.existsSync(path12.join(projectRoot, "yarn.lock"))) return "yarn";
1957
+ if (fs9.existsSync(path13.join(projectRoot, "pnpm-lock.yaml"))) return "pnpm";
1958
+ if (fs9.existsSync(path13.join(projectRoot, "yarn.lock"))) return "yarn";
1791
1959
  return "npm";
1792
1960
  }
1793
1961
  async function patchPackageJsonScripts(projectRoot) {
1794
- const pkgPath = path12.join(projectRoot, "package.json");
1962
+ const pkgPath = path13.join(projectRoot, "package.json");
1795
1963
  const raw = await readFileOrNull(pkgPath);
1796
1964
  if (!raw) return;
1797
1965
  let pkg;
@@ -1818,7 +1986,7 @@ async function patchPackageJsonScripts(projectRoot) {
1818
1986
  }
1819
1987
 
1820
1988
  // src/core/installer.ts
1821
- import * as path13 from "path";
1989
+ import * as path14 from "path";
1822
1990
  import * as fs10 from "fs/promises";
1823
1991
  async function installResources(options) {
1824
1992
  const { projectRoot, manifest, data, variantDir, packageRoot } = options;
@@ -1856,7 +2024,7 @@ async function installSingleResource(resource, projectRoot, data, variantDir, pa
1856
2024
  variantDir,
1857
2025
  packageRoot
1858
2026
  );
1859
- const targetPath = path13.join(projectRoot, resource.target);
2027
+ const targetPath = path14.join(projectRoot, resource.target);
1860
2028
  let content;
1861
2029
  if (resource.template) {
1862
2030
  const templateContent = await loadTemplateFile(sourcePath);
@@ -1880,13 +2048,13 @@ async function installRecursiveResource(resource, projectRoot, data, variantDir,
1880
2048
  variantDir,
1881
2049
  packageRoot
1882
2050
  );
1883
- const targetDir = path13.join(projectRoot, resource.target);
2051
+ const targetDir = path14.join(projectRoot, resource.target);
1884
2052
  const results = [];
1885
2053
  await ensureDir(targetDir);
1886
2054
  const entries = await walkDir(sourcePath);
1887
2055
  for (const entry of entries) {
1888
- const relPath = path13.relative(sourcePath, entry);
1889
- let targetFile = path13.join(targetDir, relPath);
2056
+ const relPath = path14.relative(sourcePath, entry);
2057
+ let targetFile = path14.join(targetDir, relPath);
1890
2058
  if (resource.template && targetFile.endsWith(".hbs")) {
1891
2059
  targetFile = targetFile.slice(0, -4);
1892
2060
  }
@@ -1899,7 +2067,7 @@ async function installRecursiveResource(resource, projectRoot, data, variantDir,
1899
2067
  }
1900
2068
  await writeFileSafe(targetFile, content);
1901
2069
  const hash = computeHash(content);
1902
- const targetRel = path13.relative(projectRoot, targetFile);
2070
+ const targetRel = path14.relative(projectRoot, targetFile);
1903
2071
  results.push({
1904
2072
  id: `${resource.id}:${relPath}`,
1905
2073
  target: targetRel,
@@ -1912,23 +2080,23 @@ async function installRecursiveResource(resource, projectRoot, data, variantDir,
1912
2080
  }
1913
2081
 
1914
2082
  // src/core/registry-client.ts
1915
- import * as path14 from "path";
2083
+ import * as path15 from "path";
1916
2084
  import * as fs11 from "fs/promises";
1917
- import { createRequire as createRequire4 } from "module";
2085
+ import { createRequire as createRequire5 } from "module";
1918
2086
  import { loadVariantManifest } from "@teamix-evo/registry";
1919
- var require5 = createRequire4(import.meta.url);
1920
- function resolvePackageRoot3(packageName) {
1921
- const pkgJsonPath = require5.resolve(`${packageName}/package.json`);
1922
- return path14.dirname(pkgJsonPath);
2087
+ var require6 = createRequire5(import.meta.url);
2088
+ function resolvePackageRoot4(packageName) {
2089
+ const pkgJsonPath = require6.resolve(`${packageName}/package.json`);
2090
+ return path15.dirname(pkgJsonPath);
1923
2091
  }
1924
2092
  async function loadVariantData(packageName, variant) {
1925
- const packageRoot = resolvePackageRoot3(packageName);
1926
- const variantDir = path14.join(packageRoot, "library", variant);
2093
+ const packageRoot = resolvePackageRoot4(packageName);
2094
+ const variantDir = path15.join(packageRoot, "library", variant);
1927
2095
  logger.debug(`Resolved variant dir: ${variantDir}`);
1928
2096
  logger.debug(`Package root: ${packageRoot}`);
1929
2097
  const manifest = await loadVariantManifest(variantDir);
1930
2098
  let data = {};
1931
- const dataPath = path14.join(variantDir, "_data.json");
2099
+ const dataPath = path15.join(variantDir, "_data.json");
1932
2100
  try {
1933
2101
  const raw = await fs11.readFile(dataPath, "utf-8");
1934
2102
  data = JSON.parse(raw);
@@ -1948,6 +2116,10 @@ export {
1948
2116
  installResources,
1949
2117
  installSkills,
1950
2118
  installUiEntries,
2119
+ listBizUiEntries,
2120
+ listBizUiVariants,
2121
+ listTemplatesEntries,
2122
+ listTemplatesVariants,
1951
2123
  listTokenVariants,
1952
2124
  loadSkillsData,
1953
2125
  loadUiData,
@@ -1956,10 +2128,12 @@ export {
1956
2128
  readProjectConfig,
1957
2129
  removeSkillFiles,
1958
2130
  removeUiFiles,
2131
+ runBizUiAdd,
1959
2132
  runLintInit,
1960
2133
  runSkillsAdd,
1961
2134
  runSkillsInit,
1962
2135
  runSkillsUpdate,
2136
+ runTemplatesAdd,
1963
2137
  runTokensInit,
1964
2138
  runUiAdd,
1965
2139
  runUiInit,