fix(ticket-management): 参数两种写法都收 + 新增 selftest + 模板域分隔符改连字符
- bin/ticket.mjs: parseArgs 同时接受 --x=v 与 --x v(仅取值型选项,布尔开关不吃后一个参数); 新增 selftest 子命令(不联网、不需要令牌),覆盖解析器 3 条与断言正反 5 条 - SKILL.md: §5 命令块补 selftest 与「两种写法等价」;子命令表补 selftest 行; §6 留档 403/405 假故障的成因(示例写空格、实现只认等号);frontmatter description 补 selftest - templates/issue.md: 域层级分隔符 / → -(断言 3 按 - 取 L1,斜杠版照抄必挂) 验证:node bin/ticket.mjs selftest → 8/8,退出码 0
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: ticket-management
|
||||
description: 用 Gitea 工单库做「人读 + 机读」双面管理 —— 标签零新增;标题用【问题域】前缀(闸门仅「不能动」时作第二段);正文**首行一行机读字段**(域/闸门/优先级/类型/模式/端/环境/证据);正文**自包含**(禁本地路径与内部分析编号,源码用仓库相对路径 + 该 ref 的 permalink);来源只能进**末尾机读引用块**(须写明 ref-owner)。含 bin/ticket.mjs 的 labels/milestones/list/verify/create/rename。适用于:建单、批量规范化既有工单标题、校验工单是否合规、用 API 读写 Gitea issue。
|
||||
description: 用 Gitea 工单库做「人读 + 机读」双面管理 —— 标签零新增;标题用【问题域】前缀(闸门仅「不能动」时作第二段);正文**首行一行机读字段**(域/闸门/优先级/类型/模式/端/环境/证据);正文**自包含**(禁本地路径与内部分析编号,源码用仓库相对路径 + 该 ref 的 permalink);来源只能进**末尾机读引用块**(须写明 ref-owner)。含 bin/ticket.mjs 的 labels/milestones/list/verify/create/rename/selftest(自检不联网、不需要令牌)。适用于:建单、批量规范化既有工单标题、校验工单是否合规、用 API 读写 Gitea issue。
|
||||
---
|
||||
|
||||
# ticket-management(Gitea 工单管理)
|
||||
@@ -68,7 +68,11 @@ refs:
|
||||
## 5 工具 `bin/ticket.mjs`
|
||||
|
||||
```bash
|
||||
# 自检:不联网、不需要令牌,改完脚本先跑这条
|
||||
node bin/ticket.mjs selftest
|
||||
|
||||
# 令牌:GITEA_TOKEN 环境变量,或 --token-file=<含 key=value 的文件>(不落盘、不回显)
|
||||
# 取值型选项两种写法等价:--repo=xbc/xbc 与 --repo xbc/xbc 都能用
|
||||
node bin/ticket.mjs labels --repo xbc/xbc
|
||||
node bin/ticket.mjs milestones --repo xbc/xbc
|
||||
node bin/ticket.mjs list --repo xbc/xbc --state=open
|
||||
@@ -83,12 +87,14 @@ node bin/ticket.mjs rename 142 --repo xbc/xbc --domain=平台 [--gate=等口径]
|
||||
| `verify <n>` | **校验**(只读):见 §7 六项断言 | `read:issue` |
|
||||
| `create` | 建单(**先按标题查重**) | `write:issue` |
|
||||
| `rename <n>` | 规范化标题(重建前缀,描述不动) | `write:issue` |
|
||||
| `selftest` | **自检**:解析器两种写法 + §7 七项断言的正反样例;不联网、不需要令牌 | 无 |
|
||||
|
||||
## 6 常见坑(实测)
|
||||
|
||||
- **HTTP 分块解码**:`let d = ''; res.on('data', c => d += c)` 会把**跨块的多字节字符**打成 `U+FFFD`(中文标签名就被打坏过)⇒ 必须 `res.setEncoding('utf8')`,或用 `fetch` 的 `text()`。
|
||||
- **建单前必须查重**:按标题查,否则会重复建单。
|
||||
- **标签传 id**:`POST /issues` 的 `labels` 是**标签 id 数组**,不是名字。
|
||||
- **参数写法的坑(已修,留档)**:早先 `parseArgs` 只认 `--repo=o/r`,而本文档示例写的是 `--repo o/r` ⇒ `xbc/xbc` 被当成位置参数、`repo` 变成 `true`,请求打到 `/repos/true/...`,报出来的是 403「缺 read 权限」与 405「方法不允许」——**全是假故障**,白排查了三轮。现在取值型选项两种写法都收;改动仍以 `selftest` 兜底。
|
||||
- **批量改首行时必须保持 ` | ` 形态**(空格 + 竖线 + 空格):把 `域=…` 换成新值时若顺手吃掉它后面的空格,`闸门=` 会与 `域` 黏成一段 ⇒ **断言 4 全线 FAIL**(实测 14/14 中招,工具拦住了)。
|
||||
- **改标题与正文**:都是 `PATCH /repos/{owner}/{repo}/issues/{n}`。
|
||||
- **令牌 scope**:只读 `read:issue,read:repository` 建不了单(403,报错会写 required scope);建 / 改需 `write:issue`;`GET /user` 另需 `read:user`。
|
||||
|
||||
Reference in New Issue
Block a user