speccore 6.83.0 → 6.89.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 (96) hide show
  1. package/dist/commands/analyze.d.ts.map +1 -1
  2. package/dist/commands/analyze.js +32 -7
  3. package/dist/commands/analyze.js.map +1 -1
  4. package/dist/commands/change.d.ts.map +1 -1
  5. package/dist/commands/change.js +39 -1
  6. package/dist/commands/change.js.map +1 -1
  7. package/dist/commands/init.d.ts.map +1 -1
  8. package/dist/commands/init.js +118 -0
  9. package/dist/commands/init.js.map +1 -1
  10. package/dist/commands/pr.d.ts.map +1 -1
  11. package/dist/commands/pr.js +75 -38
  12. package/dist/commands/pr.js.map +1 -1
  13. package/dist/core/agents/defaults/_INDEX.md +68 -0
  14. package/dist/core/agents/defaults/_TEMPLATE.md +34 -0
  15. package/dist/core/agents/defaults/code-reviewer.md +49 -0
  16. package/dist/core/agents/defaults/compiler.md +25 -0
  17. package/dist/core/agents/defaults/compliance-checker.md +38 -0
  18. package/dist/core/agents/defaults/dependency-analyst.md +42 -0
  19. package/dist/core/agents/defaults/doc-sync-agent.md +25 -0
  20. package/dist/core/agents/defaults/impact-analyst.md +37 -0
  21. package/dist/core/agents/defaults/interaction-designer.md +73 -0
  22. package/dist/core/agents/defaults/performance-expert.md +35 -0
  23. package/dist/core/agents/defaults/product-analyst-backend.md +68 -0
  24. package/dist/core/agents/defaults/product-analyst-frontend.md +72 -0
  25. package/dist/core/agents/defaults/product-analyst.md +48 -0
  26. package/dist/core/agents/defaults/regression-tester.md +36 -0
  27. package/dist/core/agents/defaults/risk-assessor.md +38 -0
  28. package/dist/core/agents/defaults/schedule-planner.md +37 -0
  29. package/dist/core/agents/defaults/security-reviewer-finance.md +67 -0
  30. package/dist/core/agents/defaults/security-reviewer.md +43 -0
  31. package/dist/core/agents/defaults/task-decomposer.md +33 -0
  32. package/dist/core/agents/defaults/test-engineer.md +25 -0
  33. package/dist/core/agents/defaults/test-reviewer.md +48 -0
  34. package/dist/core/agents/engine/agent-executor.d.ts +50 -0
  35. package/dist/core/agents/engine/agent-executor.d.ts.map +1 -0
  36. package/dist/core/agents/engine/agent-executor.js +225 -0
  37. package/dist/core/agents/engine/agent-executor.js.map +1 -0
  38. package/dist/core/agents/engine/agent-loader.d.ts +58 -0
  39. package/dist/core/agents/engine/agent-loader.d.ts.map +1 -0
  40. package/dist/core/agents/engine/agent-loader.js +377 -0
  41. package/dist/core/agents/engine/agent-loader.js.map +1 -0
  42. package/dist/core/agents/engine/types.d.ts +71 -0
  43. package/dist/core/agents/engine/types.d.ts.map +1 -0
  44. package/dist/core/agents/engine/types.js +8 -0
  45. package/dist/core/agents/engine/types.js.map +1 -0
  46. package/dist/core/agents/index.d.ts +4 -0
  47. package/dist/core/agents/index.d.ts.map +1 -1
  48. package/dist/core/agents/index.js +17 -1
  49. package/dist/core/agents/index.js.map +1 -1
  50. package/dist/core/command-loader.d.ts +31 -0
  51. package/dist/core/command-loader.d.ts.map +1 -0
  52. package/dist/core/command-loader.js +76 -0
  53. package/dist/core/command-loader.js.map +1 -0
  54. package/dist/core/commands/defaults/change-impact.md +40 -0
  55. package/dist/core/commands/defaults/pr-review.md +42 -0
  56. package/dist/core/commands/defaults/refactor.md +37 -0
  57. package/dist/core/context-injector.d.ts +56 -0
  58. package/dist/core/context-injector.d.ts.map +1 -0
  59. package/dist/core/context-injector.js +122 -0
  60. package/dist/core/context-injector.js.map +1 -0
  61. package/dist/core/hook-runner.d.ts +36 -0
  62. package/dist/core/hook-runner.d.ts.map +1 -0
  63. package/dist/core/hook-runner.js +93 -0
  64. package/dist/core/hook-runner.js.map +1 -0
  65. package/dist/core/hooks/defaults/post-execute.md +22 -0
  66. package/dist/core/hooks/defaults/pre-execute.md +18 -0
  67. package/dist/core/prompt-builder.d.ts +1 -0
  68. package/dist/core/prompt-builder.d.ts.map +1 -1
  69. package/dist/core/prompt-builder.js +60 -1
  70. package/dist/core/prompt-builder.js.map +1 -1
  71. package/dist/core/rule-loader.d.ts +38 -0
  72. package/dist/core/rule-loader.d.ts.map +1 -0
  73. package/dist/core/rule-loader.js +156 -0
  74. package/dist/core/rule-loader.js.map +1 -0
  75. package/dist/core/rules/defaults/_INDEX.md +16 -0
  76. package/dist/core/rules/defaults/api-design.md +44 -0
  77. package/dist/core/rules/defaults/database.md +37 -0
  78. package/dist/core/rules/defaults/frontend-common.md +38 -0
  79. package/dist/core/rules/defaults/nodejs.md +38 -0
  80. package/dist/core/rules/defaults/react.md +34 -0
  81. package/dist/core/rules/defaults/security.md +31 -0
  82. package/dist/core/rules/defaults/testing.md +35 -0
  83. package/dist/core/rules/defaults/typescript.md +36 -0
  84. package/dist/core/skill-loader.d.ts +28 -0
  85. package/dist/core/skill-loader.d.ts.map +1 -0
  86. package/dist/core/skill-loader.js +102 -0
  87. package/dist/core/skill-loader.js.map +1 -0
  88. package/dist/core/skills/defaults/caching.md +33 -0
  89. package/dist/core/skills/defaults/db-migration.md +46 -0
  90. package/dist/core/skills/defaults/deployment.md +50 -0
  91. package/dist/core/skills/defaults/logging.md +38 -0
  92. package/dist/core/verify-engine.d.ts +7 -0
  93. package/dist/core/verify-engine.d.ts.map +1 -1
  94. package/dist/core/verify-engine.js +27 -1
  95. package/dist/core/verify-engine.js.map +1 -1
  96. package/package.json +2 -2
@@ -0,0 +1,38 @@
1
+ ---
2
+ appliesTo:
3
+ - nodejs
4
+ - node
5
+ - nestjs
6
+ - express
7
+ priority: 80
8
+ ---
9
+
10
+ # Node.js / NestJS 服务端规范
11
+
12
+ ## API 设计
13
+
14
+ - **RESTful 标准**:使用 HTTP 方法表达语义(GET/POST/PUT/DELETE/PATCH)。
15
+ - **路由规范**:`/api/v{版本}/{模块}/{资源}`,如 `/api/v1/users`。
16
+ - **状态码**:正确使用 HTTP 状态码(200/201/204/400/401/403/404/409/422/500)。
17
+ - **统一响应格式**:
18
+ ```json
19
+ { "code": 0, "data": {}, "message": "ok" }
20
+ ```
21
+
22
+ ## 错误处理
23
+
24
+ - **全局异常过滤器**:NestJS 使用 `ExceptionFilter`,Express 使用中间件。
25
+ - **业务异常**:自定义 `BusinessException`,必须包含错误码和可读消息。
26
+ - **不暴露内部错误**:生产环境不返回堆栈信息。
27
+
28
+ ## 依赖注入
29
+
30
+ - **NestJS**:优先使用构造函数注入,避免 `@Inject()` 字符串令牌。
31
+ - **分层架构**:Controller → Service → Repository,禁止跨层调用。
32
+ - **接口隔离**:Service 层面向接口编程,便于测试和替换。
33
+
34
+ ## 数据访问
35
+
36
+ - **ORM 优先**:使用 TypeORM / Prisma / Sequelize,禁止裸写 SQL(复杂查询除外)。
37
+ - **事务边界**:多表操作必须使用事务,通过装饰器或显式事务管理。
38
+ - **N+1 防护**:使用 `relations` + `select` 或 DataLoader 避免 N+1 查询。
@@ -0,0 +1,34 @@
1
+ ---
2
+ appliesTo:
3
+ - react
4
+ - reactjs
5
+ priority: 90
6
+ ---
7
+
8
+ # React 组件规范
9
+
10
+ ## 组件设计
11
+
12
+ - **函数组件优先**:所有新组件使用函数组件 + Hooks。
13
+ - **单一职责**:一个组件只负责一个功能,超过 200 行必须拆分。
14
+ - **Props 接口**:必须定义 `interface Props`,禁止用 `any`。
15
+ - **默认导出**:页面级组件默认导出,业务组件命名导出。
16
+
17
+ ## Hooks 规范
18
+
19
+ - **自定义 Hooks**:复用逻辑必须抽成自定义 Hook,以 `use` 开头。
20
+ - **依赖数组**:`useEffect`、`useMemo`、`useCallback` 的依赖数组必须完整。
21
+ - **禁止在循环/条件中调用 Hooks**。
22
+ - **清理副作用**:`useEffect` 返回清理函数(订阅、定时器、事件监听)。
23
+
24
+ ## 状态管理
25
+
26
+ - **局部状态优先**:能用 `useState` 就不用全局状态。
27
+ - **全局状态**:使用 Context + useReducer 或 Redux/Zustand,禁止 prop drilling 超过 3 层。
28
+ - **表单状态**:复杂表单使用 React Hook Form 或 Formik。
29
+
30
+ ## 性能
31
+
32
+ - **.memo 使用**:仅对纯展示组件且接收复杂 props 时使用。
33
+ - **懒加载**:路由级组件使用 `React.lazy()` + `Suspense`。
34
+ - **避免内联对象/函数**:作为 props 传递时会导致不必要的重渲染。
@@ -0,0 +1,31 @@
1
+ ---
2
+ appliesTo:
3
+ - security
4
+ priority: 100
5
+ ---
6
+
7
+ # 安全编码规范
8
+
9
+ ## 输入验证
10
+
11
+ - **不信任任何输入**:所有用户输入必须校验(长度、类型、范围、格式)。
12
+ - **白名单校验**:优先使用允许列表(白名单),而非禁止列表(黑名单)。
13
+ - **参数化查询**:数据库查询必须使用参数化/预处理语句,禁止字符串拼接 SQL。
14
+
15
+ ## 认证与授权
16
+
17
+ - **最小权限原则**:每个接口明确所需权限,默认拒绝。
18
+ - **敏感操作二次确认**:资金操作、数据删除等需要额外验证(如短信/密码)。
19
+ - **Token 安全**:JWT 设置合理过期时间(Access Token 15min,Refresh Token 7d),使用 HTTPS 传输。
20
+
21
+ ## 数据保护
22
+
23
+ - **敏感数据加密**:密码使用 bcrypt/argon2,身份证号/银行卡号使用 AES-256 加密存储。
24
+ - **日志脱敏**:日志中不出现明文密码、Token、身份证号。
25
+ - **防泄漏**:错误响应不暴露堆栈、数据库结构、内部路径。
26
+
27
+ ## 常见漏洞防护
28
+
29
+ - **XSS**:输出到 DOM 前转义,使用框架内置的 XSS 防护(React/Vue 自动转义)。
30
+ - **CSRF**:状态变更操作使用 CSRF Token 或 SameSite Cookie。
31
+ - **文件上传**:限制文件类型(白名单)、大小、存储路径(禁止执行权限)。
@@ -0,0 +1,35 @@
1
+ ---
2
+ appliesTo:
3
+ - test
4
+ - jest
5
+ - vitest
6
+ - testing
7
+ priority: 60
8
+ ---
9
+
10
+ # 测试规范
11
+
12
+ ## 测试策略
13
+
14
+ - **测试金字塔**:单元测试(70%)→ 集成测试(20%)→ E2E 测试(10%)。
15
+ - **覆盖目标**:核心业务逻辑覆盖率 ≥ 80%,分支覆盖率 ≥ 70%。
16
+ - **测试文件名**:`{module}.test.ts` 或 `{module}.spec.ts`,与源码同目录或 `__tests__/` 下。
17
+
18
+ ## 单元测试
19
+
20
+ - **独立性**:每个测试用例独立,不依赖执行顺序。
21
+ - **Arrange-Act-Assert**:三段式结构清晰。
22
+ - **Mock 外部依赖**:HTTP 请求、数据库、文件系统必须 Mock。
23
+ - **命名规范**:`should {预期行为} when {条件}`,如 `should return 401 when token is expired`。
24
+
25
+ ## 集成测试
26
+
27
+ - **真实依赖**:使用测试数据库(如 SQLite 内存 / TestContainers)。
28
+ - **环境隔离**:每个测试套件前清理数据,后回滚事务。
29
+ - **API 契约**:验证请求/响应格式符合 OpenAPI 定义。
30
+
31
+ ## 禁止
32
+
33
+ - 不在测试中写逻辑(如 if/for),只调用和断言。
34
+ - 不测试第三方库(如测试 `lodash` 的 `debounce`)。
35
+ - 不提交 `.only`、`.skip` 到主分支。
@@ -0,0 +1,36 @@
1
+ ---
2
+ appliesTo:
3
+ - typescript
4
+ - ts
5
+ priority: 100
6
+ ---
7
+
8
+ # TypeScript 编码规范
9
+
10
+ ## 类型安全
11
+
12
+ - **禁止 `any`**:除非与第三方库交互,否则不使用 `any`。使用 `unknown` + 类型守卫替代。
13
+ - **禁止 `@ts-ignore`**:必须使用 `@ts-expect-error` 并附注释说明原因。
14
+ - **严格模式**:项目必须开启 `strict: true`。
15
+ - **显式返回类型**:公共 API 函数必须声明返回类型。
16
+
17
+ ## 命名规范
18
+
19
+ - 类型/接口:`PascalCase`(如 `UserProfile`)
20
+ - 变量/函数:`camelCase`(如 `getUserName`)
21
+ - 常量:`UPPER_SNAKE_CASE`(如 `MAX_RETRY_COUNT`)
22
+ - 枚举:`PascalCase`,成员 `UPPER_SNAKE_CASE`
23
+ - 布尔变量:使用 `is`、`has`、`should` 前缀(如 `isLoading`)
24
+
25
+ ## 模块组织
26
+
27
+ - 一个文件一个核心导出(类/函数/组件)
28
+ - 工具函数按领域分组(`utils/validation.ts`、`utils/date.ts`)
29
+ - barrel export 使用 `index.ts` 统一暴露模块公共 API
30
+ - 禁止循环依赖
31
+
32
+ ## 异步规范
33
+
34
+ - 优先使用 `async/await`,避免回调地狱
35
+ - Promise 链必须有 `.catch()` 或 `try/catch`
36
+ - 并行请求使用 `Promise.all()`,但注意错误处理
@@ -0,0 +1,28 @@
1
+ /**
2
+ * SKILLS 可复用技能库加载器
3
+ *
4
+ * 负责:
5
+ * 1. 扫描 .speccore/SKILLS/ 目录下的技能定义文件
6
+ * 2. 根据任务类型/关键词匹配对应的技能
7
+ * 3. 注入到代码生成 prompt 中
8
+ *
9
+ * v6.88.0+
10
+ */
11
+ export interface SkillDefinition {
12
+ name: string;
13
+ content: string;
14
+ tags: string[];
15
+ }
16
+ /**
17
+ * 根据任务关键词匹配适用的技能
18
+ */
19
+ export declare function resolveSkillsForTask(taskKeywords: string[], projectRoot: string): Promise<SkillDefinition[]>;
20
+ /**
21
+ * 将匹配的技能合并为 prompt 字符串
22
+ */
23
+ export declare function formatSkillsPrompt(skills: SkillDefinition[]): string;
24
+ export declare function getBuiltinSkillContents(): Promise<{
25
+ name: string;
26
+ content: string;
27
+ }[]>;
28
+ //# sourceMappingURL=skill-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-loader.d.ts","sourceRoot":"","sources":["../../src/core/skill-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AA0DD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,EAAE,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,EAAE,CAAC,CAS5B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAqBpE;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAE5F"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ /**
3
+ * SKILLS 可复用技能库加载器
4
+ *
5
+ * 负责:
6
+ * 1. 扫描 .speccore/SKILLS/ 目录下的技能定义文件
7
+ * 2. 根据任务类型/关键词匹配对应的技能
8
+ * 3. 注入到代码生成 prompt 中
9
+ *
10
+ * v6.88.0+
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.resolveSkillsForTask = resolveSkillsForTask;
14
+ exports.formatSkillsPrompt = formatSkillsPrompt;
15
+ exports.getBuiltinSkillContents = getBuiltinSkillContents;
16
+ const path_1 = require("path");
17
+ const fs_extra_1 = require("fs-extra");
18
+ const BUILTIN_SKILLS_DIR = (0, path_1.join)(__dirname, 'skills', 'defaults');
19
+ async function scanSkillFiles(dir) {
20
+ if (!(await (0, fs_extra_1.pathExists)(dir)))
21
+ return [];
22
+ const entries = await (0, fs_extra_1.readdir)(dir, { withFileTypes: true });
23
+ const skills = [];
24
+ for (const e of entries) {
25
+ if (!e.isFile() || !e.name.endsWith('.md'))
26
+ continue;
27
+ if (e.name.startsWith('_'))
28
+ continue;
29
+ const content = await (0, fs_extra_1.readFile)((0, path_1.join)(dir, e.name), 'utf-8');
30
+ skills.push({
31
+ name: e.name.replace(/\.md$/, ''),
32
+ content,
33
+ });
34
+ }
35
+ return skills;
36
+ }
37
+ function parseSkillMeta(content) {
38
+ const tags = [];
39
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n/);
40
+ if (frontmatterMatch) {
41
+ const fm = frontmatterMatch[1];
42
+ const tagsMatch = fm.match(/tags:\s*\n((\s+-\s+.+\n)+)/);
43
+ if (tagsMatch) {
44
+ for (const line of tagsMatch[1].matchAll(/-\s+(.+)/g)) {
45
+ tags.push(line[1].trim().toLowerCase());
46
+ }
47
+ }
48
+ }
49
+ return { tags };
50
+ }
51
+ async function loadAllSkills(projectRoot) {
52
+ const userSkillsDir = (0, path_1.join)(projectRoot, '.speccore', 'SKILLS');
53
+ const skillMap = new Map();
54
+ const builtinFiles = await scanSkillFiles(BUILTIN_SKILLS_DIR);
55
+ for (const f of builtinFiles) {
56
+ const meta = parseSkillMeta(f.content);
57
+ skillMap.set(f.name, { name: f.name, content: f.content, tags: meta.tags });
58
+ }
59
+ const userFiles = await scanSkillFiles(userSkillsDir);
60
+ for (const f of userFiles) {
61
+ const meta = parseSkillMeta(f.content);
62
+ skillMap.set(f.name, { name: f.name, content: f.content, tags: meta.tags });
63
+ }
64
+ return Array.from(skillMap.values());
65
+ }
66
+ /**
67
+ * 根据任务关键词匹配适用的技能
68
+ */
69
+ async function resolveSkillsForTask(taskKeywords, projectRoot) {
70
+ const allSkills = await loadAllSkills(projectRoot);
71
+ const keywords = taskKeywords.map(s => s.toLowerCase());
72
+ const matched = allSkills.filter(skill => {
73
+ return skill.tags.some(tag => keywords.some(kw => kw.includes(tag) || tag.includes(kw)));
74
+ });
75
+ return matched;
76
+ }
77
+ /**
78
+ * 将匹配的技能合并为 prompt 字符串
79
+ */
80
+ function formatSkillsPrompt(skills) {
81
+ if (skills.length === 0)
82
+ return '';
83
+ const sections = [];
84
+ sections.push('## 可复用技能参考');
85
+ sections.push('');
86
+ sections.push('> 以下技能指南供参考,按需应用。');
87
+ sections.push('');
88
+ for (const skill of skills) {
89
+ let content = skill.content;
90
+ content = content.replace(/^---\n[\s\S]*?\n---\n/, '');
91
+ content = content.trim();
92
+ sections.push(`### ${skill.name}`);
93
+ sections.push('');
94
+ sections.push(content);
95
+ sections.push('');
96
+ }
97
+ return sections.join('\n');
98
+ }
99
+ async function getBuiltinSkillContents() {
100
+ return scanSkillFiles(BUILTIN_SKILLS_DIR);
101
+ }
102
+ //# sourceMappingURL=skill-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../src/core/skill-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ ---
2
+ tags:
3
+ - cache
4
+ - redis
5
+ - performance
6
+ - memoization
7
+ ---
8
+
9
+ # 缓存技能
10
+
11
+ ## 缓存策略
12
+
13
+ | 策略 | 适用场景 | 缺点 |
14
+ |------|---------|------|
15
+ | Cache-Aside | 读多写少 | 首次读取慢 |
16
+ | Write-Through | 强一致性要求 | 写延迟增加 |
17
+ | Write-Behind | 高写入吞吐量 | 数据丢失风险 |
18
+ | Read-Through | 简化应用逻辑 | 缓存 miss 时延迟高 |
19
+
20
+ ## Redis 最佳实践
21
+
22
+ 1. **Key 命名空间**:`service:entity:id:field`,如 `user:profile:1234:email`
23
+ 2. **TTL 设置**:根据数据变化频率设置合理过期时间
24
+ 3. **序列化**:使用 JSON 或 MessagePack,避免存储对象引用
25
+ 4. **连接池**:使用连接池管理 Redis 连接
26
+ 5. **缓存穿透**:对不存在 key 设置空值缓存(短 TTL)
27
+ 6. **缓存雪崩**:设置随机 TTL 偏移量
28
+
29
+ ## 本地缓存
30
+
31
+ - Node.js:使用 `lru-cache` 或 `node-cache`
32
+ - 前端:使用 `React.memo`、`useMemo`、`useCallback`
33
+ - 限制:本地缓存仅存放热点数据,大小不超过 100MB
@@ -0,0 +1,46 @@
1
+ ---
2
+ tags:
3
+ - database
4
+ - migration
5
+ - schema
6
+ - typeorm
7
+ - prisma
8
+ ---
9
+
10
+ # 数据库迁移技能
11
+
12
+ ## 迁移原则
13
+
14
+ 1. **向后兼容**:先加字段/表,后删字段/表,中间版本兼容
15
+ 2. **可回滚**:每个迁移必须有 `up()` 和 `down()`
16
+ 3. **数据安全**:生产环境迁移先备份
17
+ 4. **分批执行**:大数据量迁移分批处理,避免锁表
18
+
19
+ ## 迁移示例(TypeORM)
20
+
21
+ ```typescript
22
+ export class AddUserProfile1672531200000 implements MigrationInterface {
23
+ name = 'AddUserProfile1672531200000';
24
+
25
+ public async up(queryRunner: QueryRunner): Promise<void> {
26
+ await queryRunner.addColumn('users', new TableColumn({
27
+ name: 'avatar',
28
+ type: 'varchar',
29
+ length: '500',
30
+ isNullable: true,
31
+ }));
32
+ }
33
+
34
+ public async down(queryRunner: QueryRunner): Promise<void> {
35
+ await queryRunner.dropColumn('users', 'avatar');
36
+ }
37
+ }
38
+ ```
39
+
40
+ ## 零停机迁移策略
41
+
42
+ 1. **加字段**:ALTER TABLE ADD COLUMN( nullable )
43
+ 2. **双写**:应用同时读写新旧字段
44
+ 3. **回填**:批量回填历史数据
45
+ 4. **切换**:应用切换到新字段
46
+ 5. **删字段**:ALTER TABLE DROP COLUMN(下一个版本)
@@ -0,0 +1,50 @@
1
+ ---
2
+ tags:
3
+ - deploy
4
+ - deployment
5
+ - ci-cd
6
+ - vercel
7
+ - aws
8
+ - docker
9
+ ---
10
+
11
+ # 部署技能
12
+
13
+ ## 通用原则
14
+
15
+ 1. **蓝绿部署**:生产环境使用蓝绿部署,零停机切换
16
+ 2. **回滚策略**:每个版本保留回滚能力(保留最近 3 个版本)
17
+ 3. **健康检查**:部署后自动执行健康检查,失败自动回滚
18
+ 4. **灰度发布**:新功能先灰度 5% → 20% → 50% → 100%
19
+
20
+ ## Docker 部署
21
+
22
+ ```dockerfile
23
+ # 多阶段构建
24
+ FROM node:18-alpine AS builder
25
+ WORKDIR /app
26
+ COPY package*.json ./
27
+ RUN npm ci
28
+ COPY . .
29
+ RUN npm run build
30
+
31
+ FROM node:18-alpine
32
+ WORKDIR /app
33
+ COPY --from=builder /app/dist ./dist
34
+ COPY --from=builder /app/node_modules ./node_modules
35
+ COPY package.json ./
36
+ EXPOSE 3000
37
+ CMD ["node", "dist/main.js"]
38
+ ```
39
+
40
+ ## CI/CD 流水线
41
+
42
+ ```yaml
43
+ # 标准流水线
44
+ stages:
45
+ - lint
46
+ - test
47
+ - build
48
+ - deploy-staging
49
+ - deploy-production
50
+ ```
@@ -0,0 +1,38 @@
1
+ ---
2
+ tags:
3
+ - log
4
+ - logging
5
+ - monitoring
6
+ - observability
7
+ ---
8
+
9
+ # 日志技能
10
+
11
+ ## 结构化日志
12
+
13
+ 所有日志必须使用结构化格式(JSON),包含以下字段:
14
+
15
+ ```json
16
+ {
17
+ "timestamp": "2024-01-01T00:00:00.000Z",
18
+ "level": "info|warn|error|debug",
19
+ "service": "user-service",
20
+ "traceId": "uuid",
21
+ "message": "用户登录成功",
22
+ "context": { "userId": "123", "ip": "1.2.3.4" },
23
+ "duration": 45
24
+ }
25
+ ```
26
+
27
+ ## 日志级别使用规范
28
+
29
+ - **ERROR**:系统异常、业务失败(需要立即处理)
30
+ - **WARN**:潜在问题、降级处理(需要关注)
31
+ - **INFO**:关键业务流程节点(正常记录)
32
+ - **DEBUG**:详细调试信息(仅开发环境)
33
+
34
+ ## 禁止
35
+
36
+ - 不记录密码、Token、身份证号等敏感信息
37
+ - 不在循环中大量打印日志
38
+ - 不记录二进制数据或大对象
@@ -47,11 +47,16 @@ export declare function generateFixPrompt(report: VerifyReport, taskDir: string)
47
47
  * 生成 SPECCORE_EXEC 标签,触发 AI 修复
48
48
  */
49
49
  export declare function outputFixTag(report: VerifyReport, taskDir: string, round: number): void;
50
+ export interface AgentQualityCheck {
51
+ agent: string;
52
+ prompt: string;
53
+ }
50
54
  export interface QualityGateResult {
51
55
  passed: boolean;
52
56
  blockingFailed: CheckResult[];
53
57
  warnings: CheckResult[];
54
58
  report: VerifyReport;
59
+ agentChecks?: AgentQualityCheck[];
55
60
  }
56
61
  /**
57
62
  * 质量门禁 — execute 后自动运行,不可跳过
@@ -60,6 +65,8 @@ export interface QualityGateResult {
60
65
  */
61
66
  export declare function runQualityGate(taskId: string, codePath: string, taskDir: string, options?: {
62
67
  timeout?: number;
68
+ withAgents?: boolean;
69
+ projectRoot?: string;
63
70
  }): Promise<QualityGateResult>;
64
71
  /**
65
72
  * 根据单元测试结果同步更新 TEST.md 勾选状态
@@ -1 +1 @@
1
- {"version":3,"file":"verify-engine.d.ts","sourceRoot":"","sources":["../../src/core/verify-engine.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAMD,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAO9E;AAyID,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA0DnE;AAMD,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACzE,OAAO,CAAC,YAAY,CAAC,CAmEvB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMhG;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAgD/E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQvF;AAsYD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,WAAW,EAAE,CAAC;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,iBAAiB,CAAC,CA2F5B;AAMD;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,OAAO,GAClB,OAAO,CAAC,IAAI,CAAC,CA4Cf"}
1
+ {"version":3,"file":"verify-engine.d.ts","sourceRoot":"","sources":["../../src/core/verify-engine.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiBH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAMD,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAO9E;AAyID,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA0DnE;AAMD,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACzE,OAAO,CAAC,YAAY,CAAC,CAmEvB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMhG;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAgD/E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQvF;AAsYD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,WAAW,EAAE,CAAC;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACnC;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACzE,OAAO,CAAC,iBAAiB,CAAC,CAmH5B;AAMD;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,OAAO,GAClB,OAAO,CAAC,IAAI,CAAC,CA4Cf"}
@@ -19,6 +19,8 @@ const child_process_1 = require("child_process");
19
19
  const path_1 = require("path");
20
20
  const fs_extra_1 = require("fs-extra");
21
21
  const logger_1 = require("../utils/logger");
22
+ // v6.84.0+: AGENTS 引擎集成
23
+ const agents_1 = require("./agents");
22
24
  // ============================================================
23
25
  // 项目类型检测
24
26
  // ============================================================
@@ -818,6 +820,30 @@ async function runQualityGate(taskId, codePath, taskDir, options) {
818
820
  const block = c.blocking ? ' 🔒' : '';
819
821
  logger_1.logger.info(` ${icon} ${c.name}${block}: ${c.details}`);
820
822
  }
823
+ // v6.84.0+: AGENTS 扩展检查(可选)
824
+ let agentChecks;
825
+ if (options?.withAgents && options?.projectRoot) {
826
+ try {
827
+ const agentContext = {
828
+ iteration: taskId.split('/')[0],
829
+ taskDir,
830
+ codePath,
831
+ };
832
+ const agents = await (0, agents_1.resolveAgentsForPhase)('execute', 'quality-gate', agentContext, options.projectRoot);
833
+ if (agents.length > 0) {
834
+ agentChecks = [];
835
+ logger_1.logger.info(` 🤖 AGENTS 扩展检查 (${agents.length} 个角色)...`);
836
+ for (const ra of agents) {
837
+ const prompt = (0, agents_1.buildAgentPrompt)(ra.definition, agentContext);
838
+ agentChecks.push({ agent: ra.name, prompt });
839
+ logger_1.logger.info(` - ${ra.name} (优先级: ${ra.priority})`);
840
+ }
841
+ }
842
+ }
843
+ catch {
844
+ // AGENTS 扩展检查失败不影响主流程
845
+ }
846
+ }
821
847
  const passed = blockingFailed.length === 0;
822
848
  if (passed) {
823
849
  logger_1.logger.info(` ✅ 编译通过,质量门禁放行`);
@@ -829,7 +855,7 @@ async function runQualityGate(taskId, codePath, taskDir, options) {
829
855
  logger_1.logger.warn(` ❌ 编译失败,质量门禁拦截`);
830
856
  logger_1.logger.info(` 💡 修复编译错误后自动重新检查`);
831
857
  }
832
- return { passed, blockingFailed, warnings, report };
858
+ return { passed, blockingFailed, warnings, report, agentChecks };
833
859
  }
834
860
  // ============================================================
835
861
  // v6.79.0+: 文档同步 — 根据实际测试结果更新 TEST.md