@miniidealab/openlogos 0.9.27 → 0.9.29

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.
Files changed (102) hide show
  1. package/claude-plugin-template/.claude-plugin/plugin.json +1 -1
  2. package/claude-plugin-template/skills/product-designer/SKILL.md +26 -1
  3. package/claude-plugin-template/skills/ui-ux-pro-max/LICENSE +21 -0
  4. package/claude-plugin-template/skills/ui-ux-pro-max/SKILL.md +379 -0
  5. package/claude-plugin-template/skills/ui-ux-pro-max/UPSTREAM.md +43 -0
  6. package/claude-plugin-template/skills/ui-ux-pro-max/data/charts.csv +26 -0
  7. package/claude-plugin-template/skills/ui-ux-pro-max/data/colors.csv +97 -0
  8. package/claude-plugin-template/skills/ui-ux-pro-max/data/icons.csv +101 -0
  9. package/claude-plugin-template/skills/ui-ux-pro-max/data/landing.csv +31 -0
  10. package/claude-plugin-template/skills/ui-ux-pro-max/data/products.csv +97 -0
  11. package/claude-plugin-template/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  12. package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  13. package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  14. package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  15. package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  16. package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  17. package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  18. package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  19. package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  20. package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  21. package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  22. package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  23. package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  24. package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  25. package/claude-plugin-template/skills/ui-ux-pro-max/data/styles.csv +68 -0
  26. package/claude-plugin-template/skills/ui-ux-pro-max/data/typography.csv +58 -0
  27. package/claude-plugin-template/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  28. package/claude-plugin-template/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  29. package/claude-plugin-template/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
  30. package/claude-plugin-template/skills/ui-ux-pro-max/scripts/core.py +253 -0
  31. package/claude-plugin-template/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
  32. package/claude-plugin-template/skills/ui-ux-pro-max/scripts/search.py +114 -0
  33. package/dist/commands/adopt.d.ts +5 -0
  34. package/dist/commands/adopt.d.ts.map +1 -0
  35. package/dist/commands/adopt.js +121 -0
  36. package/dist/commands/adopt.js.map +1 -0
  37. package/dist/commands/detect.d.ts +9 -0
  38. package/dist/commands/detect.d.ts.map +1 -1
  39. package/dist/commands/detect.js +13 -11
  40. package/dist/commands/detect.js.map +1 -1
  41. package/dist/commands/init.d.ts +3 -1
  42. package/dist/commands/init.d.ts.map +1 -1
  43. package/dist/commands/init.js +87 -2
  44. package/dist/commands/init.js.map +1 -1
  45. package/dist/commands/launch.d.ts.map +1 -1
  46. package/dist/commands/launch.js +28 -0
  47. package/dist/commands/launch.js.map +1 -1
  48. package/dist/commands/next.d.ts +1 -0
  49. package/dist/commands/next.d.ts.map +1 -1
  50. package/dist/commands/next.js +51 -9
  51. package/dist/commands/next.js.map +1 -1
  52. package/dist/commands/status.d.ts +5 -0
  53. package/dist/commands/status.d.ts.map +1 -1
  54. package/dist/commands/status.js +84 -59
  55. package/dist/commands/status.js.map +1 -1
  56. package/dist/commands/verify.d.ts.map +1 -1
  57. package/dist/commands/verify.js +15 -10
  58. package/dist/commands/verify.js.map +1 -1
  59. package/dist/i18n.d.ts.map +1 -1
  60. package/dist/i18n.js +4 -0
  61. package/dist/i18n.js.map +1 -1
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +24 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/lib/project-yaml.d.ts +35 -0
  66. package/dist/lib/project-yaml.d.ts.map +1 -0
  67. package/dist/lib/project-yaml.js +227 -0
  68. package/dist/lib/project-yaml.js.map +1 -0
  69. package/package.json +1 -1
  70. package/skills/product-designer/SKILL.en.md +26 -1
  71. package/skills/product-designer/SKILL.md +26 -1
  72. package/skills/ui-ux-pro-max/LICENSE +21 -0
  73. package/skills/ui-ux-pro-max/SKILL.md +379 -0
  74. package/skills/ui-ux-pro-max/UPSTREAM.md +43 -0
  75. package/skills/ui-ux-pro-max/data/charts.csv +26 -0
  76. package/skills/ui-ux-pro-max/data/colors.csv +97 -0
  77. package/skills/ui-ux-pro-max/data/icons.csv +101 -0
  78. package/skills/ui-ux-pro-max/data/landing.csv +31 -0
  79. package/skills/ui-ux-pro-max/data/products.csv +97 -0
  80. package/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  81. package/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  82. package/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  83. package/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  84. package/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  85. package/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  86. package/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  87. package/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  88. package/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  89. package/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  90. package/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  91. package/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  92. package/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  93. package/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  94. package/skills/ui-ux-pro-max/data/styles.csv +68 -0
  95. package/skills/ui-ux-pro-max/data/typography.csv +58 -0
  96. package/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  97. package/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  98. package/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
  99. package/skills/ui-ux-pro-max/scripts/core.py +253 -0
  100. package/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
  101. package/skills/ui-ux-pro-max/scripts/search.py +114 -0
  102. package/spec/cli-json-output.md +36 -2
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ UI/UX Pro Max Search - BM25 search engine for UI/UX style guides
5
+ Usage: python search.py "<query>" [--domain <domain>] [--stack <stack>] [--max-results 3]
6
+ python search.py "<query>" --design-system [-p "Project Name"]
7
+ python search.py "<query>" --design-system --persist [-p "Project Name"] [--page "dashboard"]
8
+
9
+ Domains: style, prompt, color, chart, landing, product, ux, typography
10
+ Stacks: html-tailwind, react, nextjs
11
+
12
+ Persistence (Master + Overrides pattern):
13
+ --persist Save design system to design-system/MASTER.md
14
+ --page Also create a page-specific override file in design-system/pages/
15
+ """
16
+
17
+ import argparse
18
+ import sys
19
+ import io
20
+ from core import CSV_CONFIG, AVAILABLE_STACKS, MAX_RESULTS, search, search_stack
21
+ from design_system import generate_design_system, persist_design_system
22
+
23
+ # Force UTF-8 for stdout/stderr to handle emojis on Windows (cp1252 default)
24
+ if sys.stdout.encoding and sys.stdout.encoding.lower() != 'utf-8':
25
+ sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
26
+ if sys.stderr.encoding and sys.stderr.encoding.lower() != 'utf-8':
27
+ sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
28
+
29
+
30
+ def format_output(result):
31
+ """Format results for Claude consumption (token-optimized)"""
32
+ if "error" in result:
33
+ return f"Error: {result['error']}"
34
+
35
+ output = []
36
+ if result.get("stack"):
37
+ output.append(f"## UI Pro Max Stack Guidelines")
38
+ output.append(f"**Stack:** {result['stack']} | **Query:** {result['query']}")
39
+ else:
40
+ output.append(f"## UI Pro Max Search Results")
41
+ output.append(f"**Domain:** {result['domain']} | **Query:** {result['query']}")
42
+ output.append(f"**Source:** {result['file']} | **Found:** {result['count']} results\n")
43
+
44
+ for i, row in enumerate(result['results'], 1):
45
+ output.append(f"### Result {i}")
46
+ for key, value in row.items():
47
+ value_str = str(value)
48
+ if len(value_str) > 300:
49
+ value_str = value_str[:300] + "..."
50
+ output.append(f"- **{key}:** {value_str}")
51
+ output.append("")
52
+
53
+ return "\n".join(output)
54
+
55
+
56
+ if __name__ == "__main__":
57
+ parser = argparse.ArgumentParser(description="UI Pro Max Search")
58
+ parser.add_argument("query", help="Search query")
59
+ parser.add_argument("--domain", "-d", choices=list(CSV_CONFIG.keys()), help="Search domain")
60
+ parser.add_argument("--stack", "-s", choices=AVAILABLE_STACKS, help="Stack-specific search (html-tailwind, react, nextjs)")
61
+ parser.add_argument("--max-results", "-n", type=int, default=MAX_RESULTS, help="Max results (default: 3)")
62
+ parser.add_argument("--json", action="store_true", help="Output as JSON")
63
+ # Design system generation
64
+ parser.add_argument("--design-system", "-ds", action="store_true", help="Generate complete design system recommendation")
65
+ parser.add_argument("--project-name", "-p", type=str, default=None, help="Project name for design system output")
66
+ parser.add_argument("--format", "-f", choices=["ascii", "markdown"], default="ascii", help="Output format for design system")
67
+ # Persistence (Master + Overrides pattern)
68
+ parser.add_argument("--persist", action="store_true", help="Save design system to design-system/MASTER.md (creates hierarchical structure)")
69
+ parser.add_argument("--page", type=str, default=None, help="Create page-specific override file in design-system/pages/")
70
+ parser.add_argument("--output-dir", "-o", type=str, default=None, help="Output directory for persisted files (default: current directory)")
71
+
72
+ args = parser.parse_args()
73
+
74
+ # Design system takes priority
75
+ if args.design_system:
76
+ result = generate_design_system(
77
+ args.query,
78
+ args.project_name,
79
+ args.format,
80
+ persist=args.persist,
81
+ page=args.page,
82
+ output_dir=args.output_dir
83
+ )
84
+ print(result)
85
+
86
+ # Print persistence confirmation
87
+ if args.persist:
88
+ project_slug = args.project_name.lower().replace(' ', '-') if args.project_name else "default"
89
+ print("\n" + "=" * 60)
90
+ print(f"✅ Design system persisted to design-system/{project_slug}/")
91
+ print(f" 📄 design-system/{project_slug}/MASTER.md (Global Source of Truth)")
92
+ if args.page:
93
+ page_filename = args.page.lower().replace(' ', '-')
94
+ print(f" 📄 design-system/{project_slug}/pages/{page_filename}.md (Page Overrides)")
95
+ print("")
96
+ print(f"📖 Usage: When building a page, check design-system/{project_slug}/pages/[page].md first.")
97
+ print(f" If exists, its rules override MASTER.md. Otherwise, use MASTER.md.")
98
+ print("=" * 60)
99
+ # Stack search
100
+ elif args.stack:
101
+ result = search_stack(args.query, args.stack, args.max_results)
102
+ if args.json:
103
+ import json
104
+ print(json.dumps(result, indent=2, ensure_ascii=False))
105
+ else:
106
+ print(format_output(result))
107
+ # Domain search
108
+ else:
109
+ result = search(args.query, args.domain, args.max_results)
110
+ if args.json:
111
+ import json
112
+ print(json.dumps(result, indent=2, ensure_ascii=False))
113
+ else:
114
+ print(format_output(result))
@@ -0,0 +1,5 @@
1
+ export declare function adopt(name?: string, options?: {
2
+ locale?: string;
3
+ aiTool?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=adopt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adopt.d.ts","sourceRoot":"","sources":["../../src/commands/adopt.ts"],"names":[],"mappings":"AAgFA,wBAAsB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,iBAmExF"}
@@ -0,0 +1,121 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { createInterface } from 'node:readline';
4
+ import { parseAiTool, detectProjectName, createLogosConfig, createAdoptLogosProject, createAgentsMd, chooseAiTool, deployAiToolAssets, deploySpecs, expandAiTools, resolveDocsAiToolForTarget, } from './init.js';
5
+ const DIRECTORIES = [
6
+ 'logos/resources/prd/1-product-requirements',
7
+ 'logos/resources/prd/2-product-design/1-feature-specs',
8
+ 'logos/resources/prd/2-product-design/2-page-design',
9
+ 'logos/resources/prd/3-technical-plan/1-architecture',
10
+ 'logos/resources/prd/3-technical-plan/2-scenario-implementation',
11
+ 'logos/resources/prd/3-technical-plan/3-deployment',
12
+ 'logos/resources/api',
13
+ 'logos/resources/database',
14
+ 'logos/resources/test',
15
+ 'logos/resources/test/smoke',
16
+ 'logos/resources/scenario',
17
+ 'logos/resources/implementation',
18
+ 'logos/resources/verify',
19
+ 'logos/resources/reference',
20
+ 'logos/changes',
21
+ 'logos/changes/archive',
22
+ ];
23
+ function isTTY() {
24
+ return Boolean(process.stdin.isTTY);
25
+ }
26
+ async function chooseLocale() {
27
+ if (!isTTY())
28
+ return 'zh';
29
+ console.log('\nChoose language / 选择语言:');
30
+ console.log(' 1. 中文 (default)');
31
+ console.log(' 2. English\n');
32
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
33
+ return await new Promise((resolve) => {
34
+ rl.question('Your choice [1/2] (default: 1): ', (answer) => {
35
+ rl.close();
36
+ resolve(answer === '2' ? 'en' : 'zh');
37
+ });
38
+ });
39
+ }
40
+ function writeInstructionFiles(root, locale, rawAiTool) {
41
+ writeFileSync(join(root, 'AGENTS.md'), createAgentsMd(locale, resolveDocsAiToolForTarget(rawAiTool, 'agents'), 'agents', true));
42
+ writeFileSync(join(root, 'CLAUDE.md'), createAgentsMd(locale, resolveDocsAiToolForTarget(rawAiTool, 'claude'), 'claude', true));
43
+ }
44
+ function ensureDirectories(root) {
45
+ for (const dir of DIRECTORIES) {
46
+ const fullPath = join(root, dir);
47
+ mkdirSync(fullPath, { recursive: true });
48
+ const gitkeep = join(fullPath, '.gitkeep');
49
+ if (!existsSync(gitkeep)) {
50
+ writeFileSync(gitkeep, '');
51
+ }
52
+ }
53
+ }
54
+ function detectSourceLabel(root) {
55
+ if (existsSync(join(root, 'package.json')))
56
+ return 'package.json';
57
+ if (existsSync(join(root, 'Cargo.toml')))
58
+ return 'Cargo.toml';
59
+ if (existsSync(join(root, 'pyproject.toml')))
60
+ return 'pyproject.toml';
61
+ return 'directory';
62
+ }
63
+ export async function adopt(name, options) {
64
+ const root = process.cwd();
65
+ const configPath = join(root, 'logos', 'logos.config.json');
66
+ const yamlPath = join(root, 'logos', 'logos-project.yaml');
67
+ if (existsSync(configPath)) {
68
+ console.error('✗ 该项目已初始化(logos/logos.config.json 已存在)');
69
+ console.error(' 若要重新配置,请先备份并删除 logos/ 目录。');
70
+ process.exit(1);
71
+ }
72
+ const locale = options?.locale === 'en'
73
+ ? 'en'
74
+ : options?.locale === 'zh'
75
+ ? 'zh'
76
+ : await chooseLocale();
77
+ let aiTool;
78
+ if (options?.aiTool !== undefined) {
79
+ const parsedAiTool = parseAiTool(options.aiTool);
80
+ if (!parsedAiTool) {
81
+ console.error(`Error: unsupported AI tool "${options.aiTool}".`);
82
+ console.error('Supported values: claude-code, opencode, codex, cursor, other, all');
83
+ process.exit(1);
84
+ }
85
+ aiTool = parsedAiTool;
86
+ }
87
+ else {
88
+ aiTool = await chooseAiTool(locale);
89
+ }
90
+ const detected = detectProjectName(root);
91
+ const projectName = name?.trim() || detected.name;
92
+ const sourceLabel = detectSourceLabel(root);
93
+ console.log('\n$ openlogos adopt\n');
94
+ console.log(`? 检测到已有项目:${projectName}(来自 ${sourceLabel})`);
95
+ console.log(`? 文档语言 (locale):${locale}`);
96
+ console.log(`? AI 工具:${aiTool}\n`);
97
+ console.log('✓ 读取项目信息完成\n');
98
+ ensureDirectories(root);
99
+ console.log('✓ 创建 logos/ 标准目录结构');
100
+ writeFileSync(configPath, createLogosConfig(projectName, locale, aiTool));
101
+ console.log('✓ 写入 logos.config.json');
102
+ writeFileSync(yamlPath, createAdoptLogosProject(projectName, locale));
103
+ console.log('✓ 写入 logos-project.yaml(bootstrap: skipped, lifecycle: launched)');
104
+ writeInstructionFiles(root, locale, aiTool);
105
+ console.log('✓ 写入 AGENTS.md / CLAUDE.md');
106
+ const deployTools = expandAiTools(aiTool);
107
+ deployAiToolAssets(root, deployTools, locale, true, 'deployed');
108
+ const specResult = deploySpecs(root);
109
+ if (specResult && specResult.count > 0) {
110
+ console.log(`✓ ${specResult.count} specs deployed to logos/spec/`);
111
+ }
112
+ console.log('\n🎉 已有项目接入完成!\n');
113
+ console.log('项目已进入快速接入模式(bootstrap: skipped):');
114
+ console.log(' · Phase 1~3 文档基线已跳过,不强制要求');
115
+ console.log(' · 模块生命周期直接设为 launched\n');
116
+ console.log('建议的下一步:先补充项目基线文档');
117
+ console.log(' → openlogos change add-baseline-docs');
118
+ console.log(' 在变更提案中逐步补写需求、架构、场景、测试用例,');
119
+ console.log(' 把 TDD 思想贯彻到每一次迭代中。\n');
120
+ }
121
+ //# sourceMappingURL=adopt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adopt.js","sourceRoot":"","sources":["../../src/commands/adopt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAEL,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,0BAA0B,GAC3B,MAAM,WAAW,CAAC;AAGnB,MAAM,WAAW,GAAG;IAClB,4CAA4C;IAC5C,sDAAsD;IACtD,oDAAoD;IACpD,qDAAqD;IACrD,gEAAgE;IAChE,mDAAmD;IACnD,qBAAqB;IACrB,0BAA0B;IAC1B,sBAAsB;IACtB,4BAA4B;IAC5B,0BAA0B;IAC1B,gCAAgC;IAChC,wBAAwB;IACxB,2BAA2B;IAC3B,eAAe;IACf,uBAAuB;CACxB,CAAC;AAEF,SAAS,KAAK;IACZ,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,YAAY;IACzB,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAE1B,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAE9B,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,OAAO,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QAC3C,EAAE,CAAC,QAAQ,CAAC,kCAAkC,EAAE,CAAC,MAAM,EAAE,EAAE;YACzD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY,EAAE,MAAc,EAAE,SAAkB;IAC7E,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,cAAc,CAAC,MAAM,EAAE,0BAA0B,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAChI,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,cAAc,CAAC,MAAM,EAAE,0BAA0B,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;AAClI,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACjC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAAE,OAAO,cAAc,CAAC;IAClE,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IAC9D,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAAE,OAAO,gBAAgB,CAAC;IACtE,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAa,EAAE,OAA8C;IACvF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAE3D,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAW,OAAO,EAAE,MAAM,KAAK,IAAI;QAC7C,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;YACxB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,MAAM,YAAY,EAAE,CAAC;IAE3B,IAAI,MAAc,CAAC;IACnB,IAAI,OAAO,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,+BAA+B,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;YACjE,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;YACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,GAAG,YAAY,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC;IAClD,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAE5C,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,aAAa,WAAW,OAAO,WAAW,GAAG,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,IAAI,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAE5B,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAElC,aAAa,CAAC,UAAU,EAAE,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAEtC,aAAa,CAAC,QAAQ,EAAE,uBAAuB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAEhF,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAE1C,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1C,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAChE,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,UAAU,IAAI,UAAU,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,KAAK,gCAAgC,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;AACxC,CAAC"}
@@ -1,4 +1,10 @@
1
1
  import type { OutputFormat } from '../lib/json-output.js';
2
+ import type { YamlDiagnostics } from '../lib/project-yaml.js';
3
+ interface DetectModuleInfo {
4
+ id: string;
5
+ name: string;
6
+ lifecycle: 'initial' | 'launched';
7
+ }
2
8
  export interface DetectData {
3
9
  cli: {
4
10
  version: string;
@@ -8,13 +14,16 @@ export interface DetectData {
8
14
  name: string;
9
15
  locale: string;
10
16
  lifecycle: string;
17
+ modules?: DetectModuleInfo[];
11
18
  description: string;
12
19
  source_roots: {
13
20
  src: string[];
14
21
  test: string[];
15
22
  } | null;
16
23
  } | null;
24
+ yaml_diagnostics: YamlDiagnostics | null;
17
25
  }
18
26
  export declare function collectDetectData(root: string): DetectData;
19
27
  export declare function detect(format?: OutputFormat): void;
28
+ export {};
20
29
  //# sourceMappingURL=detect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/commands/detect.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE;QACH,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE;YAAE,GAAG,EAAE,MAAM,EAAE,CAAC;YAAC,IAAI,EAAE,MAAM,EAAE,CAAA;SAAE,GAAG,IAAI,CAAC;KACxD,GAAG,IAAI,CAAC;CACV;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAsC1D;AAED,wBAAgB,MAAM,CAAC,MAAM,GAAE,YAAqB,QA4BnD"}
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/commands/detect.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE;QACH,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;QAC7B,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE;YAAE,GAAG,EAAE,MAAM,EAAE,CAAC;YAAC,IAAI,EAAE,MAAM,EAAE,CAAA;SAAE,GAAG,IAAI,CAAC;KACxD,GAAG,IAAI,CAAC;IACT,gBAAgB,EAAE,eAAe,GAAG,IAAI,CAAC;CAC1C;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAyC1D;AAED,wBAAgB,MAAM,CAAC,MAAM,GAAE,YAAqB,QA4BnD"}
@@ -1,30 +1,31 @@
1
1
  import { existsSync, readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
- import { parse as parseYaml } from 'yaml';
4
3
  import { VERSION, makeEnvelope } from '../lib/json-output.js';
4
+ import { readProjectYaml } from '../lib/project-yaml.js';
5
5
  export function collectDetectData(root) {
6
6
  const configPath = join(root, 'logos', 'logos.config.json');
7
7
  let project = null;
8
+ let yamlDiagnostics = null;
8
9
  if (existsSync(configPath)) {
9
10
  try {
10
11
  const config = JSON.parse(readFileSync(configPath, 'utf-8'));
11
12
  // Derive lifecycle from modules
12
13
  let lifecycle = 'initial';
13
- const yamlPath = join(root, 'logos', 'logos-project.yaml');
14
- if (existsSync(yamlPath)) {
15
- try {
16
- const yaml = parseYaml(readFileSync(yamlPath, 'utf-8'));
17
- if (Array.isArray(yaml?.modules) &&
18
- yaml.modules.some(m => m.lifecycle === 'launched')) {
19
- lifecycle = 'launched';
20
- }
21
- }
22
- catch { /* ignore */ }
14
+ const projectYaml = readProjectYaml(root);
15
+ yamlDiagnostics = projectYaml.yaml_diagnostics;
16
+ const modules = projectYaml.data?.modules?.map(m => ({
17
+ id: m.id,
18
+ name: m.name,
19
+ lifecycle: m.lifecycle === 'launched' ? 'launched' : 'initial',
20
+ }));
21
+ if (modules?.some(m => m.lifecycle === 'launched')) {
22
+ lifecycle = 'launched';
23
23
  }
24
24
  project = {
25
25
  name: config.name ?? '',
26
26
  locale: config.locale ?? 'en',
27
27
  lifecycle,
28
+ ...(modules !== undefined ? { modules } : {}),
28
29
  description: config.description ?? '',
29
30
  source_roots: config.sourceRoots ?? null,
30
31
  };
@@ -37,6 +38,7 @@ export function collectDetectData(root) {
37
38
  node_version: process.version,
38
39
  },
39
40
  project,
41
+ yaml_diagnostics: yamlDiagnostics,
40
42
  };
41
43
  }
42
44
  export function detect(format = 'text') {
@@ -1 +1 @@
1
- {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/commands/detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAiB9D,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAE5D,IAAI,OAAO,GAA0B,IAAI,CAAC;IAC1C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YAE7D,gCAAgC;YAChC,IAAI,SAAS,GAAG,SAAS,CAAC;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC;YAC3D,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;oBACxD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;wBAC3B,IAAI,CAAC,OAAyC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,UAAU,CAAC,EAAE,CAAC;wBAC1F,SAAS,GAAG,UAAU,CAAC;oBACzB,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAC1B,CAAC;YAED,OAAO,GAAG;gBACR,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;gBACvB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;gBAC7B,SAAS;gBACT,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE;gBACrC,YAAY,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;aACzC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO;QACL,GAAG,EAAE;YACH,OAAO,EAAE,OAAO;YAChB,YAAY,EAAE,OAAO,CAAC,OAAO;SAC9B;QACD,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,SAAuB,MAAM;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAErC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,wBAAwB;IACxB,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC;IAElD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClI,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/commands/detect.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,8 @@ interface NameResult {
12
12
  }
13
13
  export declare function readConfigName(root: string): NameResult | null;
14
14
  export declare function detectProjectName(root: string): NameResult;
15
- export declare const SKILL_NAMES: readonly ["project-init", "prd-writer", "product-designer", "architecture-designer", "scenario-architect", "api-designer", "db-designer", "deployment-designer", "test-writer", "test-orchestrator", "code-implementor", "code-reviewer", "change-writer", "deployment-executor", "merge-executor"];
15
+ export declare function chooseAiTool(locale: Locale): Promise<AiTool>;
16
+ export declare const SKILL_NAMES: readonly ["project-init", "prd-writer", "product-designer", "ui-ux-pro-max", "architecture-designer", "scenario-architect", "api-designer", "db-designer", "deployment-designer", "test-writer", "test-orchestrator", "code-implementor", "code-reviewer", "change-writer", "deployment-executor", "merge-executor"];
16
17
  export declare function findSkillsSource(): string | null;
17
18
  export declare function findSpecSource(): string | null;
18
19
  export declare function findOpenCodePluginTemplateSource(): string | null;
@@ -54,6 +55,7 @@ export declare function deploySkills(root: string, aiTool: AiTool, locale?: Loca
54
55
  export type Lifecycle = 'initial' | 'active';
55
56
  export declare function createLogosConfig(name: string, locale: Locale, aiTool?: AiTool): string;
56
57
  export declare function createLogosProject(name: string, locale: Locale): string;
58
+ export declare function createAdoptLogosProject(name: string, locale: Locale): string;
57
59
  export declare function createAgentsMd(locale: Locale, aiTool?: AiTool, target?: 'agents' | 'claude', isLaunched?: boolean): string;
58
60
  export declare function init(name?: string, options?: {
59
61
  locale?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { mkdirSync, writeFileSync, readFileSync, existsSync, copyFileSync, readd
2
2
  import { join, basename, dirname } from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
4
  import { createInterface } from 'node:readline';
5
+ import { execSync } from 'node:child_process';
5
6
  import { parse as parseYaml } from 'yaml';
6
7
  import { t, conventionsForYaml, conventionsForAgentsMd } from '../i18n.js';
7
8
  const ALL_DEPLOYABLE_AI_TOOLS = ['claude-code', 'opencode', 'codex', 'cursor'];
@@ -159,7 +160,7 @@ async function chooseLocale() {
159
160
  const answer = await askQuestion('Your choice [1/2] (default: 1): ');
160
161
  return answer === '2' ? 'zh' : 'en';
161
162
  }
162
- async function chooseAiTool(locale) {
163
+ export async function chooseAiTool(locale) {
163
164
  if (!isTTY())
164
165
  return detectAiToolFromEnv();
165
166
  console.log(`\n${t(locale, 'init.aiToolHeader')}`);
@@ -186,6 +187,7 @@ export const SKILL_NAMES = [
186
187
  'project-init',
187
188
  'prd-writer',
188
189
  'product-designer',
190
+ 'ui-ux-pro-max',
189
191
  'architecture-designer',
190
192
  'scenario-architect',
191
193
  'api-designer',
@@ -199,10 +201,14 @@ export const SKILL_NAMES = [
199
201
  'deployment-executor',
200
202
  'merge-executor',
201
203
  ];
204
+ const MULTI_FILE_SKILLS = new Set([
205
+ 'ui-ux-pro-max',
206
+ ]);
202
207
  const SKILL_DESCRIPTIONS = {
203
208
  'project-init': { en: 'Project initialization and structure setup', zh: '项目初始化与结构搭建' },
204
209
  'prd-writer': { en: 'Requirements document authoring', zh: '需求文档编写' },
205
210
  'product-designer': { en: 'Product design and prototyping', zh: '产品设计与原型' },
211
+ 'ui-ux-pro-max': { en: 'UI/UX design intelligence (67 styles / 96 palettes / 57 font pairings / 25 charts / 13 stacks). Auto-invoked by product-designer in Phase 2 for GUI products (Web / Mobile / Desktop).', zh: 'UI/UX 设计智能(67 风格 / 96 调色板 / 57 字体配对 / 25 图表 / 13 技术栈)。Phase 2 处理 GUI 类产品(Web / Mobile / Desktop)设计时由 product-designer 自动调用。' },
206
212
  'architecture-designer': { en: 'Technical architecture and technology selection', zh: '技术架构与技术选型' },
207
213
  'scenario-architect': { en: 'Business scenario modeling and sequence diagrams', zh: '业务场景建模与时序图' },
208
214
  'api-designer': { en: 'OpenAPI specification design', zh: 'OpenAPI 规格设计' },
@@ -689,10 +695,50 @@ export function createCodexSkillContent(skillName, content) {
689
695
  const description = SKILL_DESCRIPTIONS[skillName]?.en ?? skillName;
690
696
  return `---\nname: ${JSON.stringify(skillName)}\ndescription: ${JSON.stringify(description)}\n---\n\n${content}`;
691
697
  }
698
+ function copyDirRecursive(src, dest) {
699
+ mkdirSync(dest, { recursive: true });
700
+ for (const entry of readdirSync(src, { withFileTypes: true })) {
701
+ const srcPath = join(src, entry.name);
702
+ const destPath = join(dest, entry.name);
703
+ if (entry.isDirectory()) {
704
+ copyDirRecursive(srcPath, destPath);
705
+ }
706
+ else if (entry.isFile()) {
707
+ copyFileSync(srcPath, destPath);
708
+ }
709
+ }
710
+ }
711
+ function deployMultiFileSkillAssets(source, root) {
712
+ const logosSkillsDir = join(root, 'logos', 'skills');
713
+ for (const name of MULTI_FILE_SKILLS) {
714
+ const srcDir = join(source, name);
715
+ if (!existsSync(srcDir))
716
+ continue;
717
+ copyDirRecursive(srcDir, join(logosSkillsDir, name));
718
+ }
719
+ }
720
+ function isPython3Available() {
721
+ try {
722
+ execSync('python3 --version', { stdio: 'ignore' });
723
+ return true;
724
+ }
725
+ catch {
726
+ return false;
727
+ }
728
+ }
729
+ function maybePrintPythonHint(locale) {
730
+ if (isPython3Available())
731
+ return;
732
+ const yellow = (s) => `\x1b[33m${s}\x1b[0m`;
733
+ console.log('');
734
+ console.log(yellow(t(locale, 'init.pythonMissingHeader')));
735
+ console.log(t(locale, 'init.pythonMissingBody'));
736
+ }
692
737
  export function deploySkills(root, aiTool, locale = 'en', isLaunched = false, skillsSource) {
693
738
  const source = skillsSource ?? findSkillsSource();
694
739
  if (!source || !existsSync(source))
695
740
  return null;
741
+ deployMultiFileSkillAssets(source, root);
696
742
  let count = 0;
697
743
  if (aiTool === 'cursor') {
698
744
  const targetDir = join(root, '.cursor', 'rules');
@@ -760,7 +806,8 @@ function generateActiveSkillsSection(locale, aiTool, target) {
760
806
  const basePath = skillBasePath(aiTool, target);
761
807
  for (const name of SKILL_NAMES) {
762
808
  const desc = SKILL_DESCRIPTIONS[name]?.[locale] ?? SKILL_DESCRIPTIONS[name]?.en ?? name;
763
- section += `- \`${basePath}/${name}/SKILL.md\` ${desc}\n`;
809
+ const skillBase = MULTI_FILE_SKILLS.has(name) ? 'logos/skills' : basePath;
810
+ section += `- \`${skillBase}/${name}/SKILL.md\` — ${desc}\n`;
764
811
  }
765
812
  return section;
766
813
  }
@@ -998,6 +1045,37 @@ modules:
998
1045
 
999
1046
  resource_index: []
1000
1047
 
1048
+ ${conventionsForYaml(locale)}
1049
+ `;
1050
+ }
1051
+ export function createAdoptLogosProject(name, locale) {
1052
+ return `project:
1053
+ name: "${name}"
1054
+ description: ""
1055
+ methodology: "OpenLogos"
1056
+
1057
+ tech_stack: {}
1058
+
1059
+ scenario_counter:
1060
+ next_id: 1
1061
+
1062
+ modules:
1063
+ - id: core
1064
+ name: ${locale === 'zh' ? '核心功能' : 'Core'}
1065
+ lifecycle: launched
1066
+ bootstrap: skipped
1067
+ skip_phases: [api, database, scenario]
1068
+ deployment_required: true
1069
+
1070
+ deployment_gates:
1071
+ core:
1072
+ deployment_required: true
1073
+ smoke_required: true
1074
+ environments:
1075
+ - staging
1076
+
1077
+ resource_index: []
1078
+
1001
1079
  ${conventionsForYaml(locale)}
1002
1080
  `;
1003
1081
  }
@@ -1206,6 +1284,12 @@ export async function init(name, options) {
1206
1284
  }
1207
1285
  console.error('Error: logos/logos.config.json already exists in current directory.');
1208
1286
  console.error('This directory has already been initialized as an OpenLogos project.');
1287
+ const hasManifest = existsSync(join(root, 'package.json'))
1288
+ || existsSync(join(root, 'Cargo.toml'))
1289
+ || existsSync(join(root, 'pyproject.toml'));
1290
+ if (hasManifest) {
1291
+ console.error('Tip: If this is an existing project, use `openlogos adopt` instead.');
1292
+ }
1209
1293
  console.error('Use `openlogos init --ai-tool <tool>` to add a target AI tool, or `openlogos sync` to refresh the current configuration.');
1210
1294
  process.exit(1);
1211
1295
  }
@@ -1262,5 +1346,6 @@ export async function init(name, options) {
1262
1346
  console.log(nameHint);
1263
1347
  console.log(t(locale, 'init.step2'));
1264
1348
  console.log(t(locale, 'init.step3') + '\n');
1349
+ maybePrintPythonHint(locale);
1265
1350
  }
1266
1351
  //# sourceMappingURL=init.js.map