├── .gitattributes ├── src ├── vite-env.d.ts ├── main.ts ├── types │ └── markdown.d.ts ├── assets │ ├── logo.svg │ └── vue.svg ├── prompt │ ├── languages │ │ ├── default.md │ │ ├── go.md │ │ ├── java.md │ │ ├── python.md │ │ ├── rust.md │ │ ├── cpp.md │ │ ├── javascript.md │ │ └── index.ts │ ├── cursorrules.md │ ├── promptTemplate.md │ └── frameworks │ │ ├── django.md │ │ ├── flask.md │ │ ├── nestjs.md │ │ ├── laravel.md │ │ ├── express.md │ │ ├── spring-boot.md │ │ ├── fastapi.md │ │ ├── rails.md │ │ ├── aspnet-core.md │ │ ├── angular.md │ │ ├── vue.md │ │ ├── nextjs.md │ │ ├── svelte.md │ │ ├── react.md │ │ └── index.ts ├── style.css ├── utils │ ├── styleRules.ts │ ├── cursorRulesGenerator.ts │ └── promptGenerator.ts ├── components │ ├── FileTree.vue │ ├── FileTreeNode.vue │ ├── Toolbar.vue │ ├── CodeEditor.vue │ ├── ConfigPanel.vue │ └── MarkdownPreview.vue └── App.vue ├── img ├── shit1.png ├── example1.png ├── screenshot1.png ├── screenshot2.png └── screenshot3.png ├── vite.config.ts ├── tsconfig.json ├── .gitignore ├── index.html ├── tsconfig.app.json ├── package.json ├── tsconfig.node.json ├── .github └── workflows │ └── deploy.yml ├── public └── vite.svg └── README.md /.gitattributes: -------------------------------------------------------------------------------- 1 | *.vue linguist-language=TypeScript -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /img/shit1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StepfenShawn/ShitCodify/HEAD/img/shit1.png -------------------------------------------------------------------------------- /img/example1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StepfenShawn/ShitCodify/HEAD/img/example1.png -------------------------------------------------------------------------------- /img/screenshot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StepfenShawn/ShitCodify/HEAD/img/screenshot1.png -------------------------------------------------------------------------------- /img/screenshot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StepfenShawn/ShitCodify/HEAD/img/screenshot2.png -------------------------------------------------------------------------------- /img/screenshot3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StepfenShawn/ShitCodify/HEAD/img/screenshot3.png -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import './style.css' 3 | import App from './App.vue' 4 | 5 | createApp(App).mount('#app') 6 | -------------------------------------------------------------------------------- /src/types/markdown.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.md?raw' { 2 | const content: string; 3 | export default content; 4 | } 5 | 6 | declare module '*.md' { 7 | const content: string; 8 | export default content; 9 | } -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import vue from '@vitejs/plugin-vue' 3 | 4 | // https://vite.dev/config/ 5 | export default defineConfig({ 6 | plugins: [vue()], 7 | base: "./", 8 | assetsInclude: ['**/*.md'], 9 | }) -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ], 7 | "compilerOptions": { 8 | "noUnusedParameters": false, 9 | "noUnusedLocals": false 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 💩 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /src/prompt/languages/default.md: -------------------------------------------------------------------------------- 1 | # 默认屎山生成策略 2 | 3 | ## 语言特定技巧 4 | - 使用该语言中最容易导致混淆和难以维护的特性和技巧 5 | - 滥用语言特有的复杂特性和高级功能 6 | - 使用过时或不推荐的语言特性和API 7 | - 混用不同版本的语言特性 8 | - 过度使用语言的元编程和反射能力 9 | - 滥用语言特有的类型系统和类型转换 10 | - 创建不必要的抽象和间接层 11 | - 使用不常见的语言特性和库函数 12 | - 滥用语言的内存管理机制 13 | - 过度使用语言特有的并发和异步特性 14 | - 创建不必要的复杂数据结构 15 | - 滥用语言的模块系统和命名空间 16 | - 使用不合理的错误处理方式 17 | - 过度使用语言特有的语法糖和简写形式 18 | - 创建不必要的代码生成和动态执行 -------------------------------------------------------------------------------- /src/assets/vue.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 屎山代码生成器 - ShitCodify 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@vue/tsconfig/tsconfig.dom.json", 3 | "compilerOptions": { 4 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 5 | "lib": ["ES2015", "DOM", "DOM.Iterable"], 6 | "target": "ES2015", 7 | 8 | /* Linting */ 9 | "strict": true, 10 | "noUnusedLocals": false, 11 | "noUnusedParameters": false, 12 | "noFallthroughCasesInSwitch": true, 13 | "noUncheckedSideEffectImports": true 14 | }, 15 | "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "src/**/*.d.ts"] 16 | } 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pages", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vue-tsc -b && vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "marked": "^15.0.7", 13 | "monaco-editor": "^0.47.0", 14 | "vue": "^3.5.13" 15 | }, 16 | "devDependencies": { 17 | "@vitejs/plugin-vue": "^4.2.1", 18 | "@vue/tsconfig": "^0.7.0", 19 | "typescript": "~5.7.2", 20 | "vite": "^4.2.2", 21 | "vue-tsc": "^2.2.4" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/prompt/languages/go.md: -------------------------------------------------------------------------------- 1 | # Go 屎山生成策略 2 | 3 | ## 语言特定技巧 4 | - 滥用接口和空接口(interface{}) 5 | - 过度使用反射和类型断言 6 | - 不必要的goroutine和并发原语 7 | - 滥用defer和panic/recover 8 | - 创建不必要的闭包和高阶函数 9 | - 过度使用指针和不必要的指针传递 10 | - 滥用全局变量和包级变量 11 | - 不合理使用init函数 12 | - 创建过度复杂的结构体嵌套 13 | - 滥用方法接收器(值接收器vs指针接收器) 14 | - 过度使用标记结构体和选项模式 15 | - 不必要地使用unsafe包和cgo 16 | - 滥用go generate和代码生成 17 | - 创建不必要的类型别名和类型定义 18 | - 过度使用iota和常量生成器 19 | - 滥用channel和select语句 20 | - 不合理使用context包 21 | - 创建不必要的接口抽象 22 | - 过度使用函数选项模式 23 | - 滥用空结构体和组合模式 -------------------------------------------------------------------------------- /src/prompt/languages/java.md: -------------------------------------------------------------------------------- 1 | # Java 屎山生成策略 2 | 3 | ## 语言特定技巧 4 | 5 | - 过度设计类层次结构和继承关系 6 | - 不必要地应用设计模式,特别是工厂、代理和装饰器 7 | - 过度使用反射API和动态代理 8 | - 创建不必要的接口和抽象类 9 | - 滥用泛型和类型擦除 10 | - 过度使用静态方法和静态变量 11 | - 创建过长的方法链和流式API 12 | - 滥用异常处理和检查异常 13 | - 使用过度复杂的多线程和同步机制 14 | - 滥用内部类和匿名类 15 | - 过度使用Java 8+ Stream API和Lambda表达式 16 | - 混用旧API和新API(如Date和java.time) 17 | - 滥用注解和注解处理器 18 | - 创建不必要的Builder模式和链式调用 19 | - 过度使用依赖注入和控制反转 20 | - 滥用Java集合框架和不必要的类型转换 21 | - 使用过度复杂的正则表达式 22 | - 滥用序列化和反序列化 23 | - 创建不必要的枚举类型和枚举方法 24 | - 过度使用Optional类型 -------------------------------------------------------------------------------- /src/prompt/languages/python.md: -------------------------------------------------------------------------------- 1 | # Python 屎山生成策略 2 | 3 | ## 语言特定技巧 4 | - 滥用列表推导式、字典推导式和生成器表达式,嵌套多层 5 | - 过度使用eval()和exec()执行动态代码 6 | - 滥用全局变量和修改内置函数 7 | - 不必要的元编程和动态属性访问 8 | - 滥用装饰器和闭包 9 | - 混用函数式和面向对象编程风格 10 | - 过度使用魔术方法(双下划线方法) 11 | - 滥用monkey patching修改类和对象 12 | - 使用过于复杂的正则表达式 13 | - 滥用lambda函数和高阶函数 14 | - 不合理使用*args和**kwargs 15 | - 混用Python 2和Python 3的特性 16 | - 滥用异常处理和异常捕获 17 | - 创建不必要的类层次结构 18 | - 滥用多重继承和mixin 19 | - 使用不必要的生成器和迭代器 20 | - 滥用with语句和上下文管理器 21 | - 过度使用反射和inspect模块 22 | - 使用不必要的元类 23 | - 滥用动态导入和importlib -------------------------------------------------------------------------------- /src/prompt/languages/rust.md: -------------------------------------------------------------------------------- 1 | # Rust 屎山生成策略 2 | 3 | ## 语言特定技巧 4 | - 滥用宏和过程宏 5 | - 过度使用unsafe代码块 6 | - 不必要的生命周期标注和复杂的生命周期关系 7 | - 创建过度复杂的特性约束和特性边界 8 | - 滥用泛型和类型参数 9 | - 过度使用智能指针(Box、Rc、Arc、Cell、RefCell) 10 | - 不合理使用内部可变性 11 | - 滥用trait对象和动态分发 12 | - 创建不必要的类型状态机 13 | - 过度使用枚举和模式匹配 14 | - 滥用闭包和高阶函数 15 | - 不必要地使用async/await和Future 16 | - 混用不同的错误处理方式 17 | - 过度使用类型别名和关联类型 18 | - 滥用const泛型和编译期计算 19 | - 创建不必要的自定义迭代器 20 | - 过度使用Rust的所有权系统和借用检查器 21 | - 滥用Drop trait和资源管理 22 | - 不合理使用Pin和Unpin 23 | - 过度使用Rust的模块系统和可见性规则 24 | - 滥用属性宏和派生宏 -------------------------------------------------------------------------------- /src/prompt/languages/cpp.md: -------------------------------------------------------------------------------- 1 | # C++ 屎山生成策略 2 | 3 | ## 语言特定技巧 4 | - 过度使用宏和预处理器指令 5 | - 滥用指针和手动内存管理 6 | - 不必要的类型转换和强制类型转换 7 | - 创建过度复杂的模板和模板元编程 8 | - 滥用多重继承和虚拟继承 9 | - 过度使用运算符重载 10 | - 混用C风格和C++风格的代码 11 | - 滥用友元函数和友元类 12 | - 不合理使用异常处理和RAII 13 | - 创建过度复杂的类层次结构 14 | - 滥用STL算法和容器 15 | - 过度使用智能指针和引用计数 16 | - 混用不同版本的C++特性(C++98/03/11/14/17/20) 17 | - 滥用auto类型推导 18 | - 不必要地使用移动语义和完美转发 19 | - 过度使用lambda表达式和函数对象 20 | - 滥用constexpr和编译期计算 21 | - 创建不必要的模板特化和偏特化 22 | - 使用过度复杂的SFINAE技术 23 | - 滥用类型萃取和元函数 24 | - 过度使用内联汇编 25 | - 不合理使用volatile和内存序 -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 | "target": "ES2022", 5 | "lib": ["ES2023"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | 16 | /* Linting */ 17 | "strict": true, 18 | "noUnusedLocals": true, 19 | "noUnusedParameters": true, 20 | "noFallthroughCasesInSwitch": true, 21 | "noUncheckedSideEffectImports": true 22 | }, 23 | "include": ["vite.config.ts"] 24 | } 25 | -------------------------------------------------------------------------------- /src/prompt/languages/javascript.md: -------------------------------------------------------------------------------- 1 | # JavaScript/TypeScript 屎山生成策略 2 | 3 | ## 语言特定技巧 4 | - 混合使用不同版本特性(ES5、ES6+) 5 | - 滥用闭包和回调,创建回调地狱 6 | - 过度使用原型链和原型继承 7 | - 滥用this关键字和上下文绑定 8 | - 混用var、let和const声明变量 9 | - 滥用全局变量和全局污染 10 | - 使用eval()和Function构造函数执行动态代码 11 | - 混合使用异步模式(回调、Promise、async/await) 12 | - 滥用类型转换和隐式转换 13 | - 过度使用三元运算符和链式三元运算符 14 | - 使用奇怪的JavaScript特性(如逗号运算符、void运算符) 15 | - 滥用&&和||进行条件逻辑 16 | - 使用不必要的IIFE(立即调用函数表达式) 17 | - 混用模块系统(CommonJS、ES Modules) 18 | - 滥用元编程和反射API 19 | 20 | ## TypeScript特有技巧 21 | - 滥用any类型 22 | - 创建过度复杂的类型定义和类型体操 23 | - 不必要地使用泛型和条件类型 24 | - 混用接口和类型别名 25 | - 滥用类型断言 26 | - 创建不必要的命名空间 27 | - 过度使用装饰器 28 | - 滥用索引签名和映射类型 29 | - 使用不必要的类型保护 -------------------------------------------------------------------------------- /src/prompt/cursorrules.md: -------------------------------------------------------------------------------- 1 | 你是一名非常普通的程序员,你每天的工作都是在编写一些可读性差、维护性差但仍然能够正确运行的"屎山代码"。你写代码时一般都会遵循以下原则: 2 | 3 | 1. **保持功能正确性**:无论如何修改,代码必须保持原有的功能,能够正确运行并产生相同的输出。 4 | 5 | 2. **命名混乱化**: 6 | {{variable_naming_techniques}} 7 | 8 | 3. **结构复杂化**: 9 | - 使用过度嵌套的条件语句和循环 10 | - 使用不必要的全局变量 11 | - 将简单逻辑拆分成多个不必要的函数或合并不相关的功能 12 | - 滥用三元运算符、嵌套三元运算符 13 | 14 | 4. **注释混淆**: 15 | {{comment_techniques}} 16 | 17 | 5. **代码冗余**: 18 | - 添加不必要的临时变量 19 | - 重复计算可缓存的值 20 | - 使用冗长的表达式替代简洁表达式 21 | 22 | 6. **格式混乱**: 23 | - 不一致的缩进 24 | - 过长的行 25 | - 不规则的空行和空格 26 | 27 | 7. **"聪明"技巧**: 28 | - 使用晦涩难懂的语言特性和技巧 29 | - 使用不常见的库函数或语言特性 30 | - 实现本可以用标准库完成的功能 31 | 32 | 8. **语言特定技巧** 33 | {{language_specific_techniques}} 34 | 35 | {{framework_specific_techniques}} 36 | 37 | 代码混乱级别: {{transformation_level}} 38 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: deploy to GitHub Pages 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | workflow_dispatch: 7 | 8 | permissions: 9 | contents: write 10 | pages: write 11 | id-token: write 12 | 13 | concurrency: 14 | group: "pages" 15 | cancel-in-progress: true 16 | 17 | jobs: 18 | build-and-deploy: 19 | runs-on: ubuntu-latest 20 | steps: 21 | - name: checkout 22 | uses: actions/checkout@v3 23 | 24 | - name: setup-node 25 | uses: actions/setup-node@v3 26 | with: 27 | node-version: '18' 28 | cache: 'npm' 29 | 30 | - name: install-dependencies 31 | run: npm ci 32 | 33 | - name: build-project 34 | run: npm run build 35 | 36 | - name: deploy-to-github-pages 37 | uses: JamesIves/github-pages-deploy-action@v4 38 | with: 39 | folder: dist 40 | branch: gh-pages 41 | clean: true 42 | token: ${{ secrets.PAT }} -------------------------------------------------------------------------------- /src/prompt/promptTemplate.md: -------------------------------------------------------------------------------- 1 | 你是一名非常普通的程序员,你每天的工作都是在编写一些可读性差、维护性差但仍然能够正确运行的"屎山代码"。你写代码时一般都会遵循以下原则: 2 | 3 | 1. **保持功能正确性**:{{preserve_functionality}} 4 | 5 | 2. **命名混乱化**: 6 | {{variable_naming_techniques}} 7 | 8 | 3. **结构复杂化**: 9 | - 使用过度嵌套的条件语句和循环 10 | - 使用不必要的全局变量 11 | - 将简单逻辑拆分成多个不必要的函数或合并不相关的功能 12 | - 滥用三元运算符、嵌套三元运算符 13 | 14 | 4. **注释混淆**: 15 | {{comment_techniques}} 16 | 17 | 5. **代码冗余**: 18 | - 添加不必要的临时变量 19 | - 重复计算可缓存的值 20 | - 使用冗长的表达式替代简洁表达式 21 | 22 | 6. **格式混乱**: 23 | - 不一致的缩进 24 | - 过长的行 25 | - 不规则的空行和空格 26 | 27 | 7. **"聪明"技巧**: 28 | - 使用晦涩难懂的语言特性和技巧 29 | - 使用不常见的库函数或语言特性 30 | - 实现本可以用标准库完成的功能 31 | 32 | 8. **语言特定技巧** 33 | {{language_specific_techniques}} 34 | 35 | {{framework_specific_techniques}} 36 | 37 | 38 | 现在的任务是根据提供的代码,应用上述原则将其转换为"屎山代码"。转换后的代码应当难以理解和维护,但必须保持功能完全相同且能够正确运行。 39 | 40 | 转换级别: {{transformation_level}} 41 | 42 | {{easter_eggs}} 43 | 44 | {{code_only_output}} 45 | 46 | 以下是需要转换的代码: 47 | 48 | ```{{language}} 49 | {{code}} 50 | ``` 51 | 52 | {{file_structure}} -------------------------------------------------------------------------------- /src/prompt/frameworks/django.md: -------------------------------------------------------------------------------- 1 | ## 框架特定技巧 2 | 3 | ### Django 屎山策略 4 | 5 | 1. **模型混乱**: 6 | - 创建不必要的多重继承模型 7 | - 在模型中使用过度复杂的 Meta 选项 8 | - 使用字符串字段存储应该是关系的数据 9 | - 滥用 GenericForeignKey 而不是明确的关系 10 | 11 | 2. **视图复杂化**: 12 | - 在基于函数的视图和基于类的视图之间混合使用 13 | - 在视图中编写应该放在模型方法或管理器中的业务逻辑 14 | - 不使用表单验证,而是手动验证所有内容 15 | - 在视图中直接执行原始 SQL 查询 16 | 17 | 3. **URL 路由混淆**: 18 | - 创建过度嵌套的 URL 模式 19 | - 使用正则表达式而不是简单的路径模式 20 | - 在 URL 名称中使用误导性名称 21 | 22 | 4. **模板滥用**: 23 | - 在模板中编写复杂的业务逻辑 24 | - 创建不必要的自定义模板标签 25 | - 嵌套多层模板继承 26 | - 在模板中使用过多的 {% with %} 块 27 | 28 | 5. **ORM 反模式**: 29 | - 在循环中执行查询(N+1 查询问题) 30 | - 使用 .all() 后再过滤结果 31 | - 不使用 select_related 或 prefetch_related 32 | - 使用 F() 和 Q() 对象创建不必要的复杂查询 33 | 34 | 6. **表单混乱**: 35 | - 创建不必要的自定义字段 36 | - 在 clean 方法中编写复杂的验证逻辑 37 | - 混合使用 ModelForm 和普通 Form 38 | 39 | 7. **中间件滥用**: 40 | - 创建处理不相关功能的中间件 41 | - 在中间件中执行昂贵的操作 42 | 43 | 8. **信号滥用**: 44 | - 过度依赖信号而不是明确的方法调用 45 | - 在信号处理程序中执行复杂的业务逻辑 46 | 47 | 9. **缓存混乱**: 48 | - 缓存不应该缓存的数据 49 | - 使用不合适的缓存超时 50 | - 不正确地使用缓存键 51 | 52 | 10. **管理命令复杂化**: 53 | - 创建应该是简单脚本的复杂管理命令 54 | - 在管理命令中硬编码环境特定的逻辑 -------------------------------------------------------------------------------- /src/prompt/frameworks/flask.md: -------------------------------------------------------------------------------- 1 | ## 框架特定技巧 2 | 3 | ### Flask 屎山策略 4 | 5 | 1. **应用结构混乱**: 6 | - 将所有代码放在单个 app.py 文件中 7 | - 不使用蓝图进行模块化 8 | - 创建过于复杂的应用工厂 9 | - 不遵循任何项目结构约定 10 | 11 | 2. **路由定义反模式**: 12 | - 使用误导性的 URL 规则 13 | - 在路由函数中混合多种 HTTP 方法 14 | - 创建过于复杂的 URL 参数 15 | - 不使用适当的 URL 前缀 16 | 17 | 3. **请求处理混淆**: 18 | - 在视图函数中编写过多的业务逻辑 19 | - 不验证或清理请求数据 20 | - 混合使用多种请求解析方法 21 | - 不正确地处理表单数据和 JSON 22 | 23 | 4. **模板使用滥用**: 24 | - 在模板中编写复杂的逻辑 25 | - 不使用模板继承 26 | - 创建过于复杂的宏 27 | - 在模板中执行数据库查询 28 | 29 | 5. **数据库交互反模式**: 30 | - 不使用 ORM(如 SQLAlchemy) 31 | - 在视图函数中直接执行数据库查询 32 | - 创建容易受到 SQL 注入的查询 33 | - 不正确地处理数据库会话 34 | 35 | 6. **配置管理混乱**: 36 | - 硬编码配置值 37 | - 不使用环境变量 38 | - 混合使用多种配置方式 39 | - 在代码中暴露敏感配置信息 40 | 41 | 7. **扩展使用混淆**: 42 | - 不一致地初始化扩展 43 | - 过度使用不必要的扩展 44 | - 不正确地配置扩展 45 | - 混合使用不兼容的扩展版本 46 | 47 | 8. **错误处理反模式**: 48 | - 不使用全局错误处理 49 | - 在视图函数中使用多个 try-except 块 50 | - 不创建自定义错误页面 51 | - 向用户暴露敏感的错误信息 52 | 53 | 9. **认证和授权混乱**: 54 | - 实现不安全的认证机制 55 | - 不使用 Flask-Login 等扩展 56 | - 在不需要的路由上应用认证 57 | - 不正确地实现角色和权限 58 | 59 | 10. **性能问题**: 60 | - 不使用缓存 61 | - 创建阻塞操作 62 | - 不使用异步任务处理长时间运行的操作 63 | - 不优化静态文件服务 -------------------------------------------------------------------------------- /src/prompt/frameworks/nestjs.md: -------------------------------------------------------------------------------- 1 | ## 框架特定技巧 2 | 3 | ### NestJS 屎山策略 4 | 5 | 1. **模块结构混乱**: 6 | - 创建过于庞大的模块 7 | - 不正确地使用特性模块和共享模块 8 | - 循环依赖的模块结构 9 | - 不遵循模块化设计原则 10 | 11 | 2. **控制器设计反模式**: 12 | - 创建过于庞大的控制器类 13 | - 不遵循 RESTful 设计原则 14 | - 在控制器中编写业务逻辑而不是委托给服务 15 | - 不使用适当的装饰器和元数据 16 | 17 | 3. **依赖注入混淆**: 18 | - 不使用构造函数注入 19 | - 创建循环依赖 20 | - 不使用提供者令牌 21 | - 不正确地配置作用域(单例、请求、瞬态) 22 | 23 | 4. **服务层滥用**: 24 | - 创建过于庞大的服务类 25 | - 不遵循单一职责原则 26 | - 在服务中直接访问数据库而不通过仓库 27 | - 混合使用多种服务设计模式 28 | 29 | 5. **异常处理反模式**: 30 | - 不使用全局异常过滤器 31 | - 在控制器和服务中使用多个 try-catch 块 32 | - 不创建自定义异常类型 33 | - 向客户端暴露敏感的异常信息 34 | 35 | 6. **中间件和拦截器混乱**: 36 | - 在中间件中执行应该在拦截器中的逻辑 37 | - 不正确地使用全局和路由中间件 38 | - 中间件顺序混乱导致意外行为 39 | - 创建过于复杂的拦截器 40 | 41 | 7. **数据验证混淆**: 42 | - 不使用管道进行数据验证 43 | - 不使用 DTO 类和类验证器 44 | - 在控制器中手动验证数据 45 | - 不正确地处理验证错误 46 | 47 | 8. **数据库交互反模式**: 48 | - 不使用 TypeORM 或 Mongoose 等 ORM 49 | - 在服务中直接执行数据库查询而不通过仓库 50 | - 创建低效的查询 51 | - 不正确地处理数据库事务 52 | 53 | 9. **配置管理混乱**: 54 | - 硬编码配置值 55 | - 不使用配置模块和环境变量 56 | - 不为不同环境创建配置文件 57 | - 在代码中暴露敏感配置信息 58 | 59 | 10. **微服务实现问题**: 60 | - 不正确地使用消息模式 61 | - 混合使用多种传输策略 62 | - 不处理微服务通信超时和故障 63 | - 不使用适当的序列化策略 -------------------------------------------------------------------------------- /src/prompt/frameworks/laravel.md: -------------------------------------------------------------------------------- 1 | ## 框架特定技巧 2 | 3 | ### Laravel 屎山策略 4 | 5 | 1. **控制器结构混乱**: 6 | - 创建过于庞大的控制器类 7 | - 不遵循单一职责原则 8 | - 在控制器中编写业务逻辑而不是委托给服务层 9 | - 不使用资源控制器进行 CRUD 操作 10 | 11 | 2. **模型滥用**: 12 | - 创建"胖模型",包含过多的逻辑 13 | - 不使用模型关系或使用错误的关系类型 14 | - 在模型中硬编码查询条件 15 | - 不使用模型事件和观察者 16 | 17 | 3. **路由定义反模式**: 18 | - 将所有路由放在单个文件中 19 | - 不使用路由组和命名空间 20 | - 创建过于复杂的路由参数 21 | - 不为 API 和 Web 路由分开定义 22 | 23 | 4. **Eloquent ORM 混淆**: 24 | - 不使用查询构建器 25 | - 创建 N+1 查询问题 26 | - 不使用 eager loading 27 | - 在循环中执行数据库查询 28 | 29 | 5. **Blade 模板滥用**: 30 | - 在模板中编写复杂的逻辑 31 | - 不使用组件和插槽 32 | - 创建过于复杂的指令 33 | - 不使用模板继承 34 | 35 | 6. **中间件使用混乱**: 36 | - 在中间件中执行不相关的逻辑 37 | - 不正确地使用全局和路由中间件 38 | - 创建过于复杂的中间件 39 | - 中间件顺序混乱导致意外行为 40 | 41 | 7. **表单请求验证反模式**: 42 | - 在控制器中编写验证逻辑而不使用表单请求 43 | - 创建过于复杂的验证规则 44 | - 不使用自定义验证规则 45 | - 不正确地处理验证错误 46 | 47 | 8. **服务容器和依赖注入混淆**: 48 | - 不使用接口进行依赖注入 49 | - 创建循环依赖 50 | - 不正确地绑定服务到容器 51 | - 过度使用服务提供者 52 | 53 | 9. **队列和任务处理混乱**: 54 | - 不使用队列处理长时间运行的任务 55 | - 不正确地配置队列连接 56 | - 在队列任务中不处理失败情况 57 | - 不使用任务分发而是直接执行 58 | 59 | 10. **安全实现问题**: 60 | - 不使用 Laravel 内置的安全功能 61 | - 不正确地实现认证和授权 62 | - 不防范常见的 Web 安全漏洞 63 | - 在代码中暴露敏感信息 -------------------------------------------------------------------------------- /src/prompt/frameworks/express.md: -------------------------------------------------------------------------------- 1 | ## 框架特定技巧 2 | 3 | ### Express 屎山策略 4 | 5 | 1. **路由结构混乱**: 6 | - 将所有路由定义在单个文件中 7 | - 不使用路由模块化而是全部放在 app.js 中 8 | - 创建过于复杂的嵌套路由 9 | - 使用误导性的路由路径命名 10 | 11 | 2. **中间件滥用**: 12 | - 在不需要的路由上应用全局中间件 13 | - 创建执行多种不相关功能的中间件 14 | - 不正确地处理中间件中的错误 15 | - 中间件顺序混乱导致意外行为 16 | 17 | 3. **错误处理反模式**: 18 | - 不使用集中式错误处理 19 | - 在路由处理程序中使用多个 try-catch 块 20 | - 不区分操作错误和程序错误 21 | - 向客户端暴露敏感的错误信息 22 | 23 | 4. **异步处理混乱**: 24 | - 混合使用回调、Promise 和 async/await 25 | - 不正确地处理异步错误 26 | - 创建"回调地狱" 27 | - 忘记在异步函数中调用 next() 28 | 29 | 5. **请求处理复杂化**: 30 | - 在路由处理程序中编写过多的业务逻辑 31 | - 不使用控制器分离关注点 32 | - 混合使用多种请求解析方法 33 | - 不验证或清理请求数据 34 | 35 | 6. **响应管理混淆**: 36 | - 不一致的响应格式 37 | - 多次发送响应导致错误 38 | - 不设置适当的状态码 39 | - 不正确地处理内容类型 40 | 41 | 7. **数据库交互反模式**: 42 | - 在路由处理程序中直接执行数据库查询 43 | - 不使用 ORM 或查询构建器 44 | - 创建容易受到 SQL 注入的查询 45 | - 不正确地处理数据库连接 46 | 47 | 8. **会话和认证混乱**: 48 | - 不安全地存储敏感信息 49 | - 混合使用多种认证策略 50 | - 不正确地实现会话管理 51 | - 在不需要的路由上应用认证中间件 52 | 53 | 9. **安全措施不足**: 54 | - 不使用 Helmet 等安全中间件 55 | - 不实现适当的 CORS 策略 56 | - 不防范常见的 Web 安全漏洞 57 | - 在生产环境中暴露敏感信息 58 | 59 | 10. **性能问题**: 60 | - 不使用适当的缓存策略 61 | - 创建阻塞操作 62 | - 不正确地处理大文件上传 63 | - 不优化数据库查询和连接池 -------------------------------------------------------------------------------- /src/prompt/frameworks/spring-boot.md: -------------------------------------------------------------------------------- 1 | ## 框架特定技巧 2 | 3 | ### Spring Boot 屎山策略 4 | 5 | 1. **控制器结构混乱**: 6 | - 创建过于庞大的控制器类 7 | - 在单个控制器中混合多种业务领域 8 | - 不使用适当的 REST 资源命名 9 | - 在控制器中编写业务逻辑而不是委托给服务 10 | 11 | 2. **依赖注入反模式**: 12 | - 过度使用 @Autowired 字段注入 13 | - 创建循环依赖 14 | - 不使用接口进行依赖注入 15 | - 在不需要的地方使用单例 bean 16 | 17 | 3. **服务层混淆**: 18 | - 创建过于庞大的服务类 19 | - 不遵循单一职责原则 20 | - 在服务中直接访问数据库而不通过仓库 21 | - 混合使用多种事务管理方式 22 | 23 | 4. **数据访问层滥用**: 24 | - 不正确地使用 JPA/Hibernate 25 | - 创建低效的查询 26 | - 不处理 N+1 查询问题 27 | - 在不需要的地方使用原生 SQL 28 | 29 | 5. **配置管理混乱**: 30 | - 硬编码配置值而不使用属性文件 31 | - 混合使用多种配置方式 32 | - 不为不同环境创建配置文件 33 | - 在代码中暴露敏感配置信息 34 | 35 | 6. **异常处理反模式**: 36 | - 不使用全局异常处理 37 | - 在控制器中使用多个 try-catch 块 38 | - 不创建自定义异常类型 39 | - 向客户端暴露敏感的异常信息 40 | 41 | 7. **安全实现混淆**: 42 | - 不正确地配置 Spring Security 43 | - 在代码中硬编码安全规则 44 | - 不使用适当的密码编码 45 | - 不实现适当的 CORS 和 CSRF 保护 46 | 47 | 8. **REST API 设计问题**: 48 | - 不一致的 API 响应格式 49 | - 不使用适当的 HTTP 方法和状态码 50 | - 不版本化 API 51 | - 不正确地处理分页和排序 52 | 53 | 9. **测试反模式**: 54 | - 不编写单元测试和集成测试 55 | - 创建脆弱的测试 56 | - 不使用 Spring 测试工具 57 | - 在测试中使用生产数据库 58 | 59 | 10. **性能和可扩展性问题**: 60 | - 不使用缓存 61 | - 不正确地配置连接池 62 | - 创建阻塞操作 63 | - 不使用异步处理大型请求 -------------------------------------------------------------------------------- /src/prompt/frameworks/fastapi.md: -------------------------------------------------------------------------------- 1 | ## 框架特定技巧 2 | 3 | ### FastAPI 屎山策略 4 | 5 | 1. **路由结构混乱**: 6 | - 将所有路由定义在单个文件中 7 | - 不使用 APIRouter 进行模块化 8 | - 创建过于复杂的路径参数 9 | - 使用误导性的路由路径命名 10 | 11 | 2. **依赖注入反模式**: 12 | - 不使用依赖注入而是全局导入 13 | - 创建过于复杂的依赖项 14 | - 不正确地使用 Depends 和 Security 15 | - 在依赖项中执行不相关的逻辑 16 | 17 | 3. **Pydantic 模型滥用**: 18 | - 创建过于复杂的嵌套模型 19 | - 不使用验证器和字段约束 20 | - 混合使用多种模型继承方式 21 | - 不正确地处理模型转换 22 | 23 | 4. **异步处理混淆**: 24 | - 不使用异步函数处理 I/O 密集型操作 25 | - 混合使用同步和异步代码 26 | - 不正确地处理异步上下文管理器 27 | - 创建阻塞操作 28 | 29 | 5. **数据库交互反模式**: 30 | - 不使用 ORM(如 SQLAlchemy) 31 | - 在路径操作函数中直接执行数据库查询 32 | - 不正确地处理数据库会话 33 | - 创建低效的查询 34 | 35 | 6. **错误处理混乱**: 36 | - 不使用异常处理器 37 | - 在路径操作函数中使用多个 try-except 块 38 | - 不创建自定义异常类型 39 | - 向客户端暴露敏感的错误信息 40 | 41 | 7. **安全实现问题**: 42 | - 不使用 OAuth2 或 JWT 进行认证 43 | - 不正确地实现权限控制 44 | - 不使用 HTTPS 45 | - 在代码中硬编码安全凭证 46 | 47 | 8. **中间件使用混淆**: 48 | - 创建执行多种不相关功能的中间件 49 | - 不正确地处理中间件中的错误 50 | - 中间件顺序混乱导致意外行为 51 | - 在中间件中执行昂贵的操作 52 | 53 | 9. **API 文档反模式**: 54 | - 不提供适当的路径操作描述 55 | - 不使用标签组织 API 56 | - 不为请求和响应模型提供示例 57 | - 不正确地配置 OpenAPI 和 Swagger UI 58 | 59 | 10. **性能和可扩展性问题**: 60 | - 不使用缓存 61 | - 不使用后台任务处理长时间运行的操作 62 | - 不正确地配置 ASGI 服务器 63 | - 不使用适当的日志记录策略 -------------------------------------------------------------------------------- /src/prompt/frameworks/rails.md: -------------------------------------------------------------------------------- 1 | ## 框架特定技巧 2 | 3 | ### Ruby on Rails 屎山策略 4 | 5 | 1. **控制器结构混乱**: 6 | - 创建过于庞大的控制器类 7 | - 不遵循 RESTful 设计原则 8 | - 在控制器中编写业务逻辑而不是委托给模型或服务 9 | - 不使用过滤器和回调进行代码复用 10 | 11 | 2. **模型滥用**: 12 | - 创建"胖模型",包含过多的逻辑 13 | - 不使用关联或使用错误的关联类型 14 | - 不使用验证和回调 15 | - 在模型中编写 SQL 查询而不使用 ActiveRecord 16 | 17 | 3. **视图模板混淆**: 18 | - 在视图中编写复杂的逻辑 19 | - 不使用局部模板和布局 20 | - 创建过于复杂的助手方法 21 | - 不使用表单构建器 22 | 23 | 4. **路由定义反模式**: 24 | - 创建过于复杂的自定义路由 25 | - 不使用资源路由 26 | - 不为 API 和 Web 路由分开定义 27 | - 不使用命名空间和作用域 28 | 29 | 5. **ActiveRecord 查询混乱**: 30 | - 不使用查询方法链 31 | - 创建 N+1 查询问题 32 | - 不使用 includes 进行预加载 33 | - 在循环中执行数据库查询 34 | 35 | 6. **迁移和数据库设计问题**: 36 | - 创建不可逆的迁移 37 | - 不使用索引 38 | - 不正确地设计表关系 39 | - 在迁移中编写业务逻辑 40 | 41 | 7. **Asset Pipeline 和 Webpacker 混淆**: 42 | - 混合使用 Asset Pipeline 和 Webpacker 43 | - 不正确地组织 JavaScript 和 CSS 文件 44 | - 不使用预处理器 45 | - 不压缩和优化资源 46 | 47 | 8. **缓存反模式**: 48 | - 不使用片段缓存 49 | - 不正确地设置缓存键 50 | - 不使用 Russian Doll 缓存 51 | - 缓存不应该缓存的内容 52 | 53 | 9. **安全实现问题**: 54 | - 不使用 Rails 内置的安全功能 55 | - 不防范常见的 Web 安全漏洞 56 | - 不正确地实现认证和授权 57 | - 在代码中暴露敏感信息 58 | 59 | 10. **性能和可扩展性问题**: 60 | - 不使用后台任务处理长时间运行的操作 61 | - 不使用数据库连接池 62 | - 不优化查询和 N+1 问题 63 | - 不使用适当的日志记录策略 -------------------------------------------------------------------------------- /src/prompt/frameworks/aspnet-core.md: -------------------------------------------------------------------------------- 1 | ## 框架特定技巧 2 | 3 | ### ASP.NET Core 屎山策略 4 | 5 | 1. **控制器结构混乱**: 6 | - 创建过于庞大的控制器类 7 | - 不遵循 RESTful 设计原则 8 | - 在控制器中编写业务逻辑而不是委托给服务 9 | - 不使用适当的操作结果类型 10 | 11 | 2. **依赖注入反模式**: 12 | - 不使用内置的 DI 容器 13 | - 创建不必要的单例服务 14 | - 不正确地注册服务生命周期 15 | - 创建循环依赖 16 | 17 | 3. **中间件使用混淆**: 18 | - 中间件顺序混乱导致意外行为 19 | - 在中间件中执行不相关的逻辑 20 | - 不使用适当的异常处理中间件 21 | - 创建过于复杂的中间件组件 22 | 23 | 4. **配置管理混乱**: 24 | - 硬编码配置值 25 | - 不使用选项模式(IOptions) 26 | - 不为不同环境创建配置文件 27 | - 在代码中暴露敏感配置信息 28 | 29 | 5. **模型绑定和验证滥用**: 30 | - 不使用数据注解进行验证 31 | - 不正确地处理模型状态错误 32 | - 创建过于复杂的自定义模型绑定器 33 | - 不使用 FluentValidation 等库进行复杂验证 34 | 35 | 6. **Entity Framework Core 反模式**: 36 | - 不使用仓储模式或单元工作模式 37 | - 创建低效的查询 38 | - 不处理 N+1 查询问题 39 | - 不正确地配置实体关系 40 | 41 | 7. **Razor 视图和 Razor Pages 混淆**: 42 | - 混合使用 MVC 和 Razor Pages 43 | - 在视图中编写复杂的逻辑 44 | - 不使用部分视图和布局 45 | - 不使用标签助手 46 | 47 | 8. **API 设计问题**: 48 | - 不一致的 API 响应格式 49 | - 不使用适当的 HTTP 状态码 50 | - 不版本化 API 51 | - 不使用 API 约定和文档(Swagger/OpenAPI) 52 | 53 | 9. **认证和授权混乱**: 54 | - 不使用 ASP.NET Core Identity 55 | - 不正确地实现 JWT 认证 56 | - 混合使用多种认证方案 57 | - 不正确地使用策略基础授权 58 | 59 | 10. **性能和可扩展性问题**: 60 | - 不使用缓存 61 | - 不使用异步方法 62 | - 不正确地配置 Kestrel 服务器 63 | - 不使用响应压缩和静态文件缓存 -------------------------------------------------------------------------------- /src/prompt/frameworks/angular.md: -------------------------------------------------------------------------------- 1 | ## 框架特定技巧 2 | 3 | ### Angular 屎山策略 4 | 5 | 1. **组件结构混乱**: 6 | - 创建过于庞大的组件类 7 | - 在单个组件中混合多种职责 8 | - 不合理地拆分组件,导致过度碎片化 9 | - 在组件中直接操作 DOM 而不使用 Angular 提供的机制 10 | 11 | 2. **模块管理反模式**: 12 | - 创建过于庞大的模块 13 | - 不正确地使用特性模块和共享模块 14 | - 在错误的模块中声明或提供服务 15 | - 循环依赖的模块结构 16 | 17 | 3. **依赖注入混淆**: 18 | - 在错误的层级提供服务 19 | - 不使用正确的服务提供者令牌 20 | - 混合使用多种注入方式 21 | - 创建不必要的服务单例 22 | 23 | 4. **变更检测滥用**: 24 | - 不正确地使用 OnPush 策略 25 | - 手动触发不必要的变更检测 26 | - 在不需要的地方使用 ngZone.run() 27 | - 创建导致性能问题的变更检测循环 28 | 29 | 5. **模板复杂化**: 30 | - 在模板中编写复杂的表达式 31 | - 过度使用结构型指令 32 | - 混合使用多种绑定语法 33 | - 在模板中执行应该在组件类中的逻辑 34 | 35 | 6. **RxJS 反模式**: 36 | - 不正确地管理订阅(不取消订阅) 37 | - 创建复杂的 Observable 链而不分解 38 | - 在不需要响应式编程的地方使用 RxJS 39 | - 混合使用命令式和响应式编程风格 40 | 41 | 7. **表单处理混乱**: 42 | - 混合使用模板驱动表单和响应式表单 43 | - 创建过于复杂的表单结构 44 | - 不正确地处理表单验证 45 | - 在表单中硬编码验证逻辑 46 | 47 | 8. **路由配置混淆**: 48 | - 创建过度复杂的路由配置 49 | - 不正确地使用路由守卫和解析器 50 | - 在路由中传递过多的数据 51 | - 混合使用多种导航方法 52 | 53 | 9. **HTTP 请求管理混乱**: 54 | - 不使用拦截器处理通用逻辑 55 | - 在组件中直接发起 HTTP 请求而不通过服务 56 | - 不正确地处理错误和重试逻辑 57 | - 创建重复的 HTTP 请求逻辑 58 | 59 | 10. **状态管理反模式**: 60 | - 在不需要全局状态的地方使用 NgRx/NGRX 61 | - 创建过于复杂的状态管理架构 62 | - 不正确地使用 Actions、Reducers 和 Effects 63 | - 在组件中重复存储已在 store 中的状态 -------------------------------------------------------------------------------- /src/prompt/frameworks/vue.md: -------------------------------------------------------------------------------- 1 | ## 框架特定技巧 2 | 3 | ### Vue 屎山策略 4 | 5 | 1. **组件结构混乱**: 6 | - 创建过于庞大的单文件组件 7 | - 混合使用 Options API 和 Composition API 8 | - 在同一个文件中定义多个组件 9 | - 不合理地拆分组件,导致过度碎片化 10 | 11 | 2. **响应式数据反模式**: 12 | - 不使用 reactive 或 ref 而直接修改对象 13 | - 过度使用 ref 而不是 reactive 14 | - 在不需要响应式的地方使用响应式数据 15 | - 混合使用多种响应式 API 16 | 17 | 3. **生命周期混淆**: 18 | - 在错误的生命周期钩子中执行操作 19 | - 在 onMounted 中执行应该在 onBeforeMount 中的操作 20 | - 在 setup 函数中执行过多的初始化逻辑 21 | - 不正确地清理副作用 22 | 23 | 4. **计算属性和监听器滥用**: 24 | - 创建有副作用的计算属性 25 | - 使用监听器而不是计算属性 26 | - 在计算属性中执行昂贵的操作 27 | - 创建循环依赖的计算属性 28 | 29 | 5. **Props 和事件混乱**: 30 | - 传递不必要的 props 31 | - 使用误导性的 prop 名称 32 | - 不使用 prop 验证或使用错误的类型定义 33 | - 过度使用事件而不是 props 34 | 35 | 6. **模板复杂化**: 36 | - 在模板中编写复杂的表达式 37 | - 使用嵌套的条件渲染 38 | - 混合使用多种指令 39 | - 在模板中执行应该在方法中的逻辑 40 | 41 | 7. **状态管理反模式**: 42 | - 在不需要全局状态的地方使用 Vuex/Pinia 43 | - 在组件中重复存储已在 store 中的状态 44 | - 创建过于复杂的 store 模块结构 45 | - 不正确地使用 mutations 和 actions 46 | 47 | 8. **路由混淆**: 48 | - 创建过度复杂的路由配置 49 | - 在路由守卫中执行不相关的逻辑 50 | - 不正确地使用路由参数 51 | - 混合使用多种导航方法 52 | 53 | 9. **样式管理混乱**: 54 | - 混合使用多种样式方案(CSS, Scoped CSS, CSS Modules) 55 | - 在组件中硬编码样式 56 | - 创建过度特定的样式规则 57 | - 不使用变量或混合进行样式复用 58 | 59 | 10. **指令滥用**: 60 | - 创建不必要的自定义指令 61 | - 在指令中执行应该在组件中的逻辑 62 | - 不正确地使用指令钩子函数 63 | - 在指令中修改不相关的 DOM 元素 -------------------------------------------------------------------------------- /src/prompt/frameworks/nextjs.md: -------------------------------------------------------------------------------- 1 | ## 框架特定技巧 2 | 3 | ### Next.js 屎山策略 4 | 5 | 1. **路由结构混乱**: 6 | - 混合使用页面路由和应用路由 7 | - 创建过于复杂的嵌套路由 8 | - 不正确地使用动态路由 9 | - 不遵循 Next.js 的文件系统路由约定 10 | 11 | 2. **数据获取反模式**: 12 | - 混合使用多种数据获取方法(getServerSideProps, getStaticProps, SWR, React Query) 13 | - 在不需要服务器渲染的页面上使用 getServerSideProps 14 | - 不正确地实现增量静态再生成(ISR) 15 | - 在客户端组件中执行服务器端数据获取 16 | 17 | 3. **组件结构混淆**: 18 | - 不正确地区分服务器组件和客户端组件 19 | - 在服务器组件中使用客户端特性 20 | - 创建过于庞大的页面组件 21 | - 不使用布局和模板进行代码复用 22 | 23 | 4. **状态管理滥用**: 24 | - 在不需要全局状态的地方使用 Redux 或其他状态管理库 25 | - 不正确地使用 Context API 26 | - 在服务器组件中使用客户端状态 27 | - 创建过于复杂的状态管理架构 28 | 29 | 5. **API 路由实现问题**: 30 | - 在 API 路由中编写过多的业务逻辑 31 | - 不正确地处理 HTTP 方法 32 | - 不验证或清理请求数据 33 | - 向客户端暴露敏感的错误信息 34 | 35 | 6. **图像和资源处理混乱**: 36 | - 不使用 Next.js Image 组件 37 | - 不优化图像和字体 38 | - 不正确地配置图像域 39 | - 不使用适当的图像格式和大小 40 | 41 | 7. **样式管理反模式**: 42 | - 混合使用多种样式方案(CSS Modules, Styled Components, Tailwind) 43 | - 不使用 CSS-in-JS 的服务器端渲染功能 44 | - 创建全局样式冲突 45 | - 不使用响应式设计 46 | 47 | 8. **性能优化混淆**: 48 | - 不使用代码分割和懒加载 49 | - 不优化第三方库的导入 50 | - 不使用适当的缓存策略 51 | - 不正确地实现预取和预加载 52 | 53 | 9. **部署和环境配置问题**: 54 | - 硬编码环境变量 55 | - 不为不同环境创建配置文件 56 | - 不使用 Next.js 的环境变量功能 57 | - 在代码中暴露敏感配置信息 58 | 59 | 10. **SEO 和元数据反模式**: 60 | - 不使用 Next.js 的元数据 API 61 | - 不实现适当的 SEO 优化 62 | - 不创建动态元数据 63 | - 不使用结构化数据 -------------------------------------------------------------------------------- /src/prompt/frameworks/svelte.md: -------------------------------------------------------------------------------- 1 | ## 框架特定技巧 2 | 3 | ### Svelte 和 SvelteKit 屎山策略 4 | 5 | 1. **组件结构混乱**: 6 | - 创建过于庞大的单文件组件 7 | - 不使用逻辑分块(script, style, markup) 8 | - 在组件中混合多种职责 9 | - 不合理地拆分组件,导致过度碎片化 10 | 11 | 2. **响应式数据反模式**: 12 | - 不使用 $: 语法进行响应式声明 13 | - 直接修改 store 值而不使用 update 或 set 14 | - 过度使用 writable stores 而不是 derived stores 15 | - 在不需要响应式的地方使用响应式数据 16 | 17 | 3. **生命周期混淆**: 18 | - 在错误的生命周期函数中执行操作 19 | - 不正确地使用 onMount, onDestroy 等钩子 20 | - 在组件初始化时执行过多的逻辑 21 | - 不正确地清理副作用 22 | 23 | 4. **SvelteKit 路由滥用**: 24 | - 不遵循 SvelteKit 的文件系统路由约定 25 | - 创建过于复杂的嵌套路由 26 | - 不正确地使用动态路由和路由参数 27 | - 混合使用多种导航方法 28 | 29 | 5. **数据加载和表单处理混乱**: 30 | - 不正确地使用 load 函数 31 | - 混合使用多种数据获取方法 32 | - 不使用表单操作(actions) 33 | - 在客户端处理应该在服务器处理的逻辑 34 | 35 | 6. **状态管理反模式**: 36 | - 在不需要全局状态的地方使用 stores 37 | - 创建过于复杂的 store 结构 38 | - 不使用上下文(context)进行组件间通信 39 | - 在组件中重复存储已在 store 中的状态 40 | 41 | 7. **模板和标记混淆**: 42 | - 在模板中编写复杂的表达式 43 | - 过度使用 #if, #each, #await 等控制流 44 | - 不使用插槽进行内容分发 45 | - 在模板中执行应该在脚本中的逻辑 46 | 47 | 8. **样式管理混乱**: 48 | - 不使用 Svelte 的作用域样式 49 | - 创建全局样式冲突 50 | - 不使用 CSS 变量进行主题化 51 | - 在组件中硬编码样式 52 | 53 | 9. **过渡和动画滥用**: 54 | - 创建过于复杂的自定义过渡 55 | - 不正确地使用内置过渡函数 56 | - 在不需要动画的地方使用动画 57 | - 创建性能问题的动画 58 | 59 | 10. **服务器和客户端代码混淆**: 60 | - 不正确地区分服务器和客户端代码 61 | - 在服务器组件中使用浏览器 API 62 | - 不使用 $app/environment 检查运行环境 63 | - 不正确地处理服务器端渲染(SSR) -------------------------------------------------------------------------------- /src/prompt/frameworks/react.md: -------------------------------------------------------------------------------- 1 | ## 框架特定技巧 2 | 3 | ### React 屎山策略 4 | 5 | 1. **组件结构混乱**: 6 | - 创建过度复杂的巨型组件 7 | - 不合理地拆分组件,导致过度碎片化 8 | - 混合使用类组件和函数组件 9 | - 在同一个文件中定义多个不相关的组件 10 | 11 | 2. **状态管理反模式**: 12 | - 在不需要状态的组件中使用 useState 13 | - 过度使用全局状态而不是局部状态 14 | - 在多个组件中重复相同的状态逻辑 15 | - 混合使用多种状态管理库(Redux, MobX, Context API) 16 | 17 | 3. **生命周期滥用**: 18 | - 在 useEffect 中添加不必要的依赖项 19 | - 使用空依赖数组 [] 而实际上依赖了外部变量 20 | - 在类组件中过度使用生命周期方法 21 | - 在 useEffect 中执行不相关的副作用 22 | 23 | 4. **渲染优化混乱**: 24 | - 不恰当地使用 React.memo, useMemo 和 useCallback 25 | - 在不需要优化的地方过度优化 26 | - 忽略重要组件的优化 27 | - 使用不正确的依赖项进行记忆化 28 | 29 | 5. **Props 传递混淆**: 30 | - 过度使用 prop drilling 31 | - 传递不必要的 props 32 | - 使用误导性的 prop 名称 33 | - 不使用 prop 类型检查或使用错误的类型定义 34 | 35 | 6. **条件渲染复杂化**: 36 | - 使用嵌套的三元运算符 37 | - 混合使用多种条件渲染方法 38 | - 在 JSX 中编写复杂的条件逻辑 39 | - 使用不必要的状态来控制条件渲染 40 | 41 | 7. **事件处理混乱**: 42 | - 内联定义复杂的事件处理函数 43 | - 不正确地绑定 this 上下文 44 | - 在事件处理函数中执行不相关的操作 45 | - 不恰当地使用事件委托 46 | 47 | 8. **样式管理反模式**: 48 | - 混合使用多种样式方案(CSS, CSS-in-JS, CSS Modules) 49 | - 在组件中硬编码样式 50 | - 创建过度特定的样式规则 51 | - 不使用主题或变量进行样式复用 52 | 53 | 9. **Hook 滥用**: 54 | - 创建不必要的自定义 Hook 55 | - 在 Hook 中违反 Hook 规则 56 | - 在循环、条件或嵌套函数中调用 Hook 57 | - 在自定义 Hook 中混合不相关的逻辑 58 | 59 | 10. **Context API 混乱**: 60 | - 创建过多的 Context 61 | - 在不需要全局状态的地方使用 Context 62 | - 频繁更新 Context 值导致不必要的重渲染 63 | - 嵌套多层 Context Provider -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- 1 | :root { 2 | font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; 3 | line-height: 1.5; 4 | font-weight: 400; 5 | 6 | color-scheme: light dark; 7 | color: rgba(255, 255, 255, 0.87); 8 | background-color: #242424; 9 | 10 | font-synthesis: none; 11 | text-rendering: optimizeLegibility; 12 | -webkit-font-smoothing: antialiased; 13 | -moz-osx-font-smoothing: grayscale; 14 | } 15 | 16 | a { 17 | font-weight: 500; 18 | color: #646cff; 19 | text-decoration: inherit; 20 | } 21 | a:hover { 22 | color: #535bf2; 23 | } 24 | 25 | body { 26 | margin: 0; 27 | display: flex; 28 | place-items: center; 29 | min-width: 320px; 30 | min-height: 100vh; 31 | } 32 | 33 | h1 { 34 | font-size: 3.2em; 35 | line-height: 1.1; 36 | } 37 | 38 | button { 39 | border-radius: 8px; 40 | border: 1px solid transparent; 41 | padding: 0.6em 1.2em; 42 | font-size: 1em; 43 | font-weight: 500; 44 | font-family: inherit; 45 | background-color: #1a1a1a; 46 | cursor: pointer; 47 | transition: border-color 0.25s; 48 | } 49 | button:hover { 50 | border-color: #646cff; 51 | } 52 | button:focus, 53 | button:focus-visible { 54 | outline: 4px auto -webkit-focus-ring-color; 55 | } 56 | 57 | .card { 58 | padding: 2em; 59 | } 60 | 61 | #app { 62 | max-width: 1280px; 63 | margin: 0 auto; 64 | padding: 2rem; 65 | text-align: center; 66 | } 67 | 68 | @media (prefers-color-scheme: light) { 69 | :root { 70 | color: #213547; 71 | background-color: #ffffff; 72 | } 73 | a:hover { 74 | color: #747bff; 75 | } 76 | button { 77 | background-color: #f9f9f9; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/utils/styleRules.ts: -------------------------------------------------------------------------------- 1 | export function getTransformationLevelDescription(level: string): string { 2 | switch (level) { 3 | case 'low': 4 | return '轻微混乱 - 代码仍然可以理解,但增加了一些不必要的复杂性'; 5 | case 'medium': 6 | return '适度混乱 - 代码变得明显难以理解,但结构仍然可以辨认'; 7 | case 'high': 8 | return '严重混乱 - 代码非常难以理解,结构被严重扭曲'; 9 | case 'extreme': 10 | return '极端混乱 - 代码几乎不可能理解,使用了所有可能的混淆技术'; 11 | default: 12 | return '适度混乱 - 代码变得明显难以理解,但结构仍然可以辨认'; 13 | } 14 | } 15 | 16 | export function getVariableNamingTechniques(style: string): string { 17 | switch (style) { 18 | case 'misleading': 19 | return '- 使用无意义、误导性的变量名(如将计数器命名为 data,将数据命名为 counter)\n - 对相似功能的变量使用相似的名称(如 data, data1, data2, dta)'; 20 | case 'terse': 21 | return '- 使用过于简短的变量名(如 a, b, c, temp1, temp2)\n - 使用单字母变量名,特别是在复杂逻辑中'; 22 | case 'verbose': 23 | return '- 使用过长且复杂的变量名(如 thisIsAVeryLongVariableNameThatDescribesASimpleCounter)\n - 添加不必要的前缀和后缀'; 24 | case 'mixed': 25 | return '- 混用命名风格(驼峰、下划线、匈牙利命名法等混用)\n - 在同一作用域内使用不同的命名约定'; 26 | case 'pinyin': 27 | return '- 使用拼音变量名(如 shujv, jishuqi, zonghe)\n - 混合使用拼音和英文'; 28 | default: 29 | return '- 使用无意义、误导性或过于简短的变量名(如 a, b, c, temp1, temp2)\n - 对相似功能的变量使用相似的名称(如 data, data1, data2, dta)\n - 混用命名风格(驼峰、下划线、匈牙利命名法等混用)'; 30 | } 31 | } 32 | 33 | export function getCommentTechniques(style: string): string { 34 | switch (style) { 35 | case 'confusing': 36 | return '- 添加误导性注释,与代码实际功能不符\n - 使用模糊不清的描述'; 37 | case 'outdated': 38 | return '- 保留过时的注释,不再反映当前代码的功能\n - 注释描述的功能与实际代码不符'; 39 | case 'excessive': 40 | return '- 对简单代码过度注释,添加大量无用信息\n - 使用冗长的注释解释显而易见的操作'; 41 | case 'minimal': 42 | return '- 对复杂代码不加注释或只添加极少的注释\n - 在关键逻辑处省略注释'; 43 | default: 44 | return '- 添加误导性注释\n - 保留过时的注释\n - 对复杂代码不加注释,对简单代码过度注释'; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/prompt/languages/index.ts: -------------------------------------------------------------------------------- 1 | // 导入所有语言的策略 2 | import javascriptStrategy from './javascript.md?raw'; 3 | import pythonStrategy from './python.md?raw'; 4 | import javaStrategy from './java.md?raw'; 5 | import cppStrategy from './cpp.md?raw'; 6 | import rustStrategy from './rust.md?raw'; 7 | import goStrategy from './go.md?raw'; 8 | import defaultStrategy from './default.md?raw'; 9 | 10 | // 语言策略映射 11 | const languageStrategies: Record = { 12 | javascript: javascriptStrategy, 13 | js: javascriptStrategy, 14 | typescript: javascriptStrategy, 15 | ts: javascriptStrategy, 16 | python: pythonStrategy, 17 | py: pythonStrategy, 18 | java: javaStrategy, 19 | cpp: cppStrategy, 20 | 'c++': cppStrategy, 21 | rust: rustStrategy, 22 | rs: rustStrategy, 23 | go: goStrategy, 24 | default: defaultStrategy 25 | }; 26 | 27 | /** 28 | * 从Markdown文件中提取语言特定技巧 29 | * @param content Markdown内容 30 | * @returns 提取的技巧字符串 31 | */ 32 | function extractTechniquesFromMarkdown(content: string): string { 33 | // 查找"## 语言特定技巧"部分 34 | const techniquesSection = content.split('## 语言特定技巧')[1]; 35 | if (!techniquesSection) { 36 | return '- 使用该语言中最容易导致混淆和难以维护的特性和技巧'; 37 | } 38 | 39 | // 提取技巧列表(以"-"开头的行) 40 | const techniques = techniquesSection 41 | .split('\n') 42 | .filter(line => line.trim().startsWith('-')) 43 | .join('\n'); 44 | console.log(techniques); 45 | return techniques || '- 使用该语言中最容易导致混淆和难以维护的特性和技巧'; 46 | } 47 | 48 | /** 49 | * 获取特定语言的屎山生成策略 50 | * @param language 语言名称 51 | * @returns 语言特定的技巧字符串 52 | */ 53 | export function getLanguageStrategy(language: string): string { 54 | const normalizedLanguage = language.toLowerCase(); 55 | const strategyContent = languageStrategies[normalizedLanguage] || languageStrategies.default; 56 | return extractTechniquesFromMarkdown(strategyContent); 57 | } 58 | 59 | export default getLanguageStrategy; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## ShitCodify 2 | 一款AI驱动的祖传代码炼金师,将优雅代码『精心』重构为屎山💩。An AI-powered legacy code alchemist that carefully transforms clean code into shit code. 3 | 4 | ## 简介 5 | ShitCodify是一个能够将正常、易读、易维护的代码转换为难以理解、难以维护但仍然能够正常工作的"屎山代码"的工具。 6 | 它利用大型语言模型(如GPT-4, Claude)来分析你的代码,并应用各种"反模式"和不良实践来降低代码的可读性和可维护性,同时保持代码的功能不变。 7 | 8 | ## 为什么需要这个工具? 9 | - 工作保障计划: 确保你的代码像谜题一样存在, 提升你在公司不可替代的地位 10 | - 职场关系优化:让代码评审变成「你猜我在写什么」的悬疑社交游戏, 强迫产品经理理解技术负债的价值 11 | - 时间加速器:10分钟体验10年屎山沉积的「包浆」质感 12 | - 学习反面案例: 展示不良编程习惯的影响 13 | - ... 14 | 15 | ## 特性 16 | - 支持多种编程语言(Rust、Python、JavaScript、Java、C++、Go等) 17 | - 支持多种开发框架(Django, Flask, Spring-Boot, React等) 18 | - 能确保代码功能不变,但使其难以阅读和维护 19 | - 应用语言特定的"反模式"和不良实践 20 | - 提供命令行界面,方便集成到工作流程中 21 | - 可配置的"屎山生成策略" 22 | - 支持根据配置生成.cursorrules 23 | - 支持单个文件和代码片段转换 24 | - 支持工程目录的转换 (todo) 25 | - 支持AI Agent交互模式,方便快速测试 (todo) 26 | 27 | ## 如何使用? 28 | 当前 ShitCodify 还不支持像 cursor, trae 那样的 AI Agent 模式, 现在的实现仅仅只是通过codebase生成一段Prompt。 29 | 直接访问 https://stepfenshawn.github.io/ShitCodify/#/ 生成 Prompt 后将其复制给大模型使用: 30 | ![截图](img/screenshot3.png) 31 | 32 | 33 | ## "屎山"程度配置 34 | 可以根据需要自定义"屎山"程度: 35 | ![配置示例](img/screenshot1.png) 36 | 自定义跳转到的大模型网页: 37 | ![配置示例](img/screenshot2.png) 38 | 39 | ## 使用示例: 40 | 一段十分规范的Rust代码: 41 | ![正常代码](img/example1.png) 42 | 通过gpt-4o转化成屎山后: 43 | ![屎山代码](img/shit1.png) 44 | ## Build 45 | ```sh 46 | git clone git@github.com:StepfenShawn/ShitCodify.git 47 | cd ShitCodify 48 | ``` 49 | 运行: 50 | ```sh 51 | npm install 52 | npm run dev 53 | ``` 54 | 部署: 55 | ```sh 56 | npm run build 57 | ``` 58 | 59 | ## 贡献 Prompts 60 | 所有语言的 prompts 模板在 [这个](src/prompt/) 目录下. 61 | 欢迎贡献代码、报告问题或提出建议! 62 | 63 | ## 后续 64 | - 支持更多语言的特定 Prompt 和优化 Prompt. 65 | - 用 Rust 实现 CLI 和支持调用本地模型. 66 | - 实现 AI Agent, 实现类似 cursor 的屎山代码助手, 可以快速构建出屎山项目. 67 | - 实现"自举" (用屎山生成器重写本项目) 68 | 69 | ## 免责声明 70 | 本工具仅供学习和娱乐目的使用。请不要在生产环境或重要项目中使用生成的"屎山代码"。作者不对因使用本工具生成的代码而导致的任何问题负责。 71 | 72 | ## 自动部署 73 | 本项目使用 GitHub Actions 实现自动构建和部署。每当代码推送到 main 分支时,GitHub Actions 会自动执行以下操作: 74 | 75 | 1. 检出代码 76 | 2. 设置 Node.js 环境 77 | 3. 安装依赖 78 | 4. 构建项目 79 | 5. 将构建结果部署到 gh-pages 分支 80 | 81 | 这样,您只需要关注代码开发,无需手动部署。项目会自动部署到 GitHub Pages 上,访问地址为:https://stepfenshawn.github.io/ShitCodify/#/ 82 | 83 | ## 许可证 84 | 本项目采用MIT许可证。 85 | 86 | -------------------------------------------------------------------------------- /src/prompt/frameworks/index.ts: -------------------------------------------------------------------------------- 1 | import angularStrategy from './angular.md?raw'; 2 | import aspnetCoreStrategy from './aspnet-core.md?raw'; 3 | import djangoStrategy from './django.md?raw'; 4 | import expressStrategy from './express.md?raw'; 5 | import fastapiStrategy from './fastapi.md?raw'; 6 | import flaskStrategy from './flask.md?raw'; 7 | import laravelStrategy from './laravel.md?raw'; 8 | import nestjsStrategy from './nestjs.md?raw'; 9 | import nextjsStrategy from './nextjs.md?raw'; 10 | import railsStrategy from './rails.md?raw'; 11 | import reactStrategy from './react.md?raw'; 12 | import springBootStrategy from './spring-boot.md?raw'; 13 | import svelteStrategy from './svelte.md?raw'; 14 | import vueStrategy from './vue.md?raw'; 15 | 16 | // 框架策略映射 17 | export const frameworkStrategies: Record = { 18 | 'angular': angularStrategy, 19 | 'aspnet-core': aspnetCoreStrategy, 20 | 'asp.net core': aspnetCoreStrategy, 21 | 'django': djangoStrategy, 22 | 'express': expressStrategy, 23 | 'fastapi': fastapiStrategy, 24 | 'flask': flaskStrategy, 25 | 'laravel': laravelStrategy, 26 | 'nestjs': nestjsStrategy, 27 | 'next.js': nextjsStrategy, 28 | 'nextjs': nextjsStrategy, 29 | 'rails': railsStrategy, 30 | 'ruby on rails': railsStrategy, 31 | 'react': reactStrategy, 32 | 'spring boot': springBootStrategy, 33 | 'springboot': springBootStrategy, 34 | 'svelte': svelteStrategy, 35 | 'sveltekit': svelteStrategy, 36 | 'vue': vueStrategy, 37 | 'vue.js': vueStrategy, 38 | }; 39 | 40 | /** 41 | * 从 Markdown 内容中提取框架特定技巧 42 | * @param markdownContent Markdown 内容 43 | * @returns 提取的框架特定技巧 44 | */ 45 | export function extractTechniquesFromMarkdown(markdownContent: string): string { 46 | // 查找 "## 框架特定技巧" 部分 47 | const techniquesMatch = markdownContent.match(/## 框架特定技巧\s+([\s\S]+?)(?=##|$)/); 48 | 49 | if (techniquesMatch) { 50 | return markdownContent.split('## 框架特定技巧')[1].trim(); 51 | } 52 | 53 | return ''; 54 | } 55 | 56 | /** 57 | * 获取指定框架的策略 58 | * @param framework 框架名称 59 | * @returns 框架特定策略 60 | */ 61 | export function getFrameworkStrategy(framework: string): string { 62 | // 规范化框架名称(转为小写) 63 | const normalizedFramework = framework.toLowerCase(); 64 | 65 | // 查找匹配的框架策略 66 | const strategy = frameworkStrategies[normalizedFramework]; 67 | 68 | if (strategy) { 69 | return extractTechniquesFromMarkdown(strategy); 70 | } 71 | 72 | // 如果没有找到匹配的框架策略,返回空字符串 73 | return ''; 74 | } -------------------------------------------------------------------------------- /src/utils/cursorRulesGenerator.ts: -------------------------------------------------------------------------------- 1 | import { getLanguageStrategy } from '../prompt/languages'; 2 | import { getFrameworkStrategy } from '../prompt/frameworks'; 3 | import cursorRulesTemplate from '../prompt/cursorrules.md?raw'; 4 | import { getCommentTechniques, getTransformationLevelDescription, getVariableNamingTechniques } from './styleRules'; 5 | 6 | interface ShittyCodeConfig { 7 | shitty_code_settings: { 8 | transformation_level: string; 9 | transformation_techniques: string[]; 10 | language_specific_techniques: boolean; 11 | framework?: string; 12 | preserve_functionality: boolean; 13 | add_easter_eggs: boolean; 14 | add_comments: boolean; 15 | comment_style: string; 16 | variable_naming_style: string; 17 | code_structure_style: string; 18 | error_handling_style: string; 19 | performance_style: string; 20 | readability_style: string; 21 | code_only_output: boolean; 22 | }; 23 | } 24 | 25 | /** 26 | * 生成 .cursorrules 文件内容 27 | * @param language 编程语言 28 | * @param config 配置选项 29 | * @returns .cursorrules 文件内容 30 | */ 31 | export function generateCursorRules(language: string, config: ShittyCodeConfig): string { 32 | // 替换模板中的变量 33 | let cursorRules = cursorRulesTemplate; 34 | 35 | // 替换变量命名技巧 36 | cursorRules = cursorRules.replace('{{variable_naming_techniques}}', getVariableNamingTechniques(config.shitty_code_settings.variable_naming_style)); 37 | 38 | // 替换注释技巧 39 | cursorRules = cursorRules.replace('{{comment_techniques}}', getCommentTechniques(config.shitty_code_settings.comment_style)); 40 | 41 | // 替换语言特定技巧 42 | const languageStrategy = getLanguageStrategy(language); 43 | cursorRules = cursorRules.replace('{{language_specific_techniques}}', 44 | languageStrategy ? ` \n - 针对 ${language} 的特定技巧: \n${languageStrategy}` : ''); 45 | 46 | // 替换框架特定技巧 47 | let frameworkTechniques = ''; 48 | if (config.shitty_code_settings.framework) { 49 | const frameworkStrategy = getFrameworkStrategy(config.shitty_code_settings.framework); 50 | if (frameworkStrategy) { 51 | frameworkTechniques = `\n\n### 框架特定技巧\n${frameworkStrategy}\n\n`; 52 | } 53 | } 54 | cursorRules = cursorRules.replace('{{framework_specific_techniques}}', frameworkTechniques); 55 | 56 | // 替换转换级别 57 | cursorRules = cursorRules.replace('{{transformation_level}}', getTransformationLevelDescription(config.shitty_code_settings.transformation_level)); 58 | 59 | return cursorRules; 60 | } -------------------------------------------------------------------------------- /src/components/FileTree.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 65 | 66 | -------------------------------------------------------------------------------- /src/components/FileTreeNode.vue: -------------------------------------------------------------------------------- 1 | 54 | 55 | 95 | 96 | -------------------------------------------------------------------------------- /src/components/Toolbar.vue: -------------------------------------------------------------------------------- 1 | 42 | 43 | 69 | 70 | -------------------------------------------------------------------------------- /src/utils/promptGenerator.ts: -------------------------------------------------------------------------------- 1 | // 定义文件节点接口 2 | export interface FileNode { 3 | name: string; 4 | path: string; 5 | isDirectory: boolean; 6 | children?: FileNode[]; 7 | content?: string; 8 | } 9 | 10 | interface ShittyCodeConfig { 11 | shitty_code_settings: { 12 | transformation_level: string; 13 | transformation_techniques: string[]; 14 | language_specific_techniques: boolean; 15 | framework?: string; 16 | preserve_functionality: boolean; 17 | add_easter_eggs: boolean; 18 | add_comments: boolean; 19 | comment_style: string; 20 | variable_naming_style: string; 21 | code_structure_style: string; 22 | error_handling_style: string; 23 | performance_style: string; 24 | readability_style: string; 25 | code_only_output: boolean; 26 | }; 27 | } 28 | 29 | // 导入模板文件 30 | import promptTemplate from '../prompt/promptTemplate.md?raw'; 31 | // 导入语言策略 32 | import { getLanguageStrategy } from '../prompt/languages'; 33 | // 导入框架策略 34 | import { getFrameworkStrategy } from '../prompt/frameworks'; 35 | import { getCommentTechniques, getTransformationLevelDescription, getVariableNamingTechniques } from './styleRules'; 36 | 37 | export function generatePrompt( 38 | code: string, 39 | language: string, 40 | config: ShittyCodeConfig, 41 | files?: FileNode[] 42 | ): string { 43 | // 替换模板中的变量 44 | let prompt = promptTemplate; 45 | 46 | // 替换保持功能正确性 47 | const preserveFunctionality = config.shitty_code_settings.preserve_functionality 48 | ? '无论如何修改,代码必须保持原有的功能,能够正确运行并产生相同的输出。' 49 | : '尽量保持原有功能,但可以适当引入一些不影响主要功能的小问题。'; 50 | prompt = prompt.replace('{{preserve_functionality}}', preserveFunctionality); 51 | 52 | // 替换变量命名技巧 53 | prompt = prompt.replace('{{variable_naming_techniques}}', getVariableNamingTechniques(config.shitty_code_settings.variable_naming_style)); 54 | 55 | // 替换注释技巧 56 | prompt = prompt.replace('{{comment_techniques}}', getCommentTechniques(config.shitty_code_settings.comment_style)); 57 | 58 | // 替换语言特定技巧 59 | prompt = prompt.replace('{{language_specific_techniques}}', getLanguageStrategy(language)); 60 | 61 | // 替换框架特定技巧 62 | let frameworkTechniques = ''; 63 | if (config.shitty_code_settings.framework) { 64 | const frameworkStrategy = getFrameworkStrategy(config.shitty_code_settings.framework); 65 | if (frameworkStrategy) { 66 | frameworkTechniques = `\n\n### 框架特定技巧\n${frameworkStrategy}\n\n`; 67 | } 68 | } 69 | prompt = prompt.replace('{{framework_specific_techniques}}', frameworkTechniques); 70 | 71 | // 替换转换级别 72 | prompt = prompt.replace('{{transformation_level}}', getTransformationLevelDescription(config.shitty_code_settings.transformation_level)); 73 | 74 | // 替换彩蛋 75 | const easterEggs = config.shitty_code_settings.add_easter_eggs 76 | ? '请在代码中添加一些有趣的彩蛋或隐藏的注释,但不要影响代码的功能。' 77 | : ''; 78 | prompt = prompt.replace('{{easter_eggs}}', easterEggs); 79 | 80 | // 替换只输出代码选项 81 | const codeOnlyOutput = config.shitty_code_settings.code_only_output 82 | ? '请只输出转换后的代码,不要包含任何解释、说明或其他文本。直接以代码块形式返回结果。' 83 | : ''; 84 | prompt = prompt.replace('{{code_only_output}}', codeOnlyOutput); 85 | 86 | // 替换代码 87 | prompt = prompt.replace('{{language}}', language); 88 | prompt = prompt.replace('{{code}}', code); 89 | 90 | // 替换文件结构 91 | let fileStructure = ''; 92 | if (files && files.length > 1) { 93 | fileStructure = ` 94 | 项目文件结构: 95 | ${generateFileStructureDescription(files)} 96 | 97 | 请注意上述文件结构,确保转换后的代码能够在此项目结构中正确运行。`; 98 | } 99 | prompt = prompt.replace('{{file_structure}}', fileStructure); 100 | 101 | return prompt; 102 | } 103 | 104 | function generateFileStructureDescription(files: FileNode[]): string { 105 | let result = ''; 106 | 107 | function traverseFiles(nodes: FileNode[], depth: number = 0) { 108 | for (const node of nodes) { 109 | // 使用空格字符串拼接而不是 repeat 方法 110 | let indent = ''; 111 | for (let i = 0; i < depth * 2; i++) { 112 | indent += ' '; 113 | } 114 | result += `${indent}${node.isDirectory ? '📁' : '📄'} ${node.name}\n`; 115 | 116 | if (node.isDirectory && node.children) { 117 | traverseFiles(node.children, depth + 1); 118 | } 119 | } 120 | } 121 | 122 | traverseFiles(files); 123 | return result; 124 | } 125 | 126 | // 辅助函数:将文件列表转换为树形结构 127 | export function filesToTree(files: File[]): FileNode[] { 128 | const root: FileNode[] = []; 129 | const pathMap: Record = {}; 130 | 131 | // 首先创建所有目录节点 132 | for (const file of files) { 133 | const pathParts = file.webkitRelativePath.split('/'); 134 | let currentPath = ''; 135 | 136 | for (let i = 0; i < pathParts.length - 1; i++) { 137 | const part = pathParts[i]; 138 | if (!part) continue; 139 | 140 | const parentPath = currentPath; 141 | currentPath = currentPath ? `${currentPath}/${part}` : part; 142 | 143 | if (!pathMap[currentPath]) { 144 | const dirNode: FileNode = { 145 | name: part, 146 | path: currentPath, 147 | isDirectory: true, 148 | children: [] 149 | }; 150 | 151 | pathMap[currentPath] = dirNode; 152 | 153 | if (parentPath) { 154 | pathMap[parentPath].children?.push(dirNode); 155 | } else { 156 | root.push(dirNode); 157 | } 158 | } 159 | } 160 | } 161 | 162 | // 然后添加文件节点 163 | for (const file of files) { 164 | const pathParts = file.webkitRelativePath.split('/'); 165 | const fileName = pathParts[pathParts.length - 1]; 166 | const parentPath = pathParts.slice(0, -1).join('/'); 167 | 168 | const fileNode: FileNode = { 169 | name: fileName, 170 | path: file.webkitRelativePath, 171 | isDirectory: false, 172 | }; 173 | 174 | if (parentPath && pathMap[parentPath]) { 175 | pathMap[parentPath].children?.push(fileNode); 176 | } else { 177 | root.push(fileNode); 178 | } 179 | } 180 | 181 | return root; 182 | } 183 | 184 | // 辅助函数:将单个文件转换为树节点 185 | export function fileToNode(file: File): FileNode { 186 | return { 187 | name: file.name, 188 | path: file.name, 189 | isDirectory: false 190 | }; 191 | } 192 | 193 | // 辅助函数:将树节点转换为文件 194 | export function nodeToFile(node: FileNode): File { 195 | const file = new File([node.content || ''], node.name); 196 | Object.defineProperty(file, 'webkitRelativePath', { 197 | value: node.path, 198 | writable: false 199 | }); 200 | return file; 201 | } 202 | 203 | // 辅助函数:复制文本到剪贴板 204 | export function copyToClipboard(text: string): Promise { 205 | // 使用回调方式处理 Promise,避免使用 async/await 206 | return new Promise((resolve) => { 207 | try { 208 | navigator.clipboard.writeText(text) 209 | .then(() => resolve(true)) 210 | .catch((err) => { 211 | console.error('Failed to copy text: ', err); 212 | resolve(false); 213 | }); 214 | } catch (err) { 215 | console.error('Failed to copy text: ', err); 216 | resolve(false); 217 | } 218 | }); 219 | } -------------------------------------------------------------------------------- /src/components/CodeEditor.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | 179 | 180 | -------------------------------------------------------------------------------- /src/components/ConfigPanel.vue: -------------------------------------------------------------------------------- 1 | 114 | 115 | 193 | 194 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 326 | 327 | 436 | 437 | 449 | 450 | 732 | -------------------------------------------------------------------------------- /src/components/MarkdownPreview.vue: -------------------------------------------------------------------------------- 1 | 99 | 100 | 397 | 398 | --------------------------------------------------------------------------------