create-vibe-workflow 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.
Files changed (37) hide show
  1. package/README.md +104 -0
  2. package/dist/adapters/nestjs-nextjs/skills.recommend.json +22 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +49 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/generator.d.ts +10 -0
  8. package/dist/generator.d.ts.map +1 -0
  9. package/dist/generator.js +242 -0
  10. package/dist/generator.js.map +1 -0
  11. package/dist/questions.d.ts +11 -0
  12. package/dist/questions.d.ts.map +1 -0
  13. package/dist/questions.js +59 -0
  14. package/dist/questions.js.map +1 -0
  15. package/dist/templates/claude-md/CLAUDE.zh-CN.md +46 -0
  16. package/dist/templates/hooks/check-deps.mjs +65 -0
  17. package/dist/templates/hooks/post-commit-check.js +31 -0
  18. package/dist/templates/rules/agents.md +49 -0
  19. package/dist/templates/rules/coding-style.md +117 -0
  20. package/dist/templates/rules/development-workflow.md +122 -0
  21. package/dist/templates/rules/git-workflow.md +47 -0
  22. package/dist/templates/rules/patterns.md +48 -0
  23. package/dist/templates/rules/security.md +37 -0
  24. package/dist/templates/rules/testing.md +30 -0
  25. package/dist/templates/settings/settings.template.json +14 -0
  26. package/package.json +49 -0
  27. package/templates/claude-md/CLAUDE.zh-CN.md +46 -0
  28. package/templates/hooks/check-deps.mjs +65 -0
  29. package/templates/hooks/post-commit-check.js +31 -0
  30. package/templates/rules/agents.md +49 -0
  31. package/templates/rules/coding-style.md +117 -0
  32. package/templates/rules/development-workflow.md +122 -0
  33. package/templates/rules/git-workflow.md +47 -0
  34. package/templates/rules/patterns.md +48 -0
  35. package/templates/rules/security.md +37 -0
  36. package/templates/rules/testing.md +30 -0
  37. package/templates/settings/settings.template.json +14 -0
package/README.md ADDED
@@ -0,0 +1,104 @@
1
+ # Create Vibe Workflow
2
+
3
+ 一条命令,5 分钟拥有专业 AI 协作开发工作流。
4
+
5
+ 面向非专业编程人员(Vibe Coder)的 Claude Code 编排插件——把需求→代码→审查→发布的全流程纪律,打包成一键安装。
6
+
7
+ ## 为什么需要这个?
8
+
9
+ Claude Code 很强大,但"随意对话"模式下容易跑偏:忘了写测试、跳过代码审查、需求理解偏差、文档没人更新。
10
+
11
+ 这个插件给你一套经过生产验证的 **9 步开发流程**,告诉 AI 什么时候该做什么、不该做什么。它在泉州佳希(魔方培训机构管理系统,21 个业务模块)中验证了几个月。
12
+
13
+ ## 5 分钟上手
14
+
15
+ ```bash
16
+ # 在你的项目目录下运行
17
+ npx create-vibe-workflow
18
+ ```
19
+
20
+ 回答几个问题:
21
+
22
+ ```
23
+ ? 项目名称: my-erp
24
+ ? 技术栈: NestJS + Next.js(默认)
25
+ ? 包含模块: [x] 9步工作流 [x] 代码规范 [x] Agent编排 [ ] TDD
26
+ ? 编程经验: 非专业编程人员
27
+ ```
28
+
29
+ 安装完成,重启 Claude Code 即可使用。
30
+
31
+ ## 会生成什么
32
+
33
+ ```
34
+ 你的项目/
35
+ ├── .claude/
36
+ │ ├── rules/ ← 7 个规则文件(9步流程/代码规范/Git等)
37
+ │ │ ├── development-workflow.md
38
+ │ │ ├── coding-style.md
39
+ │ │ ├── git-workflow.md
40
+ │ │ ├── agents.md
41
+ │ │ ├── security.md
42
+ │ │ ├── testing.md
43
+ │ │ └── patterns.md
44
+ │ ├── hooks/ ← 自动化检查脚本
45
+ │ │ ├── post-commit-check.js
46
+ │ │ └── check-deps.js
47
+ │ └── settings.json ← 依赖声明
48
+ └── CLAUDE.md ← AI 协作配置(含 Skill routing)
49
+ ```
50
+
51
+ ## 9 步开发流程
52
+
53
+ ```
54
+ ① 需求澄清 → ② 计划拆分 → ③ 研究复用
55
+ → ④ TodoList → ⑤ TDD开发 → ⑥ 代码审查
56
+ → ⑦ 安全审查 → ⑧ 文档反写 → ⑨ 提交归档
57
+ ```
58
+
59
+ 每一步都有强制检查点,AI 不能跳过。
60
+
61
+ ## 依赖的外部工具
62
+
63
+ 本插件是"编排层",需要以下组件配合(安装时会提示):
64
+
65
+ | 组件 | 用途 | 必需 |
66
+ |------|------|------|
67
+ | [gstack](https://github.com/garrytan/gstack) | 审查/QA/发布流程 | ✅ |
68
+ | [Superpowers](https://github.com/anthropics/claude-code-superpowers) | TDD纪律/系统调试 | ✅ |
69
+ | [OpenSpec](https://github.com/anthropics/openspec) | 需求规格化 | ⚠️ 可选 |
70
+
71
+ ## 命令参考
72
+
73
+ ```bash
74
+ npx create-vibe-workflow # 交互式安装(合并模式)
75
+ npx create-vibe-workflow --overwrite # 强制覆盖已有配置
76
+ npx create-vibe-workflow --uninstall # 清理生成的文件
77
+ ```
78
+
79
+ ## 常见问题
80
+
81
+ **Q: 安装后没有效果?**
82
+ A: 重启 Claude Code。如果依赖组件(gstack/superpowers)未安装,启动时会看到安装指引。
83
+
84
+ **Q: 我之前已经有 CLAUDE.md 和 .claude/ 配置怎么办?**
85
+ A: 安装器会自动备份到 `.claude/.backup/`,然后进入合并模式。已有的 CLAUDE.md 内容不会丢失。
86
+
87
+ **Q: 我不用 NestJS/Next.js 怎么办?**
88
+ A: 当前 v1 默认适配 NestJS + Next.js。选择"其他技术栈"可手动配置。v2 将支持更多技术栈。
89
+
90
+ ## 开源协议
91
+
92
+ MIT License
93
+
94
+ ---
95
+
96
+ ## English Summary
97
+
98
+ One-command installer for a production-verified Claude Code development workflow. Designed for vibe coders (non-professional programmers) — structured 9-step process with enforced checkpoints, Chinese-first documentation, and cross-platform support.
99
+
100
+ ```bash
101
+ npx create-vibe-workflow
102
+ ```
103
+
104
+ Generates `.claude/rules/` (7 rule files), `.claude/hooks/` (auto-checks), and `CLAUDE.md` with skill routing. Declares dependencies on gstack + Superpowers without bundling them.
@@ -0,0 +1,22 @@
1
+ {
2
+ "recommended": [
3
+ "backend-patterns",
4
+ "frontend-patterns",
5
+ "drizzle-orm",
6
+ "shadcn",
7
+ "next-best-practices",
8
+ "postgres-patterns",
9
+ "e2e-testing",
10
+ "docker-patterns",
11
+ "database-migrations",
12
+ "deployment-patterns"
13
+ ],
14
+ "optional": [
15
+ "coding-standards",
16
+ "tdd-workflow",
17
+ "search-first",
18
+ "security-review",
19
+ "verification-loop",
20
+ "strategic-compact"
21
+ ]
22
+ }
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env node
2
+ import { askQuestions } from './questions.js';
3
+ import { generate } from './generator.js';
4
+ import chalk from 'chalk';
5
+ async function main() {
6
+ console.log(chalk.cyan.bold('\n🚀 Create Vibe Workflow\n'));
7
+ console.log(chalk.dim('面向非专业编程人员的 Claude Code 开发工作流\n'));
8
+ const args = process.argv.slice(2);
9
+ const isUninstall = args.includes('--uninstall');
10
+ const isOverwrite = args.includes('--overwrite');
11
+ if (isUninstall) {
12
+ const { uninstall } = await import('./generator.js');
13
+ await uninstall(process.cwd());
14
+ return;
15
+ }
16
+ try {
17
+ const config = await askQuestions();
18
+ config.overwrite = isOverwrite;
19
+ config.targetDir = process.cwd();
20
+ await generate(config);
21
+ console.log(chalk.green.bold('\n✅ 安装完成!\n'));
22
+ console.log(chalk.dim('已生成以下内容:'));
23
+ console.log(chalk.white(' 📁 .claude/rules/ — 开发工作流规则'));
24
+ console.log(chalk.white(' 📁 .claude/hooks/ — 自动化检查脚本'));
25
+ console.log(chalk.white(' 📄 CLAUDE.md — 项目 AI 协作配置'));
26
+ console.log(chalk.white(' ⚙️ .claude/settings.json — 依赖声明'));
27
+ console.log();
28
+ console.log(chalk.yellow('下一步:重启 Claude Code 即可使用新的工作流'));
29
+ console.log(chalk.dim('如果尚未安装依赖组件(gstack / superpowers),'));
30
+ console.log(chalk.dim('Claude Code 启动时会提示安装指引。\n'));
31
+ }
32
+ catch (err) {
33
+ if (err instanceof Error && err.message === 'USER_CANCELLED') {
34
+ console.log(chalk.dim('\n已取消'));
35
+ process.exit(0);
36
+ }
37
+ console.error(chalk.red('\n❌ 安装失败\n'));
38
+ console.error(chalk.red(err.message));
39
+ console.error();
40
+ console.error(chalk.dim('常见问题:'));
41
+ console.error(chalk.dim(' • 检查当前目录是否有写入权限'));
42
+ console.error(chalk.dim(' • 检查磁盘空间是否充足'));
43
+ console.error(chalk.dim(' • 如问题持续,请提交 Issue:'));
44
+ console.error(chalk.dim(' https://github.com/VictorStacker/create-vibe-workflow/issues\n'));
45
+ process.exit(1);
46
+ }
47
+ }
48
+ main();
49
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { UserConfig } from './questions.js';
2
+ interface FileResult {
3
+ path: string;
4
+ status: 'created' | 'merged' | 'skipped' | 'error';
5
+ error?: string;
6
+ }
7
+ export declare function generate(config: UserConfig): Promise<FileResult[]>;
8
+ export declare function uninstall(targetDir: string): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKjD,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkHD,wBAAsB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAgIxE;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBhE"}
@@ -0,0 +1,242 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import ejs from 'ejs';
5
+ import chalk from 'chalk';
6
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
7
+ const TEMPLATES_DIR = path.resolve(__dirname, '..', 'templates');
8
+ const GENERATED_MANIFEST = '.claude/.generated-manifest.json';
9
+ function ensureDir(dir) {
10
+ if (!fs.existsSync(dir))
11
+ fs.mkdirSync(dir, { recursive: true });
12
+ }
13
+ function backupExisting(targetDir) {
14
+ const claudeDir = path.join(targetDir, '.claude');
15
+ if (!fs.existsSync(claudeDir))
16
+ return;
17
+ const backupDir = path.join(claudeDir, '.backup');
18
+ ensureDir(backupDir);
19
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
20
+ const backupTarget = path.join(backupDir, `backup-${timestamp}`);
21
+ ensureDir(backupTarget);
22
+ const entries = fs.readdirSync(claudeDir, { withFileTypes: true });
23
+ for (const entry of entries) {
24
+ if (entry.name === '.backup' || entry.name === '.generated-manifest.json')
25
+ continue;
26
+ const src = path.join(claudeDir, entry.name);
27
+ const dest = path.join(backupTarget, entry.name);
28
+ if (entry.isDirectory()) {
29
+ fs.cpSync(src, dest, { recursive: true });
30
+ }
31
+ else {
32
+ fs.copyFileSync(src, dest);
33
+ }
34
+ }
35
+ console.log(chalk.dim(` 📦 已备份原有配置到 .claude/.backup/backup-${timestamp}`));
36
+ }
37
+ function renderTemplate(templatePath, vars) {
38
+ const raw = fs.readFileSync(templatePath, 'utf-8');
39
+ try {
40
+ return ejs.render(raw, vars);
41
+ }
42
+ catch (err) {
43
+ throw new Error(`模板渲染失败: ${templatePath}\n${err.message}`);
44
+ }
45
+ }
46
+ function writeFile(targetPath, content) {
47
+ ensureDir(path.dirname(targetPath));
48
+ try {
49
+ fs.writeFileSync(targetPath, content, 'utf-8');
50
+ }
51
+ catch (err) {
52
+ const code = err.code;
53
+ if (code === 'ENOSPC') {
54
+ throw new Error(`磁盘空间不足,无法写入: ${targetPath}\n请清理磁盘后重试,或使用 --overwrite 重新运行`);
55
+ }
56
+ if (code === 'EACCES' || code === 'EPERM') {
57
+ throw new Error(`没有写入权限: ${targetPath}\n请检查目录权限后重试`);
58
+ }
59
+ throw err;
60
+ }
61
+ }
62
+ function mergeSettings(existingPath, newContent) {
63
+ if (!fs.existsSync(existingPath))
64
+ return newContent;
65
+ let existing;
66
+ try {
67
+ existing = JSON.parse(fs.readFileSync(existingPath, 'utf-8'));
68
+ }
69
+ catch {
70
+ return newContent;
71
+ }
72
+ const newSettings = JSON.parse(newContent);
73
+ const merged = deepMerge(existing, newSettings);
74
+ return JSON.stringify(merged, null, 2) + '\n';
75
+ }
76
+ function deepMerge(target, source) {
77
+ const result = { ...target };
78
+ for (const key of Object.keys(source)) {
79
+ if (key === 'meta')
80
+ continue;
81
+ if (isObject(source[key]) && isObject(result[key])) {
82
+ result[key] = deepMerge(result[key], source[key]);
83
+ }
84
+ else {
85
+ result[key] = source[key];
86
+ }
87
+ }
88
+ return result;
89
+ }
90
+ function isObject(value) {
91
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
92
+ }
93
+ function appendCLAUDEmd(existingPath, newContent) {
94
+ if (!fs.existsSync(existingPath))
95
+ return newContent;
96
+ const existing = fs.readFileSync(existingPath, 'utf-8');
97
+ const markerStart = '<!-- WORKFLOW-START -->';
98
+ const markerEnd = '<!-- WORKFLOW-END -->';
99
+ if (existing.includes(markerStart)) {
100
+ const before = existing.substring(0, existing.indexOf(markerStart));
101
+ const after = existing.substring(existing.indexOf(markerEnd) + markerEnd.length);
102
+ const workflowSection = newContent.substring(newContent.indexOf(markerStart), newContent.indexOf(markerEnd) + markerEnd.length);
103
+ return before + workflowSection + after;
104
+ }
105
+ return existing + '\n' + newContent;
106
+ }
107
+ export async function generate(config) {
108
+ const results = [];
109
+ const { targetDir, overwrite } = config;
110
+ const claudeDir = path.join(targetDir, '.claude');
111
+ const hasExisting = fs.existsSync(claudeDir);
112
+ if (hasExisting && !overwrite) {
113
+ console.log(chalk.yellow('⚠️ 检测到已有的 .claude/ 目录,进入合并模式'));
114
+ backupExisting(targetDir);
115
+ }
116
+ else if (hasExisting && overwrite) {
117
+ console.log(chalk.yellow('⚠️ --overwrite:将覆盖已有配置'));
118
+ backupExisting(targetDir);
119
+ }
120
+ const vars = {
121
+ PROJECT_NAME: config.projectName,
122
+ TECH_STACK: config.techStack,
123
+ USER_LEVEL: config.userLevel,
124
+ MODULES: config.modules.join(', '),
125
+ LANGUAGE: config.language,
126
+ GENERATED_AT: new Date().toISOString(),
127
+ };
128
+ const manifestFiles = [];
129
+ // Rules
130
+ const ruleFiles = ['development-workflow.md', 'coding-style.md', 'git-workflow.md', 'security.md', 'testing.md', 'patterns.md'];
131
+ if (config.modules.includes('agents'))
132
+ ruleFiles.push('agents.md');
133
+ console.log(chalk.dim('\n📁 生成规则文件...'));
134
+ for (const file of ruleFiles) {
135
+ const templatePath = path.join(TEMPLATES_DIR, 'rules', file);
136
+ try {
137
+ const rendered = renderTemplate(templatePath, vars);
138
+ const target = path.join(claudeDir, 'rules', file);
139
+ writeFile(target, rendered);
140
+ results.push({ path: target, status: 'created' });
141
+ manifestFiles.push(target);
142
+ console.log(chalk.dim(` ✅ ${file}`));
143
+ }
144
+ catch (err) {
145
+ const status = { path: file, status: 'error', error: err.message };
146
+ results.push(status);
147
+ console.log(chalk.red(` ❌ ${file} — ${err.message}`));
148
+ }
149
+ }
150
+ // Hooks
151
+ console.log(chalk.dim('\n🔧 生成 Hook 脚本...'));
152
+ const hookFiles = ['post-commit-check.js', 'check-deps.mjs'];
153
+ for (const file of hookFiles) {
154
+ const templatePath = path.join(TEMPLATES_DIR, 'hooks', file);
155
+ try {
156
+ const rendered = renderTemplate(templatePath, vars);
157
+ const target = path.join(claudeDir, 'hooks', file);
158
+ writeFile(target, rendered);
159
+ results.push({ path: target, status: 'created' });
160
+ manifestFiles.push(target);
161
+ console.log(chalk.dim(` ✅ ${file}`));
162
+ }
163
+ catch (err) {
164
+ results.push({ path: file, status: 'error', error: err.message });
165
+ console.log(chalk.red(` ❌ ${file} — ${err.message}`));
166
+ }
167
+ }
168
+ // CLAUDE.md
169
+ console.log(chalk.dim('\n📄 生成 CLAUDE.md...'));
170
+ const claudeTemplate = path.join(TEMPLATES_DIR, 'claude-md', 'CLAUDE.zh-CN.md');
171
+ try {
172
+ const rendered = renderTemplate(claudeTemplate, vars);
173
+ const target = path.join(targetDir, 'CLAUDE.md');
174
+ const content = hasExisting && !overwrite ? appendCLAUDEmd(target, rendered) : rendered;
175
+ writeFile(target, content);
176
+ results.push({ path: target, status: hasExisting && !overwrite ? 'merged' : 'created' });
177
+ manifestFiles.push(target);
178
+ console.log(chalk.dim(` ✅ CLAUDE.md (${hasExisting && !overwrite ? '合并' : '新建'})`));
179
+ }
180
+ catch (err) {
181
+ results.push({ path: 'CLAUDE.md', status: 'error', error: err.message });
182
+ console.log(chalk.red(` ❌ CLAUDE.md — ${err.message}`));
183
+ }
184
+ // Settings
185
+ console.log(chalk.dim('\n⚙️ 生成配置文件...'));
186
+ const settingsTemplate = path.join(TEMPLATES_DIR, 'settings', 'settings.template.json');
187
+ try {
188
+ const rendered = renderTemplate(settingsTemplate, vars);
189
+ const target = path.join(claudeDir, 'settings.json');
190
+ const content = hasExisting && !overwrite ? mergeSettings(target, rendered) : rendered;
191
+ writeFile(target, content);
192
+ results.push({ path: target, status: hasExisting && !overwrite ? 'merged' : 'created' });
193
+ manifestFiles.push(target);
194
+ console.log(chalk.dim(` ✅ settings.json (${hasExisting && !overwrite ? '合并' : '新建'})`));
195
+ }
196
+ catch (err) {
197
+ results.push({ path: 'settings.json', status: 'error', error: err.message });
198
+ console.log(chalk.red(` ❌ settings.json — ${err.message}`));
199
+ }
200
+ // Skills recommend (if nestjs-nextjs adapter)
201
+ if (config.techStack === 'nestjs-nextjs') {
202
+ const skillsRecPath = path.resolve(__dirname, '..', 'adapters', 'nestjs-nextjs', 'skills.recommend.json');
203
+ if (fs.existsSync(skillsRecPath)) {
204
+ const target = path.join(claudeDir, 'skills.recommend.json');
205
+ fs.copyFileSync(skillsRecPath, target);
206
+ manifestFiles.push(target);
207
+ }
208
+ }
209
+ // Generate manifest
210
+ ensureDir(claudeDir);
211
+ fs.writeFileSync(path.join(claudeDir, '.generated-manifest.json'), JSON.stringify({
212
+ generatedBy: 'create-vibe-workflow@0.1.0',
213
+ generatedAt: new Date().toISOString(),
214
+ files: manifestFiles,
215
+ }, null, 2));
216
+ const succeeded = results.filter((r) => r.status !== 'error').length;
217
+ const failed = results.filter((r) => r.status === 'error').length;
218
+ if (failed > 0) {
219
+ throw new Error(`${succeeded}/${results.length} 个文件写入成功,${failed} 个失败`);
220
+ }
221
+ return results;
222
+ }
223
+ export async function uninstall(targetDir) {
224
+ const manifestPath = path.join(targetDir, '.claude', '.generated-manifest.json');
225
+ if (!fs.existsSync(manifestPath)) {
226
+ console.log(chalk.yellow('⚠️ 未找到安装清单,无法自动卸载'));
227
+ console.log(chalk.dim('请手动删除 .claude/ 目录及相关文件'));
228
+ return;
229
+ }
230
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
231
+ const backupDir = path.join(targetDir, '.claude', '.backup');
232
+ ensureDir(backupDir);
233
+ for (const file of manifest.files) {
234
+ if (fs.existsSync(file)) {
235
+ console.log(chalk.dim(` 🗑️ 删除: ${file}`));
236
+ fs.rmSync(file, { recursive: true });
237
+ }
238
+ }
239
+ fs.rmSync(manifestPath);
240
+ console.log(chalk.green('✅ 已清理所有生成的文件'));
241
+ }
242
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AAQjE,MAAM,kBAAkB,GAAG,kCAAkC,CAAC;AAE9D,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO;IAEtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAClD,SAAS,CAAC,SAAS,CAAC,CAAC;IAErB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,SAAS,EAAE,CAAC,CAAC;IACjE,SAAS,CAAC,YAAY,CAAC,CAAC;IAExB,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,0BAA0B;YAAE,SAAS;QACpF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,SAAS,EAAE,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,cAAc,CAAC,YAAoB,EAAE,IAA6B;IACzE,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACnD,IAAI,CAAC;QACH,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,WAAW,YAAY,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,UAAkB,EAAE,OAAe;IACpD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;QACjD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,gBAAgB,UAAU,iCAAiC,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,WAAW,UAAU,cAAc,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,YAAoB,EAAE,UAAkB;IAC7D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,UAAU,CAAC;IAEpD,IAAI,QAAiC,CAAC;IACtC,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AAChD,CAAC;AAED,SAAS,SAAS,CAAC,MAA+B,EAAE,MAA+B;IACjF,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,IAAI,GAAG,KAAK,MAAM;YAAE,SAAS;QAC7B,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CACrB,MAAM,CAAC,GAAG,CAA4B,EACtC,MAAM,CAAC,GAAG,CAA4B,CACvC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,cAAc,CAAC,YAAoB,EAAE,UAAkB;IAC9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,UAAU,CAAC;IAEpD,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,yBAAyB,CAAC;IAC9C,MAAM,SAAS,GAAG,uBAAuB,CAAC;IAE1C,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QACpE,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QACjF,MAAM,eAAe,GAAG,UAAU,CAAC,SAAS,CAC1C,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,EAC/B,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,MAAM,CACjD,CAAC;QACF,OAAO,MAAM,GAAG,eAAe,GAAG,KAAK,CAAC;IAC1C,CAAC;IAED,OAAO,QAAQ,GAAG,IAAI,GAAG,UAAU,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAkB;IAC/C,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAE7C,IAAI,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC3D,cAAc,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC;SAAM,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACrD,cAAc,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,IAAI,GAAG;QACX,YAAY,EAAE,MAAM,CAAC,WAAW;QAChC,UAAU,EAAE,MAAM,CAAC,SAAS;QAC5B,UAAU,EAAE,MAAM,CAAC,SAAS;QAC5B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACvC,CAAC;IAEF,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,QAAQ;IACR,MAAM,SAAS,GAAG,CAAC,yBAAyB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;IAChI,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAEnE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACnD,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAClD,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;YAC1F,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,MAAO,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,QAAQ;IACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,CAAC;IAC7D,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACnD,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YAClD,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,MAAO,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,YAAY;IACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAChF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,cAAc,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,WAAW,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACxF,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACzF,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,WAAW,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACvF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAoB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,WAAW;IACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC1C,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,wBAAwB,CAAC,CAAC;IACxF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,cAAc,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,WAAW,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACvF,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACzF,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,WAAW,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC3F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAwB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,8CAA8C;IAC9C,IAAI,MAAM,CAAC,SAAS,KAAK,eAAe,EAAE,CAAC;QACzC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,uBAAuB,CAAC,CAAC;QAC1G,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;YAC7D,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YACvC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,SAAS,CAAC,SAAS,CAAC,CAAC;IACrB,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,0BAA0B,CAAC,EAChD,IAAI,CAAC,SAAS,CACZ;QACE,WAAW,EAAE,4BAA4B;QACzC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,KAAK,EAAE,aAAa;KACrB,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;IAEF,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACrE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IAClE,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,IAAI,OAAO,CAAC,MAAM,YAAY,MAAM,MAAM,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAiB;IAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,0BAA0B,CAAC,CAAC;IACjF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC7D,SAAS,CAAC,SAAS,CAAC,CAAC;IAErB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7C,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface UserConfig {
2
+ projectName: string;
3
+ techStack: 'nestjs-nextjs' | 'other';
4
+ userLevel: 'vibe-coder' | 'developer';
5
+ modules: string[];
6
+ language: 'zh-CN';
7
+ overwrite: boolean;
8
+ targetDir: string;
9
+ }
10
+ export declare function askQuestions(): Promise<UserConfig>;
11
+ //# sourceMappingURL=questions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questions.d.ts","sourceRoot":"","sources":["../src/questions.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC;IACrC,SAAS,EAAE,YAAY,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,CAsDxD"}
@@ -0,0 +1,59 @@
1
+ import inquirer from 'inquirer';
2
+ export async function askQuestions() {
3
+ const answers = await inquirer.prompt([
4
+ {
5
+ type: 'input',
6
+ name: 'projectName',
7
+ message: '项目名称:',
8
+ default: 'my-project',
9
+ validate: (input) => {
10
+ if (!input.trim())
11
+ return '项目名称不能为空';
12
+ if (!/^[a-zA-Z0-9_-]+$/.test(input))
13
+ return '项目名称只能包含字母、数字、- 和 _';
14
+ return true;
15
+ },
16
+ },
17
+ {
18
+ type: 'list',
19
+ name: 'techStack',
20
+ message: '选择技术栈:',
21
+ choices: [
22
+ { name: 'NestJS + Next.js(默认推荐)', value: 'nestjs-nextjs' },
23
+ { name: '其他技术栈(手动配置)', value: 'other' },
24
+ ],
25
+ },
26
+ {
27
+ type: 'checkbox',
28
+ name: 'modules',
29
+ message: '选择要安装的模块:',
30
+ choices: [
31
+ { name: '9 步开发工作流(必选)', value: 'workflow', checked: true },
32
+ { name: '代码规范(coding-style / security / testing)', value: 'coding-standards', checked: true },
33
+ { name: 'Agent 编排(并行 agent / 分工模式)', value: 'agents', checked: true },
34
+ { name: 'TDD 工作流(强制先写测试再写代码)', value: 'tdd', checked: false },
35
+ ],
36
+ validate: (input) => {
37
+ if (!input.includes('workflow'))
38
+ return '9 步工作流是必选项';
39
+ return true;
40
+ },
41
+ },
42
+ {
43
+ type: 'list',
44
+ name: 'userLevel',
45
+ message: '你的编程经验水平?',
46
+ choices: [
47
+ { name: '非专业编程人员(Vibe Coder)— 我用自然语言描述需求', value: 'vibe-coder' },
48
+ { name: '专业开发者 — 我懂代码,但想让 AI 更有纪律', value: 'developer' },
49
+ ],
50
+ },
51
+ ]);
52
+ return {
53
+ ...answers,
54
+ language: 'zh-CN',
55
+ overwrite: false,
56
+ targetDir: '',
57
+ };
58
+ }
59
+ //# sourceMappingURL=questions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questions.js","sourceRoot":"","sources":["../src/questions.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAYhC,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACpC;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,YAAY;YACrB,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;oBAAE,OAAO,UAAU,CAAC;gBACrC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC;oBAAE,OAAO,qBAAqB,CAAC;gBAClE,OAAO,IAAI,CAAC;YACd,CAAC;SACF;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,eAAe,EAAE;gBAC1D,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE;aACxC;SACF;QACD;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE;gBAC1D,EAAE,IAAI,EAAE,yCAAyC,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE;gBAC7F,EAAE,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE;gBACrE,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE;aAC9D;YACD,QAAQ,EAAE,CAAC,KAAe,EAAE,EAAE;gBAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;oBAAE,OAAO,YAAY,CAAC;gBACrD,OAAO,IAAI,CAAC;YACd,CAAC;SACF;QACD;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,iCAAiC,EAAE,KAAK,EAAE,YAAY,EAAE;gBAChE,EAAE,IAAI,EAAE,0BAA0B,EAAE,KAAK,EAAE,WAAW,EAAE;aACzD;SACF;KACF,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,OAAO;QACV,QAAQ,EAAE,OAAO;QACjB,SAAS,EAAE,KAAK;QAChB,SAAS,EAAE,EAAE;KACA,CAAC;AAClB,CAAC"}
@@ -0,0 +1,46 @@
1
+ <!-- WORKFLOW-START -->
2
+ <!-- 此区域由 create-vibe-workflow 自动生成,重跑 CLI 时会更新 -->
3
+
4
+ ## AI 协作工具链
5
+
6
+ 本项目使用多层 AI 工具协作体系:
7
+
8
+ ```
9
+ 你的业务需求
10
+
11
+ ① OpenSpec ─── 把想法变成结构化的需求规格和任务清单
12
+
13
+ ② gstack ───── 虚拟团队角色审查(CEO审查/设计审查/工程审查)
14
+
15
+ ③ Superpowers ─ 强制执行正确的开发流程(TDD/系统调试/验证)
16
+ ```
17
+
18
+ ### 标准开发流程
19
+
20
+ ```
21
+ ① 需求澄清(OpenSpec)→ ② 计划拆分 → ③ 研究复用
22
+ → ④ TodoList编写 → ⑤ TDD开发 → ⑥ 代码审查
23
+ → ⑦ 安全审查 → ⑧ 文档反写 → ⑨ 提交归档
24
+ ```
25
+
26
+ ### 常用命令
27
+
28
+ | 场景 | 命令 |
29
+ |------|------|
30
+ | 开发新功能 | `/opsx:propose` 开始 |
31
+ | 修 Bug | 自动触发 `systematic-debugging` |
32
+ | 审查代码 | `/review` |
33
+ | 验收功能 | `/qa` |
34
+ | 准备发布 | `/ship` |
35
+ | 安全审查 | `/cso` |
36
+
37
+ ## 技术栈
38
+
39
+ - 语言: TypeScript 5.x (strict mode)
40
+ - 前端: Next.js 15 (App Router) + shadcn/ui + Tailwind CSS
41
+ - 后端: NestJS 11 (REST API)
42
+ - 数据库: PostgreSQL 16+ + Drizzle ORM
43
+ - 校验: Zod(前后端共享 schema)
44
+ - 测试: Vitest (单元) + Playwright (E2E)
45
+
46
+ <!-- WORKFLOW-END -->