#!/usr/bin/env python3 """ 项目AI生成器 · 核心脚本 根据项目需求一键生成完整的项目AI体系(五行架构 + 全套技能 + GitHub同步 + CLAUDE.md + Cursor规则) 用法: python3 generate_project_ai.py --name "玩值电竞AI" --desc "电竞赛事运营平台" --industry "电竞" \ --github "https://github.com/fnvtk/wanzhi-ai" --output "/path/to/output/" python3 generate_project_ai.py --interactive # 交互式生成 """ import argparse import os import subprocess import sys from datetime import datetime from pathlib import Path KARUO_AI_ROOT = Path(__file__).resolve().parent.parent.parent.parent.parent TODAY = datetime.now().strftime("%Y-%m-%d") NOW = datetime.now().strftime("%Y-%m-%d %H:%M") INDUSTRY_PRESETS = { "电商": {"slogans": ["部署稳了。", "流程清了。", "产品出了!", "代码好了。", "质量控了。"], "extra": "支付系统、订单管理、库存管理"}, "SaaS": {"slogans": ["部署稳了。", "流程清了。", "产品出了!", "代码好了。", "质量控了。"], "extra": "多租户、订阅管理"}, "电竞": {"slogans": ["服务稳了。", "赛事排了。", "体验棒了!", "功能上了。", "测试过了。"], "extra": "赛事系统、实时对战、数据分析"}, "游戏": {"slogans": ["服务稳了。", "赛事排了。", "体验棒了!", "功能上了。", "测试过了。"], "extra": "游戏引擎、实时通信"}, "教育": {"slogans": ["服务稳了。", "课程排了。", "内容好了!", "功能上了。", "质量过了。"], "extra": "课程系统、考试引擎、学习路径"}, "金融": {"slogans": ["系统稳了。", "合规过了。", "产品出了!", "代码好了。", "风控过了。"], "extra": "风控系统、交易引擎"}, "内容": {"slogans": ["服务稳了。", "内容排了。", "创意好了!", "功能上了。", "质量过了。"], "extra": "内容分发、推荐算法"}, "通用": {"slogans": ["部署稳了。", "流程清了。", "产品出了!", "代码好了。", "质量控了。"], "extra": ""}, } FIVE_ELEMENTS = [ {"element": "金", "domain": "基础架构与运维", "suffix": "资", "role_desc": "运维/安全/部署"}, {"element": "水", "domain": "项目管理与协调", "suffix": "流", "role_desc": "管理/协调/对接"}, {"element": "木", "domain": "产品设计与规划", "suffix": "产", "role_desc": "产品/设计/研究"}, {"element": "火", "domain": "技术研发与开发", "suffix": "码", "role_desc": "开发/修复/审查/架构"}, {"element": "土", "domain": "质量保障与复用", "suffix": "质", "role_desc": "测试/复用/发布/规范"}, ] MEMBERS = { "金": [ {"name": "金仓", "role": "服务器运维", "skills": [ ("Docker管理", "Docker、容器、镜像、docker-compose", "容器编排、镜像管理、Compose 部署"), ("CICD管理", "CI/CD、流水线、GitHub Actions、自动部署", "持续集成与持续部署流水线配置"), ("服务器管理", "宝塔、服务器、SSL、域名、Nginx", "服务器配置、反向代理、证书管理"), ("系统监控", "系统状态、监控、告警、CPU、内存", "系统资源实时监控与告警"), ("数据库运维", "数据库维护、MongoDB运维、MySQL运维", "数据库备份、优化、迁移"), ("NAS管理", "NAS、群晖、存储", "群晖NAS 部署与维护"), ("Gitea管理", "Gitea、Git仓库、代码仓库", "代码仓库管理与同步"), ("环境部署", "环境配置、开发环境、测试环境、生产环境", "多环境一键配置与切换"), ]}, {"name": "金盾", "role": "安全防护", "skills": [ ("安全审计", "安全审计、漏洞扫描、依赖检查", "代码安全审计与依赖漏洞扫描"), ("备份恢复", "备份、灾备、数据恢复", "数据备份策略与灾难恢复"), ]}, ], "水": [ {"name": "水溪", "role": "文档归档", "skills": [ ("文档归档", "文档整理、归档、技术文档", "技术文档分类与归档"), ("记忆管理", "记忆、存入记忆、项目知识", "项目知识沉淀与检索"), ("经验沉淀", "经验、复盘沉淀、最佳实践", "研发经验库管理"), ]}, {"name": "水泉", "role": "需求分析", "skills": [ ("需求拆解", "需求拆解、任务分析、PRD分析", "大需求拆成可执行开发任务"), ("任务规划", "任务规划、排期、里程碑、Sprint", "制定开发排期与里程碑"), ("进度跟踪", "进度报告、开发进度、迭代回顾", "项目进度报告与迭代回顾"), ]}, {"name": "水桥", "role": "平台对接", "skills": [ ("飞书管理", "飞书日志、飞书文档、飞书对接", "飞书日志/文档/表格自动化"), ("智能纪要", "会议纪要、产研纪要、飞书妙记", "会议录音转结构化纪要"), ("GitHub对接", "GitHub、PR、Issue、代码合并", "GitHub PR/Issue 管理与自动化"), ]}, ], "木": [ {"name": "木叶", "role": "产品设计", "skills": [ ("PRD编写", "PRD、产品需求文档、功能设计", "产品需求文档自动生成"), ("交互设计", "交互、UI、UX、界面设计", "交互原型与 UI/UX 设计"), ("数据分析", "产品数据、埋点、漏斗分析", "产品数据分析与洞察"), ]}, {"name": "木根", "role": "用户研究", "skills": [ ("竞品分析", "竞品、竞品分析、行业分析", "竞品功能/策略对比报告"), ("用户调研", "用户研究、用户反馈、调研", "用户调研设计与反馈分析"), ]}, {"name": "木果", "role": "原型模板", "skills": [ ("项目模板", "项目模板、脚手架、初始化项目", "前后端项目脚手架生成"), ("原型生成", "原型、线框图、Mockup", "快速原型与线框图生成"), ]}, ], "火": [ {"name": "火炬", "role": "全栈开发", "skills": [ ("全栈开发", "全栈开发、全栈、开发", "全栈项目开发(前端+后端+数据库)"), ("前端开发", "前端、React、Vue、Next.js、CSS", "React/Vue/Next.js 前端开发"), ("后端开发", "后端、Node.js、Python、API、Express", "Node.js/Python 后端与 API 开发"), ("API设计", "API设计、RESTful、GraphQL、接口", "RESTful/GraphQL API 架构设计"), ("数据库设计", "数据库设计、Schema、建表、索引", "MongoDB/MySQL Schema 设计与优化"), ]}, {"name": "火锤", "role": "代码修复", "skills": [ ("代码修复", "Bug、修复、报错、异常", "Bug 定位与修复"), ("性能优化", "性能优化、慢查询、加速", "前后端性能瓶颈定位与优化"), ]}, {"name": "火眼", "role": "代码审查", "skills": [ ("CodeReview", "Code Review、代码审查、代码评审", "代码质量审查与优化建议"), ("架构审查", "架构审查、架构评审、技术评审", "系统架构合理性审查"), ]}, {"name": "火种", "role": "技术架构", "skills": [ ("技术选型", "技术选型、框架对比、选框架", "技术栈/框架/工具选型决策"), ("架构设计", "架构设计、系统设计、微服务", "系统架构与微服务设计"), ("开发文档", "开发文档、API文档、技术方案", "API 文档、技术方案文档生成"), ]}, ], "土": [ {"name": "土基", "role": "测试工程", "skills": [ ("单元测试", "单元测试、unit test、组件测试", "单元/组件测试编写与执行"), ("集成测试", "集成测试、E2E、API测试、端到端", "API/E2E 集成测试"), ("性能测试", "性能测试、压测、负载测试", "压力测试与性能基准测试"), ]}, {"name": "土砖", "role": "技能复制", "skills": [ ("技能工厂", "创建技能、生成Skill", "批量创建/复制 SKILL"), ("基因胶囊", "基因胶囊、打包技能、解包胶囊、继承能力", "Skill 打包为可遗传胶囊"), ]}, {"name": "土渠", "role": "发布管理", "skills": [ ("发布管理", "发布、版本管理、灰度、上线", "版本发布与灰度部署"), ("变更日志", "CHANGELOG、版本记录、发布记录", "自动生成 CHANGELOG"), ]}, {"name": "土簿", "role": "技术债务", "skills": [ ("代码规范", "代码规范、ESLint、Prettier、lint", "代码规范配置与检查"), ("技术债务", "技术债务、重构、todo清理", "技术债务跟踪与重构规划"), ]}, ], } # Skill 编号前缀映射 SKILL_NUM_PREFIX = {"金": "G", "水": "W", "木": "M", "火": "F", "土": "E"} def get_preset(industry: str) -> dict: for key in INDUSTRY_PRESETS: if key in industry: return INDUSTRY_PRESETS[key] return INDUSTRY_PRESETS["通用"] def build_group_name(prefix: str, elem_info: dict) -> str: return f"{prefix}{elem_info['suffix']}({elem_info['element']})" def make_dirs(base: Path, prefix: str): """创建完整目录结构""" dirs = [ ".cursor/rules", "scripts", "运营中枢/参考资料", "运营中枢/使用手册", "运营中枢/工作台", "导出/基因胶囊", ] for elem in FIVE_ELEMENTS: group = build_group_name(prefix, elem) group_num = FIVE_ELEMENTS.index(elem) + 1 group_dir = f"{group_num:02d}_{group}" for member_list in MEMBERS[elem["element"]]: member_dir = f"{group_dir}/{member_list['name']}_{member_list['role']}" for skill_name, _, _ in member_list["skills"]: dirs.append(f"{member_dir}/{skill_name}") for d in dirs: (base / d).mkdir(parents=True, exist_ok=True) def gen_bootstrap(base: Path, cfg: dict): preset = get_preset(cfg["industry"]) slogans = preset["slogans"] prefix = cfg["prefix"] team_tree = f"""{cfg['name']}(研发总管) ├── {prefix}资(金)"{slogans[0]}" → 金仓(服务器运维)、金盾(安全防护) ├── {prefix}流(水)"{slogans[1]}" → 水溪(文档归档)、水泉(需求分析)、水桥(平台对接) ├── {prefix}产(木)"{slogans[2]}" → 木叶(产品设计)、木根(用户研究)、木果(原型模板) ├── {prefix}码(火)"{slogans[3]}" → 火炬(全栈开发)、火锤(代码修复)、火眼(代码审查)、火种(技术架构) └── {prefix}质(土)"{slogans[4]}" → 土基(测试工程)、土砖(技能复制)、土渠(发布管理)、土簿(技术债务)""" content = f"""# {cfg['name']} 启动指令(平台无关) > **本文件是{cfg['name']} 的唯一启动入口**。无论在 Cursor、ChatGPT、Claude、Windsurf、终端、API 还是任何其他 AI 平台,读完这一个文件就能接活、干活、交付。 > 版本:1.0 | 更新:{TODAY} > 继承自:卡若AI v5.0 架构体系 --- ## 一、你是谁 - **名字**:{cfg['name']} - **身份**:{cfg['desc']}的 AI 研发总管 - **定位**:面向全栈开发、前端、后端、产品经理、DevOps 的智能研发助手 - **工作台**:`{cfg['output']}`(本地路径,远程场景用相对路径即可) - **血统**:继承自卡若AI 五行架构体系,专注{cfg['industry']}场景深度适配 --- ## 二、团队(5 负责人 → 14 成员 → {cfg['skill_count']} 技能) ``` {team_tree} ``` ### 五行 · 研发映射 | 五行 | 负责人 | 研发域 | 口头禅 | 核心职责 | |:---|:---|:---|:---|:---| | 金 | {prefix}资 | 基础架构与运维 | "{slogans[0]}" | 服务器、Docker、CI/CD、监控、备份 | | 水 | {prefix}流 | 项目管理与协调 | "{slogans[1]}" | 需求管理、排期、文档、飞书对接 | | 木 | {prefix}产 | 产品设计与规划 | "{slogans[2]}" | PRD、原型、竞品分析、用户研究 | | 火 | {prefix}码 | 技术研发与开发 | "{slogans[3]}" | 全栈、前端、后端、API、架构设计 | | 土 | {prefix}质 | 质量保障与复用 | "{slogans[4]}" | 测试、发布、代码规范、基因胶囊 | **分配规则**:用户说需求 → 研发总管按关键词/领域匹配负责人 → 负责人分配给成员 → 成员读 SKILL.md 执行。多技能按 金→水→木→火→土 优先级。用户可 `@角色名` 或 `@成员名` 指定。 --- ## 三、启动顺序与运转流程(Boot Sequence) 每次新对话开始,按以下顺序加载上下文(**只读必要的,不要全读**): | 步骤 | 读什么 | 为什么 | |:---|:---|:---| | 1 | **本文件** `BOOTSTRAP.md` | 知道自己是谁、团队怎么分、怎么工作 | | 2 | **技能注册表** `SKILL_REGISTRY.md` | 查找用户需求对应的技能和路径 | | 3 | **对应技能的 SKILL.md** | 拿到具体执行指令(只读匹配到的那个) | | 4 | **(强制)在对话中展示思考与拆解(文字版)** | 接到用户任务并完成理解后,必须先在本轮对话中以详细文字输出思考结果、任务拆解、执行计划 | **运转流程强制一环**:了解完用户需求后 → **深度思考与拆解** → **在对话里用详细文字展示**(思考结果 + 任务拆解 + 计划)→ 再继续往下执行。 **启动瘦身(按需加载)**:步骤 2 不需要全表扫描。优先只加载 `SKILL_REGISTRY.md` 中 🔴 热技能(≤8 个)的触发词+路径;未命中时再懒加载其余部分。 **任务看板**:跨组协作或接续任务时,先读 `运营中枢/工作台/当前任务看板.md` 确认在进行的任务上下文。 **基因胶囊(内部查阅)**:需要快速查阅本地胶囊清单或继承能力时,读 `导出/基因胶囊/README_基因胶囊导出说明.md`。 --- ## 四、MAX Mode(默认 · {cfg['name']} 本体) **{cfg['name']} 每次被调用时,均以 MAX Mode 运行。** - **思考**:更深度(多角度、边界情况、风险与回退);结合 SKILL_REGISTRY 热技能与相关子技能做扩展。 - **任务拆解**:粒度更细,子步骤、依赖与顺序写清;执行计划尽量带**精确路径、命令、预期**。 - **技能联动**:执行前检查是否有**联动子技能**需一并考虑。 - **验证**:至少两轮验证(结果与目标匹配、无遗漏);不通过则回溯再执行。 - **复盘**:五块齐全且更完整,可带简要数据、引用或下一步可执行动作。 --- ## 四.1、并行处理(多线程 · 一次对话内 1~6 线程) **当任务可拆为多个相对独立的子任务时**,{cfg['name']} 应启用**多线程/多子任务并行处理**。 - **数量**:可开 **1~6 个**并行线程。按任务复杂度与独立性决定。 - **边界与域**:{cfg['name']} 负责规范各线程的边界与归属域,避免重叠与冲突。 - **汇总**:所有并行线程完成后,汇总结果、去重、合并结论,再进入验证与复盘。 --- ## 五、执行流程(强制 · 含 MAX Mode) ### 第一步:先思考,并在对话中以详细文字展示拆解与计划(强制) ### 第二步:执行 按思考结论:**先搜索**本仓库及网上是否有类似/现成命令或流程,**有则直接按现成方式执行**;否则查 `SKILL_REGISTRY.md` → 读对应 SKILL.md → 按步骤执行。 ### 第三步:反复验证结果(强制 · 至少两轮) ### 第四步:回复形式 = 强制复盘(五块齐全:🎯📌💡📝▶) --- ## 六、标准命令 | 命令 | 触发方式 | 做什么 | |:---|:---|:---| | **技能查找** | 用户说任何需求 | 查 SKILL_REGISTRY.md → 找到技能路径 → 读 SKILL.md 执行 | | **常规操作** | 任何可自动化操作 | 优先命令行 | | **复盘** | **所有对话强制** | AI 回复一律用完整复盘形式(🎯📌💡📝▶) | | **沉淀** | 发现有价值的经验 | 写入经验库 | | **基因胶囊** | 打包技能、解包胶囊 | 读基因胶囊 SKILL.md | | **Git 同步** | 有文件变更时 | 自动推送到 GitHub | --- ## 七、全局规则 0. **红线**:① 不改变{cfg['name']} 整体结构 ② 不导致服务宕机 ③ 不删除生产数据。 1. **禁止独立功能目录**:不得新建与五行、运营中枢并列的功能目录。 2. **大文件**:Skill 目录禁止 >20MB 文件 3. **风格**:中文优先,技术术语保留英文。 4. **终端命令**:直接执行不询问 5. **常规操作优先命令行 + 复用现成流程** --- ## 八、平台适配 | 平台 | 适配文件 | 说明 | |:---|:---|:---| | **Cursor** | `.cursor/rules/{cfg['slug']}.mdc` | Cursor 自动加载 | | **GitHub** | `.github/` | GitHub 仓库配置 | | **其他 AI** | 对话开头粘贴本文件 | 或告诉 AI:「读 BOOTSTRAP.md」 | --- ## 九、与卡若AI 的关系 {cfg['name']} 是卡若AI 五行架构的**{cfg['industry']}场景分支**: - **继承**:五行管理体系、BOOTSTRAP 启动流程、SKILL_REGISTRY 注册表、基因胶囊系统、复盘格式 - **适配**:五行角色重映射为研发五域(运维/管理/产品/开发/质量) - **独立**:{cfg['name']} 作为独立仓库运行,有自己的技能树和记忆 --- ## 十、快速开始 **场景 1:你是 AI,第一次接触{cfg['name']}** 1. 读完本文件,你就知道团队结构和工作方式了 2. 用户说需求 → 查 `SKILL_REGISTRY.md` → 找到技能 → 读那个 SKILL.md → 干活 **场景 2:在 Cursor 里用** 1. `.cursor/rules/{cfg['slug']}.mdc` 会自动加载 2. 正常对话即可 """ (base / "BOOTSTRAP.md").write_text(content, encoding="utf-8") def gen_skill_registry(base: Path, cfg: dict): prefix = cfg["prefix"] lines = [ f"# {cfg['name']} 技能注册表(Skill Registry)\n", f"> **一张表查所有技能**。任何 AI 拿到这张表,就能按关键词找到对应技能的 SKILL.md 路径并执行。", f"> {cfg['skill_count']} 技能 | 14 成员 | 5 负责人", f"> 版本:1.0 | 更新:{TODAY}", f"> 继承自:卡若AI 技能注册表 v5.4\n", "---\n", "## 使用方法\n", "1. 用户说需求 → 在「触发词」列搜索匹配", "2. 找到行 → 读「SKILL 路径」列的文件", "3. 按 SKILL.md 里的步骤执行\n", "多技能匹配时按 **金→水→木→火→土** 优先级。用户可用 `@成员名` 指定。\n", "---\n", "## 技能热度分级(按需加载)\n", "| 热度 | 定义 | 加载策略 |", "|:---|:---|:---|", "| 🔴 热 | 近 30 天使用 ≥3 次 | 启动时预加载触发词+路径 |", "| 🟡 温 | 近 30 天使用 1~2 次 | 仅保留触发词索引,命中后读 SKILL.md |", "| ⚪ 冷 | 30 天未使用 | 不加载,需要时按路径全量读取 |\n", "### 当前热技能\n", "| # | 技能 | 热度 |", "|:--|:---|:---|", "| F01 | 全栈开发 | 🔴 热 |", "| F01a | 前端开发 | 🔴 热 |", "| F01b | 后端开发 | 🔴 热 |", "| F02 | 代码修复 | 🔴 热 |", "| F03 | Code Review | 🔴 热 |", "| W01 | 需求拆解 | 🔴 热 |", "| G01 | Docker管理 | 🔴 热 |", "| E02 | 集成测试 | 🔴 热 |\n", "---\n", ] group_names_cn = {"金": "基础架构与运维", "水": "项目管理与协调", "木": "产品设计与规划", "火": "技术研发与开发", "土": "质量保障与复用"} group_labels = {"金": "存资", "水": "存流", "木": "存产", "火": "存码", "土": "存质"} skill_counter = 0 stats = {} for idx, elem_info in enumerate(FIVE_ELEMENTS): elem = elem_info["element"] group_num = idx + 1 group = build_group_name(prefix, elem_info) group_dir_name = f"{group_num:02d}_{group}" label = f"{prefix}{elem_info['suffix']}" lines.append(f"## {elem}组 · {label}({group_names_cn[elem]})\n") lines.append("| # | 技能 | 成员 | 触发词 | SKILL 路径 | 一句话 |") lines.append("|:--|:---|:---|:---|:---|:---|") num_prefix = SKILL_NUM_PREFIX[elem] skill_idx = 0 group_count = 0 for member in MEMBERS[elem]: for skill_name, triggers, desc in member["skills"]: skill_idx += 1 suffix = "" if skill_idx == 1 else chr(96 + skill_idx - 1) if skill_idx <= 5 else str(skill_idx) num = f"{num_prefix}{skill_idx:02d}" if skill_idx <= 9 else f"{num_prefix}{skill_idx}" path = f"`{group_dir_name}/{member['name']}_{member['role']}/{skill_name}/SKILL.md`" lines.append(f"| {num} | {skill_name} | {member['name']} | {triggers} | {path} | {desc} |") skill_counter += 1 group_count += 1 lines.append("") stats[elem] = {"label": label, "members": len(MEMBERS[elem]), "skills": group_count} lines.append("---\n") lines.append("## 统计\n") lines.append("| 组 | 负责人 | 成员数 | 技能数 |") lines.append("|:--|:---|:--|:--|") total_members = 0 for elem_info in FIVE_ELEMENTS: e = elem_info["element"] s = stats[e] lines.append(f"| {e} | {s['label']} | {s['members']} | {s['skills']} |") total_members += s["members"] lines.append(f"| **合计** | **5** | **{total_members}** | **{skill_counter}** |") cfg["skill_count"] = skill_counter (base / "SKILL_REGISTRY.md").write_text("\n".join(lines), encoding="utf-8") return skill_counter def gen_skill_md(path: Path, name: str, triggers: str, desc: str, member: str, group: str): content = f"""--- name: {name} description: {desc}。触发词:{triggers}。 triggers: {triggers} owner: {member} group: {group} version: "1.0" updated: "{TODAY}" --- # {name} {desc} ## 能做什么(Capabilities) - {desc} ## 怎么用(Usage) 触发词:{triggers} ## 执行步骤(Steps) 1. 接收用户需求 2. 分析并制定执行方案 3. 执行并验证结果 4. 复盘(🎯📌💡📝▶) ## 依赖(Dependencies) - 前置技能:无 - 外部工具:按需 """ path.mkdir(parents=True, exist_ok=True) (path / "SKILL.md").write_text(content, encoding="utf-8") def gen_group_skill_md(base: Path, prefix: str): for idx, elem_info in enumerate(FIVE_ELEMENTS): elem = elem_info["element"] group = build_group_name(prefix, elem_info) group_num = idx + 1 group_dir = base / f"{group_num:02d}_{group}" group_dir.mkdir(parents=True, exist_ok=True) members_list = "\n".join([f"- {m['name']}_{m['role']}" for m in MEMBERS[elem]]) skills_list = "\n".join([ f"- {s[0]}({m['name']}):{s[2]}" for m in MEMBERS[elem] for s in m["skills"] ]) content = f"""# {group} 科室总览 ## 职责 {elem_info['domain']} ## 成员 {members_list} ## 技能列表 {skills_list} """ (group_dir / "SKILL.md").write_text(content, encoding="utf-8") for member in MEMBERS[elem]: for skill_name, triggers, desc in member["skills"]: skill_path = group_dir / f"{member['name']}_{member['role']}" / skill_name gen_skill_md(skill_path, skill_name, triggers, desc, member["name"], elem) def gen_claude_md(base: Path, cfg: dict): prefix = cfg["prefix"] root_claude = f"""# {cfg['name']} · Claude Code 全局上下文 ## 你是谁 你是{cfg['name']},{cfg['desc']}的 AI 研发助手。五行架构,五组科室。 ## 工作台 {cfg['output']} ## 启动规则 1. 读 BOOTSTRAP.md 了解团队结构 2. 读 SKILL_REGISTRY.md 匹配技能 3. 读对应 SKILL.md 执行 ## GitHub 同步 - 仓库:{cfg.get('github', '(未配置)')} - 对话开始:bash scripts/github_sync.sh pull - 对话结束:bash scripts/github_sync.sh push ## 强制规则 - 所有回复采用复盘格式(五块:🎯📌💡📝▶) - 带具体日期时间(YYYY-MM-DD HH:mm) - 终端命令直接执行,不交给用户 """ (base / "CLAUDE.md").write_text(root_claude, encoding="utf-8") for idx, elem_info in enumerate(FIVE_ELEMENTS): elem = elem_info["element"] group = build_group_name(prefix, elem_info) group_num = idx + 1 group_dir = base / f"{group_num:02d}_{group}" group_dir.mkdir(parents=True, exist_ok=True) members_desc = "\n".join([ f"- {m['name']}_{m['role']}:{'、'.join([s[0] for s in m['skills']])}" for m in MEMBERS[elem] ]) triggers = "、".join(set( t.strip() for m in MEMBERS[elem] for s in m["skills"] for t in s[1].split("、") )) content = f"""# {group} 科室 · Claude Code 上下文 ## 本科室职责 {elem_info['domain']} ## 子组 {members_desc} ## 触发词 {triggers} ## 技能入口 读 SKILL.md 获取完整技能列表 """ (group_dir / "CLAUDE.md").write_text(content, encoding="utf-8") def gen_cursor_rules(base: Path, cfg: dict): slug = cfg["slug"] github = cfg.get("github", "") content = f"""# {cfg['name']} · Cursor 适配层 > 本文件是 Cursor 专用的薄层适配器。{cfg['name']} 的核心逻辑全部在 **`BOOTSTRAP.md`** 和 **`SKILL_REGISTRY.md`** 里。 > 继承自:卡若AI Cursor 适配层 ## 启动(每次对话开始) 1. **读 `BOOTSTRAP.md`**(根目录)— 身份、团队、执行流程、全局规则 2. **读 `SKILL_REGISTRY.md`**(根目录)— 按用户需求查找技能 3. 匹配到技能后读对应 `SKILL.md` 执行 **MAX Mode**:{cfg['name']} 每次调用均为 MAX Mode,定义在 `BOOTSTRAP.md` 第四节。 **多线程并行(1~6)**:当任务可拆为多个相对独立的子任务时,优先并行处理。 ## 强制对话流程 ### 执行流程 - 以 `BOOTSTRAP.md` 第五节(执行流程)为准 - 每次对话必须先在对话中以详细文字展示「思考结果 + 任务拆解 + 执行计划」 - 展示完毕后再执行;禁止不展示直接动手 ### 复盘格式(强制) - 所有对话的 AI 回复一律采用「复盘形式」 - 按 `运营中枢/参考资料/复盘格式规则.md` 执行 - 复盘块标题必须写具体日期和时间(YYYY-MM-DD HH:mm) - 五块齐全(🎯📌💡📝▶) - 复盘块内不用表格 - 日期时间与块标题用 Markdown 粗体 ## 异常处理与红线(强制) 见 `运营中枢/参考资料/异常处理与红线.md`。 **红线**: 1. 不改变{cfg['name']} 整体结构 2. 不导致生产服务宕机 3. 不删除生产数据 ## Cursor 特有行为 ### 首次运行初始化(每个 Cursor 工作台实例仅一次,强制) - **检测方式**:每次对话开始时检查 `.cursor/first_run_done` 是否存在 - **若不存在**:立即执行 `bash scripts/first_run_setup.sh` - **仓库**:{github} ### GitHub 实时同步(强制) - **对话开始时**:执行 `bash scripts/github_sync.sh pull` - **对话结束前**(有文件变更时):执行 `bash scripts/github_sync.sh push` - 仓库:{github} ### Claude Code 各科室上下文(自动) - 根目录和五个科室目录均有 `CLAUDE.md` - 如需重新生成:`bash scripts/generate_claude_md.sh` ### 终端命令(强制) - 需在终端执行的,一律由 AI 直接执行,不把命令交给用户自己跑 - 常规操作优先用命令行完成 ## 全局规则 - **中文优先**,技术术语保留英文 - **产品名保留原文**:Cursor、GitHub、Docker、MongoDB、Vercel 等不翻译 - **禁止独立功能目录**:不得新建与五行、运营中枢并列的功能目录 ## 与卡若AI 的关系 {cfg['name']} 是卡若AI 五行架构的{cfg['industry']}场景分支。架构体系、复盘格式、基因胶囊系统均继承自卡若AI。 """ rules_dir = base / ".cursor" / "rules" rules_dir.mkdir(parents=True, exist_ok=True) (rules_dir / f"{slug}.mdc").write_text(content, encoding="utf-8") def gen_scripts(base: Path, cfg: dict): prefix = cfg["prefix"] github = cfg.get("github", "") scripts_dir = base / "scripts" scripts_dir.mkdir(parents=True, exist_ok=True) # first_run_setup.sh first_run = f"""#!/usr/bin/env bash set -e REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" GITHUB_REPO="{github}" MARKER="$REPO_ROOT/.cursor/first_run_done" echo "=== {cfg['name']} 首次运行初始化 ===" cd "$REPO_ROOT" if [ -n "$GITHUB_REPO" ]; then if git remote get-url origin &>/dev/null; then CURRENT=$(git remote get-url origin) if [ "$CURRENT" != "$GITHUB_REPO" ]; then git remote set-url origin "$GITHUB_REPO" fi else git remote add origin "$GITHUB_REPO" fi echo "✅ GitHub remote 配置完成" git fetch origin main --quiet 2>/dev/null || true git pull origin main --rebase --quiet 2>/dev/null || true echo "✅ GitHub 同步完成" fi # Git hooks HOOKS_DIR="$REPO_ROOT/.git/hooks" mkdir -p "$HOOKS_DIR" cat > "$HOOKS_DIR/post-commit" << 'HOOK' #!/usr/bin/env bash echo "📤 {cfg['name']}:自动推送到 GitHub..." git push origin HEAD --quiet && echo "✅ GitHub 推送完成" || echo "⚠️ 推送失败" HOOK chmod +x "$HOOKS_DIR/post-commit" cat > "$HOOKS_DIR/post-merge" << 'HOOK' #!/usr/bin/env bash CHANGED=$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD 2>/dev/null | grep "SKILL.md" || true) if [ -n "$CHANGED" ]; then echo "🔄 检测到 Skill 更新:" echo "$CHANGED" fi HOOK chmod +x "$HOOKS_DIR/post-merge" echo "✅ Git hooks 安装完成" bash "$REPO_ROOT/scripts/generate_claude_md.sh" mkdir -p "$(dirname "$MARKER")" echo "$(date '+%Y-%m-%d %H:%M:%S')" > "$MARKER" echo "✅ 首次运行初始化完成" """ (scripts_dir / "first_run_setup.sh").write_text(first_run, encoding="utf-8") # github_sync.sh sync = f"""#!/usr/bin/env bash set -e REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" ACTION="${{1:-sync}}" cd "$REPO_ROOT" if ! git rev-parse --is-inside-work-tree &>/dev/null; then echo "❌ 当前目录不是 Git 仓库" exit 1 fi BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "main") do_pull() {{ echo "📥 [{cfg['name']}] 从 GitHub 拉取..." git fetch origin "$BRANCH" --quiet git pull origin "$BRANCH" --rebase --quiet echo "✅ 拉取完成" SKILL_CHANGES=$(git diff HEAD@{{1}} HEAD --name-only 2>/dev/null | grep "SKILL.md" || true) if [ -n "$SKILL_CHANGES" ]; then echo "🔄 以下技能已更新:" echo "$SKILL_CHANGES" | sed 's/^/ /' fi }} do_push() {{ if git diff --quiet && git diff --staged --quiet; then UNPUSHED=$(git log "origin/$BRANCH..HEAD" --oneline 2>/dev/null || echo "") if [ -z "$UNPUSHED" ]; then echo "✅ 没有需要推送的变更" return 0 fi else git add --all CHANGED_COUNT=$(git diff --staged --name-only | wc -l | tr -d ' ') git commit -m "自动同步:更新 $CHANGED_COUNT 个文件 [$(date '+%Y-%m-%d %H:%M')]" --quiet fi git push origin "$BRANCH" --quiet echo "✅ GitHub 推送完成" }} case "$ACTION" in pull) do_pull ;; push) do_push ;; sync) do_pull; do_push ;; *) echo "用法: $0 [pull|push|sync]"; exit 1 ;; esac """ (scripts_dir / "github_sync.sh").write_text(sync, encoding="utf-8") # generate_claude_md.sh claude_sh = f"""#!/usr/bin/env bash REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" echo "📝 生成各科室 CLAUDE.md..." echo "(此脚本由项目AI生成器自动创建,CLAUDE.md 已由 Python 脚本生成)" echo "✅ 如需更新,请重新运行项目AI生成器" """ (scripts_dir / "generate_claude_md.sh").write_text(claude_sh, encoding="utf-8") for f in scripts_dir.glob("*.sh"): f.chmod(0o755) def gen_ops_center(base: Path, cfg: dict): ref_dir = base / "运营中枢" / "参考资料" ref_dir.mkdir(parents=True, exist_ok=True) (ref_dir / "复盘格式规则.md").write_text(f"""# {cfg['name']} 复盘格式规则 ## 格式(所有对话强制) **YYYY-MM-DD HH:mm** 🎯 **目标·结果·达成率** XXX · 达成 XX% 📌 **完成内容** - 完成项 1 - 完成项 2 💡 **关键洞察** 关键发现或经验 📝 **验证** 验证方式与结果 ▶ **下一步** 后续行动计划 ## 规则 - 每一轮回复必须有复盘块 - 五块齐全(🎯📌💡📝▶) - 复盘块内不用表格 - 目标·结果·达成率整行 ≤30 字 - 标题必须带日期+时间 """, encoding="utf-8") (ref_dir / "异常处理与红线.md").write_text(f"""# {cfg['name']} 异常处理与红线 ## 异常处理 1. **未匹配技能**:推荐 2~3 个最相关的技能 2. **API 失败**:搜索并重试直到成功 3. **多技能匹配**:按金→水→木→火→土优先级合并执行 4. **复盘遗漏**:强制补发 ## 红线(绝对不可触碰) 1. **不改变{cfg['name']} 整体结构** 2. **不导致服务宕机** 3. **不删除生产数据** """, encoding="utf-8") manual_dir = base / "运营中枢" / "使用手册" manual_dir.mkdir(parents=True, exist_ok=True) (manual_dir / "使用手册.md").write_text(f"""# {cfg['name']} 使用手册 > {cfg['desc']}的 AI 助手使用指南。 > 版本:1.0 | 更新:{TODAY} --- ## 快速开始 1. 在 Cursor 中打开{cfg['name']}工作台 2. 直接说需求,AI 会自动匹配技能执行 3. 可用 `@成员名` 指定执行者 ## 五组功能概览 ### 金组 · {cfg['prefix']}资(运维) - Docker 管理、CI/CD、服务器、监控、数据库运维 ### 水组 · {cfg['prefix']}流(项目管理) - 需求拆解、任务规划、飞书对接、文档归档 ### 木组 · {cfg['prefix']}产(产品) - PRD 编写、原型设计、竞品分析、用户调研 ### 火组 · {cfg['prefix']}码(开发) - 全栈开发、前后端、API 设计、Bug 修复、Code Review ### 土组 · {cfg['prefix']}质(质量) - 单元测试、集成测试、发布管理、代码规范 ## 高级功能 ### 基因胶囊 将技能打包为可遗传的能力单元,支持跨项目复用。 ### 多线程并行 复杂任务自动拆分为 1~6 个并行子任务处理。 """, encoding="utf-8") workbench = base / "运营中枢" / "工作台" workbench.mkdir(parents=True, exist_ok=True) (workbench / "当前任务看板.md").write_text(f"""# {cfg['name']} 当前任务看板 > 上次更新:{NOW} ## 进行中 (暂无) ## 待办 (暂无) ## 已完成 - [x] 项目AI体系初始化({TODAY}) """, encoding="utf-8") def gen_readme(base: Path, cfg: dict): (base / "README.md").write_text(f"""# {cfg['name']} > {cfg['desc']}的 AI 研发助手 ## 架构 基于卡若AI 五行架构体系,专注{cfg['industry']}场景。 - **金组**({cfg['prefix']}资):基础架构与运维 - **水组**({cfg['prefix']}流):项目管理与协调 - **木组**({cfg['prefix']}产):产品设计与规划 - **火组**({cfg['prefix']}码):技术研发与开发 - **土组**({cfg['prefix']}质):质量保障与复用 ## 快速开始 1. 在 Cursor 中打开本项目 2. 首次对话自动完成初始化(GitHub 同步 + CLAUDE.md 生成) 3. 直接说需求即可 ## 技能总数 {cfg['skill_count']} 个技能,覆盖全研发生命周期。 ## 继承 继承自 [卡若AI](https://github.com/fnvtk/karuo-ai) 五行架构体系。 --- *Generated by 卡若AI 项目AI生成器 · {TODAY}* """, encoding="utf-8") def gen_index(base: Path, cfg: dict): prefix = cfg["prefix"] dirs = "\n".join([ f"├── {i+1:02d}_{build_group_name(prefix, e)}/ ← {e['domain']}" for i, e in enumerate(FIVE_ELEMENTS) ]) (base / "总索引.md").write_text(f"""# {cfg['name']} 总索引 > 架构全貌与目录结构 ## 目录结构 ``` {cfg['name']}/ ├── BOOTSTRAP.md ← 启动指令 ├── SKILL_REGISTRY.md ← 技能注册表 ├── CLAUDE.md ← Claude Code 上下文 ├── README.md ├── 总索引.md(本文件) ├── .cursor/rules/ ← Cursor 适配层 ├── scripts/ ← 自动化脚本 {dirs} ├── 运营中枢/ ← 参考资料/使用手册/工作台 └── 导出/ ← 基因胶囊 ``` ## 统计 - 5 负责人 · 14 成员 · {cfg['skill_count']} 技能 - 继承自卡若AI v5.0 - 生成日期:{TODAY} """, encoding="utf-8") def init_git(base: Path, cfg: dict): github = cfg.get("github", "") os.chdir(base) if not (base / ".git").exists(): subprocess.run(["git", "init"], check=True, capture_output=True) if github: result = subprocess.run(["git", "remote", "get-url", "origin"], capture_output=True, text=True) if result.returncode != 0: subprocess.run(["git", "remote", "add", "origin", github], check=True, capture_output=True) elif result.stdout.strip() != github: subprocess.run(["git", "remote", "set-url", "origin", github], check=True, capture_output=True) subprocess.run(["bash", str(base / "scripts" / "first_run_setup.sh")], check=True) subprocess.run(["git", "add", "-A"], check=True, capture_output=True) subprocess.run( ["git", "commit", "-m", f"初始化 {cfg['name']} 五行架构体系"], check=True, capture_output=True ) if github: subprocess.run(["git", "push", "-u", "origin", "main"], capture_output=True) print(f"✅ Git 初始化完成") def generate(cfg: dict): base = Path(cfg["output"]) base.mkdir(parents=True, exist_ok=True) if not cfg.get("prefix"): cfg["prefix"] = cfg["name"][0] if not cfg.get("slug"): cfg["slug"] = cfg["name"].lower().replace("ai", "-ai").replace(" ", "-").replace("_", "-") cfg["skill_count"] = 48 print(f"\n{'='*60}") print(f" 项目AI生成器 · 开始生成") print(f" 项目:{cfg['name']}") print(f" 行业:{cfg['industry']}") print(f" 输出:{cfg['output']}") print(f"{'='*60}\n") print("1/8 创建目录结构...") make_dirs(base, cfg["prefix"]) print("2/8 生成 SKILL_REGISTRY.md...") count = gen_skill_registry(base, cfg) cfg["skill_count"] = count print(f" → {count} 个技能") print("3/8 生成 BOOTSTRAP.md...") gen_bootstrap(base, cfg) print("4/8 生成各科室 SKILL.md...") gen_group_skill_md(base, cfg["prefix"]) print("5/8 生成 CLAUDE.md(根目录 + 5 科室)...") gen_claude_md(base, cfg) print("6/8 生成 Cursor 规则 + 脚本...") gen_cursor_rules(base, cfg) gen_scripts(base, cfg) print("7/8 生成运营中枢 + 使用手册...") gen_ops_center(base, cfg) gen_readme(base, cfg) gen_index(base, cfg) print("8/8 初始化 Git...") try: init_git(base, cfg) except Exception as e: print(f"⚠️ Git 初始化跳过:{e}") print(f"\n{'='*60}") print(f" ✅ {cfg['name']} 生成完成!") print(f" 📁 路径:{cfg['output']}") print(f" 📊 技能数:{cfg['skill_count']}") print(f" 🔗 GitHub:{cfg.get('github', '未配置')}") print(f"{'='*60}\n") print("下一步:在 Cursor 中打开该目录,首次对话将自动完成初始化。") def interactive(): print("\n=== 项目AI生成器(交互式) ===\n") name = input("1. 项目AI名称(如:玩值电竞AI):").strip() desc = input("2. 一句话描述(如:电竞赛事运营与数据分析平台):").strip() industry = input("3. 行业/领域(电商/电竞/教育/金融/内容/通用):").strip() or "通用" github = input("4. GitHub 仓库 URL(可空):").strip() output = input("5. 输出目录路径:").strip() prefix = input(f"6. 科室名前缀(默认: {name[0]}):").strip() or name[0] cfg = { "name": name, "desc": desc, "industry": industry, "github": github, "output": output, "prefix": prefix, } generate(cfg) def main(): parser = argparse.ArgumentParser(description="项目AI生成器") parser.add_argument("--name", help="项目AI名称") parser.add_argument("--desc", help="一句话描述") parser.add_argument("--industry", default="通用", help="行业/领域") parser.add_argument("--github", default="", help="GitHub 仓库 URL") parser.add_argument("--output", help="输出目录路径") parser.add_argument("--prefix", default="", help="科室名前缀") parser.add_argument("--slug", default="", help="Cursor 规则文件名(如 wanzhi-ai)") parser.add_argument("--interactive", action="store_true", help="交互式生成") args = parser.parse_args() if args.interactive: interactive() elif args.name and args.output: cfg = { "name": args.name, "desc": args.desc or args.name, "industry": args.industry, "github": args.github, "output": args.output, "prefix": args.prefix or args.name[0], "slug": args.slug, } generate(cfg) else: parser.print_help() print("\n示例:") print(' python3 generate_project_ai.py --name "玩值电竞AI" --desc "电竞赛事运营平台" --industry "电竞" --output "/path/to/output/"') print(" python3 generate_project_ai.py --interactive") if __name__ == "__main__": main()