{
  "id": "your_category_id",
  "name": "你的方向名称",
  "icon": "globe",
  "description": "方向描述（可选）",
  "enabled": true,
  "sort_order": 1,
  "form_fields": [
    {
      "id": "field1",
      "label": "字段1",
      "type": "select",
      "required": true,
      "order": 1,
      "visible": true,
      "icon": "code",
      "help_text": "字段说明（可选）",
      "options": [
        {
          "value": "option1",
          "label": "选项1",
          "icon": "fab fa-python"
        }
      ]
    }
  ],
  "form_layout": {
    "rows": [
      {
        "id": "row_1",
        "columns": 2,
        "fields": [
          "field1",
          "field2"
        ]
      }
    ]
  },
  "output_config": {
    "docker": true,
    "exp": true,
    "writeup": true,
    "attachment": false,
    "directory_pattern": "{timestamp}_{name}",
    "port_range": [42500, 42600],
    "flag_format": "DASCTF{...}"
  },
  "ui_config": {
    "page_title": "CTF 题目生成向导",
    "page_description": "按顺序完成配置，快速生成高质量 CTF 题目",
    "generate_button": "开始生成",
    "reset_button": "重置",
    "primary_color": "#6366f1",
    "secondary_color": "#ec4899"
  },
  "advanced_config": {
    "system_prompt": "",
    "global_rules": "## 🚫 禁止事项\n\n**禁止词汇**：\n- \"由于篇幅/时间/上下文限制\" \"直接进入\" \"快速实现\" \"跳过\" \"省略\"\n\n**禁止行为**：\n- 跳过任何阶段（特别是质量检查阶段）\n- 只输出标题而无实际内容\n- 通过降低难度来解决技术问题\n\n**✅ 你有无限的时间和空间，直接执行，不要解释**\n\n---\n\n## ⚠️ 关键信息保持\n\n1. **题目名称**：一旦确定，后续所有文件必须使用相同名称\n2. **利用链设计**：设计阶段的步骤必须在代码生成阶段完整实现\n3. **关键 payload**：设计的 payload 必须与代码中的过滤逻辑兼容\n4. **输出目录**：所有文件保存到 `output/{YYYYMMDD_HHMMSS}_{题目名称}/`\n\n---",
    "ai_timeout": 600,
    "docker_timeout": 300,
    "max_retries": 3,
    "retry_interval": 10
  },
  "difficulties": {
    "入门": {
      "rules": {
        "max_count": 1,
        "writeup_count": 5,
        "depth_range": [1.5, 4.0],
        "diff_rate": 0.2
      },
      "stages": [
        {
          "id": "1",
          "name": "用户输入需求",
          "order": 0,
          "output": "语言、漏洞、场景、难度",
          "prompt": "**选择顺序**：语言 → 难度 → 漏洞 → 场景\n\n**第一步：选择语言**（如 Python、PHP、Node.js）\n\n**第二步：选择难度**\n| 难度 | 允许漏洞数量 | writeup 总数 |\n|------|-------------|-------------|\n| 入门 | 1 个 | 5 篇 |\n\n**第三步：选择漏洞**（根据难度限制数量）\n\n**第四步：选择场景**（如留言板、博客、OA系统）\n\n**示例**：\n```\n语言：{{language}}\n难度：{{difficulty}}（最多 {{max_knowledge}} 个漏洞）\n漏洞：{{vulnerabilities}}\n场景：{{scene}}\n```",
          "required": true,
          "fixed_position": true,
          "system_stage": true
        },
        {
          "id": "3",
          "name": "知识库获取",
          "order": 2,
          "output": "选中的writeup列表",
          "prompt": "### 3.1 获取学习材料（必须使用 choice.py）\n\n```bash\npython3 data/scripts/choice.py --difficulty={{difficulty}} --count={{writeup_count}} \"{{vulnerabilities}}\"\n```\n\n**⚠️ 漏洞名称必须使用用户输入的完整名称，禁止简化或缩写！**\n\n**choice.py 会输出选中的 writeup 文件名，然后使用 Read 工具读取 `data/writeups` 目录下对应的 .md 文件**",
          "required": true,
          "system_stage": true,
          "description": "根据用户输入和配置的脚本，从知识库中筛选并获取相关的知识点和 Writeup",
          "output_format": "json"
        },
        {
          "id": "5",
          "name": "题目设计",
          "order": 4,
          "output": "利用链、核心代码预写",
          "prompt": "### 5.1 设计目标\n\n- **差异度**：入门 ≥20%\n- **深度**：入门 1.5-4.0\n- **趣味性**：入门 0-1 个啊哈时刻\n\n### 5.2 利用链设计\n\n```markdown\n| 步骤 | 类型 | 技术点 | 深度 | 知识来源 |\n|------|------|--------|------|---------|\n| Step 1 | 信息收集 | robots.txt | 1/10 | WP#1 |\n| Step 2 | 漏洞利用 | SQL注入 | 3/10 | WP#2 |\n```\n\n### 5.3 核心代码预写（必须！）\n\n**在设计阶段就必须写出真实的漏洞代码（非伪代码）**：\n\n```markdown\n### 漏洞触发代码（5-10行真实代码，包含导入）\n\n❌ 安全写法（不能触发）：\n```python\ncursor.execute(\"SELECT * FROM users WHERE id = ?\", (user_id,))\n```\n\n✅ 漏洞写法（能触发）：\n```python\ncursor.execute(f\"SELECT * FROM users WHERE id = {user_id}\")\n```\n```",
          "required": true
        },
        {
          "id": "6",
          "name": "质量检查",
          "order": 5,
          "output": "验证清单",
          "prompt": "### 检查清单\n\n- [ ] **深度达标**：平均深度、最高深度符合要求\n- [ ] **漏洞覆盖**：用户要求的所有漏洞都在利用链中\n- [ ] **代码可行**：阶段 5.3 的核心代码能正常运行\n- [ ] **payload 兼容**：黑名单不会阻断 payload\n\n**若检查失败 → 返回阶段 5 修改**",
          "required": true,
          "skip_forbidden": true
        },
        {
          "id": "7",
          "name": "代码生成",
          "order": 6,
          "output": "后端代码、Docker 文件",
          "prompt": "### 7.1 生成原则\n\n1. **完整性**：包含所有设计的功能点和漏洞点\n2. **零注释**：代码中禁止任何注释\n3. **真实性**：模拟真实业务逻辑\n4. **隐蔽性**：漏洞点自然隐藏在业务逻辑中\n\n### 7.2 增量生成顺序（每步必须验证）\n\n1. **后端代码**\n2. **依赖文件**\n3. **前端文件**\n4. **Docker 文件**\n\n**⚠️ 每步生成后立即验证，发现问题立即修复**",
          "required": true
        },
        {
          "id": "8",
          "name": "Docker 构建与测试",
          "order": 7,
          "output": "容器验证",
          "prompt": "### 8.1 分层验证（按顺序）\n\n1. **容器启动**：`docker-compose -p ctf_test up -d --build`\n2. **服务可用**：`curl http://localhost:端口/`\n3. **基础功能**：测试正常功能\n4. **漏洞触发**：使用简易 exp 测试漏洞是否可触发\n\n**⚠️ 每层通过后再进入下一层，失败时立即修复代码，不要继续**",
          "required": true
        },
        {
          "id": "9",
          "name": "exp 和 writeup",
          "order": 8,
          "output": "exp.py、writeup.md",
          "prompt": "**⚠️ 只有阶段 8 测试全部通过后，才能进入本阶段**\n\n### 9.1 完善 exp.py\n\n基于简易 exp 草稿，完善为标准格式。\n\n### 9.2 运行 exp.py 验证\n\n```bash\npython3 exp.py localhost 端口 test12345\n```\n\n**⚠️ 必须输出 `Pass!` 才能继续编写 writeup**\n\n### 9.3 编写 writeup.md\n\n严格按照格式编写，题目描述禁止提及漏洞类型。",
          "required": true
        },
        {
          "id": "10",
          "name": "成品输出",
          "order": 9,
          "output": "最终文件结构",
          "prompt": "删除额外的测试文件，并输出最终文件结构。\n\n**⚠️ 最后必须输出完成标记**：\n```\n## [CTF_GENERATION_COMPLETE]\n```",
          "required": true
        }
      ]
    },
    "简单": {
      "rules": {
        "max_count": 2,
        "writeup_count": 5,
        "depth_range": [2.5, 5.0],
        "diff_rate": 0.3
      },
      "stages": []
    },
    "中等": {
      "rules": {
        "max_count": 3,
        "writeup_count": 10,
        "depth_range": [6.0, 10.0],
        "diff_rate": 0.5
      },
      "stages": []
    },
    "困难": {
      "rules": {
        "max_count": 5,
        "writeup_count": 10,
        "depth_range": [6.0, 10.0],
        "diff_rate": 0.5
      },
      "stages": []
    }
  }
}


























