@namewta/speculo 0.1.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/LICENSE +21 -0
- package/README.md +89 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +58 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.js +60 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/utils.d.ts +1 -0
- package/dist/src/utils.js +11 -0
- package/dist/src/utils.js.map +1 -0
- package/package.json +54 -0
- package/speculo/.speculo/.config/LESSONS.md +9 -0
- package/speculo/.speculo/.config/RULES.md +9 -0
- package/speculo/.speculo/.config/adr/.gitkeep +1 -0
- package/speculo/.speculo/.config/context/.gitkeep +1 -0
- package/speculo/.speculo/archive/dev/.gitkeep +0 -0
- package/speculo/.speculo/archive/doc/.gitkeep +1 -0
- package/speculo/.speculo/commands/.gitkeep +0 -0
- package/speculo/.speculo/dev/.gitkeep +0 -0
- package/speculo/.speculo/dev/docs-sync-state.json +14 -0
- package/speculo/.speculo/dev-status.json +3 -0
- package/speculo/.speculo/doc/.gitkeep +1 -0
- package/speculo/.speculo/doc-status.json +3 -0
- package/speculo/commands/archive.md +53 -0
- package/speculo/commands/caveman.md +43 -0
- package/speculo/commands/grill-me.md +42 -0
- package/speculo/commands/handoff.md +42 -0
- package/speculo/commands/scaffold-exercises.md +50 -0
- package/speculo/commands/status.md +51 -0
- package/speculo/commands/write-a-skill.md +46 -0
- package/speculo/skills/caveman/SKILL.md +38 -0
- package/speculo/skills/caveman/references/compression-rules.md +102 -0
- package/speculo/skills/github-npm-ops/SKILL.md +53 -0
- package/speculo/skills/github-npm-ops/references/ci-and-security-ops.md +178 -0
- package/speculo/skills/github-npm-ops/references/failure-recovery.md +132 -0
- package/speculo/skills/github-npm-ops/references/issue-pr-triage.md +219 -0
- package/speculo/skills/github-npm-ops/references/package-json-checklist.md +171 -0
- package/speculo/skills/github-npm-ops/references/preflight-checklist.md +39 -0
- package/speculo/skills/github-npm-ops/references/publish-detection.md +68 -0
- package/speculo/skills/github-npm-ops/references/release-notes-injection.md +236 -0
- package/speculo/skills/github-npm-ops/references/release-pipeline.md +108 -0
- package/speculo/skills/github-npm-ops/references/setup-npm-token.md +63 -0
- package/speculo/skills/github-npm-ops/references/troubleshooting-playbook.md +305 -0
- package/speculo/skills/github-npm-ops/references/version-bump-flow.md +232 -0
- package/speculo/skills/github-npm-ops/references/workflow-yaml-reference.md +268 -0
- package/speculo/skills/grill-me/SKILL.md +40 -0
- package/speculo/skills/handoff/SKILL.md +41 -0
- package/speculo/skills/scaffold-exercises/SKILL.md +41 -0
- package/speculo/skills/scaffold-exercises/references/exercise-structure.md +85 -0
- package/speculo/skills/scaffold-exercises/references/lint-and-git.md +54 -0
- package/speculo/skills/speculo-write/SKILL.md +53 -0
- package/speculo/skills/speculo-write/references/asset-selection-sop.md +65 -0
- package/speculo/skills/speculo-write/references/command-authoring-sop.md +92 -0
- package/speculo/skills/speculo-write/references/migration-sop.md +101 -0
- package/speculo/skills/speculo-write/references/persistence-contract-sop.md +123 -0
- package/speculo/skills/speculo-write/references/skill-authoring-sop.md +195 -0
- package/speculo/skills/speculo-write/references/validation-checklist.md +73 -0
- package/speculo/skills/speculo-write/references/workflow-authoring-sop.md +130 -0
- package/speculo/workflows/dev/00-INDEX.md +56 -0
- package/speculo/workflows/dev/01-grill-with-docs/01-grill-with-docs.md +79 -0
- package/speculo/workflows/dev/01-grill-with-docs/ADR-FORMAT.md +49 -0
- package/speculo/workflows/dev/01-grill-with-docs/CONTEXT-FORMAT.md +65 -0
- package/speculo/workflows/dev/01-grill-with-docs/grill-context-scan.md +30 -0
- package/speculo/workflows/dev/01-grill-with-docs/grill-decision.md +38 -0
- package/speculo/workflows/dev/02-prd/02-prd.md +64 -0
- package/speculo/workflows/dev/02-prd/prd-synthesis.md +30 -0
- package/speculo/workflows/dev/02-prd/prd-zoom-out.md +29 -0
- package/speculo/workflows/dev/03-tdd/03-tdd.md +80 -0
- package/speculo/workflows/dev/03-tdd/deep-modules.md +33 -0
- package/speculo/workflows/dev/03-tdd/interface-design.md +31 -0
- package/speculo/workflows/dev/03-tdd/mocking.md +60 -0
- package/speculo/workflows/dev/03-tdd/refactoring.md +10 -0
- package/speculo/workflows/dev/03-tdd/tdd-finish.md +28 -0
- package/speculo/workflows/dev/03-tdd/tdd-loop.md +33 -0
- package/speculo/workflows/dev/03-tdd/tdd-plan.md +30 -0
- package/speculo/workflows/dev/03-tdd/tests.md +61 -0
- package/speculo/workflows/dev/D-docs-sync/D-docs-sync.md +97 -0
- package/speculo/workflows/dev/D-docs-sync/agents-contract.md +95 -0
- package/speculo/workflows/dev/D-docs-sync/changelog-contract.md +155 -0
- package/speculo/workflows/dev/D-docs-sync/docs-sync-diff.md +50 -0
- package/speculo/workflows/dev/D-docs-sync/docs-sync-finish.md +33 -0
- package/speculo/workflows/dev/D-docs-sync/docs-sync-state.md +32 -0
- package/speculo/workflows/dev/D-docs-sync/docs-sync-update.md +35 -0
- package/speculo/workflows/dev/D-docs-sync/readme-contract.md +124 -0
- package/speculo/workflows/dev/D-docs-sync/state-json-schema.md +155 -0
- package/speculo/workflows/dev/H-diagnose/H-diagnose.md +80 -0
- package/speculo/workflows/dev/H-diagnose/diagnose-fix.md +34 -0
- package/speculo/workflows/dev/H-diagnose/diagnose-guide.md +114 -0
- package/speculo/workflows/dev/H-diagnose/diagnose-loop.md +32 -0
- package/speculo/workflows/dev/H-diagnose/scripts/hitl-loop.template.sh +41 -0
- package/speculo/workflows/dev/I-to-issues/I-to-issues.md +70 -0
- package/speculo/workflows/dev/I-to-issues/issues-slices.md +31 -0
- package/speculo/workflows/dev/R-review/R-review.md +82 -0
- package/speculo/workflows/dev/R-review/review-setup.md +39 -0
- package/speculo/workflows/dev/R-review/review-two-axis.md +33 -0
- package/speculo/workflows/dev/_templates/diagnosis-template.md +19 -0
- package/speculo/workflows/dev/_templates/docs-sync-report-template.md +28 -0
- package/speculo/workflows/dev/_templates/docs-sync-state-template.json +14 -0
- package/speculo/workflows/dev/_templates/grill-context-map-template.md +19 -0
- package/speculo/workflows/dev/_templates/grill-decision-log-template.md +19 -0
- package/speculo/workflows/dev/_templates/issues-slices-template.md +19 -0
- package/speculo/workflows/dev/_templates/prd-overview-template.md +19 -0
- package/speculo/workflows/dev/_templates/prd-template.md +25 -0
- package/speculo/workflows/dev/_templates/regression-template.md +19 -0
- package/speculo/workflows/dev/_templates/review-report-template.md +16 -0
- package/speculo/workflows/dev/_templates/review-sources-template.md +24 -0
- package/speculo/workflows/dev/_templates/tdd-log-template.md +16 -0
- package/speculo/workflows/dev/_templates/tdd-plan-template.md +19 -0
- package/speculo/workflows/dev/_templates/tdd-verification-template.md +16 -0
- package/speculo/workflows/doc/00-INDEX.md +51 -0
- package/speculo/workflows/doc/B-writing-beats/B-writing-beats.md +77 -0
- package/speculo/workflows/doc/B-writing-beats/writing-beats-append.md +31 -0
- package/speculo/workflows/doc/B-writing-beats/writing-beats-options.md +29 -0
- package/speculo/workflows/doc/E-edit-article/E-edit-article.md +77 -0
- package/speculo/workflows/doc/E-edit-article/edit-article-plan.md +30 -0
- package/speculo/workflows/doc/E-edit-article/edit-article-rewrite.md +31 -0
- package/speculo/workflows/doc/F-writing-fragments/F-writing-fragments.md +78 -0
- package/speculo/workflows/doc/F-writing-fragments/writing-fragments-interview.md +32 -0
- package/speculo/workflows/doc/F-writing-fragments/writing-fragments-log.md +29 -0
- package/speculo/workflows/doc/S-writing-shape/S-writing-shape.md +79 -0
- package/speculo/workflows/doc/S-writing-shape/writing-shape-block.md +32 -0
- package/speculo/workflows/doc/S-writing-shape/writing-shape-opening.md +27 -0
- package/speculo/workflows/doc/_templates/edit-article-plan-template.md +24 -0
- package/speculo/workflows/doc/_templates/edit-article-template.md +6 -0
- package/speculo/workflows/doc/_templates/writing-article-template.md +6 -0
- package/speculo/workflows/doc/_templates/writing-beat-options-template.md +20 -0
- package/speculo/workflows/doc/_templates/writing-fragments-template.md +6 -0
- package/speculo/workflows/doc/_templates/writing-interview-log-template.md +20 -0
- package/speculo/workflows/doc/_templates/writing-shape-log-template.md +24 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
# release.yml 完整注解
|
|
2
|
+
|
|
3
|
+
逐行解释 `.github/workflows/release.yml` 中每个选择的原因。
|
|
4
|
+
|
|
5
|
+
## 完整示例
|
|
6
|
+
|
|
7
|
+
```yaml
|
|
8
|
+
name: Release
|
|
9
|
+
|
|
10
|
+
on:
|
|
11
|
+
push:
|
|
12
|
+
tags:
|
|
13
|
+
- 'v*'
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
release:
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
name: Release to npm
|
|
19
|
+
permissions:
|
|
20
|
+
id-token: write
|
|
21
|
+
contents: write
|
|
22
|
+
packages: write
|
|
23
|
+
steps:
|
|
24
|
+
- name: Checkout
|
|
25
|
+
uses: actions/checkout@v4
|
|
26
|
+
|
|
27
|
+
- name: Setup environment
|
|
28
|
+
uses: ./.github/actions/setup
|
|
29
|
+
with:
|
|
30
|
+
registry-url: 'https://registry.npmjs.org'
|
|
31
|
+
|
|
32
|
+
- name: Verify tag matches package version
|
|
33
|
+
run: |
|
|
34
|
+
TAG="${{ github.ref }}"
|
|
35
|
+
TAG_VERSION="${TAG#refs/tags/v}"
|
|
36
|
+
PACKAGE_VERSION=$(node -e "console.log(require('./package.json').version)")
|
|
37
|
+
if [ "$TAG_VERSION" != "$PACKAGE_VERSION" ]; then
|
|
38
|
+
echo "Tag version ($TAG_VERSION) does not match package.json version ($PACKAGE_VERSION)"
|
|
39
|
+
exit 1
|
|
40
|
+
fi
|
|
41
|
+
echo "Version verified: v$PACKAGE_VERSION"
|
|
42
|
+
|
|
43
|
+
- name: Run lint
|
|
44
|
+
run: pnpm lint
|
|
45
|
+
|
|
46
|
+
- name: Run tests
|
|
47
|
+
run: pnpm test
|
|
48
|
+
|
|
49
|
+
- name: Build
|
|
50
|
+
run: pnpm build
|
|
51
|
+
|
|
52
|
+
- name: Verify bin entry
|
|
53
|
+
run: node scripts/verify-bin.mjs
|
|
54
|
+
|
|
55
|
+
- name: Extract release notes from CHANGELOGS.md
|
|
56
|
+
run: |
|
|
57
|
+
VERSION="${GITHUB_REF_NAME#v}"
|
|
58
|
+
awk -v v="$VERSION" '
|
|
59
|
+
$0 ~ "^## \\["v"\\]" { found=1; print; next }
|
|
60
|
+
found && /^## \[/ { exit }
|
|
61
|
+
found && /^---[[:space:]]*$/ { next }
|
|
62
|
+
found { print }
|
|
63
|
+
' CHANGELOGS.md > release-notes.md
|
|
64
|
+
|
|
65
|
+
if [ ! -s release-notes.md ]; then
|
|
66
|
+
echo "::warning::CHANGELOGS.md 中未找到 [$VERSION] 段落,回退到自动生成。"
|
|
67
|
+
echo "See [CHANGELOGS.md](https://github.com/${{ github.repository }}/blob/main/CHANGELOGS.md) for details." > release-notes.md
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
- name: Publish to npm
|
|
71
|
+
run: npm publish --provenance --access public
|
|
72
|
+
env:
|
|
73
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
74
|
+
|
|
75
|
+
- name: Create GitHub Release
|
|
76
|
+
uses: softprops/action-gh-release@v2
|
|
77
|
+
if: success()
|
|
78
|
+
with:
|
|
79
|
+
tag_name: ${{ github.ref_name }}
|
|
80
|
+
name: Release ${{ github.ref_name }}
|
|
81
|
+
body_path: release-notes.md
|
|
82
|
+
generate_release_notes: true
|
|
83
|
+
draft: false
|
|
84
|
+
prerelease: false
|
|
85
|
+
env:
|
|
86
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## 逐项解释
|
|
90
|
+
|
|
91
|
+
### 触发条件
|
|
92
|
+
|
|
93
|
+
```yaml
|
|
94
|
+
on:
|
|
95
|
+
push:
|
|
96
|
+
tags:
|
|
97
|
+
- 'v*'
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
- 只在 push 带 `v` 开头的 tag 时触发(如 `v0.0.2`、`v1.2.3-rc1`)
|
|
101
|
+
- **不要**同时写 `branches`,否则每次 push main 都会触发 release
|
|
102
|
+
- 如果想预发,用独立的 tag 模式(如 `v*-rc*`)区分
|
|
103
|
+
|
|
104
|
+
### permissions
|
|
105
|
+
|
|
106
|
+
```yaml
|
|
107
|
+
permissions:
|
|
108
|
+
id-token: write
|
|
109
|
+
contents: write
|
|
110
|
+
packages: write
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
| 权限 | 作用 |
|
|
114
|
+
| ------------------ | -------------------------------------------------------------------------------------- |
|
|
115
|
+
| `id-token: write` | **必需**:用于 npm provenance(OIDC 签名) |
|
|
116
|
+
| `contents: write` | **必需**:`softprops/action-gh-release` 创建 GitHub Release 需要 |
|
|
117
|
+
| `packages: write` | 仅在同时发 GitHub Packages 时需要;纯 npm 发布可省略 |
|
|
118
|
+
|
|
119
|
+
默认 `GITHUB_TOKEN` 只有 `contents: read`,这三项必须显式声明。
|
|
120
|
+
|
|
121
|
+
### Checkout
|
|
122
|
+
|
|
123
|
+
```yaml
|
|
124
|
+
- uses: actions/checkout@v4
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
默认浅克隆(`fetch-depth: 1`)。如果发布说明需要完整历史(如 changelog 生成),加 `fetch-depth: 0`。
|
|
128
|
+
|
|
129
|
+
### Setup environment
|
|
130
|
+
|
|
131
|
+
```yaml
|
|
132
|
+
- uses: ./.github/actions/setup
|
|
133
|
+
with:
|
|
134
|
+
registry-url: 'https://registry.npmjs.org'
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
复合 action,通常封装:
|
|
138
|
+
|
|
139
|
+
```yaml
|
|
140
|
+
- uses: actions/setup-node@v4
|
|
141
|
+
with:
|
|
142
|
+
node-version: '24.14.1'
|
|
143
|
+
registry-url: 'https://registry.npmjs.org'
|
|
144
|
+
- uses: pnpm/action-setup@v2
|
|
145
|
+
with:
|
|
146
|
+
version: 9
|
|
147
|
+
- run: pnpm install --frozen-lockfile
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
关键点:`registry-url` **必须**在 `setup-node` 里设置,它会生成 `.npmrc` 并让 `NODE_AUTH_TOKEN` 生效。
|
|
151
|
+
|
|
152
|
+
### Verify tag matches package version
|
|
153
|
+
|
|
154
|
+
防止错发:tag `v0.0.2` 指向一个 `package.json` 版本为 `0.0.1` 的 commit,会导致用户安装到错误版本。
|
|
155
|
+
|
|
156
|
+
失败时 workflow 直接退出,不会执行任何发布动作。
|
|
157
|
+
|
|
158
|
+
### Lint / Test / Build
|
|
159
|
+
|
|
160
|
+
即使本地已经跑过,CI 再跑一遍保证:
|
|
161
|
+
|
|
162
|
+
1. 发布的产物来自干净环境
|
|
163
|
+
2. 锁文件(`pnpm-lock.yaml`)在 CI 下可复现
|
|
164
|
+
3. Build 产物与 tag 对应的源码一致
|
|
165
|
+
|
|
166
|
+
如果 repo 已有一个单独的 `ci.yml` 跑在 push/PR 上,这里仍保留是为了**再次校验 tag 指向的 commit**——tag 可能指向旧 commit。
|
|
167
|
+
|
|
168
|
+
### Verify bin entry
|
|
169
|
+
|
|
170
|
+
```yaml
|
|
171
|
+
- run: node scripts/verify-bin.mjs
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
CLI 包专有:确认 `dist/cli/index.js` 存在、有 shebang、可执行。防止 tsconfig 出问题导致产物不完整。
|
|
175
|
+
|
|
176
|
+
### Extract release notes from CHANGELOGS.md
|
|
177
|
+
|
|
178
|
+
```yaml
|
|
179
|
+
- name: Extract release notes from CHANGELOGS.md
|
|
180
|
+
run: |
|
|
181
|
+
VERSION="${GITHUB_REF_NAME#v}"
|
|
182
|
+
awk -v v="$VERSION" '
|
|
183
|
+
$0 ~ "^## \\["v"\\]" { found=1; print; next }
|
|
184
|
+
found && /^## \[/ { exit }
|
|
185
|
+
found && /^---[[:space:]]*$/ { next }
|
|
186
|
+
found { print }
|
|
187
|
+
' CHANGELOGS.md > release-notes.md
|
|
188
|
+
|
|
189
|
+
if [ ! -s release-notes.md ]; then
|
|
190
|
+
echo "::warning::..." >&2
|
|
191
|
+
echo "See [CHANGELOGS.md](...) for details." > release-notes.md
|
|
192
|
+
fi
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
把 `## [X.Y.Z]` 段落抽到 `release-notes.md`,让下面的 `softprops/action-gh-release` 通过 `body_path` 注入到 GitHub Release 正文。
|
|
196
|
+
|
|
197
|
+
**为什么必须有这一步**:仅用 `generate_release_notes: true` 时,GitHub 内部从 commit + PR + label 抽取 changelog;直 push main 流程没 PR,生成器只剩 `Full Changelog: vA...vB` 一行。CHANGELOG 是事实来源,注入它才能让 Release 正文非空。
|
|
198
|
+
|
|
199
|
+
**awk 规则细节**与边界用例(包含 `[Unreleased]` 同时存在、版本号含连字符 / 多语言 CHANGELOG / `body_path` + `generate_release_notes` 共存语义)见 [release-notes-injection.md](release-notes-injection.md)。
|
|
200
|
+
|
|
201
|
+
### Publish to npm
|
|
202
|
+
|
|
203
|
+
```yaml
|
|
204
|
+
- run: npm publish --provenance --access public
|
|
205
|
+
env:
|
|
206
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
- `--provenance`:生成 sigstore 签名,要求 `id-token: write`
|
|
210
|
+
- `--access public`:scoped 包首次发布必需;非 scoped 包加了也不会错
|
|
211
|
+
- **位置在 GitHub Release 之前**:npm publish 不可回滚,如果后续步骤失败,至少 npm 发布是成功的
|
|
212
|
+
|
|
213
|
+
### Create GitHub Release
|
|
214
|
+
|
|
215
|
+
```yaml
|
|
216
|
+
- uses: softprops/action-gh-release@v2
|
|
217
|
+
if: success()
|
|
218
|
+
with:
|
|
219
|
+
tag_name: ${{ github.ref_name }}
|
|
220
|
+
body_path: release-notes.md
|
|
221
|
+
generate_release_notes: true
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
- `if: success()`:只在 npm publish 成功后执行
|
|
225
|
+
- `body_path: release-notes.md`:**正文头部**注入上一步抽取的 CHANGELOG 段落
|
|
226
|
+
- `generate_release_notes: true`:**正文尾部**附 GitHub 自动生成的 What's Changed + Full Changelog compare 链接
|
|
227
|
+
- 两者共存不冲突,效果是「人写的精炼说明 + 机器可追溯的索引」叠加
|
|
228
|
+
- `softprops/action-gh-release@v2` 比废弃的 `actions/create-release@v1` 更稳定
|
|
229
|
+
|
|
230
|
+
仅用 `generate_release_notes: true` 而不注入 `body_path`,在没有 PR 流量的仓库会得到几乎为空的 Release 正文,详见 [release-notes-injection.md](release-notes-injection.md) §1。
|
|
231
|
+
|
|
232
|
+
## 常见变体
|
|
233
|
+
|
|
234
|
+
### 使用 pnpm publish 代替 npm publish
|
|
235
|
+
|
|
236
|
+
pnpm 也支持 `--access public --provenance`:
|
|
237
|
+
|
|
238
|
+
```yaml
|
|
239
|
+
- run: pnpm publish --provenance --access public --no-git-checks
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
`--no-git-checks` 避免 pnpm 检查当前 branch/tag(CI 中 detached HEAD 会被拒)。
|
|
243
|
+
|
|
244
|
+
### 发布到 GitHub Packages(可选)
|
|
245
|
+
|
|
246
|
+
```yaml
|
|
247
|
+
- name: Publish to GitHub Packages
|
|
248
|
+
run: npm publish --registry=https://npm.pkg.github.com
|
|
249
|
+
env:
|
|
250
|
+
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
需要单独的 setup step 指向 GitHub Packages,且 package 名必须是 `@owner/name` 形式。
|
|
254
|
+
|
|
255
|
+
### Dry run(在 PR 里预演)
|
|
256
|
+
|
|
257
|
+
```yaml
|
|
258
|
+
- run: npm publish --dry-run --access public
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
放在一个仅 PR 触发的 workflow 里,帮你在合并前发现 tarball 问题。
|
|
262
|
+
|
|
263
|
+
## 不推荐的做法
|
|
264
|
+
|
|
265
|
+
- 在同一个 job 里既跑 push-to-main CI 又跑 release — 混乱,难以调试
|
|
266
|
+
- 使用 `actions/create-release@v1` — 已废弃,推荐 `softprops/action-gh-release`
|
|
267
|
+
- 用 `secrets.NPM_TOKEN` 直接传给 `npm publish` 命令行 — 会在日志里泄露
|
|
268
|
+
- 跳过 `prepublishOnly` 或 CI 测试 — 已知会发布过坏包
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: grill-me
|
|
3
|
+
type: skill
|
|
4
|
+
name: Grill Me
|
|
5
|
+
description: 对计划、设计或决策进行逐问式压力测试;当用户要求 grill me、拷问方案、压力测试计划,或调用 command/grill-me 时使用。
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Grill Me
|
|
9
|
+
|
|
10
|
+
## 何时使用
|
|
11
|
+
|
|
12
|
+
当用户想压力测试计划、设计、架构选择、实现策略或决策树,并希望逐步达成共识时使用。
|
|
13
|
+
|
|
14
|
+
如果问题可以通过探索代码库回答,先探索代码库,不把可查事实推回给用户。
|
|
15
|
+
|
|
16
|
+
## 输入
|
|
17
|
+
|
|
18
|
+
- 待拷问的计划、设计、架构选择或实现策略
|
|
19
|
+
- 用户已表达的约束、偏好、风险承受度和成功标准
|
|
20
|
+
- 可通过仓库探索确认的事实
|
|
21
|
+
|
|
22
|
+
## 输出
|
|
23
|
+
|
|
24
|
+
- 每轮一个问题
|
|
25
|
+
- 每个问题附带推荐答案
|
|
26
|
+
- 已锁定决策、剩余开放点和依赖关系的简短摘要
|
|
27
|
+
- 需要持久化时,由调用方 command 或 workflow 归档摘要
|
|
28
|
+
|
|
29
|
+
## 执行步骤
|
|
30
|
+
|
|
31
|
+
1. 识别当前最影响方案正确性的未决问题。
|
|
32
|
+
2. 如果答案能通过本地代码、文档或配置确认,先读取相关材料。
|
|
33
|
+
3. 每次只问一个问题,避免问题组。
|
|
34
|
+
4. 对每个问题给出推荐答案,并说明推荐理由。
|
|
35
|
+
5. 用户回答后更新已锁定决策和剩余分支。
|
|
36
|
+
6. 继续遍历决策树,直到核心分支达成共识或用户停止。
|
|
37
|
+
|
|
38
|
+
## 渐进披露
|
|
39
|
+
|
|
40
|
+
无额外文件。该 skill 的完整执行规则在本入口中。
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: handoff
|
|
3
|
+
type: skill
|
|
4
|
+
name: Handoff
|
|
5
|
+
description: 将当前对话压缩成交接文档;当用户需要另一个 agent、另一个会话或 command/handoff 接手继续工作时使用。
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Handoff
|
|
9
|
+
|
|
10
|
+
## 何时使用
|
|
11
|
+
|
|
12
|
+
当当前上下文需要交给另一个 agent、另一个会话或异步执行者继续时使用。
|
|
13
|
+
|
|
14
|
+
如果用户提供参数,把参数视为下一次会话的重点,并据此调整交接文档的内容取舍。
|
|
15
|
+
|
|
16
|
+
## 输入
|
|
17
|
+
|
|
18
|
+
- 当前对话目标、已完成工作和未完成事项
|
|
19
|
+
- 已修改或需要关注的文件路径、命令、测试结果和阻塞点
|
|
20
|
+
- 用户提供的下一次会话重点
|
|
21
|
+
- 可推荐给下一个 agent 的 skill 名称
|
|
22
|
+
|
|
23
|
+
## 输出
|
|
24
|
+
|
|
25
|
+
- 保存到用户操作系统临时目录的脱敏交接文档
|
|
26
|
+
- 文档路径
|
|
27
|
+
- 推荐技能清单
|
|
28
|
+
- 如调用方需要持久化,由调用方只归档文档路径和简短摘要
|
|
29
|
+
|
|
30
|
+
## 执行步骤
|
|
31
|
+
|
|
32
|
+
1. 收集当前目标、背景、已做工作、关键文件、验证结果、剩余风险和下一步。
|
|
33
|
+
2. 删除 API key、密码、token、个人身份信息和其他敏感内容。
|
|
34
|
+
3. 不复制 PRD、计划、ADR、issue、commit、diff 或其他已有产物正文;改用路径、URL 或 commit 引用。
|
|
35
|
+
4. 添加 `推荐技能` 部分,列出下一个 agent 应优先读取或调用的技能。
|
|
36
|
+
5. 将交接文档保存到用户操作系统临时目录,不保存到当前工作区。
|
|
37
|
+
6. 返回文档路径和极简摘要。
|
|
38
|
+
|
|
39
|
+
## 渐进披露
|
|
40
|
+
|
|
41
|
+
无额外文件。该 skill 的完整执行规则在本入口中。
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: scaffold-exercises
|
|
3
|
+
type: skill
|
|
4
|
+
name: Scaffold Exercises
|
|
5
|
+
description: 创建课程章节与练习目录骨架并验证 lint;当用户要求 scaffold exercises、创建练习桩、设置课程章节,或调用 command/scaffold-exercises 时使用。
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Scaffold Exercises
|
|
9
|
+
|
|
10
|
+
## 何时使用
|
|
11
|
+
|
|
12
|
+
当项目包含课程练习结构,用户要求创建章节、练习、`problem/`、`solution/` 或 `explainer/` 桩时使用。
|
|
13
|
+
|
|
14
|
+
## 输入
|
|
15
|
+
|
|
16
|
+
- 章节和练习计划、编号、名称和变体类型
|
|
17
|
+
- 项目中的练习根目录,默认 `exercises/`
|
|
18
|
+
- 项目的 lint 命令,默认 `pnpm ai-hero-cli internal lint`
|
|
19
|
+
- git 操作要求,例如是否需要 `git mv`、是否需要提交
|
|
20
|
+
|
|
21
|
+
## 输出
|
|
22
|
+
|
|
23
|
+
- 创建或移动的练习目录清单
|
|
24
|
+
- 每个练习变体的 `readme.md` 桩
|
|
25
|
+
- lint 运行结果和修复摘要
|
|
26
|
+
- 如用户或调用方要求提交,输出 commit hash 或无法提交原因
|
|
27
|
+
|
|
28
|
+
## 执行步骤
|
|
29
|
+
|
|
30
|
+
1. 读取 `references/exercise-structure.md`,确认章节、练习、变体和必需文件规则。
|
|
31
|
+
2. 从计划中提取章节名、练习名、编号和变体;缺失变体时默认使用 `explainer/`。
|
|
32
|
+
3. 创建目录前列出影响路径;涉及重命名时使用 `git mv`。
|
|
33
|
+
4. 为每个变体创建最小但非空的 `readme.md`。
|
|
34
|
+
5. 运行 lint;按 `references/lint-and-git.md` 迭代修复,直到通过或记录阻塞。
|
|
35
|
+
6. 仅在用户或调用方明确要求时提交 git。
|
|
36
|
+
7. 不直接写 `.speculo/` 或 `.status.json`;需要归档时由调用方 command 或 workflow 负责。
|
|
37
|
+
|
|
38
|
+
## 渐进披露
|
|
39
|
+
|
|
40
|
+
- `references/exercise-structure.md`:解析章节、练习编号、变体目录和必需文件时读取。
|
|
41
|
+
- `references/lint-and-git.md`:运行 lint、修复练习结构错误、移动目录或提交时读取。
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Exercise Structure
|
|
2
|
+
|
|
3
|
+
## 目录命名
|
|
4
|
+
|
|
5
|
+
章节目录位于 `exercises/` 下,格式:
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
XX-section-name/
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
示例:
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
01-retrieval-skill-building/
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
练习目录位于章节目录下,格式:
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
XX.YY-exercise-name/
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
示例:
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
01.03-retrieval-with-bm25/
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
规则:
|
|
30
|
+
|
|
31
|
+
- 章节编号 = `XX`
|
|
32
|
+
- 练习编号 = `XX.YY`
|
|
33
|
+
- 名称使用 dash-case,小写字母和连字符
|
|
34
|
+
- 练习编号必须匹配所属章节编号
|
|
35
|
+
|
|
36
|
+
## 练习变体
|
|
37
|
+
|
|
38
|
+
每个练习至少需要以下一个子文件夹:
|
|
39
|
+
|
|
40
|
+
- `problem/`:带 TODO 的学生工作区
|
|
41
|
+
- `solution/`:参考实现
|
|
42
|
+
- `explainer/`:概念材料,不含 TODO
|
|
43
|
+
|
|
44
|
+
创建桩时,除非计划另有说明,默认使用 `explainer/`。
|
|
45
|
+
|
|
46
|
+
## 必需文件
|
|
47
|
+
|
|
48
|
+
每个变体文件夹都需要一个 `readme.md`。
|
|
49
|
+
|
|
50
|
+
`readme.md` 必须:
|
|
51
|
+
|
|
52
|
+
- 非空
|
|
53
|
+
- 包含真实内容,即使只有标题和一句描述
|
|
54
|
+
- 没有失效链接
|
|
55
|
+
|
|
56
|
+
最小桩:
|
|
57
|
+
|
|
58
|
+
```md
|
|
59
|
+
# Exercise Title
|
|
60
|
+
|
|
61
|
+
这里写描述。
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
如果子文件夹包含代码,还需要一个超过 1 行的 `main.ts`。只有 `readme.md` 的练习桩可以是 readme-only。
|
|
65
|
+
|
|
66
|
+
## 示例
|
|
67
|
+
|
|
68
|
+
计划:
|
|
69
|
+
|
|
70
|
+
```text
|
|
71
|
+
Section 05: Memory Skill Building
|
|
72
|
+
- 05.01 Introduction to Memory
|
|
73
|
+
- 05.02 Short-term Memory (explainer + problem + solution)
|
|
74
|
+
- 05.03 Long-term Memory
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
创建:
|
|
78
|
+
|
|
79
|
+
```text
|
|
80
|
+
exercises/05-memory-skill-building/05.01-introduction-to-memory/explainer/readme.md
|
|
81
|
+
exercises/05-memory-skill-building/05.02-short-term-memory/explainer/readme.md
|
|
82
|
+
exercises/05-memory-skill-building/05.02-short-term-memory/problem/readme.md
|
|
83
|
+
exercises/05-memory-skill-building/05.02-short-term-memory/solution/readme.md
|
|
84
|
+
exercises/05-memory-skill-building/05.03-long-term-memory/explainer/readme.md
|
|
85
|
+
```
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Lint And Git
|
|
2
|
+
|
|
3
|
+
## Lint 命令
|
|
4
|
+
|
|
5
|
+
默认验证命令:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm ai-hero-cli internal lint
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
如果项目文档或用户指定了其他命令,使用项目命令。
|
|
12
|
+
|
|
13
|
+
## Lint 规则摘要
|
|
14
|
+
|
|
15
|
+
linter 通常会检查:
|
|
16
|
+
|
|
17
|
+
- 每个练习都有子文件夹,例如 `problem/`、`solution/`、`explainer/`
|
|
18
|
+
- 至少存在 `problem/`、`explainer/` 或 `explainer.1/` 之一
|
|
19
|
+
- 主子文件夹中存在非空 `readme.md`
|
|
20
|
+
- 没有 `.gitkeep`
|
|
21
|
+
- 没有 `speaker-notes.md`
|
|
22
|
+
- `readme.md` 中没有失效链接
|
|
23
|
+
- `readme.md` 中没有 `pnpm run exercise`
|
|
24
|
+
- 每个含代码的子文件夹都有超过 1 行的 `main.ts`
|
|
25
|
+
|
|
26
|
+
## 修复流程
|
|
27
|
+
|
|
28
|
+
1. 运行 lint。
|
|
29
|
+
2. 根据错误补齐目录、`readme.md` 或需要的 `main.ts`。
|
|
30
|
+
3. 删除不允许的 `.gitkeep` 或 `speaker-notes.md`,但只删除本次创建或用户明确要求处理的文件。
|
|
31
|
+
4. 修复失效链接或记录需要用户确认的链接变更。
|
|
32
|
+
5. 重跑 lint,直到通过或出现外部阻塞。
|
|
33
|
+
|
|
34
|
+
## 移动或重命名练习
|
|
35
|
+
|
|
36
|
+
重新编号或移动练习时使用 `git mv`,保留 git 历史。
|
|
37
|
+
|
|
38
|
+
示例:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
git mv exercises/01-retrieval/01.03-embeddings exercises/01-retrieval/01.04-embeddings
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
移动后更新数字前缀并重新运行 lint。
|
|
45
|
+
|
|
46
|
+
## 提交
|
|
47
|
+
|
|
48
|
+
只有用户或调用方明确要求提交时才运行 `git commit`。
|
|
49
|
+
|
|
50
|
+
提交前检查:
|
|
51
|
+
|
|
52
|
+
- `git status --short`
|
|
53
|
+
- 只包含本次练习脚手架相关改动,或提交命令明确指定路径
|
|
54
|
+
- lint 已通过,或 commit message/交付说明中写明未通过原因
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: speculo-write
|
|
3
|
+
type: skill
|
|
4
|
+
name: Speculo Write
|
|
5
|
+
description: 创建或改造 Speculo workflows、skills、commands 的原子能力;当用户要求根据参考项目、外部技能、当前规范或产品意图,设计、迁移、融合、更新 Speculo 资产时使用。
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Speculo Write
|
|
9
|
+
|
|
10
|
+
## 何时使用
|
|
11
|
+
|
|
12
|
+
当任务是新增、迁移、融合或改造 Speculo 的 `workflows/`、`skills/`、`commands/`、配套模板、引用资料或 `.speculo/` 状态骨架时使用。
|
|
13
|
+
|
|
14
|
+
典型触发:
|
|
15
|
+
|
|
16
|
+
- “把这个外部 skill 迁移进 Speculo”
|
|
17
|
+
- “给 dev 加一个 review workflow”
|
|
18
|
+
- “做一个一次性归档 command”
|
|
19
|
+
- “把这几个旧技能融合成一个原子 skill”
|
|
20
|
+
|
|
21
|
+
## 输入
|
|
22
|
+
|
|
23
|
+
- 用户目标、成功标准、目标受众、约束和参考项目路径
|
|
24
|
+
- 现有同类资产:`speculo/workflows/<cat>/`、`speculo/skills/`、`speculo/commands/`
|
|
25
|
+
- 外部源材料:旧技能、参考 workflow、临时目录、README 索引、脚本、模板
|
|
26
|
+
|
|
27
|
+
本 skill 自带全部 Speculo 规范,已内化到下方 `references/`,**编写时不外读仓库 `docs/`**。
|
|
28
|
+
|
|
29
|
+
## 输出
|
|
30
|
+
|
|
31
|
+
- 合规的 Speculo workflow、skill 或 command 资产
|
|
32
|
+
- 必要的 `references/`、workflow phase 文件、workflow `_templates/` 或 command 内联模板
|
|
33
|
+
- 必要的 `.speculo/` 初始骨架或状态索引更新建议
|
|
34
|
+
- 文档、测试和残留路径检查清单
|
|
35
|
+
|
|
36
|
+
## 执行步骤
|
|
37
|
+
|
|
38
|
+
1. **判定资产类型** —— workflow、skill、command,或组合。规则见 `references/asset-selection-sop.md`。
|
|
39
|
+
2. **读取同类资产** —— 看目标目录里现有资产的真实写法,对齐风格,不直接套用外部技能格式。
|
|
40
|
+
3. **提取可复用行为** —— 从参考材料保留核心内容(触发、输入输出、铁律、边界、失败恢复、模板),只规范化路径、frontmatter、产物和渐进披露。
|
|
41
|
+
4. **设计文件结构** —— 入口、别名、状态字段、产物路径和验证清单。
|
|
42
|
+
5. **实施** —— 实施前确认不会覆盖用户已有改动;实施后同步索引、文档和测试。
|
|
43
|
+
6. **验证** —— 旧路径和旧工具名没有回流,运行项目测试或记录无法运行原因;提交前过一遍 `references/validation-checklist.md`。
|
|
44
|
+
|
|
45
|
+
## 渐进披露
|
|
46
|
+
|
|
47
|
+
- `references/asset-selection-sop.md`:判断应做 workflow、skill 还是 command 时读取。
|
|
48
|
+
- `references/workflow-authoring-sop.md`:创建或改造 workflow、phase、template、索引和状态字段时读取。
|
|
49
|
+
- `references/skill-authoring-sop.md`:创建原子 skill、迁移外部技能、拆分 references 时读取。
|
|
50
|
+
- `references/command-authoring-sop.md`:创建单步 command、调用 skill、设计归档产物时读取。
|
|
51
|
+
- `references/persistence-contract-sop.md`:需要 `.status.json` schema、目录命名、frontmatter 最小集或写入责任时读取。
|
|
52
|
+
- `references/migration-sop.md`:从 `temp/skills`、参考项目或旧 workflow 迁移能力时读取。
|
|
53
|
+
- `references/validation-checklist.md`:提交前检查 frontmatter、路径、模板、`.speculo/`、测试和旧路径残留时读取。
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Asset Selection SOP
|
|
2
|
+
|
|
3
|
+
## 目标
|
|
4
|
+
|
|
5
|
+
把用户的“做一个能力”翻译成 Speculo 的正确资产形态:workflow、skill、command,或它们的组合。
|
|
6
|
+
|
|
7
|
+
## 判定规则
|
|
8
|
+
|
|
9
|
+
### 做 Workflow
|
|
10
|
+
|
|
11
|
+
选择 workflow,当能力满足任一条件:
|
|
12
|
+
|
|
13
|
+
- 多阶段交付,需要 phase 文件、产物模板和 `.status.json`
|
|
14
|
+
- 产物属于一次 change,需要写 `.speculo/<cat>/<change>/`
|
|
15
|
+
- 会跨多轮对话推进,或需要 `current_phase`、`phase_history`
|
|
16
|
+
- 是业务流程、开发流程、文档流程或运维流程
|
|
17
|
+
|
|
18
|
+
分类:
|
|
19
|
+
|
|
20
|
+
- `dev`:开发、PRD、TDD、review、docs-sync、诊断、issue 分解
|
|
21
|
+
- `doc`:文章、素材、文档写作、编辑、塑形
|
|
22
|
+
- `ops`:运维、发布、巡检、外部系统操作的多阶段流程
|
|
23
|
+
|
|
24
|
+
### 做 Skill
|
|
25
|
+
|
|
26
|
+
选择 skill,当能力满足任一条件:
|
|
27
|
+
|
|
28
|
+
- 是 command 或 workflow 可复用的原子能力
|
|
29
|
+
- 复制到其他项目仍能工作
|
|
30
|
+
- 需要 `references/` 渐进披露
|
|
31
|
+
- 不拥有持久化责任,不直接写 `.speculo/` 或 `.status.json`
|
|
32
|
+
- 是工具集成、领域知识、决策 SOP 或可复用操作手册
|
|
33
|
+
|
|
34
|
+
### 做 Command
|
|
35
|
+
|
|
36
|
+
选择 command,当能力满足全部条件:
|
|
37
|
+
|
|
38
|
+
- 单步动作或短流程
|
|
39
|
+
- 不需要 phase 状态机
|
|
40
|
+
- 产物只归档到 `.speculo/commands/<YYYY-MM-DD>-<cmd>-<topic>/`
|
|
41
|
+
- 可以调用 skill,但不需要 workflow 的 change 生命周期
|
|
42
|
+
|
|
43
|
+
### 做组合
|
|
44
|
+
|
|
45
|
+
- command 触发 skill:例如一次性报告、归档、状态聚合
|
|
46
|
+
- workflow 内嵌 skill:例如发布 workflow 调用 GitHub/npm 原子能力
|
|
47
|
+
- workflow 融合旧 skill:当旧 skill 只服务某个 workflow,不再作为根 skill 分发
|
|
48
|
+
|
|
49
|
+
## 反例
|
|
50
|
+
|
|
51
|
+
- 不要把多阶段、有状态的流程塞进 skill。
|
|
52
|
+
- 不要让 skill 直接写 `.speculo/`。
|
|
53
|
+
- 不要为一次性命令创建 workflow。
|
|
54
|
+
- 不要把 workflow-only 方法保留为根 skill,除非会被多个入口复用。
|
|
55
|
+
|
|
56
|
+
## 输出决策
|
|
57
|
+
|
|
58
|
+
在实施前写清:
|
|
59
|
+
|
|
60
|
+
- 资产类型
|
|
61
|
+
- 目标路径
|
|
62
|
+
- 入口 id / alias
|
|
63
|
+
- 持久化路径
|
|
64
|
+
- 是否需要模板、references、scripts
|
|
65
|
+
- 需要同步的索引、文档和测试
|