@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.
- package/claude-plugin-template/.claude-plugin/plugin.json +1 -1
- package/claude-plugin-template/skills/product-designer/SKILL.md +26 -1
- package/claude-plugin-template/skills/ui-ux-pro-max/LICENSE +21 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/SKILL.md +379 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/UPSTREAM.md +43 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/styles.csv +68 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/scripts/core.py +253 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/claude-plugin-template/skills/ui-ux-pro-max/scripts/search.py +114 -0
- package/dist/commands/adopt.d.ts +5 -0
- package/dist/commands/adopt.d.ts.map +1 -0
- package/dist/commands/adopt.js +121 -0
- package/dist/commands/adopt.js.map +1 -0
- package/dist/commands/detect.d.ts +9 -0
- package/dist/commands/detect.d.ts.map +1 -1
- package/dist/commands/detect.js +13 -11
- package/dist/commands/detect.js.map +1 -1
- package/dist/commands/init.d.ts +3 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +87 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/launch.d.ts.map +1 -1
- package/dist/commands/launch.js +28 -0
- package/dist/commands/launch.js.map +1 -1
- package/dist/commands/next.d.ts +1 -0
- package/dist/commands/next.d.ts.map +1 -1
- package/dist/commands/next.js +51 -9
- package/dist/commands/next.js.map +1 -1
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +84 -59
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +15 -10
- package/dist/commands/verify.js.map +1 -1
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +4 -0
- package/dist/i18n.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/project-yaml.d.ts +35 -0
- package/dist/lib/project-yaml.d.ts.map +1 -0
- package/dist/lib/project-yaml.js +227 -0
- package/dist/lib/project-yaml.js.map +1 -0
- package/package.json +1 -1
- package/skills/product-designer/SKILL.en.md +26 -1
- package/skills/product-designer/SKILL.md +26 -1
- package/skills/ui-ux-pro-max/LICENSE +21 -0
- package/skills/ui-ux-pro-max/SKILL.md +379 -0
- package/skills/ui-ux-pro-max/UPSTREAM.md +43 -0
- package/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills/ui-ux-pro-max/scripts/core.py +253 -0
- package/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/skills/ui-ux-pro-max/scripts/search.py +114 -0
- 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 @@
|
|
|
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":"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"}
|
|
@@ -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":"
|
|
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"}
|
package/dist/commands/detect.js
CHANGED
|
@@ -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
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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,
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/commands/detect.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -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
|
|
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":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -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
|
-
|
|
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
|