@namewta/speculo 0.3.4 → 0.4.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 (65) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/template/skills/typescript-standards-builder/README.md +53 -0
  4. package/template/skills/typescript-standards-builder/SKILL.md +245 -0
  5. package/template/skills/typescript-standards-builder/examples/sample-generated-tree.md +30 -0
  6. package/template/skills/typescript-standards-builder/examples/sample-interview-decisions.md +26 -0
  7. package/template/skills/typescript-standards-builder/manifest.txt +29 -0
  8. package/template/skills/typescript-standards-builder/references/00-governance-and-fixed-defaults.md +77 -0
  9. package/template/skills/typescript-standards-builder/references/01-project-discovery.md +100 -0
  10. package/template/skills/typescript-standards-builder/references/02-interview-workflow.md +129 -0
  11. package/template/skills/typescript-standards-builder/references/03-project-architecture-and-directory-layout.md +84 -0
  12. package/template/skills/typescript-standards-builder/references/04-file-directory-and-symbol-naming.md +92 -0
  13. package/template/skills/typescript-standards-builder/references/05-modules-imports-exports-and-dependencies.md +63 -0
  14. package/template/skills/typescript-standards-builder/references/06-typescript-type-system.md +64 -0
  15. package/template/skills/typescript-standards-builder/references/07-functions-async-errors-and-resources.md +42 -0
  16. package/template/skills/typescript-standards-builder/references/08-comments-jsdoc-and-documentation.md +51 -0
  17. package/template/skills/typescript-standards-builder/references/09-testing-strategy.md +58 -0
  18. package/template/skills/typescript-standards-builder/references/10-react-and-frontend.md +39 -0
  19. package/template/skills/typescript-standards-builder/references/11-node-cli-and-cross-platform.md +31 -0
  20. package/template/skills/typescript-standards-builder/references/12-formatting-lint-and-complexity.md +58 -0
  21. package/template/skills/typescript-standards-builder/references/13-configuration-dependencies-and-ci.md +71 -0
  22. package/template/skills/typescript-standards-builder/references/14-security-performance-and-i18n.md +32 -0
  23. package/template/skills/typescript-standards-builder/references/15-git-review-and-delivery.md +28 -0
  24. package/template/skills/typescript-standards-builder/references/16-adoption-exceptions-and-migration.md +61 -0
  25. package/template/skills/typescript-standards-builder/references/17-generation-contract.md +104 -0
  26. package/template/skills/typescript-standards-builder/references/README.md +37 -0
  27. package/template/skills/typescript-standards-builder/templates/agents-compat-skill/SKILL.md +1 -0
  28. package/template/skills/typescript-standards-builder/templates/claude-skill/SKILL.md +1 -0
  29. package/template/skills/typescript-standards-builder/templates/project-skill/SKILL.md.template +34 -0
  30. package/template/skills/typescript-standards-builder/templates/project-skill/references/00-project-profile.md.template +17 -0
  31. package/template/skills/typescript-standards-builder/templates/project-skill/references/10-review-checklist.md +23 -0
  32. package/template/skills/typescript-standards-builder/templates/project-skill/references/11-decisions-and-exceptions.md.template +19 -0
  33. package/template/skills/typescript-engineering-standards/README.md +0 -36
  34. package/template/skills/typescript-engineering-standards/SKILL.md +0 -158
  35. package/template/skills/typescript-engineering-standards/examples/comment-patterns.md +0 -47
  36. package/template/skills/typescript-engineering-standards/examples/naming-patterns.md +0 -42
  37. package/template/skills/typescript-engineering-standards/examples/project-layouts.md +0 -75
  38. package/template/skills/typescript-engineering-standards/examples/review-output-example.md +0 -25
  39. package/template/skills/typescript-engineering-standards/examples/type-modeling-patterns.md +0 -66
  40. package/template/skills/typescript-engineering-standards/manifest.txt +0 -33
  41. package/template/skills/typescript-engineering-standards/references/00-standard-levels-and-precedence.md +0 -51
  42. package/template/skills/typescript-engineering-standards/references/01-project-architecture-and-directory-layout.md +0 -105
  43. package/template/skills/typescript-engineering-standards/references/02-file-directory-and-symbol-naming.md +0 -117
  44. package/template/skills/typescript-engineering-standards/references/03-modules-imports-exports-and-dependencies.md +0 -111
  45. package/template/skills/typescript-engineering-standards/references/04-typescript-type-system.md +0 -150
  46. package/template/skills/typescript-engineering-standards/references/05-functions-async-errors-and-resources.md +0 -142
  47. package/template/skills/typescript-engineering-standards/references/06-comments-jsdoc-and-documentation.md +0 -104
  48. package/template/skills/typescript-engineering-standards/references/07-testing-strategy.md +0 -84
  49. package/template/skills/typescript-engineering-standards/references/08-react-and-frontend.md +0 -91
  50. package/template/skills/typescript-engineering-standards/references/09-node-cli-and-cross-platform.md +0 -92
  51. package/template/skills/typescript-engineering-standards/references/10-formatting-lint-and-complexity.md +0 -107
  52. package/template/skills/typescript-engineering-standards/references/11-configuration-dependencies-and-ci.md +0 -86
  53. package/template/skills/typescript-engineering-standards/references/12-security-performance-and-i18n.md +0 -65
  54. package/template/skills/typescript-engineering-standards/references/13-git-review-and-delivery.md +0 -79
  55. package/template/skills/typescript-engineering-standards/references/14-adoption-exceptions-and-migration.md +0 -84
  56. package/template/skills/typescript-engineering-standards/references/15-orca-derived-observations.md +0 -54
  57. package/template/skills/typescript-engineering-standards/references/README.md +0 -45
  58. package/template/skills/typescript-engineering-standards/templates/.editorconfig +0 -12
  59. package/template/skills/typescript-engineering-standards/templates/AGENTS.typescript.md +0 -21
  60. package/template/skills/typescript-engineering-standards/templates/code-review-checklist.md +0 -37
  61. package/template/skills/typescript-engineering-standards/templates/package-scripts.json +0 -11
  62. package/template/skills/typescript-engineering-standards/templates/prettier.json +0 -6
  63. package/template/skills/typescript-engineering-standards/templates/pull-request-template.md +0 -37
  64. package/template/skills/typescript-engineering-standards/templates/tsconfig.base.json +0 -17
  65. package/template/skills/typescript-engineering-standards/templates/tsconfig.project-references.json +0 -8
@@ -0,0 +1,129 @@
1
+ # 用户问答与决策收敛
2
+
3
+ ## 总体原则
4
+
5
+ 问答的目标是确认项目规则,而不是让用户重复描述仓库事实。
6
+
7
+ - 一次确认一个决策维度。
8
+ - 每个问题给出推荐默认值和理由。
9
+ - 选项必须具体可执行,不使用“严格一点”“灵活一点”等空泛描述。
10
+ - 用户回答后立即记录,不重复询问。
11
+ - 只问真正影响生成结果的内容。
12
+ - 固定默认原则不重复征求同意,除非存在硬冲突。
13
+
14
+ ## 推荐提问顺序
15
+
16
+ ### 1. 规范范围和遗留策略
17
+
18
+ 仅在范围不明确时询问:
19
+
20
+ - 整个仓库。
21
+ - 指定应用或包。
22
+ - 新代码强制、旧代码 Ratchet。
23
+ - 全量迁移并设置阶段计划。
24
+
25
+ 推荐:成熟项目采用“新代码强制、旧代码只降不升”。
26
+
27
+ ### 2. 目录主轴
28
+
29
+ 仅在仓库结构混乱或新项目中询问:
30
+
31
+ - 业务领域优先,运行环境作为第一层边界。
32
+ - 架构层优先。
33
+ - 包边界优先的 Monorepo。
34
+ - 保留现有结构,仅禁止继续扩散问题。
35
+
36
+ 默认:先隔离运行环境,再在环境内部按业务领域组织;领域内部局部平铺。
37
+
38
+ ### 3. React 文件命名
39
+
40
+ 仅 React 项目且仓库没有统一事实时询问:
41
+
42
+ - `PascalCase.tsx` 业务组件,Hook 使用 `use-*.ts`。
43
+ - 全部 `kebab-case.tsx`。
44
+ - 保留生成器目录的特殊规则,业务代码使用统一规则。
45
+
46
+ ### 4. 模块和公开 API
47
+
48
+ 在导出方式不统一时询问:
49
+
50
+ - 默认命名导出;默认导出仅限框架入口。
51
+ - 保持现有默认导出惯例。
52
+ - Barrel 仅允许作为领域或包公共入口。
53
+ - 完全禁止 Barrel。
54
+
55
+ 推荐:命名导出优先,Barrel 只用于稳定公共入口。
56
+
57
+ ### 5. 类型建模
58
+
59
+ 在项目没有明确偏好时询问:
60
+
61
+ - 默认 `type`,需要声明合并或扩展时使用 `interface`。
62
+ - 默认 `interface`,联合和工具类型使用 `type`。
63
+ - 完全遵循现有局部惯例。
64
+
65
+ 同时确认外部输入验证使用已有 Schema 库,还是要求自定义守卫。不得为此擅自引入新依赖。
66
+
67
+ ### 6. 文件大小预算
68
+
69
+ 根据实际分布推荐阈值。可询问:
70
+
71
+ - 普通 `.ts`、`.tsx`、测试、脚本分别设置软上限。
72
+ - 仅设置“超限必须说明”的审查门槛。
73
+ - 先使用 Ratchet,不立即阻塞历史超限文件。
74
+
75
+ 推荐基线可从 `.ts` 300、`.tsx` 400、测试 700、脚本 600 行开始,但必须根据项目分位数调整。
76
+
77
+ ### 7. 测试与门禁
78
+
79
+ 确认:
80
+
81
+ - 单元测试共置的文件后缀。
82
+ - 集成、契约和 E2E 的目录。
83
+ - PR 必跑的 `format:check`、`lint`、`typecheck`、`test`、`build`。
84
+ - 是否运行受影响测试还是全量测试。
85
+
86
+ 固定默认:单元测试共置,缺陷修复需要回归测试,核心门禁不得被删除或跳过。
87
+
88
+ ### 8. 例外和迁移
89
+
90
+ 确认项目如何记录:
91
+
92
+ - Lint/类型例外说明格式。
93
+ - TODO 的任务编号格式。
94
+ - 临时例外的负责人和删除条件。
95
+ - 历史债务的 Ratchet 指标。
96
+
97
+ ## 结束条件
98
+
99
+ 当以下内容均已确定即可停止提问:
100
+
101
+ - 目录和命名规则可执行。
102
+ - 类型、安全和运行时验证边界明确。
103
+ - 文件大小与拆分策略明确。
104
+ - 测试位置、命名和门禁明确。
105
+ - 例外和遗留治理明确。
106
+ - 项目特有框架规则已覆盖。
107
+
108
+ 不要为了填满问题数量继续提问。
109
+
110
+ ## 决策摘要格式
111
+
112
+ ```md
113
+ ## 自动识别
114
+ - 包管理器:pnpm
115
+ - 模块系统:ESM
116
+ - 测试:Vitest,单元测试已共置
117
+
118
+ ## 用户确认
119
+ - React 组件使用 PascalCase.tsx
120
+ - Barrel 仅用于包公共入口
121
+
122
+ ## 默认基线
123
+ - 领域内部局部平铺
124
+ - 注释解释 WHY
125
+ - 普通 TS 文件软上限 300 行
126
+
127
+ ## 兼容例外
128
+ - generated/ 保留生成器命名,不执行文件大小检查
129
+ ```
@@ -0,0 +1,84 @@
1
+ # 项目架构与目录布局
2
+
3
+ ## 先表达稳定边界
4
+
5
+ 目录优先表达以下一种或组合后的稳定边界:
6
+
7
+ - 运行环境:`main/`、`renderer/`、`server/`、`worker/`、`cli/`。
8
+ - 产品领域:`user-auth/`、`orders/`、`payments/`。
9
+ - 架构职责:`domain/`、`application/`、`infrastructure/`。
10
+ - 独立发布单元:`apps/`、`packages/`。
11
+
12
+ 对多运行环境项目,通常先隔离运行环境,再在各环境内部按领域组织。
13
+
14
+ ## 领域内部局部平铺
15
+
16
+ 这是生成规范的固定默认原则:一个职责明确的领域目录应优先直接平铺文件,不为每个文件建立同名目录。
17
+
18
+ 推荐:
19
+
20
+ ```text
21
+ features/user-auth/
22
+ ├── login-command.ts
23
+ ├── login-command.test.ts
24
+ ├── login-policy.ts
25
+ ├── login-service.ts
26
+ └── user-session.ts
27
+ ```
28
+
29
+ 不推荐:
30
+
31
+ ```text
32
+ features/user-auth/
33
+ ├── commands/login/login-command.ts
34
+ ├── policies/login/login-policy.ts
35
+ └── services/login/login-service.ts
36
+ ```
37
+
38
+ 增加子目录的条件:
39
+
40
+ - 形成稳定、可命名的子领域。
41
+ - 同级文件长期较多,浏览成本明显上升。
42
+ - 文件组拥有独立入口、资源、夹具或生命周期。
43
+ - 文件组需要整体移动、替换或发布。
44
+ - 运行环境或依赖方向要求物理隔离。
45
+
46
+ 阈值应根据项目实际规模确定,不能机械复制通用数字。
47
+
48
+ ## 领域优先,技术类型局部化
49
+
50
+ 小项目可从技术类型目录起步;业务增长后,应把 `components/`、`hooks/`、`services/` 等技术目录移动到对应领域内部。
51
+
52
+ 不要在同一层混用互不相干的分类主轴。
53
+
54
+ ## `shared/` 准入
55
+
56
+ 代码进入共享层前应满足:
57
+
58
+ 1. 至少有两个真实调用方。
59
+ 2. 不依赖具体业务领域。
60
+ 3. 能用具体名称说明能力。
61
+ 4. API 相对稳定。
62
+ 5. 不造成反向依赖。
63
+ 6. 共享确实减少重复,而非提前抽象。
64
+
65
+ `shared/` 不是“不知道放哪里”的收容区。
66
+
67
+ ## 多运行环境
68
+
69
+ - 各环境使用独立 `tsconfig` 或项目引用。
70
+ - 浏览器代码不得意外导入 Node 专属模块。
71
+ - 服务端代码不得无意依赖 DOM。
72
+ - 跨环境数据通过显式、可序列化、可版本化契约。
73
+ - 桥接 API 最小化,并验证所有边界输入。
74
+
75
+ 不要把 Electron 专属的 `main/preload/renderer` 目录复制到普通项目;只在实际存在这些运行环境时采用。
76
+
77
+ ## 拆分信号
78
+
79
+ - 一个目录同时包含多个运行环境。
80
+ - 改动一个领域经常触发无关领域。
81
+ - 文件名需要大量前缀才能区分。
82
+ - 公共入口持续扩大。
83
+ - 依赖图出现循环。
84
+ - 不同部分需要不同构建、发布或权限策略。
@@ -0,0 +1,92 @@
1
+ # 文件、目录与标识符命名
2
+
3
+ ## 文件名必须具体
4
+
5
+ 这是固定默认原则。文件名应表达“领域 + 职责”,使搜索结果和代码评审无需打开文件即可理解用途。
6
+
7
+ 推荐:
8
+
9
+ - `user-session-store.ts`
10
+ - `payment-retry-policy.ts`
11
+ - `terminal-output-parser.ts`
12
+ - `github-auth-client.ts`
13
+ - `workspace-path-validator.ts`
14
+
15
+ 默认禁止把不相关能力堆进:
16
+
17
+ - `utils.ts`
18
+ - `helpers.ts`
19
+ - `common.ts`
20
+ - `misc.ts`
21
+ - `general.ts`
22
+ - `manager.ts`
23
+ - `processor.ts`
24
+ - `handler.ts`
25
+ - 全局 `types.ts`
26
+ - 全局 `constants.ts`
27
+
28
+ 父目录已经提供完整语义时,局部 `types.ts` 可以作为兼容例外;仍优先考虑可搜索的具体名称。
29
+
30
+ ## 默认命名
31
+
32
+ 项目生成时必须结合仓库事实确认,常用基线为:
33
+
34
+ | 对象 | 默认规则 | 示例 |
35
+ |---|---|---|
36
+ | 目录 | `kebab-case` | `user-auth/` |
37
+ | 普通 TypeScript 文件 | `kebab-case.ts` | `session-expiration-policy.ts` |
38
+ | React 业务组件 | `PascalCase.tsx` | `SessionExpiredDialog.tsx` |
39
+ | Hook | `use-*.ts` / `use-*.tsx` | `use-session-timeout.ts` |
40
+ | 单元测试 | 源文件名 + `.test` | `login-service.test.ts` |
41
+ | 集成测试 | `.integration.test` | `payment-flow.integration.test.ts` |
42
+ | E2E | `.e2e.spec` | `checkout.e2e.spec.ts` |
43
+ | 声明文件 | 环境或能力名 | `electron-api.d.ts` |
44
+ | 工程脚本 | 动宾结构 | `generate-icons.ts` |
45
+
46
+ 生成器或框架管理的文件可保留其约定,必须在项目规范中标出适用范围。
47
+
48
+ ## 职责后缀
49
+
50
+ - `-service`:完整应用能力,不得成为万能类。
51
+ - `-repository`:领域对象的持久化抽象。
52
+ - `-client`:外部 HTTP、RPC 或 SDK 客户端。
53
+ - `-adapter`:接口或模型适配。
54
+ - `-gateway`:外部系统或资源边界。
55
+ - `-store`:状态保存和更新。
56
+ - `-selector`:状态派生。
57
+ - `-policy`:可替换业务决策。
58
+ - `-validator`:验证输入。
59
+ - `-parser` / `-serializer`:格式转换。
60
+ - `-mapper`:明确模型之间映射。
61
+ - `-factory`:复杂对象或依赖图构造。
62
+ - `-registry`:实现注册和查找。
63
+ - `-scheduler`:任务调度。
64
+ - `-coordinator`:多个流程协调。
65
+ - `-contract`:跨模块、跨进程或公开 API 契约。
66
+
67
+ 后缀不能替代领域信息。单独的 `service.ts` 仍然模糊。
68
+
69
+ ## 标识符
70
+
71
+ - 变量、函数、方法:`camelCase`。
72
+ - 类型、类、组件:`PascalCase`。
73
+ - 真正常量:`SCREAMING_SNAKE_CASE`。
74
+ - 私有字段:`#field` 或 `private`,不加无意义 `_`。
75
+ - Hook:`useXxx`。
76
+ - 事件属性:`onXxx`。
77
+ - 内部事件处理:`handleXxx`。
78
+ - 泛型:简单时 `T`,复杂时 `TResult`、`TContext`。
79
+
80
+ ## 布尔与单位
81
+
82
+ 布尔值优先:`isConnected`、`hasAccess`、`canRetry`、`shouldPersist`。
83
+
84
+ 数值名称包含单位或语义:
85
+
86
+ ```ts
87
+ const timeoutMs = 30_000
88
+ const payloadSizeBytes = 1_024
89
+ const retryCount = 3
90
+ ```
91
+
92
+ 避免 `flag`、`data`、`info`、`obj`、`temp` 等无信息名称。
@@ -0,0 +1,63 @@
1
+ # 模块、导入、导出与依赖
2
+
3
+ ## 命名导出优先
4
+
5
+ 默认使用命名导出。默认导出仅用于:
6
+
7
+ - 框架规定的页面、路由或配置入口。
8
+ - 工具链要求的入口。
9
+ - 仓库已经形成且用户确认保留的惯例。
10
+
11
+ ## 一个文件一个主要公开概念
12
+
13
+ 一个文件可以包含少量私有辅助函数,但通常只公开一个主要能力或一组高度相关能力。达到独立职责的辅助逻辑应拆为具体命名文件,不得拆成新的 `helpers.ts`。
14
+
15
+ ## Barrel 文件
16
+
17
+ 允许 `index.ts`:
18
+
19
+ - 作为包或领域的明确公共入口。
20
+ - 隐藏内部实现并稳定外部 API。
21
+ - 作为依赖装配或框架入口。
22
+
23
+ 禁止:
24
+
25
+ - 每个目录机械创建 `index.ts`。
26
+ - 建立全项目万能 Barrel。
27
+ - 暴露内部实现。
28
+ - 用 Barrel 隐藏循环依赖。
29
+
30
+ ## 导入
31
+
32
+ 常用顺序:Node 内置、第三方、项目别名、相对路径、类型导入。具体顺序由项目格式化或 Lint 工具执行。
33
+
34
+ 要求:
35
+
36
+ - Node 内置模块使用 `node:` 前缀。
37
+ - 仅作为类型使用时采用 `import type`。
38
+ - 不保留未使用和重复导入。
39
+ - 副作用导入必须有明确原因。
40
+ - 路径别名对应稳定边界,不用于任意跨层跳转。
41
+
42
+ ## 依赖方向
43
+
44
+ 推荐:
45
+
46
+ ```text
47
+ UI / Entry
48
+
49
+ Application orchestration
50
+
51
+ Domain
52
+
53
+ Ports / contracts
54
+
55
+ Infrastructure adapters
56
+ ```
57
+
58
+ - 领域逻辑不直接依赖数据库、HTTP、文件系统或 UI 框架。
59
+ - 共享模块不依赖具体领域。
60
+ - 底层模块不反向导入界面层。
61
+ - 跨环境调用通过显式契约和适配器。
62
+
63
+ 循环依赖必须作为架构问题处理,而不是调整导入顺序掩盖。
@@ -0,0 +1,64 @@
1
+ # TypeScript 类型系统规范
2
+
3
+ ## 严格模式
4
+
5
+ 新项目必须启用 `strict`。成熟项目根据现状制定分阶段迁移,但新代码不得继续增加宽松类型债务。
6
+
7
+ 建议评估:
8
+
9
+ - `noUncheckedIndexedAccess`
10
+ - `exactOptionalPropertyTypes`
11
+ - `noImplicitOverride`
12
+ - `noImplicitReturns`
13
+ - `noFallthroughCasesInSwitch`
14
+ - `useUnknownInCatchVariables`
15
+ - `verbatimModuleSyntax`
16
+ - `isolatedModules`
17
+ - `forceConsistentCasingInFileNames`
18
+
19
+ 必须与当前编译器、模块系统和构建工具兼容。
20
+
21
+ ## 外部输入使用 `unknown`
22
+
23
+ HTTP、RPC、WebSocket、IPC、CLI 参数、环境变量、JSON、数据库反序列化、本地存储、第三方 SDK 和插件输入默认不可信。
24
+
25
+ 类型断言不能替代运行时验证。优先使用项目已存在的 Schema 库或明确类型守卫,不擅自引入新依赖。
26
+
27
+ ## 禁止传播 `any`
28
+
29
+ `any` 仅允许存在于极小兼容层,并满足:
30
+
31
+ - 最小作用域。
32
+ - 有原因和退出条件。
33
+ - 经过运行时验证后再向内部传递。
34
+ - 不进入公共 API。
35
+
36
+ ## 可辨识联合
37
+
38
+ 互斥状态使用单一判别字段,避免多个可能矛盾的布尔值。状态分支执行穷尽检查。
39
+
40
+ ## `type` 与 `interface`
41
+
42
+ 由问答确定项目默认偏好。无项目事实时推荐:默认使用 `type`;需要声明合并、公开扩展或明确 `implements` 契约时使用 `interface`。
43
+
44
+ ## 类型标注
45
+
46
+ 必须显式标注:
47
+
48
+ - 导出函数返回类型。
49
+ - 跨模块公共 API。
50
+ - 插件、回调和扩展点。
51
+ - 递归函数。
52
+ - 权限、金额、状态转换等高风险函数。
53
+
54
+ 局部明显变量可依赖推断。
55
+
56
+ ## 断言、空值和声明文件
57
+
58
+ 优先顺序:控制流收窄、类型守卫、运行时验证、`satisfies`、最后才使用 `as`。
59
+
60
+ 禁止无理由双重断言和 `@ts-ignore`。必须压制时使用带原因的 `@ts-expect-error`。
61
+
62
+ 明确区分可选属性、`null`、`undefined` 和失败结果。
63
+
64
+ `.d.ts` 只用于环境、模块、声明扩展和发布声明;普通业务类型放在 `.ts`。
@@ -0,0 +1,42 @@
1
+ # 函数、异步、错误与资源生命周期
2
+
3
+ ## 函数职责
4
+
5
+ 函数只处理一个可命名职责和一个抽象层级。项目规范可设置函数行数、嵌套和参数数量的软预算,但不得为满足数字做无意义拆分。
6
+
7
+ - 使用 Guard Clause 减少嵌套。
8
+ - 长参数列表和布尔参数改为具名参数对象。
9
+ - 分离解析、验证、领域决策、I/O 和流程编排。
10
+ - 纯逻辑不读取隐藏全局状态,不修改输入。
11
+
12
+ ## Promise 必须有归宿
13
+
14
+ 所有 Promise 必须被 `await`、`return`、显式收集,或用 `void` 明确脱离当前流程并自行处理错误。
15
+
16
+ 只有互相独立的任务才使用 `Promise.all`。大型输入不得无界并发。
17
+
18
+ ## 取消、超时与重试
19
+
20
+ 网络、子进程、文件监听、Worker 和长任务应考虑:
21
+
22
+ - `AbortSignal`。
23
+ - 明确超时。
24
+ - 清理路径。
25
+ - 可识别取消错误。
26
+ - 超时后底层资源是否真正停止。
27
+
28
+ 重试必须定义最大次数、退避、抖动、可重试错误和幂等性。
29
+
30
+ ## 错误
31
+
32
+ 不得吞掉异常。错误应包含操作上下文并保留 `cause`。
33
+
34
+ 调用方需要分支处理的错误使用具名错误类、结构化 `code`、`Result<T, E>` 或可辨识联合,不匹配错误消息字符串。
35
+
36
+ `catch` 值视为 `unknown`,先收窄再处理。
37
+
38
+ ## 资源清理
39
+
40
+ 事件监听器、Timer、文件句柄、Socket、数据库连接、Worker、子进程、`AbortController` 和 React Effect 订阅必须有明确生命周期。
41
+
42
+ 创建资源的模块通常负责定义或暴露清理方式,可返回清理函数或实现 `dispose()`。
@@ -0,0 +1,51 @@
1
+ # 注释、JSDoc 与文档
2
+
3
+ ## 注释必须关注 WHY
4
+
5
+ 这是固定默认原则。注释用于解释代码无法直接表达的原因和约束:
6
+
7
+ - 为什么必须采用此顺序。
8
+ - 为什么不能删除看似多余的逻辑。
9
+ - 平台、协议、性能或安全约束。
10
+ - 第三方缺陷和规避方案。
11
+ - 竞态条件和资源生命周期。
12
+ - 非直观产品规则。
13
+
14
+ 不逐行翻译代码,不用注释补救模糊命名或过大模块。
15
+
16
+ ## 风格
17
+
18
+ - 优先一行或短段落。
19
+ - 靠近被解释逻辑。
20
+ - 原因必须具体、可验证。
21
+ - 修改实现时同步更新。
22
+ - 看似特殊的兼容或性能逻辑应说明删除条件。
23
+
24
+ ## 不应提交
25
+
26
+ - 注释掉的旧代码。
27
+ - 无跟踪信息的“以后优化”。
28
+ - 与实现重复的大篇教程。
29
+ - 无法验证的猜测。
30
+
31
+ ## JSDoc
32
+
33
+ 主要用于:
34
+
35
+ - 公共库 API。
36
+ - 插件和扩展点。
37
+ - 跨团队、跨包或跨进程契约。
38
+ - 参数有单位、边界或特殊格式。
39
+ - 函数有重要副作用、取消或异常语义。
40
+
41
+ 内部显而易见函数不机械添加 JSDoc。
42
+
43
+ ## TODO 与设计文档
44
+
45
+ TODO 必须符合项目确认的任务编号格式并说明删除条件,例如:
46
+
47
+ ```ts
48
+ // TODO(PROJ-1423): Remove after all clients send protocol v3.
49
+ ```
50
+
51
+ 多方案权衡、迁移计划和长期架构放入 `docs/` 或 ADR;源码注释只保留理解当前实现所需的最小上下文。
@@ -0,0 +1,58 @@
1
+ # 测试策略
2
+
3
+ ## 单元测试靠近实现
4
+
5
+ 这是固定默认原则:单元测试与源文件共置,便于发现、移动、重命名和维护。
6
+
7
+ ```text
8
+ shell-command-quote.ts
9
+ shell-command-quote.test.ts
10
+ ```
11
+
12
+ 跨模块集成、契约和 E2E 测试集中管理,例如:
13
+
14
+ ```text
15
+ tests/
16
+ ├── integration/
17
+ ├── contracts/
18
+ └── e2e/
19
+ ```
20
+
21
+ 生成项目规范时应根据现有框架确认实际后缀和目录,不机械复制示例。
22
+
23
+ ## 测试命名
24
+
25
+ 测试名描述可观察行为,不描述实现步骤。禁止 `it('works')` 和 `describe('utils')`。
26
+
27
+ ## 覆盖范围
28
+
29
+ 关键模块考虑:
30
+
31
+ - 正常路径。
32
+ - 边界和空输入。
33
+ - 无效输入。
34
+ - 错误传播。
35
+ - 取消和超时。
36
+ - 并发或重复调用。
37
+ - 资源清理。
38
+ - 已修复缺陷的回归场景。
39
+
40
+ ## 缺陷修复
41
+
42
+ 1. 添加稳定复现问题的失败测试。
43
+ 2. 确认修复前失败。
44
+ 3. 实施最小修复。
45
+ 4. 确认回归和相关测试通过。
46
+ 5. 必要时增加跨平台或集成测试。
47
+
48
+ ## 确定性与 Mock
49
+
50
+ 测试不依赖真实当前时间、外部不稳定网络、执行顺序、共享可变全局状态、本机特定路径或无种子随机数。
51
+
52
+ Mock 系统边界,不 Mock 被测模块每个内部调用。优先测试真实纯函数和可观察行为。
53
+
54
+ ## 质量门禁
55
+
56
+ - 不得为使 CI 通过而删除或长期跳过失败测试。
57
+ - 新功能和缺陷修复必须按风险补充测试。
58
+ - 测试代码同样遵守清晰命名、资源清理和大小预算。
@@ -0,0 +1,39 @@
1
+ # React 与前端规范
2
+
3
+ 仅在项目实际使用 React 或类似组件框架时生成本模块。
4
+
5
+ ## 组件
6
+
7
+ - Props 明确表达输入,渲染尽量纯粹。
8
+ - 数据获取、业务状态编排、领域交互和视觉展示按复杂度拆分。
9
+ - 组件使用具体领域名称,避免 `CommonModal`、`GenericPanel`。
10
+ - 组件文件命名由仓库事实或用户问答确认。
11
+
12
+ ## Props 与 Hook
13
+
14
+ - Props 类型使用项目统一命名,如 `XxxProps`。
15
+ - 布尔 Props 使用 `is`、`has`、`can`、`should`。
16
+ - 事件 Props 使用 `onXxx`。
17
+ - 复杂互斥状态使用联合类型,不用多个布尔值构造隐式状态机。
18
+ - 自定义 Hook 以 `use` 开头,一个 Hook 一个可命名职责。
19
+ - Effect 依赖完整,创建资源时返回清理函数。
20
+
21
+ ## 状态和 Effect
22
+
23
+ - 状态尽量靠近使用位置。
24
+ - Store 按领域切片,不创建单一巨型 Store。
25
+ - 派生数据优先计算,不重复存储。
26
+ - Effect 用于与外部系统同步,不替代普通计算。
27
+ - 异步 Effect 考虑取消、竞态和过期响应。
28
+
29
+ ## 性能与可访问性
30
+
31
+ - 不滥用 `memo`、`useMemo`、`useCallback`。
32
+ - 优化基于测量或已识别瓶颈。
33
+ - 长列表使用虚拟化,高频事件使用调度或节流。
34
+ - 使用语义化 HTML,交互支持键盘,图标按钮有可访问名称。
35
+ - 不以颜色作为唯一状态表达。
36
+
37
+ ## 浏览器边界
38
+
39
+ 验证 URL、消息、Storage 和第三方脚本输入;不把秘密放入前端 Bundle;不直接导入 Node 专属模块,除非平台提供受控桥接。
@@ -0,0 +1,31 @@
1
+ # Node.js、CLI 与跨平台规范
2
+
3
+ 仅在项目实际包含 Node.js、CLI、Electron 主进程或服务端代码时生成相关部分。
4
+
5
+ ## 路径和文件系统
6
+
7
+ - 使用 `node:path` 等标准 API,不手工拼接平台路径。
8
+ - 考虑 Windows 分隔符、盘符、UNC、符号链接、路径遍历和大小写差异。
9
+ - 文件操作明确编码、原子性、权限和清理路径。
10
+
11
+ ## CLI
12
+
13
+ - 参数解析、验证、命令执行和错误渲染分离。
14
+ - 错误写入 `stderr`,机器可读正常输出写入 `stdout`。
15
+ - 明确定义退出码。
16
+ - 底层领域逻辑不直接调用 `process.exit()`。
17
+ - 信号处理和资源清理集中管理。
18
+
19
+ ## 环境变量
20
+
21
+ 在启动边界一次性读取、验证和标准化环境变量,转换为只读配置对象。业务代码不得在各处直接访问 `process.env`。
22
+
23
+ ## 子进程和 Shell
24
+
25
+ - 优先使用参数数组而非拼接 Shell 字符串。
26
+ - 明确超时、取消、信号、输出上限和清理。
27
+ - 用户输入不得未经转义进入命令。
28
+
29
+ ## 多运行环境
30
+
31
+ Node、浏览器、Electron 主进程、预加载和 Worker 使用独立类型与构建配置。只复制实际存在的运行环境结构,不机械创建不相关目录。