@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))
@@ -53,11 +53,22 @@ openlogos detect --format json # JSON 格式
53
53
  "name": "my-project", // 项目名
54
54
  "locale": "zh", // 语言设置
55
55
  "lifecycle": "launched", // "initial" | "launched"
56
+ "modules": [
57
+ {
58
+ "id": "core",
59
+ "name": "核心功能",
60
+ "lifecycle": "launched"
61
+ }
62
+ ],
56
63
  "description": "项目描述", // 项目描述
57
64
  "source_roots": null | { // 源代码根目录,null 表示未配置
58
65
  "src": ["src"], // 业务代码根目录列表
59
66
  "test": ["test"] // 测试代码根目录列表
60
67
  }
68
+ },
69
+ "yaml_diagnostics": null | {
70
+ "parse_status": "recovered",
71
+ "messages": ["logos-project.yaml 存在可恢复的解析错误"]
61
72
  }
62
73
  }
63
74
  ```
@@ -71,11 +82,23 @@ openlogos detect --format json # JSON 格式
71
82
  | `project` | object \| null | 是 | 若当前目录含 `logos/logos.config.json` 则返回项目信息,否则 null |
72
83
  | `project.name` | string | 是 | 项目名(来自 config) |
73
84
  | `project.locale` | string | 是 | 项目语言设置 |
74
- | `project.lifecycle` | string | 是 | 项目生命周期阶段 |
85
+ | `project.lifecycle` | string | 是 | 项目生命周期阶段;由 `project.modules` 派生,任一模块为 `launched` 时项目也必须为 `launched` |
86
+ | `project.modules` | array | 否 | 模块注册表;存在 `logos-project.yaml` 的 `modules[]` 时返回。即使 YAML 存在可恢复解析错误,也不得省略此字段 |
87
+ | `project.modules[].id` | string | 是 | 模块标识符 |
88
+ | `project.modules[].name` | string | 是 | 模块名称 |
89
+ | `project.modules[].lifecycle` | string | 是 | 模块生命周期:`"initial"` 或 `"launched"` |
75
90
  | `project.description` | string | 是 | 项目描述 |
76
91
  | `project.source_roots` | object \| null | 是 | 源代码根目录配置;未配置时为 null |
77
92
  | `project.source_roots.src` | string[] | 是 | 业务代码根目录列表 |
78
93
  | `project.source_roots.test` | string[] | 是 | 测试代码根目录列表 |
94
+ | `yaml_diagnostics` | object \| null | 否 | `logos-project.yaml` 的解析诊断;存在可恢复/不可恢复错误时返回 |
95
+ | `yaml_diagnostics.parse_status` | string | 是 | `"recovered"` 或 `"error"`;`recovered` 表示已从 AST 恢复可用的 `modules` 等数据 |
96
+ | `yaml_diagnostics.messages` | string[] | 是 | 诊断消息摘要 |
97
+
98
+ ### 2.4 解析语义
99
+
100
+ - 当 `yaml_diagnostics.parse_status = "recovered"` 时,`project.modules` 必须保留,`project.lifecycle` 必须按恢复后的模块状态派生。
101
+ - 当 `yaml_diagnostics.parse_status = "error"` 时,CLI 必须返回明确诊断消息,不得静默伪装成正常的 `initial` 项目。
79
102
 
80
103
  ---
81
104
 
@@ -188,6 +211,10 @@ openlogos status --format json # JSON 格式
188
211
  "source_roots": null | { // 源代码根目录,null 表示未配置
189
212
  "src": ["src"],
190
213
  "test": ["test"]
214
+ },
215
+ "yaml_diagnostics": null | {
216
+ "parse_status": "recovered",
217
+ "messages": ["logos-project.yaml 存在可恢复的解析错误"]
191
218
  }
192
219
  }
193
220
  ```
@@ -238,8 +265,15 @@ openlogos status --format json # JSON 格式
238
265
  | `all_done` | boolean | 是 | 是否全部阶段已完成(skipped 阶段不阻塞) |
239
266
  | `lifecycle` | string | 是 | 项目生命周期(`initial` 或 `launched`,由模块状态派生) |
240
267
  | `source_roots` | object \| null | 是 | 源代码根目录配置;未配置时为 null |
268
+ | `yaml_diagnostics` | object \| null | 否 | `logos-project.yaml` 的解析诊断;存在可恢复/不可恢复错误时返回 |
269
+ | `yaml_diagnostics.parse_status` | string | 是 | `"recovered"` 或 `"error"`;`recovered` 表示已从 AST 恢复可用的 `modules` 等数据 |
270
+ | `yaml_diagnostics.messages` | string[] | 是 | 诊断消息摘要 |
271
+
272
+ ### 3.4 解析语义
273
+
274
+ `yaml_diagnostics.parse_status = "recovered"` 时,`modules` 必须保留,`lifecycle` 必须按恢复后的模块状态派生,不得因为 YAML 局部损坏而退回 `initial`。若无法恢复任何模块信息,则 CLI 必须返回明确的 `yaml_diagnostics`,而不是静默吞错。
241
275
 
242
- ### 3.4 冲突语义
276
+ ### 3.5 冲突语义
243
277
 
244
278
  `deployment_decision_conflict=true` 表示 CLI 检测到活跃提案的 `proposal.md` 部署影响声明与 `tasks.md` 的 `[deploy]` section 不一致。客户端必须将其视为阻塞态,提示用户修正提案或任务清单,不得继续展示部署、smoke 或归档主动作。
245
279