teamix-evo 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,777 @@
1
+ #!/usr/bin/env node
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __esm = (fn, res) => function __init() {
5
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
6
+ };
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+
12
+ // src/utils/logger.ts
13
+ import { red, yellow, cyan, green, gray } from "kolorist";
14
+ var isDebug, logger;
15
+ var init_logger = __esm({
16
+ "src/utils/logger.ts"() {
17
+ "use strict";
18
+ isDebug = process.env.TEAMIX_DEBUG === "1";
19
+ logger = {
20
+ info(msg) {
21
+ console.log(cyan("\u2139"), msg);
22
+ },
23
+ warn(msg) {
24
+ console.warn(yellow("\u26A0"), msg);
25
+ },
26
+ error(msg) {
27
+ console.error(red("\u2716"), msg);
28
+ },
29
+ success(msg) {
30
+ console.log(green("\u2714"), msg);
31
+ },
32
+ debug(msg) {
33
+ if (isDebug) {
34
+ console.log(gray("\u22A1"), gray(msg));
35
+ }
36
+ }
37
+ };
38
+ }
39
+ });
40
+
41
+ // src/utils/fs.ts
42
+ var fs_exports = {};
43
+ __export(fs_exports, {
44
+ backupFile: () => backupFile,
45
+ ensureDir: () => ensureDir,
46
+ fileExists: () => fileExists,
47
+ readFileOrNull: () => readFileOrNull,
48
+ writeFileSafe: () => writeFileSafe
49
+ });
50
+ import * as fs2 from "fs/promises";
51
+ import * as path2 from "path";
52
+ async function ensureDir(dir) {
53
+ await fs2.mkdir(dir, { recursive: true });
54
+ }
55
+ async function writeFileSafe(filePath, content) {
56
+ const dir = path2.dirname(filePath);
57
+ await ensureDir(dir);
58
+ const tmp = filePath + ".tmp";
59
+ await fs2.writeFile(tmp, content, "utf-8");
60
+ await fs2.rename(tmp, filePath);
61
+ }
62
+ async function readFileOrNull(filePath) {
63
+ try {
64
+ return await fs2.readFile(filePath, "utf-8");
65
+ } catch (err) {
66
+ if (err.code === "ENOENT") {
67
+ return null;
68
+ }
69
+ throw err;
70
+ }
71
+ }
72
+ async function backupFile(filePath, projectRoot) {
73
+ const content = await readFileOrNull(filePath);
74
+ if (content === null) {
75
+ logger.debug(`Skip backup: ${filePath} does not exist`);
76
+ return;
77
+ }
78
+ const rel = path2.relative(projectRoot, filePath);
79
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
80
+ const backupPath = path2.join(
81
+ projectRoot,
82
+ ".teamix-evo",
83
+ ".backups",
84
+ `${rel}.${timestamp}.bak`
85
+ );
86
+ await ensureDir(path2.dirname(backupPath));
87
+ await fs2.writeFile(backupPath, content, "utf-8");
88
+ logger.debug(`Backed up ${rel} \u2192 ${path2.relative(projectRoot, backupPath)}`);
89
+ }
90
+ async function fileExists(filePath) {
91
+ try {
92
+ await fs2.access(filePath);
93
+ return true;
94
+ } catch {
95
+ return false;
96
+ }
97
+ }
98
+ var init_fs = __esm({
99
+ "src/utils/fs.ts"() {
100
+ "use strict";
101
+ init_logger();
102
+ }
103
+ });
104
+
105
+ // src/index.ts
106
+ import { Command as Command5 } from "commander";
107
+
108
+ // src/commands/design/index.ts
109
+ import { Command as Command4 } from "commander";
110
+
111
+ // src/commands/design/init.ts
112
+ import { Command } from "commander";
113
+
114
+ // src/ide/QoderAdapter.ts
115
+ var QoderAdapter = class {
116
+ name = "qoder";
117
+ getProjectRoot() {
118
+ return process.cwd();
119
+ }
120
+ detectIde() {
121
+ return true;
122
+ }
123
+ };
124
+
125
+ // src/ide/index.ts
126
+ function detectIde() {
127
+ return new QoderAdapter();
128
+ }
129
+
130
+ // src/core/registry-client.ts
131
+ init_logger();
132
+ import * as path from "path";
133
+ import * as fs from "fs/promises";
134
+ import { createRequire } from "module";
135
+ import { loadVariantManifest } from "@teamix-evo/registry";
136
+ function resolveVariantPackage(packageName, variant) {
137
+ const require2 = createRequire(import.meta.url);
138
+ const pkgJsonPath = require2.resolve(`${packageName}/package.json`);
139
+ const pkgRoot = path.dirname(pkgJsonPath);
140
+ return path.join(pkgRoot, "library", variant);
141
+ }
142
+ async function loadVariantData(packageName, variant) {
143
+ const variantDir = resolveVariantPackage(packageName, variant);
144
+ const require2 = createRequire(import.meta.url);
145
+ const pkgJsonPath = require2.resolve(`${packageName}/package.json`);
146
+ const packageRoot = path.dirname(pkgJsonPath);
147
+ logger.debug(`Resolved variant dir: ${variantDir}`);
148
+ logger.debug(`Package root: ${packageRoot}`);
149
+ const manifest = await loadVariantManifest(variantDir);
150
+ let data = {};
151
+ const dataPath = path.join(variantDir, "_data.json");
152
+ try {
153
+ const raw = await fs.readFile(dataPath, "utf-8");
154
+ data = JSON.parse(raw);
155
+ } catch (err) {
156
+ if (err.code !== "ENOENT") {
157
+ throw err;
158
+ }
159
+ logger.debug(`No _data.json found at ${dataPath}, using empty data`);
160
+ }
161
+ return { manifest, data, variantDir, packageRoot };
162
+ }
163
+
164
+ // src/core/installer.ts
165
+ init_fs();
166
+ import * as path3 from "path";
167
+ import * as fs4 from "fs/promises";
168
+
169
+ // src/utils/hash.ts
170
+ import { createHash } from "crypto";
171
+ function computeHash(content) {
172
+ const hash = createHash("sha256").update(content, "utf-8").digest("hex");
173
+ return `sha256:${hash}`;
174
+ }
175
+
176
+ // src/utils/template.ts
177
+ import Handlebars from "handlebars";
178
+ import * as fs3 from "fs/promises";
179
+ Handlebars.registerHelper("lowercase", (str) => {
180
+ return typeof str === "string" ? str.toLowerCase() : String(str ?? "").toLowerCase();
181
+ });
182
+ function renderTemplate(templateContent, data) {
183
+ const compiled = Handlebars.compile(templateContent, { noEscape: true });
184
+ return compiled(data);
185
+ }
186
+ async function loadTemplateFile(filePath) {
187
+ return fs3.readFile(filePath, "utf-8");
188
+ }
189
+
190
+ // src/core/installer.ts
191
+ init_logger();
192
+ async function installResources(options) {
193
+ const { projectRoot, manifest, data, variantDir, packageRoot } = options;
194
+ const installedResources = [];
195
+ for (const resource of manifest.resources) {
196
+ logger.debug(`Installing resource: ${resource.id} \u2192 ${resource.target}`);
197
+ if (resource.recursive) {
198
+ const results = await installRecursiveResource(
199
+ resource,
200
+ projectRoot,
201
+ data,
202
+ variantDir,
203
+ packageRoot
204
+ );
205
+ installedResources.push(...results);
206
+ } else {
207
+ const result = await installSingleResource(
208
+ resource,
209
+ projectRoot,
210
+ data,
211
+ variantDir,
212
+ packageRoot
213
+ );
214
+ installedResources.push(result);
215
+ }
216
+ }
217
+ return {
218
+ resources: installedResources,
219
+ count: installedResources.length
220
+ };
221
+ }
222
+ async function installSingleResource(resource, projectRoot, data, variantDir, packageRoot) {
223
+ const sourcePath = resolveSourcePath(resource.source, variantDir, packageRoot);
224
+ const targetPath = path3.join(projectRoot, resource.target);
225
+ let content;
226
+ if (resource.template) {
227
+ const templateContent = await loadTemplateFile(sourcePath);
228
+ content = renderTemplate(templateContent, data);
229
+ } else {
230
+ content = await fs4.readFile(sourcePath, "utf-8");
231
+ }
232
+ await writeFileSafe(targetPath, content);
233
+ const hash = computeHash(content);
234
+ logger.debug(` Written: ${resource.target} (${resource.updateStrategy})`);
235
+ return {
236
+ id: resource.id,
237
+ target: resource.target,
238
+ hash,
239
+ strategy: resource.updateStrategy
240
+ };
241
+ }
242
+ async function installRecursiveResource(resource, projectRoot, data, variantDir, packageRoot) {
243
+ const sourcePath = resolveSourcePath(resource.source, variantDir, packageRoot);
244
+ const targetDir = path3.join(projectRoot, resource.target);
245
+ const results = [];
246
+ await ensureDir(targetDir);
247
+ const entries = await walkDir(sourcePath);
248
+ for (const entry of entries) {
249
+ const relPath = path3.relative(sourcePath, entry);
250
+ let targetFile = path3.join(targetDir, relPath);
251
+ if (resource.template && targetFile.endsWith(".hbs")) {
252
+ targetFile = targetFile.slice(0, -4);
253
+ }
254
+ let content;
255
+ if (resource.template && entry.endsWith(".hbs")) {
256
+ const templateContent = await loadTemplateFile(entry);
257
+ content = renderTemplate(templateContent, data);
258
+ } else {
259
+ content = await fs4.readFile(entry, "utf-8");
260
+ }
261
+ await writeFileSafe(targetFile, content);
262
+ const hash = computeHash(content);
263
+ const targetRel = path3.relative(projectRoot, targetFile);
264
+ results.push({
265
+ id: `${resource.id}:${relPath}`,
266
+ target: targetRel,
267
+ hash,
268
+ strategy: resource.updateStrategy
269
+ });
270
+ logger.debug(` Written: ${targetRel}`);
271
+ }
272
+ return results;
273
+ }
274
+ function resolveSourcePath(source, variantDir, packageRoot) {
275
+ if (source.startsWith("_template/")) {
276
+ return path3.join(packageRoot, source);
277
+ }
278
+ return path3.join(variantDir, source);
279
+ }
280
+ async function walkDir(dir) {
281
+ const files = [];
282
+ const entries = await fs4.readdir(dir, { withFileTypes: true });
283
+ for (const entry of entries) {
284
+ const fullPath = path3.join(dir, entry.name);
285
+ if (entry.isDirectory()) {
286
+ files.push(...await walkDir(fullPath));
287
+ } else if (entry.isFile()) {
288
+ files.push(fullPath);
289
+ }
290
+ }
291
+ return files;
292
+ }
293
+
294
+ // src/core/state.ts
295
+ init_fs();
296
+ init_logger();
297
+ import * as path4 from "path";
298
+ import { validateConfig, validateInstalled } from "@teamix-evo/registry";
299
+ var TEAMIX_DIR = ".teamix-evo";
300
+ var CONFIG_FILE = "config.json";
301
+ var MANIFEST_FILE = "manifest.json";
302
+ function getTeamixDir(projectRoot) {
303
+ return path4.join(projectRoot, TEAMIX_DIR);
304
+ }
305
+ async function ensureTeamixDir(projectRoot) {
306
+ const dir = getTeamixDir(projectRoot);
307
+ await ensureDir(dir);
308
+ return dir;
309
+ }
310
+ async function readProjectConfig(projectRoot) {
311
+ const configPath = path4.join(projectRoot, TEAMIX_DIR, CONFIG_FILE);
312
+ const raw = await readFileOrNull(configPath);
313
+ if (raw === null) return null;
314
+ try {
315
+ const data = JSON.parse(raw);
316
+ const result = validateConfig(data);
317
+ if (!result.success) {
318
+ logger.warn(`Invalid config.json: ${result.error}`);
319
+ return null;
320
+ }
321
+ return result.data;
322
+ } catch (err) {
323
+ logger.warn(`Failed to parse config.json: ${err.message}`);
324
+ return null;
325
+ }
326
+ }
327
+ async function writeProjectConfig(projectRoot, config) {
328
+ const configPath = path4.join(projectRoot, TEAMIX_DIR, CONFIG_FILE);
329
+ await writeFileSafe(configPath, JSON.stringify(config, null, 2) + "\n");
330
+ logger.debug(`Wrote config \u2192 ${configPath}`);
331
+ }
332
+ async function readInstalledManifest(projectRoot) {
333
+ const manifestPath = path4.join(projectRoot, TEAMIX_DIR, MANIFEST_FILE);
334
+ const raw = await readFileOrNull(manifestPath);
335
+ if (raw === null) return null;
336
+ try {
337
+ const data = JSON.parse(raw);
338
+ const result = validateInstalled(data);
339
+ if (!result.success) {
340
+ logger.warn(`Invalid manifest.json: ${result.error}`);
341
+ return null;
342
+ }
343
+ return result.data;
344
+ } catch (err) {
345
+ logger.warn(`Failed to parse manifest.json: ${err.message}`);
346
+ return null;
347
+ }
348
+ }
349
+ async function writeInstalledManifest(projectRoot, manifest) {
350
+ const manifestPath = path4.join(projectRoot, TEAMIX_DIR, MANIFEST_FILE);
351
+ await writeFileSafe(manifestPath, JSON.stringify(manifest, null, 2) + "\n");
352
+ logger.debug(`Wrote manifest \u2192 ${manifestPath}`);
353
+ }
354
+
355
+ // src/commands/design/init.ts
356
+ init_logger();
357
+ var DEFAULT_VARIANT = "opentrek";
358
+ var DESIGN_PACKAGE = "@teamix-evo/design";
359
+ var initCommand = new Command("init").description("\u521D\u59CB\u5316\u8BBE\u8BA1\u4F53\u7CFB\u8D44\u6E90").argument("[variant]", "\u8BBE\u8BA1\u53D8\u4F53\u540D\u79F0", DEFAULT_VARIANT).action(async (variant) => {
360
+ try {
361
+ const ide = detectIde();
362
+ const projectRoot = ide.getProjectRoot();
363
+ logger.info(`Initializing design system: variant="${variant}"`);
364
+ logger.debug(`Project root: ${projectRoot}`);
365
+ logger.debug(`IDE: ${ide.name}`);
366
+ await ensureTeamixDir(projectRoot);
367
+ const existingConfig = await readProjectConfig(projectRoot);
368
+ if (existingConfig?.packages?.design) {
369
+ logger.warn(
370
+ `Design system already initialized (variant: ${existingConfig.packages.design.variant}). Use "teamix-evo design update" to update.`
371
+ );
372
+ return;
373
+ }
374
+ logger.info(`Loading variant "${variant}" from ${DESIGN_PACKAGE}...`);
375
+ const { manifest, data, variantDir, packageRoot } = await loadVariantData(DESIGN_PACKAGE, variant);
376
+ logger.debug(
377
+ `Loaded manifest: ${manifest.displayName} v${manifest.version}`
378
+ );
379
+ logger.debug(`Resources: ${manifest.resources.length}`);
380
+ logger.info("Installing resources...");
381
+ const result = await installResources({
382
+ projectRoot,
383
+ manifest,
384
+ data,
385
+ variantDir,
386
+ packageRoot
387
+ });
388
+ const config = {
389
+ $schema: "https://teamix-evo.dev/schema/config/v1.json",
390
+ schemaVersion: 1,
391
+ ide: ide.name,
392
+ packages: {
393
+ design: {
394
+ variant,
395
+ version: manifest.version
396
+ }
397
+ }
398
+ };
399
+ await writeProjectConfig(projectRoot, config);
400
+ const installedManifest = {
401
+ schemaVersion: 1,
402
+ installed: [
403
+ {
404
+ package: DESIGN_PACKAGE,
405
+ variant,
406
+ version: manifest.version,
407
+ installedAt: (/* @__PURE__ */ new Date()).toISOString(),
408
+ resources: result.resources
409
+ }
410
+ ]
411
+ };
412
+ await writeInstalledManifest(projectRoot, installedManifest);
413
+ logger.success(
414
+ `Design system initialized: ${manifest.displayName} v${manifest.version}`
415
+ );
416
+ logger.info(` Variant: ${variant}`);
417
+ logger.info(` Resources: ${result.count} files installed`);
418
+ logger.info("");
419
+ logger.info('Run "teamix-evo design update" to update resources later.');
420
+ } catch (err) {
421
+ logger.error(`Failed to initialize: ${err.message}`);
422
+ logger.debug(err.stack ?? "");
423
+ process.exitCode = 1;
424
+ }
425
+ });
426
+
427
+ // src/commands/design/update.ts
428
+ import { Command as Command2 } from "commander";
429
+
430
+ // src/core/updater.ts
431
+ init_fs();
432
+ import * as path5 from "path";
433
+ import * as fs5 from "fs/promises";
434
+ import {
435
+ getUpdateAction,
436
+ replaceManagedRegion
437
+ } from "@teamix-evo/registry";
438
+ init_logger();
439
+ async function updateResources(options) {
440
+ const {
441
+ projectRoot,
442
+ manifest,
443
+ data,
444
+ variantDir,
445
+ packageRoot,
446
+ installedManifest,
447
+ packageName
448
+ } = options;
449
+ const updatedResources = [];
450
+ const summary = { overwritten: 0, managed: 0, skipped: 0, created: 0 };
451
+ const installedPkg = installedManifest.installed.find(
452
+ (p) => p.package === packageName && p.variant === manifest.variant
453
+ );
454
+ const installedMap = /* @__PURE__ */ new Map();
455
+ if (installedPkg) {
456
+ for (const res of installedPkg.resources) {
457
+ installedMap.set(res.id, res);
458
+ }
459
+ }
460
+ for (const resource of manifest.resources) {
461
+ if (resource.recursive) {
462
+ const results = await updateRecursiveResource(
463
+ resource,
464
+ projectRoot,
465
+ data,
466
+ variantDir,
467
+ packageRoot,
468
+ installedMap,
469
+ summary
470
+ );
471
+ updatedResources.push(...results);
472
+ } else {
473
+ const result = await updateSingleResource(
474
+ resource,
475
+ projectRoot,
476
+ data,
477
+ variantDir,
478
+ packageRoot,
479
+ installedMap,
480
+ summary
481
+ );
482
+ updatedResources.push(result);
483
+ }
484
+ }
485
+ return { resources: updatedResources, summary };
486
+ }
487
+ async function updateSingleResource(resource, projectRoot, data, variantDir, packageRoot, installedMap, summary) {
488
+ const targetPath = path5.join(projectRoot, resource.target);
489
+ const exists = await fileExists(targetPath);
490
+ const installed = installedMap.get(resource.id);
491
+ const sourcePath = resolveSourcePath2(resource.source, variantDir, packageRoot);
492
+ let newContent;
493
+ if (resource.template) {
494
+ const templateContent = await loadTemplateFile(sourcePath);
495
+ newContent = renderTemplate(templateContent, data);
496
+ } else {
497
+ newContent = await fs5.readFile(sourcePath, "utf-8");
498
+ }
499
+ const newHash = computeHash(newContent);
500
+ const action = getUpdateAction(resource.updateStrategy, {
501
+ exists,
502
+ hash: newHash,
503
+ currentHash: installed?.hash
504
+ });
505
+ switch (action) {
506
+ case "skip": {
507
+ logger.debug(` Skip: ${resource.target} (${resource.updateStrategy})`);
508
+ summary.skipped++;
509
+ return installed ?? {
510
+ id: resource.id,
511
+ target: resource.target,
512
+ hash: newHash,
513
+ strategy: resource.updateStrategy
514
+ };
515
+ }
516
+ case "overwrite": {
517
+ if (exists) {
518
+ await backupFile(targetPath, projectRoot);
519
+ summary.overwritten++;
520
+ } else {
521
+ summary.created++;
522
+ }
523
+ await writeFileSafe(targetPath, newContent);
524
+ logger.debug(` ${exists ? "Overwrite" : "Create"}: ${resource.target}`);
525
+ return {
526
+ id: resource.id,
527
+ target: resource.target,
528
+ hash: newHash,
529
+ strategy: resource.updateStrategy
530
+ };
531
+ }
532
+ case "managed-update": {
533
+ const currentContent = await readFileOrNull(targetPath);
534
+ if (currentContent === null) {
535
+ await writeFileSafe(targetPath, newContent);
536
+ summary.created++;
537
+ return {
538
+ id: resource.id,
539
+ target: resource.target,
540
+ hash: computeHash(newContent),
541
+ strategy: resource.updateStrategy
542
+ };
543
+ }
544
+ let updatedContent = currentContent;
545
+ const regionIds = resource.managedRegions ?? [];
546
+ for (const regionId of regionIds) {
547
+ const regionPattern = new RegExp(
548
+ `<!-- teamix-evo:managed:start id="${escapeRegExp(regionId)}" -->([\\s\\S]*?)<!-- teamix-evo:managed:end id="${escapeRegExp(regionId)}" -->`
549
+ );
550
+ const match = newContent.match(regionPattern);
551
+ if (match) {
552
+ const regionContent = match[1].replace(/^\n/, "").replace(/\n$/, "");
553
+ try {
554
+ updatedContent = replaceManagedRegion(
555
+ updatedContent,
556
+ regionId,
557
+ regionContent
558
+ );
559
+ } catch {
560
+ logger.warn(
561
+ `Managed region "${regionId}" not found in ${resource.target}. Skipping region.`
562
+ );
563
+ }
564
+ }
565
+ }
566
+ await backupFile(targetPath, projectRoot);
567
+ await writeFileSafe(targetPath, updatedContent);
568
+ summary.managed++;
569
+ return {
570
+ id: resource.id,
571
+ target: resource.target,
572
+ hash: computeHash(updatedContent),
573
+ strategy: resource.updateStrategy
574
+ };
575
+ }
576
+ default:
577
+ summary.skipped++;
578
+ return installed ?? {
579
+ id: resource.id,
580
+ target: resource.target,
581
+ hash: newHash,
582
+ strategy: resource.updateStrategy
583
+ };
584
+ }
585
+ }
586
+ async function updateRecursiveResource(resource, projectRoot, data, variantDir, packageRoot, installedMap, summary) {
587
+ const sourcePath = resolveSourcePath2(resource.source, variantDir, packageRoot);
588
+ const targetDir = path5.join(projectRoot, resource.target);
589
+ const results = [];
590
+ if (resource.updateStrategy === "frozen") {
591
+ const anyInstalled = [...installedMap.keys()].some(
592
+ (k) => k.startsWith(`${resource.id}:`)
593
+ );
594
+ if (anyInstalled) {
595
+ summary.skipped++;
596
+ for (const [id, res] of installedMap) {
597
+ if (id.startsWith(`${resource.id}:`)) {
598
+ results.push(res);
599
+ }
600
+ }
601
+ return results;
602
+ }
603
+ }
604
+ const { ensureDir: ensureDir2 } = await Promise.resolve().then(() => (init_fs(), fs_exports));
605
+ await ensureDir2(targetDir);
606
+ const entries = await walkDir2(sourcePath);
607
+ for (const entry of entries) {
608
+ const relPath = path5.relative(sourcePath, entry);
609
+ let targetFile = path5.join(targetDir, relPath);
610
+ if (resource.template && targetFile.endsWith(".hbs")) {
611
+ targetFile = targetFile.slice(0, -4);
612
+ }
613
+ let content;
614
+ if (resource.template && entry.endsWith(".hbs")) {
615
+ const templateContent = await loadTemplateFile(entry);
616
+ content = renderTemplate(templateContent, data);
617
+ } else {
618
+ content = await fs5.readFile(entry, "utf-8");
619
+ }
620
+ await writeFileSafe(targetFile, content);
621
+ const hash = computeHash(content);
622
+ const targetRel = path5.relative(projectRoot, targetFile);
623
+ results.push({
624
+ id: `${resource.id}:${relPath}`,
625
+ target: targetRel,
626
+ hash,
627
+ strategy: resource.updateStrategy
628
+ });
629
+ summary.overwritten++;
630
+ }
631
+ return results;
632
+ }
633
+ function resolveSourcePath2(source, variantDir, packageRoot) {
634
+ if (source.startsWith("_template/")) {
635
+ return path5.join(packageRoot, source);
636
+ }
637
+ return path5.join(variantDir, source);
638
+ }
639
+ async function walkDir2(dir) {
640
+ const files = [];
641
+ const entries = await fs5.readdir(dir, { withFileTypes: true });
642
+ for (const entry of entries) {
643
+ const fullPath = path5.join(dir, entry.name);
644
+ if (entry.isDirectory()) {
645
+ files.push(...await walkDir2(fullPath));
646
+ } else if (entry.isFile()) {
647
+ files.push(fullPath);
648
+ }
649
+ }
650
+ return files;
651
+ }
652
+ function escapeRegExp(str) {
653
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
654
+ }
655
+
656
+ // src/commands/design/update.ts
657
+ init_logger();
658
+ var DESIGN_PACKAGE2 = "@teamix-evo/design";
659
+ var updateCommand = new Command2("update").description("\u66F4\u65B0\u8BBE\u8BA1\u4F53\u7CFB\u8D44\u6E90").action(async () => {
660
+ try {
661
+ const ide = detectIde();
662
+ const projectRoot = ide.getProjectRoot();
663
+ logger.info("Updating design system resources...");
664
+ const config = await readProjectConfig(projectRoot);
665
+ if (!config?.packages?.design) {
666
+ logger.error(
667
+ 'Design system not initialized. Run "teamix-evo design init" first.'
668
+ );
669
+ process.exitCode = 1;
670
+ return;
671
+ }
672
+ const { variant, version: currentVersion } = config.packages.design;
673
+ const installedManifest = await readInstalledManifest(projectRoot);
674
+ if (!installedManifest) {
675
+ logger.error(
676
+ 'No installed manifest found. Try re-initializing with "teamix-evo design init".'
677
+ );
678
+ process.exitCode = 1;
679
+ return;
680
+ }
681
+ logger.info(`Loading variant "${variant}" from ${DESIGN_PACKAGE2}...`);
682
+ const { manifest, data, variantDir, packageRoot } = await loadVariantData(DESIGN_PACKAGE2, variant);
683
+ logger.info(
684
+ `Current: v${currentVersion} \u2192 Available: v${manifest.version}`
685
+ );
686
+ const result = await updateResources({
687
+ projectRoot,
688
+ manifest,
689
+ data,
690
+ variantDir,
691
+ packageRoot,
692
+ installedManifest,
693
+ packageName: DESIGN_PACKAGE2
694
+ });
695
+ config.packages.design.version = manifest.version;
696
+ await writeProjectConfig(projectRoot, config);
697
+ const updatedManifest = { ...installedManifest };
698
+ const pkgIdx = updatedManifest.installed.findIndex(
699
+ (p) => p.package === DESIGN_PACKAGE2 && p.variant === variant
700
+ );
701
+ const pkgEntry = {
702
+ package: DESIGN_PACKAGE2,
703
+ variant,
704
+ version: manifest.version,
705
+ installedAt: (/* @__PURE__ */ new Date()).toISOString(),
706
+ resources: result.resources
707
+ };
708
+ if (pkgIdx >= 0) {
709
+ updatedManifest.installed[pkgIdx] = pkgEntry;
710
+ } else {
711
+ updatedManifest.installed.push(pkgEntry);
712
+ }
713
+ await writeInstalledManifest(projectRoot, updatedManifest);
714
+ const { summary } = result;
715
+ logger.success(
716
+ `Design system updated to v${manifest.version}`
717
+ );
718
+ logger.info(` Created: ${summary.created}`);
719
+ logger.info(` Overwritten: ${summary.overwritten}`);
720
+ logger.info(` Managed: ${summary.managed}`);
721
+ logger.info(` Skipped: ${summary.skipped}`);
722
+ } catch (err) {
723
+ logger.error(`Failed to update: ${err.message}`);
724
+ logger.debug(err.stack ?? "");
725
+ process.exitCode = 1;
726
+ }
727
+ });
728
+
729
+ // src/commands/design/list.ts
730
+ import { Command as Command3 } from "commander";
731
+ init_logger();
732
+ var listCommand = new Command3("list").description("\u5217\u51FA\u5DF2\u5B89\u88C5\u7684\u8BBE\u8BA1\u53D8\u4F53").action(async () => {
733
+ try {
734
+ const ide = detectIde();
735
+ const projectRoot = ide.getProjectRoot();
736
+ const config = await readProjectConfig(projectRoot);
737
+ if (!config?.packages?.design) {
738
+ logger.info("No design system installed.");
739
+ logger.info('Run "teamix-evo design init [variant]" to get started.');
740
+ return;
741
+ }
742
+ const { variant, version } = config.packages.design;
743
+ logger.info("Installed design system:");
744
+ logger.info(` Package: @teamix-evo/design`);
745
+ logger.info(` Variant: ${variant}`);
746
+ logger.info(` Version: ${version}`);
747
+ logger.info(` IDE: ${config.ide}`);
748
+ const manifest = await readInstalledManifest(projectRoot);
749
+ if (manifest) {
750
+ const pkg = manifest.installed.find(
751
+ (p) => p.package === "@teamix-evo/design" && p.variant === variant
752
+ );
753
+ if (pkg) {
754
+ logger.info(` Resources: ${pkg.resources.length} files`);
755
+ logger.info(
756
+ ` Installed: ${new Date(pkg.installedAt).toLocaleString()}`
757
+ );
758
+ }
759
+ }
760
+ } catch (err) {
761
+ logger.error(`Failed to list: ${err.message}`);
762
+ process.exitCode = 1;
763
+ }
764
+ });
765
+
766
+ // src/commands/design/index.ts
767
+ var designCommand = new Command4("design").description("\u7BA1\u7406\u8BBE\u8BA1\u4F53\u7CFB\u8D44\u6E90");
768
+ designCommand.addCommand(initCommand);
769
+ designCommand.addCommand(updateCommand);
770
+ designCommand.addCommand(listCommand);
771
+
772
+ // src/index.ts
773
+ var program = new Command5();
774
+ program.name("teamix-evo").description("Where ideas evolve. \u2014 AI Coding \u5957\u4EF6").version("0.0.0");
775
+ program.addCommand(designCommand);
776
+ program.parse();
777
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/logger.ts","../src/utils/fs.ts","../src/index.ts","../src/commands/design/index.ts","../src/commands/design/init.ts","../src/ide/QoderAdapter.ts","../src/ide/index.ts","../src/core/registry-client.ts","../src/core/installer.ts","../src/utils/hash.ts","../src/utils/template.ts","../src/core/state.ts","../src/commands/design/update.ts","../src/core/updater.ts","../src/commands/design/list.ts"],"sourcesContent":["import { red, yellow, cyan, green, gray } from \"kolorist\";\n\nconst isDebug = process.env.TEAMIX_DEBUG === \"1\";\n\nexport const logger = {\n info(msg: string): void {\n console.log(cyan(\"ℹ\"), msg);\n },\n\n warn(msg: string): void {\n console.warn(yellow(\"⚠\"), msg);\n },\n\n error(msg: string): void {\n console.error(red(\"✖\"), msg);\n },\n\n success(msg: string): void {\n console.log(green(\"✔\"), msg);\n },\n\n debug(msg: string): void {\n if (isDebug) {\n console.log(gray(\"⊡\"), gray(msg));\n }\n },\n};\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { logger } from \"./logger.js\";\n\n/**\n * Recursively create a directory (like mkdir -p).\n */\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\n/**\n * Atomic write: write to a .tmp file first, then rename.\n */\nexport async function writeFileSafe(\n filePath: string,\n content: string,\n): Promise<void> {\n const dir = path.dirname(filePath);\n await ensureDir(dir);\n const tmp = filePath + \".tmp\";\n await fs.writeFile(tmp, content, \"utf-8\");\n await fs.rename(tmp, filePath);\n}\n\n/**\n * Read a file or return null if it doesn't exist.\n */\nexport async function readFileOrNull(\n filePath: string,\n): Promise<string | null> {\n try {\n return await fs.readFile(filePath, \"utf-8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw err;\n }\n}\n\n/**\n * Create a backup of a file under `.teamix-evo/.backups/`.\n */\nexport async function backupFile(\n filePath: string,\n projectRoot: string,\n): Promise<void> {\n const content = await readFileOrNull(filePath);\n if (content === null) {\n logger.debug(`Skip backup: ${filePath} does not exist`);\n return;\n }\n\n const rel = path.relative(projectRoot, filePath);\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const backupPath = path.join(\n projectRoot,\n \".teamix-evo\",\n \".backups\",\n `${rel}.${timestamp}.bak`,\n );\n\n await ensureDir(path.dirname(backupPath));\n await fs.writeFile(backupPath, content, \"utf-8\");\n logger.debug(`Backed up ${rel} → ${path.relative(projectRoot, backupPath)}`);\n}\n\n/**\n * Check whether a file exists.\n */\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n","import { Command } from \"commander\";\nimport { designCommand } from \"./commands/design/index.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"teamix-evo\")\n .description(\"Where ideas evolve. — AI Coding 套件\")\n .version(\"0.0.0\");\n\nprogram.addCommand(designCommand);\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport { initCommand } from \"./init.js\";\nimport { updateCommand } from \"./update.js\";\nimport { listCommand } from \"./list.js\";\n\nexport const designCommand = new Command(\"design\")\n .description(\"管理设计体系资源\");\n\ndesignCommand.addCommand(initCommand);\ndesignCommand.addCommand(updateCommand);\ndesignCommand.addCommand(listCommand);\n","import { Command } from \"commander\";\nimport type { ProjectConfig, InstalledManifest } from \"@teamix-evo/registry\";\nimport { detectIde } from \"../../ide/index.js\";\nimport { loadVariantData } from \"../../core/registry-client.js\";\nimport { installResources } from \"../../core/installer.js\";\nimport {\n ensureTeamixDir,\n readProjectConfig,\n writeProjectConfig,\n writeInstalledManifest,\n} from \"../../core/state.js\";\nimport { logger } from \"../../utils/logger.js\";\n\nconst DEFAULT_VARIANT = \"opentrek\";\nconst DESIGN_PACKAGE = \"@teamix-evo/design\";\n\nexport const initCommand = new Command(\"init\")\n .description(\"初始化设计体系资源\")\n .argument(\"[variant]\", \"设计变体名称\", DEFAULT_VARIANT)\n .action(async (variant: string) => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n logger.info(`Initializing design system: variant=\"${variant}\"`);\n logger.debug(`Project root: ${projectRoot}`);\n logger.debug(`IDE: ${ide.name}`);\n\n // 1. Ensure .teamix-evo/ directory\n await ensureTeamixDir(projectRoot);\n\n // 2. Check if already initialized\n const existingConfig = await readProjectConfig(projectRoot);\n if (existingConfig?.packages?.design) {\n logger.warn(\n `Design system already initialized (variant: ${existingConfig.packages.design.variant}). ` +\n `Use \"teamix-evo design update\" to update.`,\n );\n return;\n }\n\n // 3. Load variant manifest and data\n logger.info(`Loading variant \"${variant}\" from ${DESIGN_PACKAGE}...`);\n const { manifest, data, variantDir, packageRoot } =\n await loadVariantData(DESIGN_PACKAGE, variant);\n\n logger.debug(\n `Loaded manifest: ${manifest.displayName} v${manifest.version}`,\n );\n logger.debug(`Resources: ${manifest.resources.length}`);\n\n // 4. Install resources\n logger.info(\"Installing resources...\");\n const result = await installResources({\n projectRoot,\n manifest,\n data,\n variantDir,\n packageRoot,\n });\n\n // 5. Write config.json\n const config: ProjectConfig = {\n $schema: \"https://teamix-evo.dev/schema/config/v1.json\",\n schemaVersion: 1,\n ide: ide.name,\n packages: {\n design: {\n variant,\n version: manifest.version,\n },\n },\n };\n await writeProjectConfig(projectRoot, config);\n\n // 6. Write manifest.json\n const installedManifest: InstalledManifest = {\n schemaVersion: 1,\n installed: [\n {\n package: DESIGN_PACKAGE,\n variant,\n version: manifest.version,\n installedAt: new Date().toISOString(),\n resources: result.resources,\n },\n ],\n };\n await writeInstalledManifest(projectRoot, installedManifest);\n\n // 7. Success output\n logger.success(\n `Design system initialized: ${manifest.displayName} v${manifest.version}`,\n );\n logger.info(` Variant: ${variant}`);\n logger.info(` Resources: ${result.count} files installed`);\n logger.info(\"\");\n logger.info('Run \"teamix-evo design update\" to update resources later.');\n } catch (err) {\n logger.error(`Failed to initialize: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? \"\");\n process.exitCode = 1;\n }\n });\n","import type { IdeAdapter } from \"./IdeAdapter.js\";\n\n/**\n * Qoder IDE adapter — MVP default implementation.\n */\nexport class QoderAdapter implements IdeAdapter {\n name = \"qoder\";\n\n getProjectRoot(): string {\n return process.cwd();\n }\n\n detectIde(): boolean {\n // MVP: default to true. Future: check environment variables\n return true;\n }\n}\n","import type { IdeAdapter } from \"./IdeAdapter.js\";\nimport { QoderAdapter } from \"./QoderAdapter.js\";\n\nexport type { IdeAdapter } from \"./IdeAdapter.js\";\n\n/**\n * Detect the current IDE environment and return the appropriate adapter.\n * MVP: always returns QoderAdapter.\n */\nexport function detectIde(): IdeAdapter {\n return new QoderAdapter();\n}\n","import * as path from \"node:path\";\nimport * as fs from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport type { VariantManifest } from \"@teamix-evo/registry\";\nimport { loadVariantManifest } from \"@teamix-evo/registry\";\nimport { logger } from \"../utils/logger.js\";\n\n/**\n * Resolve the directory path for a variant inside a package.\n * MVP: resolves from local node_modules using require.resolve.\n *\n * @param packageName - e.g. \"@teamix-evo/design\"\n * @param variant - e.g. \"opentrek\"\n * @returns Absolute path to the variant directory (library/<variant>/)\n */\nexport function resolveVariantPackage(\n packageName: string,\n variant: string,\n): string {\n const require = createRequire(import.meta.url);\n // Resolve the package.json of the package to find its root\n const pkgJsonPath = require.resolve(`${packageName}/package.json`);\n const pkgRoot = path.dirname(pkgJsonPath);\n return path.join(pkgRoot, \"library\", variant);\n}\n\n/**\n * Load the variant manifest and _data.json for template rendering.\n *\n * @param packageName - e.g. \"@teamix-evo/design\"\n * @param variant - e.g. \"opentrek\"\n * @returns manifest and data for template rendering\n */\nexport async function loadVariantData(\n packageName: string,\n variant: string,\n): Promise<{\n manifest: VariantManifest;\n data: Record<string, unknown>;\n variantDir: string;\n packageRoot: string;\n}> {\n const variantDir = resolveVariantPackage(packageName, variant);\n const require = createRequire(import.meta.url);\n const pkgJsonPath = require.resolve(`${packageName}/package.json`);\n const packageRoot = path.dirname(pkgJsonPath);\n\n logger.debug(`Resolved variant dir: ${variantDir}`);\n logger.debug(`Package root: ${packageRoot}`);\n\n // Load manifest\n const manifest = await loadVariantManifest(variantDir);\n\n // Load _data.json\n let data: Record<string, unknown> = {};\n const dataPath = path.join(variantDir, \"_data.json\");\n try {\n const raw = await fs.readFile(dataPath, \"utf-8\");\n data = JSON.parse(raw) as Record<string, unknown>;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw err;\n }\n logger.debug(`No _data.json found at ${dataPath}, using empty data`);\n }\n\n return { manifest, data, variantDir, packageRoot };\n}\n","import * as path from \"node:path\";\nimport * as fs from \"node:fs/promises\";\nimport type {\n VariantManifest,\n Resource,\n InstalledResource,\n} from \"@teamix-evo/registry\";\nimport { writeFileSafe, ensureDir } from \"../utils/fs.js\";\nimport { computeHash } from \"../utils/hash.js\";\nimport { renderTemplate, loadTemplateFile } from \"../utils/template.js\";\nimport { logger } from \"../utils/logger.js\";\n\nexport interface InstallOptions {\n /** Project root directory */\n projectRoot: string;\n /** The variant manifest */\n manifest: VariantManifest;\n /** Template data for Handlebars rendering */\n data: Record<string, unknown>;\n /** Absolute path to the variant directory (where source files live) */\n variantDir: string;\n /** Absolute path to the package root (for resolving _template/ sources) */\n packageRoot: string;\n}\n\nexport interface InstallResult {\n /** Successfully installed resource records */\n resources: InstalledResource[];\n /** Number of resources installed */\n count: number;\n}\n\n/**\n * Install resources from a variant manifest into the project.\n */\nexport async function installResources(\n options: InstallOptions,\n): Promise<InstallResult> {\n const { projectRoot, manifest, data, variantDir, packageRoot } = options;\n const installedResources: InstalledResource[] = [];\n\n for (const resource of manifest.resources) {\n logger.debug(`Installing resource: ${resource.id} → ${resource.target}`);\n\n if (resource.recursive) {\n const results = await installRecursiveResource(\n resource,\n projectRoot,\n data,\n variantDir,\n packageRoot,\n );\n installedResources.push(...results);\n } else {\n const result = await installSingleResource(\n resource,\n projectRoot,\n data,\n variantDir,\n packageRoot,\n );\n installedResources.push(result);\n }\n }\n\n return {\n resources: installedResources,\n count: installedResources.length,\n };\n}\n\n/**\n * Install a single (non-recursive) resource.\n */\nasync function installSingleResource(\n resource: Resource,\n projectRoot: string,\n data: Record<string, unknown>,\n variantDir: string,\n packageRoot: string,\n): Promise<InstalledResource> {\n const sourcePath = resolveSourcePath(resource.source, variantDir, packageRoot);\n const targetPath = path.join(projectRoot, resource.target);\n\n let content: string;\n if (resource.template) {\n const templateContent = await loadTemplateFile(sourcePath);\n content = renderTemplate(templateContent, data);\n } else {\n content = await fs.readFile(sourcePath, \"utf-8\");\n }\n\n await writeFileSafe(targetPath, content);\n const hash = computeHash(content);\n\n logger.debug(` Written: ${resource.target} (${resource.updateStrategy})`);\n\n return {\n id: resource.id,\n target: resource.target,\n hash,\n strategy: resource.updateStrategy,\n };\n}\n\n/**\n * Install a recursive resource (directory).\n */\nasync function installRecursiveResource(\n resource: Resource,\n projectRoot: string,\n data: Record<string, unknown>,\n variantDir: string,\n packageRoot: string,\n): Promise<InstalledResource[]> {\n const sourcePath = resolveSourcePath(resource.source, variantDir, packageRoot);\n const targetDir = path.join(projectRoot, resource.target);\n const results: InstalledResource[] = [];\n\n await ensureDir(targetDir);\n\n const entries = await walkDir(sourcePath);\n for (const entry of entries) {\n const relPath = path.relative(sourcePath, entry);\n let targetFile = path.join(targetDir, relPath);\n\n // Strip .hbs extension from target if template\n if (resource.template && targetFile.endsWith(\".hbs\")) {\n targetFile = targetFile.slice(0, -4);\n }\n\n let content: string;\n if (resource.template && entry.endsWith(\".hbs\")) {\n const templateContent = await loadTemplateFile(entry);\n content = renderTemplate(templateContent, data);\n } else {\n content = await fs.readFile(entry, \"utf-8\");\n }\n\n await writeFileSafe(targetFile, content);\n const hash = computeHash(content);\n const targetRel = path.relative(projectRoot, targetFile);\n\n results.push({\n id: `${resource.id}:${relPath}`,\n target: targetRel,\n hash,\n strategy: resource.updateStrategy,\n });\n\n logger.debug(` Written: ${targetRel}`);\n }\n\n return results;\n}\n\n/**\n * Resolve a source path — handles _template/ prefix by resolving from packageRoot.\n */\nfunction resolveSourcePath(\n source: string,\n variantDir: string,\n packageRoot: string,\n): string {\n if (source.startsWith(\"_template/\")) {\n return path.join(packageRoot, source);\n }\n return path.join(variantDir, source);\n}\n\n/**\n * Recursively walk a directory and return all file paths.\n */\nasync function walkDir(dir: string): Promise<string[]> {\n const files: string[] = [];\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await walkDir(fullPath)));\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n","import { createHash } from \"node:crypto\";\n\n/**\n * Compute a SHA-256 hash of the given content.\n * Returns a string in the format \"sha256:<hex>\".\n */\nexport function computeHash(content: string): string {\n const hash = createHash(\"sha256\").update(content, \"utf-8\").digest(\"hex\");\n return `sha256:${hash}`;\n}\n","import Handlebars from \"handlebars\";\nimport * as fs from \"node:fs/promises\";\n\n// Register custom helpers\nHandlebars.registerHelper(\"lowercase\", (str: unknown) => {\n return typeof str === \"string\" ? str.toLowerCase() : String(str ?? \"\").toLowerCase();\n});\n\n/**\n * Render a Handlebars template string with the given data.\n */\nexport function renderTemplate(\n templateContent: string,\n data: Record<string, unknown>,\n): string {\n const compiled = Handlebars.compile(templateContent, { noEscape: true });\n return compiled(data);\n}\n\n/**\n * Load template file content from disk.\n */\nexport async function loadTemplateFile(filePath: string): Promise<string> {\n return fs.readFile(filePath, \"utf-8\");\n}\n","import * as path from \"node:path\";\nimport type { ProjectConfig, InstalledManifest } from \"@teamix-evo/registry\";\nimport { validateConfig, validateInstalled } from \"@teamix-evo/registry\";\nimport { readFileOrNull, writeFileSafe, ensureDir } from \"../utils/fs.js\";\nimport { logger } from \"../utils/logger.js\";\n\nconst TEAMIX_DIR = \".teamix-evo\";\nconst CONFIG_FILE = \"config.json\";\nconst MANIFEST_FILE = \"manifest.json\";\n\n/**\n * Get the .teamix-evo directory path for a project.\n */\nexport function getTeamixDir(projectRoot: string): string {\n return path.join(projectRoot, TEAMIX_DIR);\n}\n\n/**\n * Ensure the .teamix-evo directory exists.\n */\nexport async function ensureTeamixDir(projectRoot: string): Promise<string> {\n const dir = getTeamixDir(projectRoot);\n await ensureDir(dir);\n return dir;\n}\n\n/**\n * Read the project config from .teamix-evo/config.json.\n * Returns null if the file does not exist.\n */\nexport async function readProjectConfig(\n projectRoot: string,\n): Promise<ProjectConfig | null> {\n const configPath = path.join(projectRoot, TEAMIX_DIR, CONFIG_FILE);\n const raw = await readFileOrNull(configPath);\n if (raw === null) return null;\n\n try {\n const data = JSON.parse(raw);\n const result = validateConfig(data);\n if (!result.success) {\n logger.warn(`Invalid config.json: ${result.error}`);\n return null;\n }\n return result.data;\n } catch (err) {\n logger.warn(`Failed to parse config.json: ${(err as Error).message}`);\n return null;\n }\n}\n\n/**\n * Write the project config to .teamix-evo/config.json.\n */\nexport async function writeProjectConfig(\n projectRoot: string,\n config: ProjectConfig,\n): Promise<void> {\n const configPath = path.join(projectRoot, TEAMIX_DIR, CONFIG_FILE);\n await writeFileSafe(configPath, JSON.stringify(config, null, 2) + \"\\n\");\n logger.debug(`Wrote config → ${configPath}`);\n}\n\n/**\n * Read the installed manifest from .teamix-evo/manifest.json.\n * Returns null if the file does not exist.\n */\nexport async function readInstalledManifest(\n projectRoot: string,\n): Promise<InstalledManifest | null> {\n const manifestPath = path.join(projectRoot, TEAMIX_DIR, MANIFEST_FILE);\n const raw = await readFileOrNull(manifestPath);\n if (raw === null) return null;\n\n try {\n const data = JSON.parse(raw);\n const result = validateInstalled(data);\n if (!result.success) {\n logger.warn(`Invalid manifest.json: ${result.error}`);\n return null;\n }\n return result.data;\n } catch (err) {\n logger.warn(`Failed to parse manifest.json: ${(err as Error).message}`);\n return null;\n }\n}\n\n/**\n * Write the installed manifest to .teamix-evo/manifest.json.\n */\nexport async function writeInstalledManifest(\n projectRoot: string,\n manifest: InstalledManifest,\n): Promise<void> {\n const manifestPath = path.join(projectRoot, TEAMIX_DIR, MANIFEST_FILE);\n await writeFileSafe(manifestPath, JSON.stringify(manifest, null, 2) + \"\\n\");\n logger.debug(`Wrote manifest → ${manifestPath}`);\n}\n","import { Command } from \"commander\";\nimport { detectIde } from \"../../ide/index.js\";\nimport { loadVariantData } from \"../../core/registry-client.js\";\nimport { updateResources } from \"../../core/updater.js\";\nimport {\n readProjectConfig,\n readInstalledManifest,\n writeProjectConfig,\n writeInstalledManifest,\n} from \"../../core/state.js\";\nimport { logger } from \"../../utils/logger.js\";\n\nconst DESIGN_PACKAGE = \"@teamix-evo/design\";\n\nexport const updateCommand = new Command(\"update\")\n .description(\"更新设计体系资源\")\n .action(async () => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n logger.info(\"Updating design system resources...\");\n\n // 1. Read existing config\n const config = await readProjectConfig(projectRoot);\n if (!config?.packages?.design) {\n logger.error(\n 'Design system not initialized. Run \"teamix-evo design init\" first.',\n );\n process.exitCode = 1;\n return;\n }\n\n const { variant, version: currentVersion } = config.packages.design;\n\n // 2. Read installed manifest\n const installedManifest = await readInstalledManifest(projectRoot);\n if (!installedManifest) {\n logger.error(\n \"No installed manifest found. Try re-initializing with \" +\n '\"teamix-evo design init\".',\n );\n process.exitCode = 1;\n return;\n }\n\n // 3. Load latest variant data\n logger.info(`Loading variant \"${variant}\" from ${DESIGN_PACKAGE}...`);\n const { manifest, data, variantDir, packageRoot } =\n await loadVariantData(DESIGN_PACKAGE, variant);\n\n logger.info(\n `Current: v${currentVersion} → Available: v${manifest.version}`,\n );\n\n // 4. Update resources\n const result = await updateResources({\n projectRoot,\n manifest,\n data,\n variantDir,\n packageRoot,\n installedManifest,\n packageName: DESIGN_PACKAGE,\n });\n\n // 5. Update config version\n config.packages.design.version = manifest.version;\n await writeProjectConfig(projectRoot, config);\n\n // 6. Update installed manifest\n const updatedManifest = { ...installedManifest };\n const pkgIdx = updatedManifest.installed.findIndex(\n (p) => p.package === DESIGN_PACKAGE && p.variant === variant,\n );\n const pkgEntry = {\n package: DESIGN_PACKAGE,\n variant,\n version: manifest.version,\n installedAt: new Date().toISOString(),\n resources: result.resources,\n };\n if (pkgIdx >= 0) {\n updatedManifest.installed[pkgIdx] = pkgEntry;\n } else {\n updatedManifest.installed.push(pkgEntry);\n }\n await writeInstalledManifest(projectRoot, updatedManifest);\n\n // 7. Output summary\n const { summary } = result;\n logger.success(\n `Design system updated to v${manifest.version}`,\n );\n logger.info(` Created: ${summary.created}`);\n logger.info(` Overwritten: ${summary.overwritten}`);\n logger.info(` Managed: ${summary.managed}`);\n logger.info(` Skipped: ${summary.skipped}`);\n } catch (err) {\n logger.error(`Failed to update: ${(err as Error).message}`);\n logger.debug((err as Error).stack ?? \"\");\n process.exitCode = 1;\n }\n });\n","import * as path from \"node:path\";\nimport * as fs from \"node:fs/promises\";\nimport type {\n VariantManifest,\n Resource,\n InstalledResource,\n InstalledManifest,\n} from \"@teamix-evo/registry\";\nimport {\n getUpdateAction,\n replaceManagedRegion,\n} from \"@teamix-evo/registry\";\nimport {\n writeFileSafe,\n readFileOrNull,\n fileExists,\n backupFile,\n} from \"../utils/fs.js\";\nimport { computeHash } from \"../utils/hash.js\";\nimport { renderTemplate, loadTemplateFile } from \"../utils/template.js\";\nimport { logger } from \"../utils/logger.js\";\n\nexport interface UpdateOptions {\n /** Project root directory */\n projectRoot: string;\n /** The new variant manifest */\n manifest: VariantManifest;\n /** Template data for Handlebars rendering */\n data: Record<string, unknown>;\n /** Absolute path to the variant directory */\n variantDir: string;\n /** Absolute path to the package root */\n packageRoot: string;\n /** Previously installed manifest */\n installedManifest: InstalledManifest;\n /** Full package name e.g. \"@teamix-evo/design\" */\n packageName: string;\n}\n\nexport interface UpdateResult {\n /** Updated resource records */\n resources: InstalledResource[];\n /** Summary of actions taken */\n summary: {\n overwritten: number;\n managed: number;\n skipped: number;\n created: number;\n };\n}\n\n/**\n * Update resources based on their update strategy.\n */\nexport async function updateResources(\n options: UpdateOptions,\n): Promise<UpdateResult> {\n const {\n projectRoot,\n manifest,\n data,\n variantDir,\n packageRoot,\n installedManifest,\n packageName,\n } = options;\n\n const updatedResources: InstalledResource[] = [];\n const summary = { overwritten: 0, managed: 0, skipped: 0, created: 0 };\n\n // Build a lookup of currently installed resources\n const installedPkg = installedManifest.installed.find(\n (p) => p.package === packageName && p.variant === manifest.variant,\n );\n const installedMap = new Map<string, InstalledResource>();\n if (installedPkg) {\n for (const res of installedPkg.resources) {\n installedMap.set(res.id, res);\n }\n }\n\n for (const resource of manifest.resources) {\n if (resource.recursive) {\n // For recursive resources, just regenerate fully\n const results = await updateRecursiveResource(\n resource,\n projectRoot,\n data,\n variantDir,\n packageRoot,\n installedMap,\n summary,\n );\n updatedResources.push(...results);\n } else {\n const result = await updateSingleResource(\n resource,\n projectRoot,\n data,\n variantDir,\n packageRoot,\n installedMap,\n summary,\n );\n updatedResources.push(result);\n }\n }\n\n return { resources: updatedResources, summary };\n}\n\nasync function updateSingleResource(\n resource: Resource,\n projectRoot: string,\n data: Record<string, unknown>,\n variantDir: string,\n packageRoot: string,\n installedMap: Map<string, InstalledResource>,\n summary: UpdateResult[\"summary\"],\n): Promise<InstalledResource> {\n const targetPath = path.join(projectRoot, resource.target);\n const exists = await fileExists(targetPath);\n const installed = installedMap.get(resource.id);\n\n // Render new content\n const sourcePath = resolveSourcePath(resource.source, variantDir, packageRoot);\n let newContent: string;\n if (resource.template) {\n const templateContent = await loadTemplateFile(sourcePath);\n newContent = renderTemplate(templateContent, data);\n } else {\n newContent = await fs.readFile(sourcePath, \"utf-8\");\n }\n\n const newHash = computeHash(newContent);\n\n const action = getUpdateAction(resource.updateStrategy, {\n exists,\n hash: newHash,\n currentHash: installed?.hash,\n });\n\n switch (action) {\n case \"skip\": {\n logger.debug(` Skip: ${resource.target} (${resource.updateStrategy})`);\n summary.skipped++;\n return installed ?? {\n id: resource.id,\n target: resource.target,\n hash: newHash,\n strategy: resource.updateStrategy,\n };\n }\n\n case \"overwrite\": {\n if (exists) {\n await backupFile(targetPath, projectRoot);\n summary.overwritten++;\n } else {\n summary.created++;\n }\n await writeFileSafe(targetPath, newContent);\n logger.debug(` ${exists ? \"Overwrite\" : \"Create\"}: ${resource.target}`);\n return {\n id: resource.id,\n target: resource.target,\n hash: newHash,\n strategy: resource.updateStrategy,\n };\n }\n\n case \"managed-update\": {\n const currentContent = await readFileOrNull(targetPath);\n if (currentContent === null) {\n // File was deleted by user — recreate\n await writeFileSafe(targetPath, newContent);\n summary.created++;\n return {\n id: resource.id,\n target: resource.target,\n hash: computeHash(newContent),\n strategy: resource.updateStrategy,\n };\n }\n\n // Replace managed regions from new content into current content\n let updatedContent = currentContent;\n const regionIds = resource.managedRegions ?? [];\n\n for (const regionId of regionIds) {\n // Extract managed region content from the new rendered content\n const regionPattern = new RegExp(\n `<!-- teamix-evo:managed:start id=\"${escapeRegExp(regionId)}\" -->([\\\\s\\\\S]*?)<!-- teamix-evo:managed:end id=\"${escapeRegExp(regionId)}\" -->`,\n );\n const match = newContent.match(regionPattern);\n if (match) {\n const regionContent = match[1].replace(/^\\n/, \"\").replace(/\\n$/, \"\");\n try {\n updatedContent = replaceManagedRegion(\n updatedContent,\n regionId,\n regionContent,\n );\n } catch {\n logger.warn(\n `Managed region \"${regionId}\" not found in ${resource.target}. Skipping region.`,\n );\n }\n }\n }\n\n await backupFile(targetPath, projectRoot);\n await writeFileSafe(targetPath, updatedContent);\n summary.managed++;\n\n return {\n id: resource.id,\n target: resource.target,\n hash: computeHash(updatedContent),\n strategy: resource.updateStrategy,\n };\n }\n\n default:\n summary.skipped++;\n return installed ?? {\n id: resource.id,\n target: resource.target,\n hash: newHash,\n strategy: resource.updateStrategy,\n };\n }\n}\n\nasync function updateRecursiveResource(\n resource: Resource,\n projectRoot: string,\n data: Record<string, unknown>,\n variantDir: string,\n packageRoot: string,\n installedMap: Map<string, InstalledResource>,\n summary: UpdateResult[\"summary\"],\n): Promise<InstalledResource[]> {\n const sourcePath = resolveSourcePath(resource.source, variantDir, packageRoot);\n const targetDir = path.join(projectRoot, resource.target);\n const results: InstalledResource[] = [];\n\n // For frozen recursive resources, skip entirely if already installed\n if (resource.updateStrategy === \"frozen\") {\n const anyInstalled = [...installedMap.keys()].some((k) =>\n k.startsWith(`${resource.id}:`),\n );\n if (anyInstalled) {\n summary.skipped++;\n // Return existing installed entries\n for (const [id, res] of installedMap) {\n if (id.startsWith(`${resource.id}:`)) {\n results.push(res);\n }\n }\n return results;\n }\n }\n\n const { ensureDir } = await import(\"../utils/fs.js\");\n await ensureDir(targetDir);\n\n const entries = await walkDir(sourcePath);\n for (const entry of entries) {\n const relPath = path.relative(sourcePath, entry);\n let targetFile = path.join(targetDir, relPath);\n\n if (resource.template && targetFile.endsWith(\".hbs\")) {\n targetFile = targetFile.slice(0, -4);\n }\n\n let content: string;\n if (resource.template && entry.endsWith(\".hbs\")) {\n const templateContent = await loadTemplateFile(entry);\n content = renderTemplate(templateContent, data);\n } else {\n content = await fs.readFile(entry, \"utf-8\");\n }\n\n await writeFileSafe(targetFile, content);\n const hash = computeHash(content);\n const targetRel = path.relative(projectRoot, targetFile);\n\n results.push({\n id: `${resource.id}:${relPath}`,\n target: targetRel,\n hash,\n strategy: resource.updateStrategy,\n });\n\n summary.overwritten++;\n }\n\n return results;\n}\n\nfunction resolveSourcePath(\n source: string,\n variantDir: string,\n packageRoot: string,\n): string {\n if (source.startsWith(\"_template/\")) {\n return path.join(packageRoot, source);\n }\n return path.join(variantDir, source);\n}\n\nasync function walkDir(dir: string): Promise<string[]> {\n const files: string[] = [];\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await walkDir(fullPath)));\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n return files;\n}\n\nfunction escapeRegExp(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import { Command } from \"commander\";\nimport { detectIde } from \"../../ide/index.js\";\nimport { readProjectConfig, readInstalledManifest } from \"../../core/state.js\";\nimport { logger } from \"../../utils/logger.js\";\n\nexport const listCommand = new Command(\"list\")\n .description(\"列出已安装的设计变体\")\n .action(async () => {\n try {\n const ide = detectIde();\n const projectRoot = ide.getProjectRoot();\n\n const config = await readProjectConfig(projectRoot);\n if (!config?.packages?.design) {\n logger.info(\"No design system installed.\");\n logger.info('Run \"teamix-evo design init [variant]\" to get started.');\n return;\n }\n\n const { variant, version } = config.packages.design;\n\n logger.info(\"Installed design system:\");\n logger.info(` Package: @teamix-evo/design`);\n logger.info(` Variant: ${variant}`);\n logger.info(` Version: ${version}`);\n logger.info(` IDE: ${config.ide}`);\n\n // Show resource count from installed manifest\n const manifest = await readInstalledManifest(projectRoot);\n if (manifest) {\n const pkg = manifest.installed.find(\n (p) => p.package === \"@teamix-evo/design\" && p.variant === variant,\n );\n if (pkg) {\n logger.info(` Resources: ${pkg.resources.length} files`);\n logger.info(\n ` Installed: ${new Date(pkg.installedAt).toLocaleString()}`,\n );\n }\n }\n } catch (err) {\n logger.error(`Failed to list: ${(err as Error).message}`);\n process.exitCode = 1;\n }\n });\n"],"mappings":"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","names":["fs","path","Command","Command","require","path","fs","fs","path","Command","path","fs","resolveSourcePath","ensureDir","walkDir","DESIGN_PACKAGE","Command","Command","Command","Command","Command"]}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "teamix-evo",
3
+ "version": "0.1.0",
4
+ "description": "AI Coding toolkit for product development - CLI entry point",
5
+ "type": "module",
6
+ "bin": {
7
+ "teamix-evo": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsup",
14
+ "dev": "tsup --watch",
15
+ "test": "vitest run",
16
+ "test:watch": "vitest",
17
+ "typecheck": "tsc --noEmit",
18
+ "lint": "tsc --noEmit"
19
+ },
20
+ "dependencies": {
21
+ "@teamix-evo/design": "workspace:*",
22
+ "@teamix-evo/registry": "workspace:*",
23
+ "commander": "^12.0.0",
24
+ "@clack/prompts": "^0.8.0",
25
+ "handlebars": "^4.7.0",
26
+ "kolorist": "^1.8.0"
27
+ },
28
+ "devDependencies": {
29
+ "@types/node": "^20.0.0",
30
+ "tsup": "^8.0.0",
31
+ "typescript": "^5.5.0",
32
+ "vitest": "^2.0.0"
33
+ }
34
+ }