@niujiajie/freespec 0.0.0-stage → 1.15.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 (308) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +58 -2
  3. package/bin/freespec.js +5 -0
  4. package/dist/cli/index.d.ts +25 -0
  5. package/dist/cli/index.js +359 -0
  6. package/dist/commands/shared-output.d.ts +18 -0
  7. package/dist/commands/shared-output.js +61 -0
  8. package/dist/commands/workflow/default-schema.d.ts +2 -0
  9. package/dist/commands/workflow/default-schema.js +4 -0
  10. package/dist/commands/workflow/index.d.ts +13 -0
  11. package/dist/commands/workflow/index.js +10 -0
  12. package/dist/commands/workflow/instructions.d.ts +39 -0
  13. package/dist/commands/workflow/instructions.js +565 -0
  14. package/dist/commands/workflow/new-change.d.ts +19 -0
  15. package/dist/commands/workflow/new-change.js +135 -0
  16. package/dist/commands/workflow/shared.d.ts +94 -0
  17. package/dist/commands/workflow/shared.js +169 -0
  18. package/dist/commands/workflow/status.d.ts +18 -0
  19. package/dist/commands/workflow/status.js +201 -0
  20. package/dist/core/artifact-graph/graph.d.ts +72 -0
  21. package/dist/core/artifact-graph/graph.js +165 -0
  22. package/dist/core/artifact-graph/index.d.ts +9 -0
  23. package/dist/core/artifact-graph/index.js +14 -0
  24. package/dist/core/artifact-graph/instruction-loader.d.ts +208 -0
  25. package/dist/core/artifact-graph/instruction-loader.js +268 -0
  26. package/dist/core/artifact-graph/outputs.d.ts +19 -0
  27. package/dist/core/artifact-graph/outputs.js +351 -0
  28. package/dist/core/artifact-graph/resolver.d.ts +89 -0
  29. package/dist/core/artifact-graph/resolver.js +342 -0
  30. package/dist/core/artifact-graph/schema.d.ts +27 -0
  31. package/dist/core/artifact-graph/schema.js +160 -0
  32. package/dist/core/artifact-graph/state.d.ts +12 -0
  33. package/dist/core/artifact-graph/state.js +31 -0
  34. package/dist/core/artifact-graph/types.d.ts +40 -0
  35. package/dist/core/artifact-graph/types.js +59 -0
  36. package/dist/core/available-tools.d.ts +18 -0
  37. package/dist/core/available-tools.js +49 -0
  38. package/dist/core/change-layout.d.ts +17 -0
  39. package/dist/core/change-layout.js +30 -0
  40. package/dist/core/change-metadata/index.d.ts +2 -0
  41. package/dist/core/change-metadata/index.js +2 -0
  42. package/dist/core/change-metadata/schema.d.ts +23 -0
  43. package/dist/core/change-metadata/schema.js +46 -0
  44. package/dist/core/change-status-policy.d.ts +49 -0
  45. package/dist/core/change-status-policy.js +50 -0
  46. package/dist/core/command-generation/adapters/amazon-q.d.ts +17 -0
  47. package/dist/core/command-generation/adapters/amazon-q.js +32 -0
  48. package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
  49. package/dist/core/command-generation/adapters/antigravity.js +27 -0
  50. package/dist/core/command-generation/adapters/atomcode.d.ts +24 -0
  51. package/dist/core/command-generation/adapters/atomcode.js +46 -0
  52. package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
  53. package/dist/core/command-generation/adapters/auggie.js +28 -0
  54. package/dist/core/command-generation/adapters/bob.d.ts +18 -0
  55. package/dist/core/command-generation/adapters/bob.js +33 -0
  56. package/dist/core/command-generation/adapters/claude.d.ts +13 -0
  57. package/dist/core/command-generation/adapters/claude.js +32 -0
  58. package/dist/core/command-generation/adapters/cline.d.ts +14 -0
  59. package/dist/core/command-generation/adapters/cline.js +27 -0
  60. package/dist/core/command-generation/adapters/codeassistant.d.ts +15 -0
  61. package/dist/core/command-generation/adapters/codeassistant.js +29 -0
  62. package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
  63. package/dist/core/command-generation/adapters/codebuddy.js +29 -0
  64. package/dist/core/command-generation/adapters/codestudio.d.ts +13 -0
  65. package/dist/core/command-generation/adapters/codestudio.js +27 -0
  66. package/dist/core/command-generation/adapters/command-code.d.ts +19 -0
  67. package/dist/core/command-generation/adapters/command-code.js +34 -0
  68. package/dist/core/command-generation/adapters/continue.d.ts +13 -0
  69. package/dist/core/command-generation/adapters/continue.js +33 -0
  70. package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
  71. package/dist/core/command-generation/adapters/costrict.js +28 -0
  72. package/dist/core/command-generation/adapters/crush.d.ts +13 -0
  73. package/dist/core/command-generation/adapters/crush.js +30 -0
  74. package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
  75. package/dist/core/command-generation/adapters/cursor.js +31 -0
  76. package/dist/core/command-generation/adapters/devin.d.ts +19 -0
  77. package/dist/core/command-generation/adapters/devin.js +36 -0
  78. package/dist/core/command-generation/adapters/easycode.d.ts +17 -0
  79. package/dist/core/command-generation/adapters/easycode.js +28 -0
  80. package/dist/core/command-generation/adapters/factory.d.ts +13 -0
  81. package/dist/core/command-generation/adapters/factory.js +28 -0
  82. package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
  83. package/dist/core/command-generation/adapters/gemini.js +27 -0
  84. package/dist/core/command-generation/adapters/gigacode.d.ts +17 -0
  85. package/dist/core/command-generation/adapters/gigacode.js +31 -0
  86. package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
  87. package/dist/core/command-generation/adapters/github-copilot.js +27 -0
  88. package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
  89. package/dist/core/command-generation/adapters/iflow.js +30 -0
  90. package/dist/core/command-generation/adapters/index.d.ts +40 -0
  91. package/dist/core/command-generation/adapters/index.js +40 -0
  92. package/dist/core/command-generation/adapters/junie.d.ts +13 -0
  93. package/dist/core/command-generation/adapters/junie.js +27 -0
  94. package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
  95. package/dist/core/command-generation/adapters/kilocode.js +23 -0
  96. package/dist/core/command-generation/adapters/kiro.d.ts +13 -0
  97. package/dist/core/command-generation/adapters/kiro.js +27 -0
  98. package/dist/core/command-generation/adapters/lingma.d.ts +13 -0
  99. package/dist/core/command-generation/adapters/lingma.js +30 -0
  100. package/dist/core/command-generation/adapters/oh-my-pi.d.ts +21 -0
  101. package/dist/core/command-generation/adapters/oh-my-pi.js +42 -0
  102. package/dist/core/command-generation/adapters/opencode.d.ts +14 -0
  103. package/dist/core/command-generation/adapters/opencode.js +38 -0
  104. package/dist/core/command-generation/adapters/pi.d.ts +18 -0
  105. package/dist/core/command-generation/adapters/pi.js +39 -0
  106. package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
  107. package/dist/core/command-generation/adapters/qoder.js +30 -0
  108. package/dist/core/command-generation/adapters/qwen.d.ts +17 -0
  109. package/dist/core/command-generation/adapters/qwen.js +31 -0
  110. package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
  111. package/dist/core/command-generation/adapters/roocode.js +27 -0
  112. package/dist/core/command-generation/adapters/trae.d.ts +13 -0
  113. package/dist/core/command-generation/adapters/trae.js +28 -0
  114. package/dist/core/command-generation/adapters/zcode.d.ts +16 -0
  115. package/dist/core/command-generation/adapters/zcode.js +33 -0
  116. package/dist/core/command-generation/generator.d.ts +29 -0
  117. package/dist/core/command-generation/generator.js +43 -0
  118. package/dist/core/command-generation/index.d.ts +22 -0
  119. package/dist/core/command-generation/index.js +24 -0
  120. package/dist/core/command-generation/invocation.d.ts +73 -0
  121. package/dist/core/command-generation/invocation.js +77 -0
  122. package/dist/core/command-generation/registry.d.ts +36 -0
  123. package/dist/core/command-generation/registry.js +114 -0
  124. package/dist/core/command-generation/toml.d.ts +19 -0
  125. package/dist/core/command-generation/toml.js +39 -0
  126. package/dist/core/command-generation/types.d.ts +63 -0
  127. package/dist/core/command-generation/types.js +8 -0
  128. package/dist/core/command-generation/yaml.d.ts +36 -0
  129. package/dist/core/command-generation/yaml.js +48 -0
  130. package/dist/core/command-surface.d.ts +15 -0
  131. package/dist/core/command-surface.js +33 -0
  132. package/dist/core/config-prompts.d.ts +9 -0
  133. package/dist/core/config-prompts.js +56 -0
  134. package/dist/core/config-schema.d.ts +98 -0
  135. package/dist/core/config-schema.js +308 -0
  136. package/dist/core/config.d.ts +50 -0
  137. package/dist/core/config.js +122 -0
  138. package/dist/core/file-state.d.ts +36 -0
  139. package/dist/core/file-state.js +144 -0
  140. package/dist/core/file-view.d.ts +13 -0
  141. package/dist/core/file-view.js +14 -0
  142. package/dist/core/global-config.d.ts +101 -0
  143. package/dist/core/global-config.js +182 -0
  144. package/dist/core/id.d.ts +17 -0
  145. package/dist/core/id.js +30 -0
  146. package/dist/core/index.d.ts +6 -0
  147. package/dist/core/index.js +7 -0
  148. package/dist/core/init.d.ts +57 -0
  149. package/dist/core/init.js +836 -0
  150. package/dist/core/list.d.ts +11 -0
  151. package/dist/core/list.js +197 -0
  152. package/dist/core/migration.d.ts +121 -0
  153. package/dist/core/migration.js +540 -0
  154. package/dist/core/onboarding-commands.d.ts +30 -0
  155. package/dist/core/onboarding-commands.js +38 -0
  156. package/dist/core/openspec-root.d.ts +47 -0
  157. package/dist/core/openspec-root.js +196 -0
  158. package/dist/core/planning-home.d.ts +16 -0
  159. package/dist/core/planning-home.js +67 -0
  160. package/dist/core/profile-sync-drift.d.ts +31 -0
  161. package/dist/core/profile-sync-drift.js +201 -0
  162. package/dist/core/profiles.d.ts +19 -0
  163. package/dist/core/profiles.js +33 -0
  164. package/dist/core/project-config.d.ts +132 -0
  165. package/dist/core/project-config.js +519 -0
  166. package/dist/core/references.d.ts +10 -0
  167. package/dist/core/references.js +46 -0
  168. package/dist/core/root-selection.d.ts +59 -0
  169. package/dist/core/root-selection.js +132 -0
  170. package/dist/core/shared/allowed-tools.d.ts +12 -0
  171. package/dist/core/shared/allowed-tools.js +12 -0
  172. package/dist/core/shared/ide-restart.d.ts +26 -0
  173. package/dist/core/shared/ide-restart.js +42 -0
  174. package/dist/core/shared/index.d.ts +11 -0
  175. package/dist/core/shared/index.js +11 -0
  176. package/dist/core/shared/skill-content-equivalence.d.ts +7 -0
  177. package/dist/core/shared/skill-content-equivalence.js +45 -0
  178. package/dist/core/shared/skill-files.d.ts +7 -0
  179. package/dist/core/shared/skill-files.js +43 -0
  180. package/dist/core/shared/skill-generation.d.ts +49 -0
  181. package/dist/core/shared/skill-generation.js +125 -0
  182. package/dist/core/shared/skill-paths.d.ts +13 -0
  183. package/dist/core/shared/skill-paths.js +23 -0
  184. package/dist/core/shared/tool-detection.d.ts +99 -0
  185. package/dist/core/shared/tool-detection.js +318 -0
  186. package/dist/core/shared-skill-target.d.ts +51 -0
  187. package/dist/core/shared-skill-target.js +239 -0
  188. package/dist/core/store/errors.d.ts +20 -0
  189. package/dist/core/store/errors.js +22 -0
  190. package/dist/core/store/index.d.ts +2 -0
  191. package/dist/core/store/index.js +2 -0
  192. package/dist/core/styles/palette.d.ts +7 -0
  193. package/dist/core/styles/palette.js +8 -0
  194. package/dist/core/templates/optional-workflow.d.ts +69 -0
  195. package/dist/core/templates/optional-workflow.js +140 -0
  196. package/dist/core/templates/types.d.ts +19 -0
  197. package/dist/core/templates/types.js +5 -0
  198. package/dist/core/templates/workflows/personal.d.ts +22 -0
  199. package/dist/core/templates/workflows/personal.js +225 -0
  200. package/dist/core/update-plan.d.ts +127 -0
  201. package/dist/core/update-plan.js +390 -0
  202. package/dist/core/update.d.ts +154 -0
  203. package/dist/core/update.js +723 -0
  204. package/dist/core/version-check.d.ts +188 -0
  205. package/dist/core/version-check.js +906 -0
  206. package/dist/core/zod-issues.d.ts +4 -0
  207. package/dist/core/zod-issues.js +10 -0
  208. package/dist/index.d.ts +3 -0
  209. package/dist/index.js +3 -0
  210. package/dist/prompts/searchable-multi-select.d.ts +35 -0
  211. package/dist/prompts/searchable-multi-select.js +188 -0
  212. package/dist/telemetry/config.d.ts +37 -0
  213. package/dist/telemetry/config.js +148 -0
  214. package/dist/telemetry/index.d.ts +39 -0
  215. package/dist/telemetry/index.js +217 -0
  216. package/dist/telemetry/opt-out.d.ts +17 -0
  217. package/dist/telemetry/opt-out.js +27 -0
  218. package/dist/ui/ascii-patterns.d.ts +16 -0
  219. package/dist/ui/ascii-patterns.js +133 -0
  220. package/dist/ui/welcome-screen.d.ts +18 -0
  221. package/dist/ui/welcome-screen.js +199 -0
  222. package/dist/utils/change-metadata.d.ts +116 -0
  223. package/dist/utils/change-metadata.js +324 -0
  224. package/dist/utils/change-utils.d.ts +79 -0
  225. package/dist/utils/change-utils.js +121 -0
  226. package/dist/utils/ci.d.ts +12 -0
  227. package/dist/utils/ci.js +16 -0
  228. package/dist/utils/command-references.d.ts +104 -0
  229. package/dist/utils/command-references.js +190 -0
  230. package/dist/utils/date.d.ts +8 -0
  231. package/dist/utils/date.js +13 -0
  232. package/dist/utils/executable-path.d.ts +5 -0
  233. package/dist/utils/executable-path.js +44 -0
  234. package/dist/utils/file-system.d.ts +58 -0
  235. package/dist/utils/file-system.js +432 -0
  236. package/dist/utils/index.d.ts +6 -0
  237. package/dist/utils/index.js +9 -0
  238. package/dist/utils/interactive.d.ts +85 -0
  239. package/dist/utils/interactive.js +174 -0
  240. package/dist/utils/item-discovery.d.ts +15 -0
  241. package/dist/utils/item-discovery.js +33 -0
  242. package/dist/utils/line-endings.d.ts +34 -0
  243. package/dist/utils/line-endings.js +46 -0
  244. package/dist/utils/match.d.ts +3 -0
  245. package/dist/utils/match.js +22 -0
  246. package/dist/utils/nested-change.d.ts +35 -0
  247. package/dist/utils/nested-change.js +185 -0
  248. package/dist/utils/shell-detection.d.ts +20 -0
  249. package/dist/utils/shell-detection.js +94 -0
  250. package/dist/utils/task-progress.d.ts +67 -0
  251. package/dist/utils/task-progress.js +184 -0
  252. package/package.json +74 -4
  253. package/schemas//351/273/230/350/256/244/schema.yaml +68 -0
  254. package/schemas//351/273/230/350/256/244/templates//344/273/273/345/212/241/346/270/205/345/215/225.md +25 -0
  255. package/schemas//351/273/230/350/256/244/templates//346/265/213/350/257/225/347/224/250/344/276/213.md +34 -0
  256. package/schemas//351/273/230/350/256/244/templates//350/256/276/350/256/241/346/226/207/346/241/243.md +172 -0
  257. package/schemas//351/273/230/350/256/244/templates//351/234/200/346/261/202/346/226/207/346/241/243.md +19 -0
  258. package/skill-files//344/273/273/345/212/241/references//346/212/244/346/240/217.md +43 -0
  259. package/skill-files//344/273/273/345/212/241/references//347/262/222/345/272/246.md +23 -0
  260. package/skill-files//344/273/273/345/212/241/references//347/272/246/346/235/237.md +8 -0
  261. package/skill-files//344/273/273/345/212/241/scripts/check-tasks.mjs +83 -0
  262. package/skill-files//345/206/231Java/references/Java/350/247/204/350/214/203.md +25 -0
  263. package/skill-files//345/206/231Java/references//345/215/261/351/231/251/345/206/231/346/263/225.md +27 -0
  264. package/skill-files//345/206/231Java/references//345/256/214/346/210/220/345/257/271/347/205/247.md +15 -0
  265. package/skill-files//345/206/231Java/references//346/212/244/346/240/217.md +35 -0
  266. package/skill-files//345/206/231Java/references//347/272/246/346/235/237.md +8 -0
  267. package/skill-files//345/206/231Java/references//350/270/251/345/235/221.md +17 -0
  268. package/skill-files//345/256/241Java/references//346/212/244/346/240/217.md +19 -0
  269. package/skill-files//345/256/241Java/references//347/244/272/344/276/213.md +23 -0
  270. package/skill-files//345/256/241Java/references//347/272/246/346/235/237.md +7 -0
  271. package/skill-files//345/256/241Java/references//350/247/204/345/210/231.md +23 -0
  272. package/skill-files//345/256/241Java/references//351/242/206/345/237/237/346/243/200/351/241/271.md +58 -0
  273. package/skill-files//345/256/241/346/226/207/346/241/243/references//346/212/244/346/240/217.md +18 -0
  274. package/skill-files//345/256/241/346/226/207/346/241/243/references//347/272/246/346/235/237.md +8 -0
  275. package/skill-files//345/256/241/346/226/207/346/241/243/references//347/273/264/345/272/246.md +17 -0
  276. package/skill-files//345/256/241/346/226/207/346/241/243/references//350/270/251/345/235/221.md +11 -0
  277. package/skill-files//346/226/260/345/273/272/references//344/272/244/346/216/245.md +11 -0
  278. package/skill-files//346/226/260/345/273/272/references//346/212/244/346/240/217.md +14 -0
  279. package/skill-files//346/226/260/345/273/272/references//347/272/246/346/235/237.md +7 -0
  280. package/skill-files//346/267/261/346/200/235/config/prompts.yaml +114 -0
  281. package/skill-files//346/267/261/346/200/235/references//344/270/211/346/226/271/346/240/270/345/257/271.md +72 -0
  282. package/skill-files//346/267/261/346/200/235/references//344/276/213/345/255/220.md +39 -0
  283. package/skill-files//346/267/261/346/200/235/references//346/200/216/344/271/210/346/203/263.md +61 -0
  284. package/skill-files//346/267/261/346/200/235/references//346/212/244/346/240/217.md +26 -0
  285. package/skill-files//346/267/261/346/200/235/references//347/202/271/351/200/211/346/217/220/351/227/256.md +66 -0
  286. package/skill-files//346/267/261/346/200/235/references//347/231/273/350/256/260.md +45 -0
  287. package/skill-files//346/267/261/346/200/235/references//347/272/246/346/235/237.md +9 -0
  288. package/skill-files//347/224/250/344/276/213/references//346/200/216/344/271/210/345/206/231.md +13 -0
  289. package/skill-files//347/224/250/344/276/213/references//346/212/244/346/240/217.md +42 -0
  290. package/skill-files//347/224/250/344/276/213/references//347/272/246/346/235/237.md +5 -0
  291. package/skill-files//347/224/250/344/276/213/scripts/check-cases.mjs +70 -0
  292. package/skill-files//350/256/276/350/256/241/references//345/207/206/345/244/207.md +25 -0
  293. package/skill-files//350/256/276/350/256/241/references//346/212/244/346/240/217.md +134 -0
  294. package/skill-files//350/256/276/350/256/241/references//346/226/207/351/243/216.md +17 -0
  295. package/skill-files//350/256/276/350/256/241/references//347/225/214/351/235/242.md +18 -0
  296. package/skill-files//350/256/276/350/256/241/references//347/261/273/345/236/213.md +19 -0
  297. package/skill-files//350/256/276/350/256/241/references//347/272/246/346/235/237.md +25 -0
  298. package/skill-files//350/256/276/350/256/241/scripts/_smoke.mjs +72 -0
  299. package/skill-files//350/256/276/350/256/241/scripts/check-design.mjs +331 -0
  300. package/skill-files//351/234/200/346/261/202/references//346/212/244/346/240/217.md +26 -0
  301. package/skill-files//351/234/200/346/261/202/references//346/226/207/351/243/216.md +23 -0
  302. package/skill-files//351/234/200/346/261/202/references//346/267/261/346/200/235/346/221/204/345/205/245.md +21 -0
  303. package/skill-files//351/234/200/346/261/202/references//347/272/246/346/235/237.md +8 -0
  304. package/skill-files//351/234/200/346/261/202/references//351/234/200/346/261/202/345/276/205/345/256/232.md +13 -0
  305. package/skill-files//351/234/200/346/261/202/scripts/check-requirements.mjs +60 -0
  306. package/skill-files//351/252/214/346/224/266/references//346/212/244/346/240/217.md +27 -0
  307. package/skill-files//351/252/214/346/224/266/references//346/240/270/345/257/271.md +17 -0
  308. package/skill-files//351/252/214/346/224/266/references//347/272/246/346/235/237.md +7 -0
@@ -0,0 +1,43 @@
1
+ # 护栏
2
+
3
+ 护栏挂在动作上,不靠回头翻清单。落盘前运行 `scripts/check-tasks.mjs`,脚本退出码不是 0,就不能交。必须项只在这一份。`references/约束.md` 只是尽量项。
4
+
5
+ ## 写每一条时查
6
+
7
+ 1. 用 `- [ ]` 开头,一行只写一条。勾选只改成 `- [x]`,不换别的符号。说明不要用 `- ` 开头。
8
+ 2. 每条写上「完成:」,后面写怎样算做完。脚本查这个标记在不在。功能点对得准不准人看,脚本不查。
9
+ 3. 设计里没有的章,不生造任务。设计只写了方法名、没有步骤的,不在这里补算法。
10
+
11
+ ## 重写整份清单时查
12
+
13
+ 1. 已经是 `- [x]` 的条目原样保留,不弄丢。
14
+ 2. 设计里没有的章,对应任务组整组删掉,不留空标题。
15
+ 3. 仓库里的脚本进仓库、已经在数据库执行过,分成两条写。
16
+
17
+ ## 遇到这些,停手
18
+
19
+ | 遇到什么 | 停下后干什么 |
20
+ |---|---|
21
+ | 功能点或设计缺到写不出这一条 | 停,问人。缺的记成需求待定,不要猜一句结果填上 |
22
+ | 设计步骤前后矛盾 | 停,问人,指出矛盾在哪两处。不要在任务里自己挑一边 |
23
+
24
+ ## 落盘前查
25
+
26
+ 1. 跑 `node scripts/check-tasks.mjs <任务清单.md>`,退出码是 0。
27
+ 2. 对话只报路径和没把握的条目。不开始写代码,不说「接下来实现」。
28
+
29
+ ## 脚本核对
30
+
31
+ 上面的句子给人读。脚本只执行下面这块。要放宽、改禁词,改这里,不用改脚本。
32
+
33
+ ```json
34
+ {
35
+ "核对": {
36
+ "任务行格式说明": "第{行}行的任务没有用 - [ ] 或 - [x] 开头",
37
+ "空组说明": "「{标题}」这个组下面一条任务都没有,整组删掉或补上任务",
38
+ "任务行禁词": ["优化", "完善", "提升", "大概", "可能", "后续再看"],
39
+ "禁词说明": "第{行}行用了「{词}」,写清具体做什么",
40
+ "完成标记说明": "第{行}行没有「完成:」。写上怎样算做完"
41
+ }
42
+ }
43
+ ```
@@ -0,0 +1,23 @@
1
+ # 任务粒度
2
+
3
+ 每条用简体中文写清做什么,并写上设计第几章、对应哪条功能点、怎样算做完。不要只写内部代号。
4
+
5
+ 禁止:优化、完善、提升、大概、可能、后续再看,以及「实现某模块」「完成后端」「做增删改查」。
6
+
7
+ 合适的一条:一个接口加上它的服务和主要失败分支,或一张表,或一页关键交互。
8
+
9
+ 不要每个导入、每个取值方法、每个按钮单独一条,除非设计把那一项单独要求出来。
10
+
11
+ 同一服务里紧耦合的接口可以并成一条,但句子里要列全接口和分支。
12
+
13
+ 缓存、开关、线程池、定时任务可以和相邻任务写在一起,句子里必须点出这些词。禁止只写「实现配置」却不出现「线程池」或「开关」。
14
+
15
+ 仓库里的脚本,和已经在数据库执行过,分成两条。
16
+
17
+ 设计只写了方法名、没有步骤的,不要在任务里补算法。
18
+
19
+ 没有对应设计章节的组整组删掉。没有设计时,合成一组「要做的事」,仍然用 `- [ ]`。
20
+
21
+ 重写清单时保留已经是 `- [x]` 的条目,不要重排后弄丢。
22
+
23
+ 一条里的设计引用不要超过三处。
@@ -0,0 +1,8 @@
1
+ # 约束
2
+
3
+ 这里只写尽量做到的事。必须项在 `references/护栏.md`。
4
+
5
+ ## 尽量
6
+
7
+ - 一条对应一个接口加它的服务,或一张表,或一页。
8
+ - 缓存、开关、定时任务、线程池在句子里点出来。
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 任务清单核对。条文在 references/护栏.md 的 json 块里,脚本只执行。
4
+ * 护栏未通过则退出码 1。
5
+ * 用法:node check-tasks.mjs <任务清单.md>
6
+ *
7
+ * 查四样:任务行格式(- [ ] 或 - [x] 开头)、空组(组标题下没有任务)、
8
+ * 任务行禁词、伪任务行(看着像列表项但不是勾选格式)。
9
+ * 一级标题(文档总标题)不算组。
10
+ */
11
+ import fs from 'node:fs';
12
+ import path from 'node:path';
13
+ import { fileURLToPath } from 'node:url';
14
+
15
+ const docPath = process.argv[2];
16
+ if (!docPath) {
17
+ console.error('用法:node check-tasks.mjs <任务清单.md>');
18
+ process.exit(2);
19
+ }
20
+
21
+ const here = path.dirname(fileURLToPath(import.meta.url));
22
+ const rulePath = path.join(here, '..', 'references', '护栏.md');
23
+ const fence = fs.readFileSync(rulePath, 'utf8').match(/```json\s*([\s\S]*?)```/);
24
+ let rules = {};
25
+ if (fence) {
26
+ try {
27
+ rules = JSON.parse(fence[1]).核对 ?? {};
28
+ } catch (error) {
29
+ console.error(`护栏.md 里的 json 读不了:${error.message}`);
30
+ process.exit(2);
31
+ }
32
+ }
33
+
34
+ function fill(template, vars) {
35
+ return String(template ?? '未通过').replace(/\{([^}]+)\}/g, (_, key) => vars[key] ?? '');
36
+ }
37
+
38
+ const lines = fs.readFileSync(docPath, 'utf8').split(/\r?\n/);
39
+ const found = [];
40
+ const groups = [];
41
+ let group = null;
42
+
43
+ lines.forEach((line, index) => {
44
+ const number = index + 1;
45
+ const head = /^(#{1,6})\s+(.+)$/.exec(line);
46
+ if (head) {
47
+ group = { title: head[2].trim(), level: head[1].length, hasTask: false };
48
+ groups.push(group);
49
+ return;
50
+ }
51
+ if (!/^\s*-\s+/.test(line)) return;
52
+ if (group == null) {
53
+ group = { title: '清单开头', level: 0, hasTask: false };
54
+ groups.push(group);
55
+ }
56
+ group.hasTask = true;
57
+ if (!/^\s*-\s+\[[ xX]\]/.test(line)) {
58
+ found.push(fill(rules.任务行格式说明, { 行: number }));
59
+ return;
60
+ }
61
+ if (!line.includes('完成:')) {
62
+ found.push(fill(rules.完成标记说明, { 行: number }));
63
+ }
64
+ for (const word of rules.任务行禁词 ?? []) {
65
+ if (line.includes(word)) {
66
+ found.push(fill(rules.禁词说明, { 行: number, 词: word }));
67
+ }
68
+ }
69
+ });
70
+
71
+ for (const item of groups) {
72
+ // 一级标题是文档总标题,不算组;没有任务的组标题是残留。
73
+ if (item.level >= 2 && !item.hasTask) {
74
+ found.push(fill(rules.空组说明, { 标题: item.title }));
75
+ }
76
+ }
77
+
78
+ if (found.length > 0) {
79
+ console.error(`未通过 ${found.length} 项:`);
80
+ for (const item of found) console.error(`- ${item}`);
81
+ process.exit(1);
82
+ }
83
+ console.log('通过');
@@ -0,0 +1,25 @@
1
+ # Java 默认写法
2
+
3
+ 本仓库已有的分层、异常、返回体、路径参数、工具库写法优先。没有先例时才用下面这些。
4
+
5
+ 控制器只接参数、做校验和鉴权,然后调服务。业务判断不要写在控制器里。
6
+
7
+ 多表写入要回滚时,在服务实现上加事务。传播行为和只读标记跟仓库里同类方法一致。改代码前确认模块和构建文件路径。
8
+
9
+ 判空和字符串优先 Hutool 的 StrUtil、CollUtil,其次 Commons 或 Spring 自带工具。
10
+
11
+ 简单对象用 Lombok,不要手写 Getter 和 Setter。对象转换优先 Stream。复杂逻辑可以用循环。对外不要返回裸 null,跟项目现有习惯用空集合或 Optional。
12
+
13
+ 日志用项目已有的方式。核心入口、外部调用前后、捕获处要打,带业务编号。不要打没有信息的「成功了」。
14
+
15
+ 不要空捕获。业务异常用项目里已有的类型。没有时再用 BizException 或 ServiceException。不要把数据库异常或空指针栈返回给调用方。
16
+
17
+ 不要把密钥写进代码。新增配置要在设计里有说明,放在项目已有的配置文件。
18
+
19
+ 改已有接口默认只追加。要破坏旧用法,必须是这次明确要求的。写操作按设计考虑能不能重复提交。
20
+
21
+ 名字用业务词。不要用 data1、obj2。布尔字段不要以 is 开头。简单增删改查直接写在服务里,不要为了模式再包一层。注释只解释看不出来的逻辑。
22
+
23
+ 目标类已经存在就改它,不要平行再建一个同职责的类。至少先读一个同包的同类。
24
+
25
+ 不要用 Executors 给业务建线程池,除非仓库里已经这样写。
@@ -0,0 +1,27 @@
1
+ # 危险写法
2
+
3
+ 这里只收写了会出事的:静默失效、数据损坏、安全漏洞。风格约定不在这里,在 `references/Java规范.md`。动手前扫一遍,写完自查一遍。
4
+
5
+ ## 数据库
6
+
7
+ 1. UPDATE 和 DELETE 必须有删不掉的 WHERE。动态 `<where>` 加一堆 `<if>`,条件全空时会更新全表。Java 侧先校验条件非空,XML 里 WHERE 写死。
8
+ 2. MyBatis 传参数一律 `#{}`。`${}` 是拼字符串,能被注入。动态表名、排序列必须先过白名单再进 `${}`。
9
+
10
+ ## 事务
11
+
12
+ 3. `@Transactional` 只加在 Service 层的 public 实例方法上。类级注解、Controller 上的、static 方法上的、`new` 出来的对象上的,都不生效。
13
+ 4. 写库的方法显式写 `rollbackFor = Exception.class`。不写的话,受检异常抛出后事务照样提交,半截数据落库。
14
+ 5. 同类里 `this.doCreate()` 不走 Spring 代理,事务不生效。拆到另一个 Bean 调用。
15
+ 6. 事务方法里 catch 了异常只打日志不重抛,事务照样提交。要回滚就重抛,或写 `setRollbackOnly()`。
16
+
17
+ ## 性能
18
+
19
+ 7. 循环里不查库。列表页 100 条主记录,循环里逐条查子记录,就是 101 次 SQL。改 JOIN 或批量 IN。
20
+ 8. 循环里不单条 insert。500 条数据就是 500 次 SQL。用 `<foreach>` 拼一条批量 insert,或 `saveBatch`。
21
+ 9. 循环里不调远程接口(HTTP、Feign、RPC)。改批量接口。没有批量接口时停下来问,不要先写了再说。
22
+
23
+ ## 金额与并发
24
+
25
+ 10. 金额字段一律 `BigDecimal`,禁止 `double`、`float`。比较用 `compareTo`,`equals` 会因精度位数不同判不等。
26
+ 11. 单例 Bean 里不放可变实例字段给并发读写。`SimpleDateFormat` 不能共享,用 `DateTimeFormatter`。
27
+ 12. `lock()` 后面紧跟 `try-finally` 释放。`countDown()` 放 `finally`。两者漏了,异常时锁不释放、等待永久阻塞。
@@ -0,0 +1,15 @@
1
+ # 完成对照
2
+
3
+ 每条任务开始前,用几行中文写:依据哪一节、要改哪些文件、怎样算做完。不超过十二行。用户说直接写码时可以不写这几行。
4
+
5
+ 勾选之前仍要写完成对照,不超过五行。即使用户说这轮做几条,也不能攒到最后。
6
+
7
+ 三行就够,每行都能单独看懂:
8
+
9
+ - 依据:设计第几章,或功能点原句
10
+ - 文件:改了哪些
11
+ - 测试:是否通过。有用例时要先看到失败,再看到通过
12
+
13
+ 不要写「已搞定」「写完了」「按设计实现了」。步骤用完整中文,不要用写边、选桶、查 bind。
14
+
15
+ 类名和路径可以留,旁边说明做了什么。
@@ -0,0 +1,35 @@
1
+ # 护栏
2
+
3
+ 护栏挂在动作上,不靠回头翻清单。做到哪一步,就查哪一步。必须项只在这一份。`references/约束.md` 只是尽量项。
4
+
5
+ ## 开工前查
6
+
7
+ 1. 有测试用例时,先确认这些测试现在跑不过。没看到失败,不写实现。
8
+ 2. 有任务清单时,只做最前面一条没勾的。开工前按 `references/完成对照.md` 写三行。
9
+ 3. 做哪条任务,只读设计里对应的那几节,不通读整篇设计。读不着的按停手处理。
10
+
11
+ ## 写码中遇到这些,停手
12
+
13
+ | 遇到什么 | 停下后干什么 |
14
+ |---|---|
15
+ | 设计里某个方法只有名字、没有步骤 | 停,问人。不要编算法,也不要把算法补进设计或任务清单 |
16
+ | 仓库现状和设计写的对不上 | 停,问人,指出设计哪一句和哪个文件对不上。不改设计正文,也不按错的硬写 |
17
+ | 要改需求、设计、任务、用例的正文才能继续 | 停,问人。设计那一步可以改需求文档里的一个词。写代码这一步不行。用户明确要求才可以改 |
18
+ | 用例怎么跑都不变红 | 停,问人。说明用例可能没断言到行为 |
19
+
20
+ ## 勾选前查
21
+
22
+ 1. 完成对照已经写:依据、文件、测试,三行。
23
+ 2. 有测试用例时,这一条对应用例的测试要先失败,再通过。没有测试用例时,按任务写完再勾。
24
+ 3. 涉及数据库脚本时,写清是脚本进仓库,还是已经在库里执行过。两件事不写成一句。
25
+ 4. 用户说这轮做几条,也是做完一条、对照一条、勾一条。不攒到最后一起勾。
26
+
27
+ ## 宣布做完前查
28
+
29
+ 1. 勾了几条,就是做完了几条。没勾的不说做完了。
30
+ 2. 对话报:做到哪一条、测试是否通过。试错过程不写进去。
31
+
32
+ ## 对话里不许
33
+
34
+ - 不贴代码全文和文档全文。
35
+ - 不说「接下来审代码」「接下来验收」。做完就停,等用户点名。
@@ -0,0 +1,8 @@
1
+ # 约束
2
+
3
+ 这里只写尽量做到的事。必须项在 `references/护栏.md`。
4
+
5
+ ## 尽量
6
+
7
+ - 沿用这个仓库里已经有的写法。
8
+ - 两份文档都没有时,按对话里已经说清的内容实现,并写明假设。
@@ -0,0 +1,17 @@
1
+ # 写 Java 时停下的情况
2
+
3
+ 设计或任务里某个方法只有名字、没有步骤:停下来问。不要自己编算法再勾上。
4
+
5
+ 算法和状态迁移不能建立在假设上。假设可以有,但要少,而且要写明。核心逻辑不能靠没确认的假设。
6
+
7
+ 一次只做一条未勾选任务。即使用户说一次做几条,也做完一条、对照一条、勾一条。不要攒到最后一起勾。
8
+
9
+ 旧数据或旧入口怎么处理,要写明。仓库里的脚本和已经在库里执行过,要分开说。
10
+
11
+ 没有用例、也没有任务清单时,按对话里已经说清的内容实现,并写明假设。
12
+
13
+ 对话里只报做到哪一条、测试是否通过。试错过程不写入完成对照。
14
+
15
+ 写 SQL、事务、循环、金额、线程前,先扫一遍 `references/危险写法.md`。那里是写了会出事的写法,不是风格建议。
16
+
17
+ 做完就停。
@@ -0,0 +1,19 @@
1
+ # 护栏
2
+
3
+ 护栏挂在动作上,不靠回头翻清单。必须项只在这一份。`references/约束.md` 只是尽量项。
4
+
5
+ ## 开评前查
6
+
7
+ 1. 评审范围明确:这次评什么,用户说了算,不猜。用户在本会话说过的警告不用管,这轮不再报。
8
+ 2. 只看 diff 和搜索到的证据。没搜到证据的,不升成必须改。
9
+
10
+ ## 判级别时查
11
+
12
+ 1. 结论是:通过、有条件通过、不通过。三者之一。
13
+ 2. 指出的问题写了文件。能定位到行的写了行。
14
+ 3. 结构喜好只算建议,不算严重。
15
+ 4. 建议最多三条,多的折成一句。
16
+
17
+ ## 报结论后查
18
+
19
+ 没有改代码,没有说「接下来改代码」「接下来验收」。
@@ -0,0 +1,23 @@
1
+ # 审 Java 的结论示例
2
+
3
+ ## 代码评审
4
+
5
+ 结论:不通过
6
+
7
+ 严重:
8
+
9
+ - 已有 RefundService,这次又新建了 RefundServiceV2,而且没有改原来的类。
10
+ - 证据:搜索命中 RefundService.java。调用是 RefundController 到 RefundServiceV2。
11
+ - 风险:仓库里会有两套退款逻辑。
12
+ - 改法:把新逻辑并进 RefundService 的原方法,删掉 RefundServiceV2。
13
+
14
+ 警告:
15
+
16
+ - RefundServiceV2 里自己写了空白判断,仓库里已有 StrUtil.isBlank。
17
+ - 改法:改用已有方法,删掉重复实现。
18
+
19
+ 建议:
20
+
21
+ - 两个服务方法只有实体类型不同。可以以后抽公共转换,这次不挡。
22
+
23
+ 不要把「要不要用策略模式」写成严重。编译失败要写文件和行,有证据才算严重。
@@ -0,0 +1,7 @@
1
+ # 约束
2
+
3
+ 这里只写尽量做到的事。必须项在 `references/护栏.md`。
4
+
5
+ ## 尽量
6
+
7
+ - 问题写清文件,能定位到行就写行。
@@ -0,0 +1,23 @@
1
+ # 审 Java 的规则
2
+
3
+ 只评这次 Java 改动。不改代码。不评文档齐不齐。不核对需求有没有做完。
4
+
5
+ 先看 diff,再用搜索核对。没有搜索到的证据,不要把结论升成严重。
6
+
7
+ 新建文件的类名如果以 Service、Controller、Facade、Manager、Helper、Handler、Wrapper、Biz、Core、Processor、Coordinator 结尾,先在仓库里搜同一职责。搜到了却没有扩展原类、又新建平行类,算严重。只是方法可以复用,算警告,写出原方法在哪。已有类被修改,不强制再搜一遍。
8
+
9
+ 自己又写一套判空、日期或字符串工具,而仓库里已有等价方法,算警告。
10
+
11
+ 同一个文件里有两处八行以上几乎一样的逻辑,算警告。
12
+
13
+ 新建类只包了一层转发,或简单增删改查包了三层以上,算警告。方法体只有一行转发,算建议。
14
+
15
+ 像「要不要用策略模式」这种结构喜好,只可以算建议,不要算严重。
16
+
17
+ 本仓库已有写法和这次 diff 冲突时,以仓库先例为准,并指出新代码哪里不一致。
18
+
19
+ diff 涉及 SQL、事务、循环、并发、IO、异常日志、安全、接口参数时,读 `references/领域检项.md` 里对应的那一组,按组里的检项查。哪组都不沾的改动不用读。
20
+
21
+ 意见必须是简体中文。先说风险,再写文件和依据。不要用黑话。类名可以留,旁边说明它在重复什么。
22
+
23
+ 结论用:通过、有条件通过、不通过。
@@ -0,0 +1,58 @@
1
+ # 领域检项
2
+
3
+ 改到哪个领域,查哪一组。不全量读。每组先写「看到什么信号」,再写「查什么」。查到才报,查不到不凑数。
4
+
5
+ ## 数据库(看到 SQL、Mapper XML、批量操作时查)
6
+
7
+ - UPDATE/DELETE 的 WHERE 能不能被绕过:动态条件全空时会不会全表执行。Java 侧有没有校验条件非空。
8
+ - IN 参数有没有上限:单批超过 1000 会撞数据库限制。大集合优先改 JOIN,改不了要分批(`Lists.partition`)。
9
+ - 有没有同表重复 JOIN、与结果集无关的子查询。过滤条件有没有下推到派生表内层。
10
+ - 列表查询有没有分页或硬上限:LIMIT、分页插件、pageSize 上限,动态 SQL 每个分支都要有界。全量导出要走流式或游标。
11
+ - 有没有 `SELECT *`。宽表应只取必要列。
12
+ - 格式化、转换类计算有没有下推到 DB 函数。应在 Java 侧做。
13
+ - 连接池参数:connection-timeout、max-lifetime、minimum-idle 配了没有。实例数乘池大小有没有超 DB 的 max_connections。
14
+
15
+ ## 事务(看到 @Transactional 或方法内多次写库时查)
16
+
17
+ - 注解位置:是不是 Service 层 public 实例方法,类是不是 Spring Bean。类级注解、Controller、static、`new` 出来的对象,事务都不生效。
18
+ - 写操作有没有显式 `rollbackFor = Exception.class`。默认只回滚 RuntimeException。
19
+ - 同类 `this` 自调用不走代理:事务方法是不是被同类别的方法直接调的。
20
+ - 事务方法内有没有 catch 吞异常不重抛:事务会照常提交。
21
+
22
+ ## 性能(看到循环体或集合处理时查)
23
+
24
+ - 循环内查库(N+1):改 JOIN 或批量 IN 加 `groupingBy`。
25
+ - 循环内单条 insert:改 `<foreach>` 批量或 `saveBatch`。
26
+ - 循环内调远程 API:改批量接口,没有批量接口应停下问,不是先写。
27
+
28
+ ## 并发(看到线程、线程池、共享状态时查)
29
+
30
+ - 有没有裸 `new Thread()`:应统一用 `@Async` 加自定义 `ThreadPoolTaskExecutor`,或复用已有线程池。
31
+ - 共享可变状态:单例 Bean 的可变字段、共享 `SimpleDateFormat`、check-then-act 非原子(改 `computeIfAbsent`)、双检锁字段没加 `volatile`。并发容器选型(`ConcurrentHashMap`、`CopyOnWriteArrayList`)。
32
+ - `ReentrantLock.lock()` 后是不是紧跟 `try-finally`;`CountDownLatch.countDown()` 在不在 `finally`。
33
+ - 多锁场景加锁顺序是不是全局唯一(如按 ID 排序)。`synchronized` 块内有没有调外部方法。
34
+
35
+ ## 资源泄漏(看到 IO、ThreadLocal、静态集合时查)
36
+
37
+ - 资源是否 try-with-resources。
38
+ - ThreadLocal 有没有在 `finally` 里 `remove()`。
39
+ - 静态集合是不是裸 `static Map` 只增不删:缓存要用带淘汰策略的容器(Caffeine 的 `maximumSize` 加 `expireAfterWrite`)。集合承载唯一状态数据时要确认持久化方案。
40
+
41
+ ## 异常日志(看到 catch、log 调用时查)
42
+
43
+ - 空 catch、只 `e.printStackTrace()`、只打 `e.getMessage()`。
44
+ - 异常对象是不是 log 方法的最后一个参数(保证堆栈完整)。
45
+ - 日志有没有业务上下文:userId、orderNo 之类,只有「失败」两个字没法定位。
46
+
47
+ ## 安全(看到 SQL 拼接、文件路径、加密、随机数时查)
48
+
49
+ - `${}` 拼接:动态表名、排序列有没有白名单校验。
50
+ - 路径拼接:有没有 `normalize()` 加 `startsWith(basePath)`。解压有没有防 Zip Slip。上传有没有扩展名白名单加重命名。下载路径是不是服务端映射。
51
+ - 密钥、口令有没有硬编码:应走环境变量或配置中心。
52
+ - 弱算法:MD5、SHA1、DES、AES-ECB。安全场景有没有用 `SecureRandom` 而不是 `new Random()`。
53
+ - 反序列化:Jackson 的 default typing、Fastjson 的 autoType 有没有关。
54
+
55
+ ## 接口(看到 Controller、请求对象时查)
56
+
57
+ - 参数校验:`@Validated` 加约束注解,或代码内手动校验,二者有其一。
58
+ - 金额字段是不是 `BigDecimal`,比较是不是 `compareTo`。
@@ -0,0 +1,18 @@
1
+ # 护栏
2
+
3
+ 护栏挂在动作上,不靠回头翻清单。必须项只在这一份。`references/约束.md` 只是尽量项。
4
+
5
+ ## 开评前查
6
+
7
+ 1. 只看已经存在的文件。缺的文件点名,不要求补齐,也不因此判不通过。
8
+ 2. 纯后端变更里,页面类检项整体记不适用,不空转。
9
+
10
+ ## 判级别时查
11
+
12
+ 1. 结论是:通过、有条件通过、不通过。三者之一。
13
+ 2. 有接口设计时,还在用的接口少了请求参数、成功响应或业务错误任一张表,标成阻塞。表被写成一段话,同样标成阻塞。
14
+ 3. 两份文档冲突时,更具体的设计为准,并指出需求里哪一句要改。不两边各打一耙。
15
+
16
+ ## 报结论后查
17
+
18
+ 没有改文件,没有写代码,没有说「接下来改文档」。
@@ -0,0 +1,8 @@
1
+ # 约束
2
+
3
+ 这里只写尽量做到的事。必须项在 `references/护栏.md`。
4
+
5
+ ## 尽量
6
+
7
+ - 问题条写清证据在哪一句、怎么改。
8
+ - 设计里没有的章,不要要求补回空章。
@@ -0,0 +1,17 @@
1
+ # 审文档的七项
2
+
3
+ 只看已经存在的文件。缺的文件点名,不要因此判不通过,也不要要求补齐。
4
+
5
+ 给业务看的摘要用 3 到 5 句白话,不要用内部编号刷屏。问题条写:哪一项、证据在哪一句、怎么改。级别只用:阻塞、重要、建议。
6
+
7
+ 1. 合理性:做法和目标对得上,风险和回滚说得清,没有明显做不到的承诺。
8
+ 2. 完整性:会改变功能点的缺口有没有写成需求待定,而不是被猜掉。前端不在这个仓库时,功能点里的草图可以留,不要算漏了前端任务。有接口设计时,还在用的接口少了请求参数、成功响应或业务错误任一张表,标成阻塞。表被写成一段话,同样标成阻塞。
9
+ 3. 一致性:需求、设计、任务、用例互相不打架。两份都写了且冲突时,更具体的设计为准,并指出需求里哪一句要改。不要两边各打一耙。功能点句子和它下面的草图不一致时,以句子为准。设计里的页面原型和需求功能点对不上时,标成阻塞。
10
+ 4. 清晰:业务能看懂需求背景、需求描述、功能点拆分和设计概述。句子能单独成立。黑话要指出来,并写成完整中文该怎么改。
11
+ 5. 可测试:功能点能对上用例或看得见的结果。
12
+ 6. 可追溯:任务和用例能指回功能点原句。没有这些文件就跳过。
13
+ 7. 可维护:不做的事写在设计概述里。设计里没有的章,按这次不涉及处理。范围外的事就写不涉及。
14
+
15
+ 有没拍板、而且会改变功能点或实现的问题,标成阻塞。
16
+
17
+ 结论用:通过、有条件通过、不通过。
@@ -0,0 +1,11 @@
1
+ # 审文档踩坑
2
+
3
+ 目录下有多个变更、用户没点名时,先问看哪一个。
4
+
5
+ 缺文件只点名。不要把缺文件写成不通过,也不要替用户补一篇。
6
+
7
+ 两份文档冲突时,采用更具体的那份设计,并写出需求里要改的那一句。
8
+
9
+ 范围外写成「下一期」是错的。范围外就写不涉及。
10
+
11
+ 结论只留判断和要改的那一句。
@@ -0,0 +1,11 @@
1
+ # 新建之后怎么说
2
+
3
+ 这次只建目录。
4
+
5
+ 目录已经存在时,问是继续用这个目录,还是换一个名字。不要另外再建一个。
6
+
7
+ 命令失败就用白话说明原因,再附上命令返回的错误。不要假装已经建好。
8
+
9
+ 成功时只报路径:`freespec/<名称>变更/`。
10
+
11
+ 这个目录是这次变更的抽屉。里面一开始只有 `.freespec.yaml`。
@@ -0,0 +1,14 @@
1
+ # 护栏
2
+
3
+ 护栏挂在动作上,不靠回头翻清单。必须项只在这一份。
4
+
5
+ ## 建之前查
6
+
7
+ 1. 名称拿不准时问过了。
8
+ 2. 目录已经存在时,问过继续用还是换名,没有另建一个。
9
+
10
+ ## 报结果前查
11
+
12
+ 1. 命令退出码是 0 才说建好。失败用白话说明原因,附上命令返回的错误,不假装建好。
13
+ 2. 这次只建了目录,目录在 `freespec/<名称>变更/`。
14
+ 3. 对话只说明路径。不说「接下来写需求」。
@@ -0,0 +1,7 @@
1
+ # 约束
2
+
3
+ 这里只写尽量做到的事。必须项在 `references/护栏.md`。
4
+
5
+ ## 尽量
6
+
7
+ - 名称用中文。用户没说「变更」时,原样传给命令,由命令补上。不要为了补这两个字再问一次。
@@ -0,0 +1,114 @@
1
+ # 往深处和旁边想时要看的漏洞。
2
+ # 用户原话、已有材料或仓库已经能补上的,写进答案,不要出题。
3
+ # 页面、表、接口对不上时,先点选以哪边为准,再出这里的题。
4
+ # 实物不在这里。按 references/三方核对.md。
5
+ # skip_if 成立就不要出这题。options 是点选项。
6
+ # allow_multiple 为 true 时人可以点多项。Cursor 对应 allow_multiple,Trae 对应 multiSelect。
7
+ # text 里的「这里换成…」出卡前换成仓库里看到的内容。没换成不要出这题。
8
+ # 不要跑脚本。不替设计发明新的路径、错误码、表结构。
9
+
10
+ layers:
11
+ - 范围
12
+ - 功能点
13
+ - 现状
14
+
15
+ prompts:
16
+ - id: SCOPE-01
17
+ layer: 范围
18
+ header: 这次范围
19
+ text: 这次动哪一块?旁边容易被算成同一次的,要不要算进来?
20
+ skip_if: 用户原话、已有材料或需求描述里已经写了动哪一块,以及这次不动的相邻块
21
+ allow_multiple: false
22
+ options:
23
+ - id: named-only
24
+ label: 只动已经点名的那一块
25
+ description: 旁边的页面、表、接口这次不改。
26
+ - id: with-neighbor
27
+ label: 连同相邻的一块一起动
28
+ description: 出题前把相邻块的名字写进 label。看不出名字就删掉这项。删掉后不足两项,不要出这题,记已定,结论写「只动已经点名的那一块」,并写明没有看出第二块。
29
+
30
+ - id: SCOPE-02
31
+ layer: 范围
32
+ header: 从哪完成
33
+ text: 人从哪里完成这件事?
34
+ skip_if: 已经说明有页面、没有页面,或从哪里触发
35
+ allow_multiple: false
36
+ options:
37
+ - id: page
38
+ label: 有页面,人在页面上完成
39
+ description: 可以写多了或少了哪一块。不问按钮怎么摆、字段怎么放。
40
+ - id: called
41
+ label: 没有页面,别的系统调进来
42
+ description: 不问按钮和字段怎么摆。
43
+ - id: job
44
+ label: 定时或人在后台跑
45
+ description: 答案里写谁触发、跑完怎样、不跑时怎样。
46
+ - id: data
47
+ label: 只改数据或配置
48
+ description: 没有人点的入口。
49
+
50
+ - id: SCOPE-03
51
+ layer: 范围
52
+ header: 谁能看见
53
+ text: 做完之后谁能看出不一样?
54
+ skip_if: 用户原话、已有材料或功能点里已经写了谁看见什么
55
+ allow_multiple: false
56
+ options:
57
+ - id: operator
58
+ label: 只有操作的人能看出不一样
59
+ description: 别人的界面不变。
60
+ - id: another
61
+ label: 还有别人能看见
62
+ description: 材料里已经有角色名,就把名字写进 label。没有名字就留这句话,不要编一个角色。
63
+ - id: log-only
64
+ label: 人看不出来,只留记录
65
+ description: 答案里写留下什么记录。
66
+
67
+ - id: NOW-01
68
+ layer: 现状
69
+ header: 现有行为
70
+ text: 仓库里现在是「这里换成你看到的行为」。这次保持,还是改掉?
71
+ skip_if: 已经对照过现有实现,并写进答案
72
+ allow_multiple: false
73
+ options:
74
+ - id: keep
75
+ label: 保持仓库里现在的行为
76
+ description: 这次不改这段已经在跑的做法。
77
+ - id: change
78
+ label: 改成这次要的行为
79
+ description: 问句里要已经写上现在是什么样。没写上就不要出这题。
80
+
81
+ - id: FUNC-01
82
+ layer: 功能点
83
+ header: 异常情况
84
+ text: 失败、重复、没有数据,这三种里哪种这次要管?不管的不用点。
85
+ skip_if: 答案、功能点或需求待定里已经写了这三种
86
+ allow_multiple: true
87
+ note: 如果「三种这次都不管」和另外几项一起被点中,丢掉「三种这次都不管」,只记被点中的具体项。
88
+ options:
89
+ - id: fail
90
+ label: 失败要有人能看出来
91
+ description: 答案里要写失败时谁看见什么。
92
+ - id: retry
93
+ label: 重复提交要有确定结果
94
+ description: 同一次事情来第二次,结果要写明。
95
+ - id: empty
96
+ label: 没有数据要有确定结果
97
+ description: 找不到时谁看见什么,要写明。
98
+ - id: none
99
+ label: 三种这次都不管
100
+ description: 只在三种都不管时单选这一项。
101
+
102
+ - id: FUNC-02
103
+ layer: 功能点
104
+ header: 旧数据
105
+ text: 以前已经产生的数据,要不要一起改?
106
+ skip_if: 用户原话、答案或需求描述里已经写了历史数据
107
+ allow_multiple: false
108
+ options:
109
+ - id: migrate
110
+ label: 以前的数据一起改
111
+ description: 答案里要写旧数据变成什么样。
112
+ - id: leave
113
+ label: 以前的数据保持不动
114
+ description: 只影响这次新发生的。答案里写明旧数据不在这次范围内。