@netpilot/skills 0.3.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/AGENTS.md +25 -9
- package/CHANGELOG.md +27 -0
- package/README.md +78 -112
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/agents/codex/architecture-designer.toml +2 -1
- package/agents/codex/backend-reviewer.toml +3 -1
- package/agents/codex/frontend-reviewer.toml +3 -1
- package/agents/codex/test-verifier.toml +4 -1
- package/bin/netpilot-skills.mjs +130 -6
- package/docs/agent-authoring.md +15 -5
- package/package.json +1 -1
- package/scripts/sync.mjs +1304 -101
- package/scripts/validate.mjs +68 -14
- package/skills/ask/SKILL.md +51 -47
- package/skills/ask/agents/openai.yaml +3 -3
- package/skills/code-review/SKILL.md +68 -52
- package/skills/code-review/agents/openai.yaml +2 -2
- package/skills/codebase-design/SKILL.md +87 -50
- package/skills/codebase-design/agents/openai.yaml +2 -2
- package/skills/codebase-design/references/deepening.md +60 -0
- package/skills/codebase-design/references/design-it-twice.md +54 -0
- package/skills/diagnosing-bugs/SKILL.md +124 -54
- package/skills/diagnosing-bugs/agents/openai.yaml +2 -2
- package/skills/diagnosing-bugs/scripts/hitl-loop.template.mjs +52 -0
- package/skills/domain-modeling/SKILL.md +65 -55
- package/skills/domain-modeling/agents/openai.yaml +2 -2
- package/skills/domain-modeling/references/adr-format.md +47 -0
- package/skills/domain-modeling/references/context-format.md +60 -0
- package/skills/domain-modeling/references/domain-docs.md +53 -0
- package/skills/grill-me/SKILL.md +13 -0
- package/skills/grill-me/agents/openai.yaml +6 -0
- package/skills/grill-with-docs/SKILL.md +16 -63
- package/skills/grill-with-docs/agents/openai.yaml +3 -3
- package/skills/grilling/SKILL.md +10 -54
- package/skills/grilling/agents/openai.yaml +2 -2
- package/skills/handoff/SKILL.md +24 -42
- package/skills/handoff/agents/openai.yaml +3 -3
- package/skills/implement/SKILL.md +18 -55
- package/skills/implement/agents/openai.yaml +3 -3
- package/skills/improve-codebase-architecture/SKILL.md +88 -0
- package/skills/improve-codebase-architecture/agents/openai.yaml +6 -0
- package/skills/improve-codebase-architecture/references/html-report.md +158 -0
- package/skills/prototype/SKILL.md +21 -53
- package/skills/prototype/agents/openai.yaml +2 -2
- package/skills/prototype/references/logic.md +87 -0
- package/skills/prototype/references/ui.md +108 -0
- package/skills/research/SKILL.md +9 -66
- package/skills/research/agents/openai.yaml +2 -2
- package/skills/resolving-merge-conflicts/SKILL.md +94 -0
- package/skills/resolving-merge-conflicts/agents/openai.yaml +6 -0
- package/skills/tdd/SKILL.md +30 -46
- package/skills/tdd/agents/openai.yaml +2 -2
- package/skills/tdd/references/mocking.md +70 -0
- package/skills/tdd/references/tests.md +95 -0
- package/skills/teach/SKILL.md +115 -47
- package/skills/teach/agents/openai.yaml +3 -3
- package/skills/teach/references/glossary-format.md +35 -10
- package/skills/teach/references/learning-record-format.md +41 -11
- package/skills/teach/references/mission-format.md +20 -17
- package/skills/teach/references/resources-format.md +34 -16
- package/skills/to-spec/SKILL.md +56 -51
- package/skills/to-spec/agents/openai.yaml +3 -3
- package/skills/to-tickets/SKILL.md +84 -45
- package/skills/to-tickets/agents/openai.yaml +3 -3
- package/skills/triage/SKILL.md +171 -0
- package/skills/triage/agents/openai.yaml +6 -0
- package/skills/triage/references/agent-brief.md +168 -0
- package/skills/triage/references/issue-tracker-github.md +42 -0
- package/skills/triage/references/issue-tracker-gitlab.md +42 -0
- package/skills/triage/references/issue-tracker-local.md +28 -0
- package/skills/triage/references/out-of-scope.md +113 -0
- package/skills/triage/references/project-config.md +57 -0
- package/skills/triage/references/triage-labels.md +13 -0
- package/skills/wayfinder/SKILL.md +158 -51
- package/skills/wayfinder/agents/openai.yaml +3 -3
- package/skills/writing-great-skills/SKILL.md +96 -54
- package/skills/writing-great-skills/agents/openai.yaml +3 -3
- package/skills/writing-great-skills/references/glossary.md +279 -0
- package/agents/codex/code-reader.toml +0 -11
- package/skills/grill/SKILL.md +0 -54
- package/skills/grill/agents/openai.yaml +0 -6
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# 编写 Agent Brief
|
|
2
|
+
|
|
3
|
+
Agent brief 是 item 进入 **ready-for-agent** 时写入 tracker 的权威合同。原始 body 与讨论是背景;brief 定义 AFK agent 真正需要完成的工作。
|
|
4
|
+
|
|
5
|
+
Issue brief 描述从当前系统构建变化。PR brief 描述现有 diff 仍需补齐、修复或验证的部分。
|
|
6
|
+
|
|
7
|
+
## 原则
|
|
8
|
+
|
|
9
|
+
### 持久性优先于易失的精确度
|
|
10
|
+
|
|
11
|
+
Item 可能数周后才被执行:
|
|
12
|
+
|
|
13
|
+
- 描述 Interface、type 和 behavioral contract;
|
|
14
|
+
- 可以命名稳定类型、函数签名或配置 shape;
|
|
15
|
+
- 不引用具体文件路径或行号;
|
|
16
|
+
- 只引用稳定的 Interface、type、contract、配置键或数据 shape;
|
|
17
|
+
- 不假设当前目录结构长期不变。
|
|
18
|
+
|
|
19
|
+
### 描述行为,不写编辑步骤
|
|
20
|
+
|
|
21
|
+
写系统完成后应具备的行为,不写逐步编辑指令。
|
|
22
|
+
|
|
23
|
+
好:
|
|
24
|
+
|
|
25
|
+
> `SkillConfig` 接受可选 `schedule: CronExpression`,缺省时保持现有行为。
|
|
26
|
+
|
|
27
|
+
差:
|
|
28
|
+
|
|
29
|
+
> 打开某文件第 42 行,加一个字段。
|
|
30
|
+
|
|
31
|
+
### 完整的验收标准
|
|
32
|
+
|
|
33
|
+
每条 criterion 独立可验证。避免“工作正常”“体验良好”等不可判定表达。
|
|
34
|
+
|
|
35
|
+
### 明确范围
|
|
36
|
+
|
|
37
|
+
明确不属于本 item 的相邻能力,阻止 gold-plating。
|
|
38
|
+
|
|
39
|
+
## 模板
|
|
40
|
+
|
|
41
|
+
```markdown
|
|
42
|
+
> *此内容由 AI 在分诊过程中生成。*
|
|
43
|
+
|
|
44
|
+
## Agent Brief
|
|
45
|
+
|
|
46
|
+
**Category:** bug / enhancement
|
|
47
|
+
**Summary:** 一句话说明需要实现或完成什么。
|
|
48
|
+
|
|
49
|
+
**Current behavior:**
|
|
50
|
+
描述当前系统或 PR diff 的真实状态。bug 写损坏行为;enhancement 写 status quo;PR 写现有 diff 已完成和未完成的部分。
|
|
51
|
+
|
|
52
|
+
**Desired behavior:**
|
|
53
|
+
描述完成后的可观察行为,包括 edge cases 和 error conditions。
|
|
54
|
+
|
|
55
|
+
**Key interfaces:**
|
|
56
|
+
- `TypeName` — 应具备的 contract
|
|
57
|
+
- `functionName()` — 输入、输出或错误行为
|
|
58
|
+
- Config / schema shape — 必要变化
|
|
59
|
+
|
|
60
|
+
**Acceptance criteria:**
|
|
61
|
+
- [ ] 具体、可验证标准一
|
|
62
|
+
- [ ] 具体、可验证标准二
|
|
63
|
+
- [ ] 关键失败或边界标准
|
|
64
|
+
|
|
65
|
+
**Verification evidence available:**
|
|
66
|
+
- 已确认的 reproduction、test、command 或 code path
|
|
67
|
+
- 尚未能执行的验证及原因
|
|
68
|
+
|
|
69
|
+
**Out of scope:**
|
|
70
|
+
- 相邻但不属于本 item 的内容
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## 示例
|
|
74
|
+
|
|
75
|
+
### Bug 示例
|
|
76
|
+
|
|
77
|
+
```markdown
|
|
78
|
+
## Agent Brief
|
|
79
|
+
|
|
80
|
+
**Category:** bug
|
|
81
|
+
**Summary:** Skill description 截断不能在单词中间产生损坏输出。
|
|
82
|
+
|
|
83
|
+
**Current behavior:**
|
|
84
|
+
description 超过限制后在固定字符位置截断,可能留下半个单词。
|
|
85
|
+
|
|
86
|
+
**Desired behavior:**
|
|
87
|
+
超过限制时,在限制内最后一个单词边界截断并追加省略号;未超过限制时保持原文。
|
|
88
|
+
|
|
89
|
+
**Key interfaces:**
|
|
90
|
+
- Description formatter — 输入原文与长度限制,返回符合限制的显示文本
|
|
91
|
+
- Fallback contract — 无空格文本仍必须产生合法、长度受限的结果
|
|
92
|
+
|
|
93
|
+
**Acceptance criteria:**
|
|
94
|
+
- [ ] 未超过限制的 description 不变化
|
|
95
|
+
- [ ] 超过限制时在单词边界截断
|
|
96
|
+
- [ ] 输出含省略号且总长度不超过限制
|
|
97
|
+
- [ ] 中英文和无空格文本有明确 fallback
|
|
98
|
+
|
|
99
|
+
**Out of scope:**
|
|
100
|
+
- 修改长度限制
|
|
101
|
+
- 改变 description 的存储格式
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Enhancement 示例
|
|
105
|
+
|
|
106
|
+
```markdown
|
|
107
|
+
## Agent Brief
|
|
108
|
+
|
|
109
|
+
**Category:** enhancement
|
|
110
|
+
**Summary:** 为被拒绝的 feature requests 建立按概念归档的 knowledge base。
|
|
111
|
+
|
|
112
|
+
**Current behavior:**
|
|
113
|
+
拒绝理由只存在于关闭 comment,类似请求到来时难以发现历史决定。
|
|
114
|
+
|
|
115
|
+
**Desired behavior:**
|
|
116
|
+
每个被拒绝概念对应一份 `.out-of-scope/<concept>.md`,记录 durable reason 与 prior requests。
|
|
117
|
+
|
|
118
|
+
**Key interfaces:**
|
|
119
|
+
- Out-of-scope entry — 一个概念、一项长期理由和多个 prior requests
|
|
120
|
+
- Triage lookup — 按概念相似性读取历史决定
|
|
121
|
+
|
|
122
|
+
**Acceptance criteria:**
|
|
123
|
+
- [ ] 拒绝 enhancement 时创建或更新对应概念文件
|
|
124
|
+
- [ ] 同概念请求追加到 prior requests,不产生重复文件
|
|
125
|
+
- [ ] Triage 时读取并展示相似历史决定
|
|
126
|
+
- [ ] Bug 和 already-implemented item 不写入 knowledge base
|
|
127
|
+
|
|
128
|
+
**Out of scope:**
|
|
129
|
+
- 自动重新打开历史 requests
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### External PR 示例
|
|
133
|
+
|
|
134
|
+
```markdown
|
|
135
|
+
## Agent Brief
|
|
136
|
+
|
|
137
|
+
**Category:** enhancement
|
|
138
|
+
**Summary:** 完成现有 JSON 输出 diff 的错误路径和测试覆盖。
|
|
139
|
+
|
|
140
|
+
**Current behavior:**
|
|
141
|
+
PR 的成功路径会输出 JSON,但错误仍是 human text,且缺少覆盖。
|
|
142
|
+
|
|
143
|
+
**Desired behavior:**
|
|
144
|
+
启用 JSON 模式后成功和失败输出都为合法 JSON,exit code 保持现有 contract;未启用时输出完全不变。
|
|
145
|
+
|
|
146
|
+
**Key interfaces:**
|
|
147
|
+
- CLI JSON output contract — 成功与失败都输出单个合法 JSON document
|
|
148
|
+
- Exit status contract — JSON 模式不改变既有 exit code 语义
|
|
149
|
+
|
|
150
|
+
**Acceptance criteria:**
|
|
151
|
+
- [ ] 成功和错误路径均输出合法 JSON
|
|
152
|
+
- [ ] Exit code 与非 JSON 模式一致
|
|
153
|
+
- [ ] 至少覆盖一条成功和一条错误测试
|
|
154
|
+
- [ ] 默认输出保持不变
|
|
155
|
+
|
|
156
|
+
**Out of scope:**
|
|
157
|
+
- 重命名既有 JSON fields
|
|
158
|
+
- 改变 human-readable 默认输出
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
以下内容不合格:
|
|
162
|
+
|
|
163
|
+
```markdown
|
|
164
|
+
## Agent Brief
|
|
165
|
+
修一下 triage。某文件第 150 行有问题。
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
它没有 category、current/desired behavior、acceptance criteria、scope、验证证据,并依赖易过期的路径与行号。
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Issue Tracker:GitHub
|
|
2
|
+
|
|
3
|
+
GitHub issues 承载 issue、spec/PRD、implementation tickets 与 Wayfinder map。Tracker 选择和项目覆盖先按 [project-config.md](project-config.md) 解析。优先使用当前宿主已连接的 GitHub connector 或 API;不可用时使用官方 `gh` CLI。所有写入都继承调用方 skill 的动作门禁,本文件本身不授予远程写权限。
|
|
4
|
+
|
|
5
|
+
## 常规操作
|
|
6
|
+
|
|
7
|
+
- 创建 issue:`gh issue create --title "..." --body-file <path>`
|
|
8
|
+
- 读取 issue:`gh issue view <number> --comments --json number,title,body,labels,comments,author,createdAt,updatedAt`
|
|
9
|
+
- 列出 issues:`gh issue list --state open --json number,title,body,labels,comments`
|
|
10
|
+
- 评论:`gh issue comment <number> --body-file <path>`
|
|
11
|
+
- 增删 labels:`gh issue edit <number> --add-label "..."` / `--remove-label "..."`
|
|
12
|
+
- 指派:`gh issue edit <number> --add-assignee @me`
|
|
13
|
+
- 关闭:先写有证据的 resolution comment,再执行 `gh issue close <number>`
|
|
14
|
+
|
|
15
|
+
多行或来自外部输入的正文使用 connector 的结构化字段或临时 body file,不把不可信内容拼接进 shell 命令。运行在 clone 内时由 `gh` 从 Git remote 识别仓库;仓库不唯一时显式指定。
|
|
16
|
+
|
|
17
|
+
## PR 作为 triage surface
|
|
18
|
+
|
|
19
|
+
默认 **否**。只有仓库规则明确把外部 PR 当作 request surface 时才纳入。
|
|
20
|
+
|
|
21
|
+
- 读取:`gh pr view <number> --comments` 与 `gh pr diff <number>`
|
|
22
|
+
- 列出外部 PR:读取 `authorAssociation`,只保留 `CONTRIBUTOR`、`FIRST_TIME_CONTRIBUTOR` 或 `NONE`
|
|
23
|
+
- 评论、label、关闭:使用 `gh pr comment`、`gh pr edit`、`gh pr close`
|
|
24
|
+
|
|
25
|
+
GitHub issue 与 PR 共用编号空间。裸 `#42` 可能属于任一 surface:先用 `gh pr view 42` 解析 PR,失败后再用 `gh issue view 42`;两个 surface 都无法读取时才报告目标不存在或权限不足。
|
|
26
|
+
|
|
27
|
+
## 发布与读取约定
|
|
28
|
+
|
|
29
|
+
- “发布到 issue tracker”表示创建 GitHub issue。
|
|
30
|
+
- “读取相关 ticket”表示读取完整 body、comments、labels 与关联对象,而不是只看标题。
|
|
31
|
+
- Canonical triage roles 到实际 label 的映射见 [triage-labels.md](triage-labels.md)。
|
|
32
|
+
|
|
33
|
+
## Wayfinder 操作
|
|
34
|
+
|
|
35
|
+
- **Map**:单一 issue,label 为 `wayfinder:map`,保存 Destination、Notes、Decisions so far 与 fog。
|
|
36
|
+
- **Child ticket**:优先使用 GitHub sub-issue。不可用时,在 map task list 中链接 child,并在 child 顶部写 `Part of #<map>`。每票带 `wayfinder:<type>` label。
|
|
37
|
+
- **Blocking**:优先使用 GitHub native issue dependencies。当前 `gh issue create` 支持 `--blocked-by <numbers>` 与 `--blocking <numbers>`;需要 API 时,用 `POST repos/<owner>/<repo>/issues/<child>/dependencies/blocked_by -F issue_id=<blocker-db-id>` 添加 edge。`issue_id` 是 blocker 的 numeric database id,可由 `gh api repos/<owner>/<repo>/issues/<n> --jq .id` 获取,不是 `#number` 或 `node_id`。用 `GET .../dependencies/blocked_by` 查询当前 ticket 的 blockers,用 `GET .../dependencies/blocking` 查询它阻塞的 tickets。不可用时回退到 body 顶部的 `Blocked by: #<n>, #<n>`。
|
|
38
|
+
- **Frontier**:列出 map 的 open children,查询每票的 live blocker 状态;优先读取 `blockedBy` / `blocking` 或上述 dependency endpoints,而不是依赖创建时的旧快照。排除仍有 open blocker 或已有 assignee 的 tickets,按 map 顺序取第一项。
|
|
39
|
+
- **Claim**:在任何实质工作前把 ticket 指派给当前维护者。
|
|
40
|
+
- **Resolve**:写独立可读的 resolution comment,关闭 ticket,再把“标题链接 + 一行 gist”的 context pointer 追加到 map。
|
|
41
|
+
|
|
42
|
+
Assets 和 research branches 只通过链接/context pointer 引用,不把完整产物粘贴到 map body。
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Issue Tracker:GitLab
|
|
2
|
+
|
|
3
|
+
GitLab issues 承载 issue、spec/PRD、implementation tickets 与 Wayfinder map。Tracker 选择和项目覆盖先按 [project-config.md](project-config.md) 解析。优先使用当前宿主已连接的 GitLab API;不可用时使用官方 `glab` CLI。所有写入都继承调用方 skill 的动作门禁。
|
|
4
|
+
|
|
5
|
+
## 常规操作
|
|
6
|
+
|
|
7
|
+
- 创建 issue:`glab issue create --title "..." --description "..." --yes`
|
|
8
|
+
- 读取 issue:`glab issue view <number> --comments --output json`
|
|
9
|
+
- 列出 issues:`glab issue list --output json`
|
|
10
|
+
- 评论:`glab issue note <number> --message "..."`
|
|
11
|
+
- 增删 labels:`glab issue update <number> --label "..."` / `--unlabel "..."`
|
|
12
|
+
- 指派:`glab issue update <number> --assignee @me`
|
|
13
|
+
- 关闭:先用 note 写 resolution,再执行 `glab issue close <number>`
|
|
14
|
+
|
|
15
|
+
长正文优先通过结构化 GitLab API 字段提交;使用 CLI 时将正文作为独立参数传递,不把不可信内容拼接进 shell。运行在 clone 内时可由 Git remote 识别项目;项目不唯一时显式指定。
|
|
16
|
+
|
|
17
|
+
## Merge Request 作为 triage surface
|
|
18
|
+
|
|
19
|
+
默认 **否**。只有仓库规则明确把外部 MR 当作 request surface 时才纳入。
|
|
20
|
+
|
|
21
|
+
- 读取:`glab mr view <number> --comments` 与 `glab mr diff <number>`
|
|
22
|
+
- 列出:`glab mr list --output json`,排除 project member/owner 的维护中工作
|
|
23
|
+
- 评论、label、关闭:使用 `glab mr note`、`glab mr update`、`glab mr close`
|
|
24
|
+
|
|
25
|
+
GitLab issues 与 MRs 使用不同编号空间,因此必须先知道 surface。
|
|
26
|
+
|
|
27
|
+
## 发布与读取约定
|
|
28
|
+
|
|
29
|
+
- “发布到 issue tracker”表示创建 GitLab issue。
|
|
30
|
+
- “读取相关 ticket”表示读取完整 description、notes、labels 与关联对象。
|
|
31
|
+
- Canonical triage roles 到实际 label 的映射见 [triage-labels.md](triage-labels.md)。
|
|
32
|
+
|
|
33
|
+
## Wayfinder 操作
|
|
34
|
+
|
|
35
|
+
- **Map**:label 为 `wayfinder:map` 的 issue;有合适 tier 时也可使用 epic,但普通 issue 在所有 tier 可用。
|
|
36
|
+
- **Child ticket**:description 顶部写 `Part of #<map>`,并添加 `wayfinder:<type>` label。
|
|
37
|
+
- **Blocking**:优先使用 native blocking link,例如 `/blocked_by #<n>` quick action。功能不可用时回退到 `Blocked by: #<n>, #<n>`。
|
|
38
|
+
- **Frontier**:列出 map children,排除仍有 open blocker 或 assignee 的 tickets;按 map 顺序选择。
|
|
39
|
+
- **Claim**:任何实质工作前先指派。
|
|
40
|
+
- **Resolve**:写 resolution note,关闭 issue,再把标题链接与一行 gist 追加到 map。
|
|
41
|
+
|
|
42
|
+
Assets 和 research branches 使用链接/context pointer,不粘贴完整产物。
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Issue Tracker:Local Markdown
|
|
2
|
+
|
|
3
|
+
没有远程 tracker 或用户明确选择本地模式时,issues、specs 与 Wayfinder map 保存在 `.scratch/` 下。Tracker 选择和项目覆盖先按 [project-config.md](project-config.md) 解析;写入仍继承调用方 skill 的动作门禁。
|
|
4
|
+
|
|
5
|
+
## 常规约定
|
|
6
|
+
|
|
7
|
+
- 一个 feature 一个目录:`.scratch/<feature-slug>/`
|
|
8
|
+
- Spec:`.scratch/<feature-slug>/spec.md`
|
|
9
|
+
- Implementation tickets:`.scratch/<feature-slug>/issues/<NN>-<slug>.md`
|
|
10
|
+
- Ticket 从 `01` 按依赖顺序编号;每票一个文件,不能合并成单一 tickets 文档
|
|
11
|
+
- Triage state 使用文件顶部附近的 `Status:` 字段
|
|
12
|
+
- 评论与历史追加到 `## Comments`
|
|
13
|
+
- Canonical roles 见 [triage-labels.md](triage-labels.md)
|
|
14
|
+
|
|
15
|
+
“发布到 issue tracker”表示按上述位置创建文件;“读取 ticket”表示读取用户给出的路径或能唯一解析的编号。不要扫描或覆盖无关 `.scratch/` effort。
|
|
16
|
+
|
|
17
|
+
## Wayfinder 操作
|
|
18
|
+
|
|
19
|
+
- **Map**:`.scratch/<effort>/map.md`
|
|
20
|
+
- **Child ticket**:`.scratch/<effort>/issues/<NN>-<slug>.md`
|
|
21
|
+
- **Type**:`research`、`prototype`、`grilling` 或 `task`
|
|
22
|
+
- **Status**:至少区分 open、claimed 与 resolved
|
|
23
|
+
- **Blocking**:顶部使用 `Blocked by: NN, NN`;全部 blockers resolved 后才 unblocked
|
|
24
|
+
- **Frontier**:扫描该 effort 的 issues,选择 open、unblocked、unclaimed 中编号最小者
|
|
25
|
+
- **Claim**:任何实质工作前先写 `Status: claimed`
|
|
26
|
+
- **Resolve**:在 `## Answer` 下追加独立可读的答案,改为 `Status: resolved`,再把标题链接与一行 gist 追加到 map
|
|
27
|
+
|
|
28
|
+
Research artifact 或 prototype 以相对链接引用;答案和 artifact 不在 map 重复存储。
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# 超出范围的知识库
|
|
2
|
+
|
|
3
|
+
`.out-of-scope/` 保存被明确拒绝的 enhancement 的长期记录:
|
|
4
|
+
|
|
5
|
+
1. 保留 institutional memory;
|
|
6
|
+
2. 在相似请求再次出现时去重,避免重新争论已经决定的内容。
|
|
7
|
+
|
|
8
|
+
一份文件对应一个概念,而不是一个 issue。
|
|
9
|
+
|
|
10
|
+
```text
|
|
11
|
+
.out-of-scope/
|
|
12
|
+
├── dark-mode.md
|
|
13
|
+
├── plugin-system.md
|
|
14
|
+
└── graphql-api.md
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 文件格式
|
|
18
|
+
|
|
19
|
+
文件应像短设计文档,而不是数据库记录。可以使用段落、例子和必要代码,确保第一次看到的人也理解理由。
|
|
20
|
+
|
|
21
|
+
```markdown
|
|
22
|
+
# Dark Mode
|
|
23
|
+
|
|
24
|
+
本项目不提供运行时主题切换。
|
|
25
|
+
|
|
26
|
+
## Why this is out of scope
|
|
27
|
+
|
|
28
|
+
说明项目 scope、架构约束或长期战略理由。理由必须在数月后仍成立,不能只写“现在没时间”。
|
|
29
|
+
|
|
30
|
+
## Prior requests
|
|
31
|
+
|
|
32
|
+
- [Add dark mode](issue-link)
|
|
33
|
+
- [Night theme](issue-link)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
文件名使用表达概念的 kebab-case。多个相同概念请求追加到 Prior requests。
|
|
37
|
+
|
|
38
|
+
### 完整示例
|
|
39
|
+
|
|
40
|
+
```markdown
|
|
41
|
+
# Runtime Theme Switching
|
|
42
|
+
|
|
43
|
+
本产品不提供运行时主题切换;视觉主题由部署时配置决定。
|
|
44
|
+
|
|
45
|
+
## Why this is out of scope
|
|
46
|
+
|
|
47
|
+
产品输出需要经过固定主题的像素级审查,并作为可审计快照保存。运行时切换会让同一内容产生多套必须独立验证的视觉状态,同时破坏“一个部署对应一套已批准呈现”的约束。若未来产品目标改为面向终端用户的个性化界面,应作为新的产品方向重新评估,而不是在现有渲染链路上追加开关。
|
|
48
|
+
|
|
49
|
+
## Prior requests
|
|
50
|
+
|
|
51
|
+
- [Allow each viewer to choose a theme](issue-link)
|
|
52
|
+
- [Add a night presentation mode](issue-link)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## 持久理由
|
|
56
|
+
|
|
57
|
+
好的理由通常来自:
|
|
58
|
+
|
|
59
|
+
- project scope 或 philosophy;
|
|
60
|
+
- 与现有架构的实质冲突;
|
|
61
|
+
- 已批准的战略选择;
|
|
62
|
+
- 成本与项目定位长期不匹配。
|
|
63
|
+
|
|
64
|
+
“当前优先级低”“这季度没时间”“现在不方便”属于 deferral,不是 rejection,不应写入 knowledge base。
|
|
65
|
+
|
|
66
|
+
## 何时读取
|
|
67
|
+
|
|
68
|
+
Triage gather-context 阶段读取所有 `.out-of-scope/*.md`,按概念相似性判断,不只匹配关键词。
|
|
69
|
+
|
|
70
|
+
发现相似项时向维护者展示:
|
|
71
|
+
|
|
72
|
+
- 匹配的 concept;
|
|
73
|
+
- 上次拒绝的 durable reason;
|
|
74
|
+
- prior requests;
|
|
75
|
+
- 询问当前决定是否仍成立。
|
|
76
|
+
|
|
77
|
+
维护者可以:
|
|
78
|
+
|
|
79
|
+
- **Confirm**:追加新请求并关闭;
|
|
80
|
+
- **Reconsider**:更新或删除 knowledge entry,让请求继续正常 triage;
|
|
81
|
+
- **Distinct**:确认相关但不同,继续 triage。
|
|
82
|
+
|
|
83
|
+
## 何时写入
|
|
84
|
+
|
|
85
|
+
仅在 enhancement 被明确拒绝为 wontfix 时写入。外部 enhancement PR 同样适用。
|
|
86
|
+
|
|
87
|
+
不要写入:
|
|
88
|
+
|
|
89
|
+
- bug rejection;
|
|
90
|
+
- already-implemented request;
|
|
91
|
+
- temporary deferral;
|
|
92
|
+
- 仍在讨论的想法。
|
|
93
|
+
|
|
94
|
+
流程:
|
|
95
|
+
|
|
96
|
+
1. 确认拒绝的是 enhancement;
|
|
97
|
+
2. 查找现有 concept file;
|
|
98
|
+
3. 存在则追加 prior request;
|
|
99
|
+
4. 不存在则创建文件;
|
|
100
|
+
5. tracker comment 解释并引用该记录;
|
|
101
|
+
6. 应用 wontfix 并关闭 item。
|
|
102
|
+
|
|
103
|
+
若 Git 管理该知识库,显式 triage 且 branch 目标清楚时可以 commit 这次更新,但不得自动 push。
|
|
104
|
+
|
|
105
|
+
## 更新或删除
|
|
106
|
+
|
|
107
|
+
维护者改变长期决定时:
|
|
108
|
+
|
|
109
|
+
- 更新理由,或在明确确认后删除对应文件;
|
|
110
|
+
- 不自动 reopen 历史 issues;
|
|
111
|
+
- 触发重新考虑的新 issue 进入正常 triage。
|
|
112
|
+
|
|
113
|
+
删除是破坏性动作,必须有明确目标与维护者确认,不能仅凭模型推断执行。
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# 项目 Tracker 配置
|
|
2
|
+
|
|
3
|
+
常规仓库应零配置工作。只有自定义 tracker、自定义 labels、多 remote 或主动启用 PR/MR request surface 时,才需要项目级覆盖;不要修改用户级已安装 Skill 保存项目事实。
|
|
4
|
+
|
|
5
|
+
## 发现顺序
|
|
6
|
+
|
|
7
|
+
每次需要 tracker 时按以下顺序解析,并在某一步得到唯一答案后停止:
|
|
8
|
+
|
|
9
|
+
1. 读取适用的项目 `AGENTS.md`、`CLAUDE.md` 或其他项目规则中明确声明的 tracker、labels 和 request surface。
|
|
10
|
+
2. 兼容读取项目可选文件:
|
|
11
|
+
- `docs/agents/issue-tracker.md`
|
|
12
|
+
- `docs/agents/triage-labels.md`
|
|
13
|
+
3. 没有显式配置时,从唯一 Git remote 推断:
|
|
14
|
+
- `github.com` → GitHub;
|
|
15
|
+
- `gitlab.com` 或明确 GitLab host → GitLab。
|
|
16
|
+
4. 没有 remote,但当前 effort 已存在 `.scratch/<effort>/issues/` 或用户明确选择本地模式时,使用 Local Markdown。
|
|
17
|
+
5. 仍无法唯一判断、存在多个不同 tracker remote,或 host 属于自定义 tracker 时,展示候选并询问一次;不要猜。
|
|
18
|
+
|
|
19
|
+
Canonical labels 默认直接使用:
|
|
20
|
+
|
|
21
|
+
- `needs-triage`
|
|
22
|
+
- `needs-info`
|
|
23
|
+
- `ready-for-agent`
|
|
24
|
+
- `ready-for-human`
|
|
25
|
+
- `wontfix`
|
|
26
|
+
|
|
27
|
+
PR/MR request surface 默认关闭。只有项目规则或 `docs/agents/issue-tracker.md` 明确启用时,discovery 才把外部 PR/MR 放入 triage buckets;用户显式指定某个 PR/MR 时仍可处理该对象。
|
|
28
|
+
|
|
29
|
+
## 可选项目覆盖
|
|
30
|
+
|
|
31
|
+
需要覆盖时,优先沿用仓库已有格式。没有既有格式时,可使用:
|
|
32
|
+
|
|
33
|
+
```md
|
|
34
|
+
# Issue Tracker
|
|
35
|
+
|
|
36
|
+
- Type: github | gitlab | local | custom
|
|
37
|
+
- Repository: owner/name 或项目路径
|
|
38
|
+
- PR/MR request surface: yes | no
|
|
39
|
+
|
|
40
|
+
## Operations
|
|
41
|
+
|
|
42
|
+
{自定义 tracker 时,写明读取、创建、评论、label、指派、关闭、blocking 和 frontier 的 connector/API/CLI。}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
自定义 label 映射保存在 `docs/agents/triage-labels.md`:
|
|
46
|
+
|
|
47
|
+
```md
|
|
48
|
+
| Canonical role | Tracker label |
|
|
49
|
+
| --- | --- |
|
|
50
|
+
| needs-triage | needs-review |
|
|
51
|
+
| needs-info | awaiting-reporter |
|
|
52
|
+
| ready-for-agent | ready-for-agent |
|
|
53
|
+
| ready-for-human | maintainer-review |
|
|
54
|
+
| wontfix | declined |
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
自定义 tracker 必须说明对象标识如何唯一解析、写入权限如何获得、blocking/sub-issue 如何表达,以及哪些操作不可逆。配置文件只描述项目事实,不因为调用 Skill 自动扩大动作权限。
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Triage Labels
|
|
2
|
+
|
|
3
|
+
Skills 使用五个 canonical triage roles。本表把这些 roles 映射到当前 tracker 的实际 label 字符串。
|
|
4
|
+
|
|
5
|
+
| Canonical role | Tracker label | 含义 |
|
|
6
|
+
| --- | --- | --- |
|
|
7
|
+
| `needs-triage` | `needs-triage` | 等待维护者评估 |
|
|
8
|
+
| `needs-info` | `needs-info` | 等待 reporter 补充信息 |
|
|
9
|
+
| `ready-for-agent` | `ready-for-agent` | 合同完整,可由 AFK agent 执行 |
|
|
10
|
+
| `ready-for-human` | `ready-for-human` | 需要人工判断、权限或操作 |
|
|
11
|
+
| `wontfix` | `wontfix` | 不会实施 |
|
|
12
|
+
|
|
13
|
+
仓库有自定义 label vocabulary 时,在 [项目级配置](project-config.md) 指定的位置维护映射,不修改用户级已安装 Skill。Canonical role 保持不变,只覆盖 tracker 上的实际 label。调用 skill 时先读取项目已有映射;映射不存在时使用上表默认值,发生冲突时询问,不能猜测。
|