Coding Net

Polar Sponsor
爱发电 赞助
.NET 9.0

查询和操作腾讯 Coding DevOps 平台(e.coding.net)的迭代、事项(需求/缺陷/任务)、团队成员等数据,包括创建需求和缺陷。当用户涉及 Coding 平台操作时触发,如「查迭代」「查事项」「当前迭代的需求」「Coding 上的 bug」「团队成员列表」「assignee」「新建需求」「创建缺...

Coding Open API Skill

功能概述

Coding Open API Skill是一项面向实际任务的技能,主要用于启动引导(每次对话开始时必须执行);第一步:收集 token;

核心要点

  • 检查用户消息是否已包含 token;
  • 若未提供,检查环境变量:;
  • 若均未提供,向用户询问:「请提供您的 Coding 个人访问令牌(Bearer Token)」;

使用与执行

第二步:验证 token,确认团队;第三步:确认项目标识;告知用户已验证团队,然后询问:;「请提供项目 URL 或项目标识。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。

结果检查与注意事项

从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。

Coding Open API Skill

启动引导(每次对话开始时必须执行)

第一步:收集 token

检查用户消息是否已包含 token。若未提供,检查环境变量:

python3 -c "import os; print('已设置' if os.environ.get('CODING_TOKEN') else '未设置')"

若均未提供,向用户询问:「请提供您的 Coding 个人访问令牌(Bearer Token)」

第二步:验证 token,确认团队

import sys; sys.path.insert(0, "path/to/coding-net/scripts")
from core import bootstrap
result = bootstrap(token="")
if result["error"]:
    print("✗", result["error"])
else:
    t = result["team"]
    print(f"✓ Token 有效  团队: {t['name']}  ({t['host']})")

第三步:确认项目标识

告知用户已验证团队,然后询问: 「请提供项目 URL 或项目标识。URL 格式为 https://<团队>.coding.net/p/<项目标识>/,项目标识是 /p/ 后面的部分(如 biaopin-swiftagent)。」

⚠️ 不要猜项目名。Coding.net 区分"显示名"和"项目标识",API 只认项目标识。 用户说"项目叫 swiftagent"≠ 标识就是 swiftagent,必须追问 URL。

第四步:验证项目 + 展示迭代列表,让用户选择

result = bootstrap("biaopin-swiftagent", token="")
if result["error"]:
    print("✗", result["error"])
else:
    print("项目下的迭代列表:")
    for it in result["iterations"]:
        print(f"  [{it['code']}] {it['name']}")

将迭代列表展示给用户,询问:「请问您要查看哪个迭代?」

完成以上四步后,再执行用户的实际查询请求。

环境配置(可选,配置后免传参)

变量 说明
CODING_TOKEN Bearer Token
CODING_DEFAULT_PROJECT_NAME 默认项目标识(URL 中 /p/ 后的部分)
CODING_DEFAULT_ITERATION_CODE 默认迭代 Code(整数)

脚本结构

scripts/
├── core.py        — HTTP 客户端、Token 解析、CodingAPIError
├── iterations.py  — 迭代 API(依赖 core)
├── issues.py      — 事项 API(依赖 core + iterations)
└── members.py     — 团队成员 API(依赖 core)

在 Python 中使用(脚本已处理 sys.path,直接 import 即可):

import sys
sys.path.insert(0, "path/to/scripts")
from iterations import get_iteration_list_code_and_name
from issues import describe_issue, describe_issue_list, create_issue, describe_defect_types, 
    extract_members_from_issue_list, get_custom_fields_from_issues
from members import get_team_members_id_and_name

公开函数速查

iterations.py

get_iteration_list_code_and_name(project_name=None, *, token=None) -> [{'code': int, 'name': str}]

分页拉取全量迭代列表。返回的 code 即 describe_issue_list(iteration=...) 所需值。

issues.py

describe_issue_list(
    project_name=None, *,   # 省略时读 CODING_DEFAULT_PROJECT_NAME
    issue_type="ALL",       # ALL / REQUIREMENT / DEFECT / MISSION
    limit="2000",
    assignee_ids=None,      # [int] — API 侧过滤(不可靠,建议配合 filter_issues 二次过滤)
    iteration=None,         # int  — 省略时读 CODING_DEFAULT_ITERATION_CODE;已内置客户端二次过滤
    status_types=None,      # None→TODO+PROCESSING; []→不过滤; ['TODO',...]→指定
    base_issue_type=None,   # REQUIREMENT / DEFECT / MISSION
    token=None,
) -> dict
# Response.IssueList 每条含:
#   Code, Name, Type, IssueStatusName, IssueStatusType, Priority,
#   Assignees([{"id": int, "name": str}]),  ← 处理人数组(非 Creator/Handler)
#   IterationCode, IterationName, StartDate, DueDate, CustomFields
filter_issues(
    items: list,            # describe_issue_list 返回的 IssueList
    *,
    assignee_name=None,     # 处理人姓名(模糊匹配,不区分大小写)
    assignee_id=None,       # 处理人 ID(精确匹配)
    iteration_code=None,    # 迭代 Code 二次过滤(API 侧过滤失效时使用)
) -> list
describe_issue(project_name=None, issue_code=0, *, token=None) -> dict
# 返回 {Name, Description, IssueStatusName, AssigneeName, CreatorName}
create_issue(
    project_name=None, *,
    name: str,                  # 标题(必填)
    issue_type="REQUIREMENT",   # REQUIREMENT / DEFECT / MISSION
    description="",
    priority=2,                 # 0=低 1=中 2=高(默认) 3=紧急(API 文档定义)
    assignee_id=None,           # int — 成员 ID(见 members.py 或从事项列表反查)
    iteration=None,             # int — 省略时读 CODING_DEFAULT_ITERATION_CODE
    start_date=None,            # str 'YYYY-MM-DD' — 部分项目必填
    due_date=None,              # str 'YYYY-MM-DD' — 部分项目必填
    label_ids=None,             # [int] — 部分项目必填,缺失报 issue_project_label_required
    working_hours=None,         # float — 工时(小时),部分项目必填
    issue_type_id=None,         # int — 事项大类 ID(非缺陷子类型)
    defect_type_id=None,        # int — 缺陷子类型 ID,来自 describe_defect_types
    token=None,
) -> dict  # {Code, Name, IssueStatusName, AssigneeName, CreatorName}
describe_defect_types(project_name=None, *, token=None) -> [{'id': int, 'name': str}]
# 返回缺陷子类型列表,对应 create_issue(defect_type_id=...)
extract_members_from_issue_list(issues_result: dict) -> [{'id': int, 'name': str}]
# 从 describe_issue_list 返回值中提取去重成员,用于 DescribeTeamMembers 无权限时的替代
get_custom_fields_from_issues(
    project_name=None, *,
    issue_type="REQUIREMENT",   # 按事项类型采样
    sample=10,                  # 采样条数
    token=None,
) -> [{'id': int, 'name': str}]
# 通过采样现有事项推断项目自定义字段(绕开需高权限的 DescribeIssueCustomFieldsBoundToProject)
# 创建事项前必须先调用,将必填字段通过 custom_field_values 传入 create_issue

members.py

get_team_members_id_and_name(*, token=None) -> [{'id': int, 'name': str}]

分页拉取全量团队成员。id 可用于 describe_issue_list(assignee_ids=[...]) 过滤。 注意:部分 token 无 DescribeTeamMembers 权限,会报错,此时改用 extract_members_from_issue_list。

常见工作流

查指定迭代下某处理人的需求(标准流程):

import sys; sys.path.insert(0, "path/to/coding-net/scripts")
from issues import describe_issue_list, filter_issues

result = describe_issue_list(project_name, iteration=22904, issue_type="REQUIREMENT", status_types=[])
issues = result["Response"]["IssueList"]

# 客户端按处理人过滤(API 侧过滤不可靠)
my_issues = filter_issues(issues, assignee_name="wangyin")
for it in my_issues:
    assignees = ", ".join(a["name"] for a in it["Assignees"])
    print(f"#{it['Code']} [{it['IssueStatusName']}] {it['Name']} — {assignees}")

从事项列表提取成员(DescribeTeamMembers 无权限时的替代方案):

from issues import describe_issue_list, extract_members_from_issue_list

result = describe_issue_list(project_name, iteration=code, status_types=[])
members = extract_members_from_issue_list(result)
# [{'id': 9403993, 'name': 'wangyin'}, ...]

查单条事项详情(含描述):

from issues import describe_issue
detail = describe_issue(project_name, issue_code=12345)

创建需求(必须先检测自定义字段):

⚠️ 项目可能配置了必填自定义字段(如"提测日期"),直接创建会报 issue_custom_field_required。 先调用 get_custom_fields_from_issues() 推断字段列表,再传入 custom_field_values。

from issues import create_issue, get_custom_fields_from_issues

# 第一步:检测项目自定义字段
custom_fields = get_custom_fields_from_issues(project_name, issue_type="REQUIREMENT")
# 返回示例:[{"id": 38589683, "name": "提测日期"}, ...]
# 向用户确认各字段值,必填字段必须传入

# 第二步:创建需求
issue = create_issue(
    project_name,
    name="支持 XX 功能",
    start_date="2026-06-17",
    due_date="2026-06-30",
    custom_field_values=[
        {"Id": 38589683, "Content": "2026-06-30"},  # 提测日期
        # 其他必填自定义字段...
    ],
)
print(issue["Code"], issue["Name"])

创建缺陷(含项目级必填字段):

from issues import describe_issue_list, extract_members_from_issue_list, describe_defect_types, create_issue, filter_issues

# 1. 从事项列表反查成员 ID
result = describe_issue_list(project_name, iteration=code, status_types=[])
members = extract_members_from_issue_list(result)
uid = next(m["id"] for m in members if m["name"] == "张三")

# 2. 查缺陷子类型
defect_types = describe_defect_types(project_name)  # [{'id': 36666669, 'name': '功能缺陷'}, ...]

# 3. 创建(start_date/due_date/label_ids/working_hours 按项目配置决定是否必填)
issue = create_issue(
    project_name,
    name="登录页面报 500 错误",
    issue_type="DEFECT",
    priority=1,
    assignee_id=uid,
    iteration=code,
    start_date="2026-06-17",
    due_date="2026-06-20",
    label_ids=[123],
    working_hours=2.0,
    defect_type_id=defect_types[0]["id"],
)

相关专题

更多
Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

2026.11.12

0

15

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

2026.11.12

0

15

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

2026.11.12

0

15

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

0

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

0

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

0

10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

0

12

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

2026.11.05

0

12

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

2026.11.04

0

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.3万人学习