@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.
Files changed (130) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +89 -0
  3. package/dist/src/cli.d.ts +2 -0
  4. package/dist/src/cli.js +58 -0
  5. package/dist/src/cli.js.map +1 -0
  6. package/dist/src/index.d.ts +10 -0
  7. package/dist/src/index.js +60 -0
  8. package/dist/src/index.js.map +1 -0
  9. package/dist/src/utils.d.ts +1 -0
  10. package/dist/src/utils.js +11 -0
  11. package/dist/src/utils.js.map +1 -0
  12. package/package.json +54 -0
  13. package/speculo/.speculo/.config/LESSONS.md +9 -0
  14. package/speculo/.speculo/.config/RULES.md +9 -0
  15. package/speculo/.speculo/.config/adr/.gitkeep +1 -0
  16. package/speculo/.speculo/.config/context/.gitkeep +1 -0
  17. package/speculo/.speculo/archive/dev/.gitkeep +0 -0
  18. package/speculo/.speculo/archive/doc/.gitkeep +1 -0
  19. package/speculo/.speculo/commands/.gitkeep +0 -0
  20. package/speculo/.speculo/dev/.gitkeep +0 -0
  21. package/speculo/.speculo/dev/docs-sync-state.json +14 -0
  22. package/speculo/.speculo/dev-status.json +3 -0
  23. package/speculo/.speculo/doc/.gitkeep +1 -0
  24. package/speculo/.speculo/doc-status.json +3 -0
  25. package/speculo/commands/archive.md +53 -0
  26. package/speculo/commands/caveman.md +43 -0
  27. package/speculo/commands/grill-me.md +42 -0
  28. package/speculo/commands/handoff.md +42 -0
  29. package/speculo/commands/scaffold-exercises.md +50 -0
  30. package/speculo/commands/status.md +51 -0
  31. package/speculo/commands/write-a-skill.md +46 -0
  32. package/speculo/skills/caveman/SKILL.md +38 -0
  33. package/speculo/skills/caveman/references/compression-rules.md +102 -0
  34. package/speculo/skills/github-npm-ops/SKILL.md +53 -0
  35. package/speculo/skills/github-npm-ops/references/ci-and-security-ops.md +178 -0
  36. package/speculo/skills/github-npm-ops/references/failure-recovery.md +132 -0
  37. package/speculo/skills/github-npm-ops/references/issue-pr-triage.md +219 -0
  38. package/speculo/skills/github-npm-ops/references/package-json-checklist.md +171 -0
  39. package/speculo/skills/github-npm-ops/references/preflight-checklist.md +39 -0
  40. package/speculo/skills/github-npm-ops/references/publish-detection.md +68 -0
  41. package/speculo/skills/github-npm-ops/references/release-notes-injection.md +236 -0
  42. package/speculo/skills/github-npm-ops/references/release-pipeline.md +108 -0
  43. package/speculo/skills/github-npm-ops/references/setup-npm-token.md +63 -0
  44. package/speculo/skills/github-npm-ops/references/troubleshooting-playbook.md +305 -0
  45. package/speculo/skills/github-npm-ops/references/version-bump-flow.md +232 -0
  46. package/speculo/skills/github-npm-ops/references/workflow-yaml-reference.md +268 -0
  47. package/speculo/skills/grill-me/SKILL.md +40 -0
  48. package/speculo/skills/handoff/SKILL.md +41 -0
  49. package/speculo/skills/scaffold-exercises/SKILL.md +41 -0
  50. package/speculo/skills/scaffold-exercises/references/exercise-structure.md +85 -0
  51. package/speculo/skills/scaffold-exercises/references/lint-and-git.md +54 -0
  52. package/speculo/skills/speculo-write/SKILL.md +53 -0
  53. package/speculo/skills/speculo-write/references/asset-selection-sop.md +65 -0
  54. package/speculo/skills/speculo-write/references/command-authoring-sop.md +92 -0
  55. package/speculo/skills/speculo-write/references/migration-sop.md +101 -0
  56. package/speculo/skills/speculo-write/references/persistence-contract-sop.md +123 -0
  57. package/speculo/skills/speculo-write/references/skill-authoring-sop.md +195 -0
  58. package/speculo/skills/speculo-write/references/validation-checklist.md +73 -0
  59. package/speculo/skills/speculo-write/references/workflow-authoring-sop.md +130 -0
  60. package/speculo/workflows/dev/00-INDEX.md +56 -0
  61. package/speculo/workflows/dev/01-grill-with-docs/01-grill-with-docs.md +79 -0
  62. package/speculo/workflows/dev/01-grill-with-docs/ADR-FORMAT.md +49 -0
  63. package/speculo/workflows/dev/01-grill-with-docs/CONTEXT-FORMAT.md +65 -0
  64. package/speculo/workflows/dev/01-grill-with-docs/grill-context-scan.md +30 -0
  65. package/speculo/workflows/dev/01-grill-with-docs/grill-decision.md +38 -0
  66. package/speculo/workflows/dev/02-prd/02-prd.md +64 -0
  67. package/speculo/workflows/dev/02-prd/prd-synthesis.md +30 -0
  68. package/speculo/workflows/dev/02-prd/prd-zoom-out.md +29 -0
  69. package/speculo/workflows/dev/03-tdd/03-tdd.md +80 -0
  70. package/speculo/workflows/dev/03-tdd/deep-modules.md +33 -0
  71. package/speculo/workflows/dev/03-tdd/interface-design.md +31 -0
  72. package/speculo/workflows/dev/03-tdd/mocking.md +60 -0
  73. package/speculo/workflows/dev/03-tdd/refactoring.md +10 -0
  74. package/speculo/workflows/dev/03-tdd/tdd-finish.md +28 -0
  75. package/speculo/workflows/dev/03-tdd/tdd-loop.md +33 -0
  76. package/speculo/workflows/dev/03-tdd/tdd-plan.md +30 -0
  77. package/speculo/workflows/dev/03-tdd/tests.md +61 -0
  78. package/speculo/workflows/dev/D-docs-sync/D-docs-sync.md +97 -0
  79. package/speculo/workflows/dev/D-docs-sync/agents-contract.md +95 -0
  80. package/speculo/workflows/dev/D-docs-sync/changelog-contract.md +155 -0
  81. package/speculo/workflows/dev/D-docs-sync/docs-sync-diff.md +50 -0
  82. package/speculo/workflows/dev/D-docs-sync/docs-sync-finish.md +33 -0
  83. package/speculo/workflows/dev/D-docs-sync/docs-sync-state.md +32 -0
  84. package/speculo/workflows/dev/D-docs-sync/docs-sync-update.md +35 -0
  85. package/speculo/workflows/dev/D-docs-sync/readme-contract.md +124 -0
  86. package/speculo/workflows/dev/D-docs-sync/state-json-schema.md +155 -0
  87. package/speculo/workflows/dev/H-diagnose/H-diagnose.md +80 -0
  88. package/speculo/workflows/dev/H-diagnose/diagnose-fix.md +34 -0
  89. package/speculo/workflows/dev/H-diagnose/diagnose-guide.md +114 -0
  90. package/speculo/workflows/dev/H-diagnose/diagnose-loop.md +32 -0
  91. package/speculo/workflows/dev/H-diagnose/scripts/hitl-loop.template.sh +41 -0
  92. package/speculo/workflows/dev/I-to-issues/I-to-issues.md +70 -0
  93. package/speculo/workflows/dev/I-to-issues/issues-slices.md +31 -0
  94. package/speculo/workflows/dev/R-review/R-review.md +82 -0
  95. package/speculo/workflows/dev/R-review/review-setup.md +39 -0
  96. package/speculo/workflows/dev/R-review/review-two-axis.md +33 -0
  97. package/speculo/workflows/dev/_templates/diagnosis-template.md +19 -0
  98. package/speculo/workflows/dev/_templates/docs-sync-report-template.md +28 -0
  99. package/speculo/workflows/dev/_templates/docs-sync-state-template.json +14 -0
  100. package/speculo/workflows/dev/_templates/grill-context-map-template.md +19 -0
  101. package/speculo/workflows/dev/_templates/grill-decision-log-template.md +19 -0
  102. package/speculo/workflows/dev/_templates/issues-slices-template.md +19 -0
  103. package/speculo/workflows/dev/_templates/prd-overview-template.md +19 -0
  104. package/speculo/workflows/dev/_templates/prd-template.md +25 -0
  105. package/speculo/workflows/dev/_templates/regression-template.md +19 -0
  106. package/speculo/workflows/dev/_templates/review-report-template.md +16 -0
  107. package/speculo/workflows/dev/_templates/review-sources-template.md +24 -0
  108. package/speculo/workflows/dev/_templates/tdd-log-template.md +16 -0
  109. package/speculo/workflows/dev/_templates/tdd-plan-template.md +19 -0
  110. package/speculo/workflows/dev/_templates/tdd-verification-template.md +16 -0
  111. package/speculo/workflows/doc/00-INDEX.md +51 -0
  112. package/speculo/workflows/doc/B-writing-beats/B-writing-beats.md +77 -0
  113. package/speculo/workflows/doc/B-writing-beats/writing-beats-append.md +31 -0
  114. package/speculo/workflows/doc/B-writing-beats/writing-beats-options.md +29 -0
  115. package/speculo/workflows/doc/E-edit-article/E-edit-article.md +77 -0
  116. package/speculo/workflows/doc/E-edit-article/edit-article-plan.md +30 -0
  117. package/speculo/workflows/doc/E-edit-article/edit-article-rewrite.md +31 -0
  118. package/speculo/workflows/doc/F-writing-fragments/F-writing-fragments.md +78 -0
  119. package/speculo/workflows/doc/F-writing-fragments/writing-fragments-interview.md +32 -0
  120. package/speculo/workflows/doc/F-writing-fragments/writing-fragments-log.md +29 -0
  121. package/speculo/workflows/doc/S-writing-shape/S-writing-shape.md +79 -0
  122. package/speculo/workflows/doc/S-writing-shape/writing-shape-block.md +32 -0
  123. package/speculo/workflows/doc/S-writing-shape/writing-shape-opening.md +27 -0
  124. package/speculo/workflows/doc/_templates/edit-article-plan-template.md +24 -0
  125. package/speculo/workflows/doc/_templates/edit-article-template.md +6 -0
  126. package/speculo/workflows/doc/_templates/writing-article-template.md +6 -0
  127. package/speculo/workflows/doc/_templates/writing-beat-options-template.md +20 -0
  128. package/speculo/workflows/doc/_templates/writing-fragments-template.md +6 -0
  129. package/speculo/workflows/doc/_templates/writing-interview-log-template.md +20 -0
  130. package/speculo/workflows/doc/_templates/writing-shape-log-template.md +24 -0
@@ -0,0 +1,219 @@
1
+ # Issue 与 PR 分诊手册
2
+
3
+ 标签体系、分诊节奏、社区 PR 质量线与 stale 策略的落地细节。SKILL.md 中保留的是每天会用的动作,这里覆盖边界与模板。
4
+
5
+ ## 标签体系
6
+
7
+ 建议仓库标签按维度分组,而不是一股脑堆平。
8
+
9
+ ### 类型标签(必须有一个)
10
+
11
+ | 标签 | 含义 |
12
+ | ------------------ | --------------------------------------- |
13
+ | `bug` | 功能不符合预期或文档 |
14
+ | `feature-request` | 新功能请求 |
15
+ | `enhancement` | 现有功能的改进 |
16
+ | `documentation` | 文档相关 |
17
+ | `question` | 使用类问题(非 bug) |
18
+ | `duplicate` | 与其他 issue/PR 重复 |
19
+ | `invalid` | 不适用本项目 |
20
+ | `wontfix` | 不会修(给清晰理由) |
21
+ | `good-first-issue` | 适合新贡献者 |
22
+
23
+ ### 优先级(可选,用于 bug/feature-request)
24
+
25
+ | 标签 | 含义 |
26
+ | ------------------- | ------------------------------------------------ |
27
+ | `priority:critical` | 生产破坏、安全事件;24h 内响应 |
28
+ | `priority:high` | 显著影响主要用户;1 周内处理 |
29
+ | `priority:medium` | 影响部分用户或体验;按 sprint 排期 |
30
+ | `priority:low` | 外观/轻微改进;有空再说 |
31
+
32
+ ### 模块/领域(自定义)
33
+
34
+ 根据项目结构给领域标签,例如 `area:cli`、`area:templates`、`area:skill-creator`。方便按模块聚合。
35
+
36
+ ### 状态标签
37
+
38
+ | 标签 | 含义 |
39
+ | ------------------- | ------------------------------------------- |
40
+ | `needs-repro` | 等复现步骤 |
41
+ | `needs-design` | 需要设计讨论再 coding |
42
+ | `needs-review` | PR 等评审 |
43
+ | `blocked` | 被其他 issue/上游依赖阻塞 |
44
+ | `stale` | 长时间无活动 |
45
+ | `closed-stale` | 因无活动被关闭 |
46
+
47
+ ## Issue 分诊流程
48
+
49
+ 1. 读 title、body、comments,判断类型
50
+ 2. 搜重复:`gh issue list --search "关键词" --state all --limit 20`
51
+ 3. 打 **类型** 标签,必要时加 **优先级** 和 **领域**
52
+ 4. 根据缺失信息回复:
53
+ - bug 缺复现:问复现步骤、系统信息、复现率
54
+ - feature-request:问具体 use case,是否有 workaround
55
+ - question:直接回答或指向文档
56
+
57
+ ### 回复模板
58
+
59
+ **要求复现**
60
+
61
+ > Thanks for the report. Could you share a minimal reproduction? Please include:
62
+ > - Command you ran and full output
63
+ > - Node version (`node -v`) and OS
64
+ > - Contents of relevant config files
65
+ > Without this we can't investigate further.
66
+
67
+ **标记重复**
68
+
69
+ > This looks like a duplicate of #XXX. Closing here, please follow the original for updates. Thanks!
70
+
71
+ **转为 discussion**
72
+
73
+ > This is more of a usage question than a bug, moving to [Discussions](link) where the community can chime in.
74
+
75
+ ### 大批量分诊节奏
76
+
77
+ 每天或每两天扫一次 open issue:
78
+
79
+ ```bash
80
+ # 没有 type 标签的都要处理
81
+ gh issue list --state open \
82
+ --search "no:label" \
83
+ --limit 50
84
+ ```
85
+
86
+ ## PR 审查流程
87
+
88
+ ### 入场检查(收到 PR 后 24h 内)
89
+
90
+ 1. CI 是否全绿:`gh pr checks <N>`
91
+ 2. 是否可合并:`gh pr view <N> --json mergeable,mergeStateStatus`
92
+ 3. 是否有描述、是否关联 issue
93
+ 4. 是否来自新贡献者(给欢迎评论)
94
+
95
+ ### 评审维度(深度审查时)
96
+
97
+ - **目的对齐**:PR 是否解决了声明的 issue
98
+ - **实现**:是否符合项目约定(见 AGENTS.md / CONTRIBUTING.md)
99
+ - **测试**:新功能/bug 修复是否带测试
100
+ - **文档**:面向用户的变更是否更新了 README/docs
101
+ - **兼容性**:是否有破坏性变更,是否在 PR 描述里标注
102
+
103
+ ### 合并决策
104
+
105
+ CI 全绿 + 至少一位 maintainer approve + 无 `blocked`/`needs-design` 标签 → 可合并。
106
+
107
+ ```bash
108
+ # Squash merge(默认策略)
109
+ gh pr merge <N> --squash --delete-branch
110
+
111
+ # Merge commit(保留完整历史)
112
+ gh pr merge <N> --merge --delete-branch
113
+ ```
114
+
115
+ ## Stale 策略
116
+
117
+ ### 判断规则
118
+
119
+ - **Issue**:14 天无活动 → 加 `stale` 并询问
120
+ - **PR**:7 天无 review/comment → 主动询问是否继续
121
+ - **Stale → Closed**:再 14 天无响应 → 关闭并加 `closed-stale`
122
+
123
+ ### 自动化(推荐)
124
+
125
+ 用 [`actions/stale`](https://github.com/actions/stale):
126
+
127
+ ```yaml
128
+ name: Mark Stale
129
+
130
+ on:
131
+ schedule:
132
+ - cron: '30 1 * * *'
133
+
134
+ jobs:
135
+ stale:
136
+ runs-on: ubuntu-latest
137
+ permissions:
138
+ issues: write
139
+ pull-requests: write
140
+ steps:
141
+ - uses: actions/stale@v9
142
+ with:
143
+ days-before-issue-stale: 14
144
+ days-before-issue-close: 14
145
+ days-before-pr-stale: 7
146
+ days-before-pr-close: 14
147
+ stale-issue-label: 'stale'
148
+ stale-pr-label: 'stale'
149
+ close-issue-label: 'closed-stale'
150
+ close-pr-label: 'closed-stale'
151
+ stale-issue-message: >
152
+ 此 issue 已 14 天无更新。如仍需关注请留言,否则 14 天后将自动关闭。
153
+ stale-pr-message: >
154
+ 此 PR 已 7 天无更新。如仍在推进请留言,否则 14 天后将自动关闭。
155
+ exempt-issue-labels: 'pinned,priority:critical,priority:high'
156
+ exempt-pr-labels: 'pinned,work-in-progress'
157
+ ```
158
+
159
+ ### 手动查询
160
+
161
+ ```bash
162
+ # 找超过 14 天未更新的 open issue
163
+ gh issue list --state open \
164
+ --json number,title,updatedAt \
165
+ --jq '.[] | select(.updatedAt < "2026-04-26")' | head -20
166
+
167
+ # 找超过 7 天未更新的 open PR
168
+ gh pr list --state open \
169
+ --json number,title,updatedAt,author \
170
+ --jq '.[] | select(.updatedAt < "2026-05-03")'
171
+ ```
172
+
173
+ ## 社区 PR 特殊处理
174
+
175
+ ### 新贡献者检测
176
+
177
+ 看 PR 作者历史:
178
+
179
+ ```bash
180
+ gh pr view <N> --json author,authorAssociation
181
+ # authorAssociation: FIRST_TIME_CONTRIBUTOR / CONTRIBUTOR / MEMBER
182
+ ```
183
+
184
+ 首次贡献者给热情的欢迎评论,附:
185
+
186
+ - CONTRIBUTING 链接
187
+ - 本地跑测试的命令
188
+ - 告知 review 时长预期
189
+
190
+ ### CLA / DCO
191
+
192
+ 若仓库要求 CLA 签署或 DCO signoff,PR 里会有 bot 检查。未签署的:
193
+
194
+ > Thanks for the PR. Our CLA bot needs you to sign the agreement before we can merge. You should see a comment above with instructions.
195
+
196
+ ### 驳回时保持尊重
197
+
198
+ 即使方向不对也要说明清楚:
199
+
200
+ > Thanks for taking the time on this. After discussing with the team, we've decided not to go this direction because [原因]. The alternative we're considering is [方案]. Closing this PR, but would love to hear your thoughts in [issue link].
201
+
202
+ ## 每周例行巡检
203
+
204
+ 一个典型的周一清单:
205
+
206
+ ```bash
207
+ # 1. 未分诊的 issue
208
+ gh issue list --state open --search "no:label" --limit 20
209
+
210
+ # 2. 超过 7 天无 review 的 PR
211
+ gh pr list --state open --json number,title,updatedAt \
212
+ --jq '.[] | select(.updatedAt < "YYYY-MM-DD")'
213
+
214
+ # 3. 本周合并统计
215
+ gh pr list --state merged --base main --search "merged:>YYYY-MM-DD"
216
+
217
+ # 4. 关注 critical/high 标签的未解决 issue
218
+ gh issue list --label "priority:critical,priority:high" --state open
219
+ ```
@@ -0,0 +1,171 @@
1
+ # package.json 发布前字段清单
2
+
3
+ 发布失败的一半原因都是 `package.json` 少字段或字段错位。按这张清单逐项确认。
4
+
5
+ ## 必填字段
6
+
7
+ ### name
8
+
9
+ - 普通包:全局唯一,小写 + 连字符(如 `my-cli`)
10
+ - Scoped 包:`@scope/name`,必须先在 npm 上拥有 scope
11
+ - **首次发布前用 `npm view <name>` 查询是否被占用**;返回 404 才可用
12
+
13
+ ```bash
14
+ npm view my-cli # 404 = 可用;有输出 = 已占用
15
+ npm view @scope/my-cli # 首次发布会 404,正常
16
+ ```
17
+
18
+ ### version
19
+
20
+ - 遵循 SemVer(MAJOR.MINOR.PATCH)
21
+ - 必须与要发布的 git tag 严格匹配:tag `v0.0.2` ↔ version `0.0.2`
22
+ - npm **不允许重复发布同一个 version**,即使之前 unpublished 也不行(24h 内)
23
+
24
+ ### repository
25
+
26
+ **npm provenance 强制要求这个字段**,缺失会报 `E422`。
27
+
28
+ ```json
29
+ {
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/owner/my-cli"
33
+ }
34
+ }
35
+ ```
36
+
37
+ - `url` 必须指向实际托管 workflow 的 GitHub 仓库
38
+ - 注意大小写:GitHub 虽不区分,但 provenance 验证严格匹配
39
+
40
+ ### license
41
+
42
+ SPDX 标识符(如 `MIT`、`Apache-2.0`、`ISC`)。别写 `LICENSE.md` 或随意字符串。
43
+
44
+ ## CLI 包专用字段
45
+
46
+ ### bin
47
+
48
+ 命令入口。路径必须以 `./` 开头:
49
+
50
+ ```json
51
+ {
52
+ "bin": {
53
+ "my-cli": "./dist/cli/index.js"
54
+ }
55
+ }
56
+ ```
57
+
58
+ 入口文件必须:
59
+
60
+ 1. 有可执行权限(`chmod +x`,或通过 `scripts/inject-shebang.mjs` 注入 shebang)
61
+ 2. 首行是 `#!/usr/bin/env node`
62
+ 3. 是 ESM(`"type": "module"` 时)或 CJS,与 package 一致
63
+
64
+ ### files
65
+
66
+ 显式允许列表,避免把源码、测试、`.env` 发到 npm:
67
+
68
+ ```json
69
+ {
70
+ "files": [
71
+ "dist",
72
+ "templates",
73
+ "!dist/**/*.test.js",
74
+ "!dist/**/__tests__",
75
+ "!dist/**/*.map"
76
+ ]
77
+ }
78
+ ```
79
+
80
+ - 不写 `files` 时,npm 走 `.gitignore` 加一堆默认规则,通常会漏发或误发
81
+ - 发布前用 `npm pack --dry-run` 看看 tarball 实际内容
82
+
83
+ ## 推荐但可选字段
84
+
85
+ ### description / keywords
86
+
87
+ 影响 npm 搜索结果,写清楚。
88
+
89
+ ### homepage / bugs
90
+
91
+ ```json
92
+ {
93
+ "homepage": "https://github.com/owner/my-cli#readme",
94
+ "bugs": {
95
+ "url": "https://github.com/owner/my-cli/issues"
96
+ }
97
+ }
98
+ ```
99
+
100
+ 显示在 npm 包页面,方便用户找文档和报问题。
101
+
102
+ ### engines
103
+
104
+ ```json
105
+ {
106
+ "engines": {
107
+ "node": ">=24.14.1"
108
+ }
109
+ }
110
+ ```
111
+
112
+ 声明最低 Node 版本;npm 会在安装时提示(但不会阻止)。
113
+
114
+ ### type / exports
115
+
116
+ ESM 包:
117
+
118
+ ```json
119
+ {
120
+ "type": "module",
121
+ "exports": {
122
+ ".": {
123
+ "types": "./dist/index.d.ts",
124
+ "default": "./dist/index.js"
125
+ }
126
+ }
127
+ }
128
+ ```
129
+
130
+ ## scripts
131
+
132
+ ### prepublishOnly
133
+
134
+ 发布前的质量闸门。仅在 `npm publish` 前执行(`npm install` 不触发):
135
+
136
+ ```json
137
+ {
138
+ "scripts": {
139
+ "prepublishOnly": "pnpm check"
140
+ }
141
+ }
142
+ ```
143
+
144
+ `pnpm check` 通常是 `pnpm lint && pnpm test && pnpm build`。
145
+
146
+ ### 不要用的 scripts
147
+
148
+ - `prepublish` — 已废弃,会在 `install` 时也触发,容易误伤
149
+ - `prepare` — 在 `install` 时也跑,写构建命令会导致普通安装变慢
150
+
151
+ ## 发布前自检流程
152
+
153
+ ```bash
154
+ # 1. 检查 name 可用(首次发布)
155
+ npm view @scope/my-cli
156
+
157
+ # 2. 版本一致性
158
+ node -e "console.log(require('./package.json').version)"
159
+ git tag --list 'v*' | sort -V | tail -3
160
+
161
+ # 3. tarball 内容预览
162
+ npm pack --dry-run
163
+
164
+ # 4. 运行质量闸门
165
+ pnpm check
166
+
167
+ # 5. 预演发布(不会真的推送)
168
+ npm publish --dry-run --access public --provenance
169
+ ```
170
+
171
+ 如果 5 个命令都正常,再执行真正的 `git tag && git push origin <tag>` 触发 CI 发布。
@@ -0,0 +1,39 @@
1
+ # Phase 0 — 前置检测完整清单
2
+
3
+ > 本文件是 `npm-cicd-release` 命令 Phase 0 的「展开形态」。命令正文只列出五项核心前置;这里给出 11 项完整探测、失败信号与建议修复。
4
+ > 全部探测都是**只读**的,不会修改任何文件。任一项不通过 → 命令终止,输出修复建议;不要尝试自动跳过。
5
+
6
+ ## 探测矩阵
7
+
8
+ | # | 项 | 探测命令 | 通过判定 | 失败建议 |
9
+ |---|----|---------|---------|---------|
10
+ | 1 | 当前分支 | `git rev-parse --abbrev-ref HEAD` | 输出 = 仓库声明的发布分支(默认 `main`) | `git checkout main` 后重新触发;或显式声明本仓库的发布分支 |
11
+ | 2 | 工作区干净 | `git status --porcelain` | 输出为空 | 先 stash / commit;不允许 `git stash` 后立刻发版(stash 内容易丢失) |
12
+ | 3 | 远端可达 | `git ls-remote --exit-code origin` | 退出码 0 | 检查网络 / SSH key / `gh auth status` |
13
+ | 4 | gh 已登录 | `gh auth status` | 含 `Logged in to github.com` | `gh auth login` |
14
+ | 5 | gh 仓库权限 | `gh repo view --json viewerCanAdminister` | `viewerCanAdminister == true` 或至少 push 权限 | 联系仓库管理员;或 fork 后申请 PR 流程 |
15
+ | 6 | Node 版本 | `node --version` | ≥ `package.json#engines.node` | `nvm use` / `fnm use` / 升级本机 Node |
16
+ | 7 | 包管理器 | `pnpm --version` (或 `npm` / `yarn`) | 版本 ≥ 仓库 lockfile 隐含版本 | 安装匹配版本;不要随意切换包管理器 |
17
+ | 8 | release.yml 存在 | `test -f .github/workflows/release.yml` | 文件存在 | 转 `github-ops` skill 的 `references/workflow-yaml-reference.md` 先落该文件 |
18
+ | 9 | release.yml 形态 | 见 [publish-detection.md](publish-detection.md) | 输出 `PUBLISH_TO_NPM=true` 或 `false` | 见 publish-detection 文档的判定矩阵 |
19
+ | 10 | docs-sync state | `test -f .speculo/dev/docs-sync-state.json && jq . .speculo/dev/docs-sync-state.json` | 解析成功且 `last_sync_sha != null` | 不存在 → 走 `dev/D-docs-sync` workflow 的「首次运行」分支;存在但损坏 → 修复 JSON |
20
+ | 11 | tag 名称冲突 | `git rev-parse vX.Y.Z 2>/dev/null` | 退出码非 0(tag 不存在) | 同 tag 已存在:先确认是否真的失败需要重发;若是则 `git tag -d` + `git push origin :refs/tags/vX.Y.Z`,否则 bump 到下一版本 |
21
+
22
+ ## 失败处理总策略
23
+
24
+ - 探测项 1–3、6–7:本机环境问题,提示用户人工修复后重跑命令
25
+ - 探测项 4–5:GitHub 权限问题,给出对应的 `gh` 命令
26
+ - 探测项 8:基础设施缺失,明确转交 `github-ops` skill 而不是在本命令里现写 release.yml
27
+ - 探测项 9:影响 Phase 5 的分支选择,**不阻塞**命令执行(仅决定后续是否做 npm view 校验)
28
+ - 探测项 10:影响 Phase 2 是否进入 docs-sync 主流程
29
+ - 探测项 11:直接关系到能否打 tag,必须在 Phase 0 阶段就排除
30
+
31
+ ## 与三个 skill 的边界
32
+
33
+ Phase 0 只做**只读探测**,不调用任何 skill 的 SOP:
34
+
35
+ - `git-commit-template` skill 只在 Phase 1 被引用
36
+ - `docs-sync` skill 只在 Phase 2 / Phase 6 被引用
37
+ - `github-ops` skill 在 Phase 3 / 4 / 5 被引用
38
+
39
+ 如果 Phase 0 嗅探到的状态需要某个 skill 的修复 SOP(如 release.yml 缺失),明确转交,不要在本命令内复刻 skill 的内容。
@@ -0,0 +1,68 @@
1
+ # Release.yml 是否含 npm publish 的判定脚本
2
+
3
+ > 用于决定 Phase 5 是否做 npm 端校验。命令正文只展示了核心 grep;这里给出完整模式集合、第三方 action 清单与误判排除策略。
4
+
5
+ ## 判定输出
6
+
7
+ ```bash
8
+ RELEASE_YML=".github/workflows/release.yml"
9
+
10
+ if [ ! -f "$RELEASE_YML" ]; then
11
+ echo "RELEASE_YML_MISSING=true"
12
+ exit 0
13
+ fi
14
+
15
+ # 主判定:是否含 npm publish 步骤
16
+ if grep -Eq 'npm[[:space:]]+publish|run:[[:space:]]*pnpm[[:space:]]+publish|run:[[:space:]]*yarn[[:space:]]+publish|JS-DevTools/npm-publish|cycjimmy/semantic-release-action|changesets/action' "$RELEASE_YML"; then
17
+ echo "PUBLISH_TO_NPM=true"
18
+ else
19
+ echo "PUBLISH_TO_NPM=false"
20
+ fi
21
+ ```
22
+
23
+ ## 模式集合
24
+
25
+ `PUBLISH_TO_NPM=true` 命中下列任一行时为真:
26
+
27
+ | 模式 | 形态 | 说明 |
28
+ |------|------|------|
29
+ | `npm publish` | `run: npm publish --provenance --access public` | 官方 npm CLI |
30
+ | `pnpm publish` | `run: pnpm publish --no-git-checks` | pnpm 包管理器 |
31
+ | `yarn publish` | `run: yarn publish --new-version $VERSION` | 旧 yarn / berry |
32
+ | `JS-DevTools/npm-publish@vN` | `uses: JS-DevTools/npm-publish@v3` | 第三方封装 action |
33
+ | `cycjimmy/semantic-release-action@vN` | `uses: cycjimmy/semantic-release-action@v4` | semantic-release 流水线 |
34
+ | `changesets/action@vN` | `uses: changesets/action@v1` 且配置 `publish:` 输入 | Changesets 风格的多包发布 |
35
+
36
+ ## 误判排除
37
+
38
+ 下列形态**不应**触发 `PUBLISH_TO_NPM=true`:
39
+
40
+ | 形态 | 是否触发 | 原因 |
41
+ |------|---------|------|
42
+ | `# npm publish` 注释行 | ❌ | grep `-E` 默认匹配整行;如需更严格可加 `^[^#]*` 锚定 |
43
+ | `description: 'Run npm publish ...'` | ⚠️ 可能误命中 | 收紧 grep 为 `run:[[:space:]]*npm[[:space:]]+publish` 即可避免 |
44
+ | `npm publish --dry-run` | ✅ 仍命中 | 视作真发布意图;如需排除,可在判定后追加 `--dry-run` 检查并手动降级 |
45
+ | `npm pack` | ❌ | `pack` 不是 `publish` |
46
+ | 仅 `softprops/action-gh-release` | ❌ | 这是 GitHub Release 创建器,不是 npm publish |
47
+
48
+ ## 收紧版(推荐用于精确判定)
49
+
50
+ ```bash
51
+ grep -E '^\s*(run:\s*(npm|pnpm|yarn)\s+publish|uses:\s*(JS-DevTools/npm-publish|cycjimmy/semantic-release-action|changesets/action))\b' "$RELEASE_YML"
52
+ ```
53
+
54
+ > 如果仓库使用了非主流的发布方式(如自写 shell 脚本里调用 `npm publish`),grep 仍可能漏判。
55
+ > 漏判后果:Phase 5 跳过 `npm view` 校验。这是**安全侧**漏判(不会误报"未发布"),但用户应在该仓库的 README 或 SKILL 注释里明确发布方式,避免歧义。
56
+
57
+ ## 多 workflow 文件的处理
58
+
59
+ 若仓库有多个 release 相关 workflow(如 `release.yml` + `publish-canary.yml`),默认只看 `release.yml`。
60
+ 如需扩展,在调用方 workflow 或项目上下文中声明 `releaseWorkflowPaths: [...]`,执行时按该列表逐个判定。
61
+
62
+ ## 与 Phase 5 的衔接
63
+
64
+ | 嗅探结果 | Phase 5 行为 |
65
+ |---------|-------------|
66
+ | `PUBLISH_TO_NPM=true` | 跑 `gh release view` + `gh run` + `npm view` 三端 |
67
+ | `PUBLISH_TO_NPM=false` | 仅跑 `gh release view` + `gh run` 两端,并向用户输出「本仓库 release.yml 不含 npm publish 步骤」提示 |
68
+ | `RELEASE_YML_MISSING=true` | Phase 0 直接终止,不进入后续 phase |