@mycodemap/mycodemap 0.5.0 → 0.5.2-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/README.md +77 -9
- package/dist/cli/commands/analyze.d.ts +18 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -1
- package/dist/cli/commands/analyze.js +239 -6
- package/dist/cli/commands/analyze.js.map +1 -1
- package/dist/cli/commands/check.d.ts +22 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +168 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/ci.d.ts +25 -0
- package/dist/cli/commands/ci.d.ts.map +1 -1
- package/dist/cli/commands/ci.js +139 -36
- package/dist/cli/commands/ci.js.map +1 -1
- package/dist/cli/commands/complexity.d.ts.map +1 -1
- package/dist/cli/commands/complexity.js +6 -0
- package/dist/cli/commands/complexity.js.map +1 -1
- package/dist/cli/commands/design.d.ts +5 -0
- package/dist/cli/commands/design.d.ts.map +1 -1
- package/dist/cli/commands/design.js +6 -0
- package/dist/cli/commands/design.js.map +1 -1
- package/dist/cli/commands/generate.d.ts +1 -0
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +121 -8
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/history.d.ts +26 -0
- package/dist/cli/commands/history.d.ts.map +1 -0
- package/dist/cli/commands/history.js +92 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +13 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +108 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/workflow.d.ts.map +1 -1
- package/dist/cli/commands/workflow.js +22 -2
- package/dist/cli/commands/workflow.js.map +1 -1
- package/dist/cli/config-loader.d.ts.map +1 -1
- package/dist/cli/config-loader.js +3 -2
- package/dist/cli/config-loader.js.map +1 -1
- package/dist/cli/contract-checker.d.ts +33 -0
- package/dist/cli/contract-checker.d.ts.map +1 -0
- package/dist/cli/contract-checker.js +719 -0
- package/dist/cli/contract-checker.js.map +1 -0
- package/dist/cli/contract-diff-scope.d.ts +14 -0
- package/dist/cli/contract-diff-scope.d.ts.map +1 -0
- package/dist/cli/contract-diff-scope.js +127 -0
- package/dist/cli/contract-diff-scope.js.map +1 -0
- package/dist/cli/contract-gate-thresholds.d.ts +14 -0
- package/dist/cli/contract-gate-thresholds.d.ts.map +1 -0
- package/dist/cli/contract-gate-thresholds.js +19 -0
- package/dist/cli/contract-gate-thresholds.js.map +1 -0
- package/dist/cli/design-contract-loader.d.ts.map +1 -1
- package/dist/cli/design-contract-loader.js +355 -3
- package/dist/cli/design-contract-loader.js.map +1 -1
- package/dist/cli/design-scope-resolver.d.ts.map +1 -1
- package/dist/cli/design-scope-resolver.js +89 -41
- package/dist/cli/design-scope-resolver.js.map +1 -1
- package/dist/cli/index.js +18 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/paths.d.ts.map +1 -1
- package/dist/cli/paths.js +30 -7
- package/dist/cli/paths.js.map +1 -1
- package/dist/core/analyzer.d.ts.map +1 -1
- package/dist/core/analyzer.js +16 -0
- package/dist/core/analyzer.js.map +1 -1
- package/dist/domain/entities/CodeGraph.d.ts +5 -1
- package/dist/domain/entities/CodeGraph.d.ts.map +1 -1
- package/dist/domain/entities/CodeGraph.js +29 -12
- package/dist/domain/entities/CodeGraph.js.map +1 -1
- package/dist/domain/entities/Dependency.d.ts +8 -1
- package/dist/domain/entities/Dependency.d.ts.map +1 -1
- package/dist/domain/entities/Dependency.js +19 -4
- package/dist/domain/entities/Dependency.js.map +1 -1
- package/dist/domain/entities/Symbol.d.ts +2 -1
- package/dist/domain/entities/Symbol.d.ts.map +1 -1
- package/dist/domain/entities/Symbol.js +6 -3
- package/dist/domain/entities/Symbol.js.map +1 -1
- package/dist/infrastructure/storage/StorageFactory.d.ts +1 -0
- package/dist/infrastructure/storage/StorageFactory.d.ts.map +1 -1
- package/dist/infrastructure/storage/StorageFactory.js +7 -2
- package/dist/infrastructure/storage/StorageFactory.js.map +1 -1
- package/dist/infrastructure/storage/adapters/FileSystemStorage.d.ts +3 -1
- package/dist/infrastructure/storage/adapters/FileSystemStorage.d.ts.map +1 -1
- package/dist/infrastructure/storage/adapters/FileSystemStorage.js +10 -2
- package/dist/infrastructure/storage/adapters/FileSystemStorage.js.map +1 -1
- package/dist/infrastructure/storage/adapters/KuzuDBStorage.d.ts +3 -1
- package/dist/infrastructure/storage/adapters/KuzuDBStorage.d.ts.map +1 -1
- package/dist/infrastructure/storage/adapters/KuzuDBStorage.js +9 -1
- package/dist/infrastructure/storage/adapters/KuzuDBStorage.js.map +1 -1
- package/dist/infrastructure/storage/adapters/MemoryStorage.d.ts +3 -1
- package/dist/infrastructure/storage/adapters/MemoryStorage.d.ts.map +1 -1
- package/dist/infrastructure/storage/adapters/MemoryStorage.js +9 -1
- package/dist/infrastructure/storage/adapters/MemoryStorage.js.map +1 -1
- package/dist/infrastructure/storage/adapters/SQLiteStorage.d.ts +53 -0
- package/dist/infrastructure/storage/adapters/SQLiteStorage.d.ts.map +1 -0
- package/dist/infrastructure/storage/adapters/SQLiteStorage.js +879 -0
- package/dist/infrastructure/storage/adapters/SQLiteStorage.js.map +1 -0
- package/dist/infrastructure/storage/graph-helpers.d.ts +3 -1
- package/dist/infrastructure/storage/graph-helpers.d.ts.map +1 -1
- package/dist/infrastructure/storage/graph-helpers.js +90 -0
- package/dist/infrastructure/storage/graph-helpers.js.map +1 -1
- package/dist/infrastructure/storage/index.d.ts +1 -1
- package/dist/infrastructure/storage/index.d.ts.map +1 -1
- package/dist/infrastructure/storage/interfaces/StorageBase.d.ts +3 -1
- package/dist/infrastructure/storage/interfaces/StorageBase.d.ts.map +1 -1
- package/dist/infrastructure/storage/interfaces/StorageBase.js.map +1 -1
- package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.d.ts +27 -0
- package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.js +246 -0
- package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/perf-thresholds.d.ts +25 -0
- package/dist/infrastructure/storage/sqlite/perf-thresholds.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/perf-thresholds.js +25 -0
- package/dist/infrastructure/storage/sqlite/perf-thresholds.js.map +1 -0
- package/dist/infrastructure/storage/sqlite/schema.d.ts +4 -0
- package/dist/infrastructure/storage/sqlite/schema.d.ts.map +1 -0
- package/dist/infrastructure/storage/sqlite/schema.js +111 -0
- package/dist/infrastructure/storage/sqlite/schema.js.map +1 -0
- package/dist/interface/types/design-check.d.ts +73 -0
- package/dist/interface/types/design-check.d.ts.map +1 -0
- package/dist/interface/types/design-check.js +4 -0
- package/dist/interface/types/design-check.js.map +1 -0
- package/dist/interface/types/design-contract.d.ts +56 -1
- package/dist/interface/types/design-contract.d.ts.map +1 -1
- package/dist/interface/types/history-risk.d.ts +90 -0
- package/dist/interface/types/history-risk.d.ts.map +1 -0
- package/dist/interface/types/history-risk.js +4 -0
- package/dist/interface/types/history-risk.js.map +1 -0
- package/dist/interface/types/index.d.ts +17 -2
- package/dist/interface/types/index.d.ts.map +1 -1
- package/dist/interface/types/storage.d.ts +28 -1
- package/dist/interface/types/storage.d.ts.map +1 -1
- package/dist/orchestrator/adapters/ast-grep-adapter.d.ts +10 -0
- package/dist/orchestrator/adapters/ast-grep-adapter.d.ts.map +1 -1
- package/dist/orchestrator/adapters/ast-grep-adapter.js +46 -17
- package/dist/orchestrator/adapters/ast-grep-adapter.js.map +1 -1
- package/dist/orchestrator/adapters/codemap-adapter.d.ts.map +1 -1
- package/dist/orchestrator/adapters/codemap-adapter.js +2 -22
- package/dist/orchestrator/adapters/codemap-adapter.js.map +1 -1
- package/dist/orchestrator/history-risk-service.d.ts +55 -0
- package/dist/orchestrator/history-risk-service.d.ts.map +1 -0
- package/dist/orchestrator/history-risk-service.js +680 -0
- package/dist/orchestrator/history-risk-service.js.map +1 -0
- package/dist/orchestrator/types.d.ts +19 -1
- package/dist/orchestrator/types.d.ts.map +1 -1
- package/dist/orchestrator/types.js +19 -0
- package/dist/orchestrator/types.js.map +1 -1
- package/dist/server/mcp/index.d.ts +4 -0
- package/dist/server/mcp/index.d.ts.map +1 -0
- package/dist/server/mcp/index.js +5 -0
- package/dist/server/mcp/index.js.map +1 -0
- package/dist/server/mcp/server.d.ts +17 -0
- package/dist/server/mcp/server.d.ts.map +1 -0
- package/dist/server/mcp/server.js +84 -0
- package/dist/server/mcp/server.js.map +1 -0
- package/dist/server/mcp/service.d.ts +22 -0
- package/dist/server/mcp/service.d.ts.map +1 -0
- package/dist/server/mcp/service.js +177 -0
- package/dist/server/mcp/service.js.map +1 -0
- package/dist/server/mcp/types.d.ts +56 -0
- package/dist/server/mcp/types.d.ts.map +1 -0
- package/dist/server/mcp/types.js +4 -0
- package/dist/server/mcp/types.js.map +1 -0
- package/docs/AI_ASSISTANT_SETUP.md +1 -1
- package/docs/PUBLISHING.md +41 -12
- package/docs/SETUP_GUIDE.md +6 -6
- package/docs/ai-guide/COMMANDS.md +98 -4
- package/docs/ai-guide/INTEGRATION.md +137 -433
- package/docs/ai-guide/OUTPUT.md +476 -6
- package/docs/ai-guide/PATTERNS.md +41 -11
- package/docs/ai-guide/PROMPTS.md +11 -6
- package/docs/backlog.md +177 -0
- package/docs/eatdogfood-reports/2026-04-17-eatdogfood-agent-experience.md +231 -0
- package/docs/exec-plans/completed/2026-04-17-eatdogfood-codemap-cli.md +103 -0
- package/docs/ideation/2026-04-15-executable-architecture-constitution-ideation.md +102 -0
- package/docs/product-specs/DESIGN_CONTRACT_TEMPLATE.md +47 -0
- package/docs/product-specs/MVP3-ARCHITECTURE-COMPARISON.md +11 -10
- package/docs/product-specs/MVP3-ARCHITECTURE-REDESIGN-PRD.md +10 -10
- package/docs/product-specs/MVP3-ARCHITECTURE-REDESIGN-TECH-PRD.md +17 -12
- package/docs/rules/README.md +16 -11
- package/docs/rules/architecture-guardrails.md +24 -336
- package/docs/rules/code-quality-redlines.md +25 -311
- package/docs/rules/engineering-with-codex-openai.md +14 -1
- package/docs/rules/pre-release-checklist.md +9 -4
- package/docs/rules/validation.md +91 -40
- package/mycodemap.config.schema.json +3 -3
- package/package.json +7 -2
- package/scripts/benchmark-governance-graph.mjs +132 -0
- package/scripts/calibrate-contract-gate.mjs +221 -0
- package/scripts/capability-report.py +255 -0
- package/scripts/pre-release-check.js +2 -2
- package/scripts/qa-rule-control.sh +254 -0
- package/scripts/report-high-risk-files.mjs +395 -0
- package/scripts/rule-context.mjs +155 -0
- package/scripts/smoke-sqlite-impact.mjs +85 -0
- package/scripts/sync-analyze-docs.js +1 -0
- package/scripts/tests/test_capability_report.py +89 -0
- package/scripts/tests/test_rule_control_workflow.py +51 -0
- package/scripts/tests/test_validate_rules.py +81 -0
- package/scripts/validate-ai-docs.js +283 -1
- package/scripts/validate-docs.js +249 -42
- package/scripts/validate-rules.py +254 -0
- package/dist/ai/claude.d.ts +0 -38
- package/dist/ai/claude.d.ts.map +0 -1
- package/dist/ai/claude.js +0 -169
- package/dist/ai/claude.js.map +0 -1
- package/dist/ai/codex.d.ts +0 -38
- package/dist/ai/codex.d.ts.map +0 -1
- package/dist/ai/codex.js +0 -169
- package/dist/ai/codex.js.map +0 -1
- package/dist/ai/factory.d.ts +0 -48
- package/dist/ai/factory.d.ts.map +0 -1
- package/dist/ai/factory.js +0 -95
- package/dist/ai/factory.js.map +0 -1
- package/dist/ai/index.d.ts +0 -12
- package/dist/ai/index.d.ts.map +0 -1
- package/dist/ai/index.js +0 -29
- package/dist/ai/index.js.map +0 -1
- package/dist/ai/provider.d.ts +0 -70
- package/dist/ai/provider.d.ts.map +0 -1
- package/dist/ai/provider.js +0 -31
- package/dist/ai/provider.js.map +0 -1
- package/dist/ai/subagent-caller.d.ts +0 -90
- package/dist/ai/subagent-caller.d.ts.map +0 -1
- package/dist/ai/subagent-caller.js +0 -280
- package/dist/ai/subagent-caller.js.map +0 -1
- package/dist/ai/types.d.ts +0 -70
- package/dist/ai/types.d.ts.map +0 -1
- package/dist/ai/types.js +0 -5
- package/dist/ai/types.js.map +0 -1
- package/dist/cli/commands/server.d.ts +0 -9
- package/dist/cli/commands/server.d.ts.map +0 -1
- package/dist/cli/commands/server.js +0 -65
- package/dist/cli/commands/server.js.map +0 -1
- package/dist/cli-new/commands/server.d.ts +0 -13
- package/dist/cli-new/commands/server.d.ts.map +0 -1
- package/dist/cli-new/commands/server.js +0 -90
- package/dist/cli-new/commands/server.js.map +0 -1
- package/dist/generator/ai-overview.d.ts +0 -51
- package/dist/generator/ai-overview.d.ts.map +0 -1
- package/dist/generator/ai-overview.js +0 -160
- package/dist/generator/ai-overview.js.map +0 -1
- package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts +0 -41
- package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts.map +0 -1
- package/dist/infrastructure/storage/adapters/Neo4jStorage.js +0 -162
- package/dist/infrastructure/storage/adapters/Neo4jStorage.js.map +0 -1
- package/dist/orchestrator/ai-feed-generator.d.ts +0 -210
- package/dist/orchestrator/ai-feed-generator.d.ts.map +0 -1
- package/dist/orchestrator/ai-feed-generator.js +0 -377
- package/dist/orchestrator/ai-feed-generator.js.map +0 -1
- package/docs/archive/test-report-symbol-search.md +0 -384
- package/docs/archive/test-scenario-4-complexity-analysis.md +0 -460
- package/docs/archive/test_report_scenario5.md +0 -615
- package/docs/archive/test_scenario_3_impact_analysis_report.md +0 -520
|
@@ -1,321 +1,35 @@
|
|
|
1
1
|
# 代码质量红线
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> 目标:用最少的文字描述“什么会被挡住、怎么检查、失败后怎么修”。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 红线表
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
| 红线 | 命令 | 阈值/级别 | 失败后果 | 恢复方式 |
|
|
8
|
+
|---|---|---|---|---|
|
|
9
|
+
| 敏感信息硬编码 | `grep -rn "password.*=.*['\"]" src/ --include="*.ts"` | 生产代码出现明文凭证 | 阻断提交/审查 | 改为 `process.env` + 类型检查 |
|
|
10
|
+
| 非边界文件使用 `any` | `npm run typecheck` / `npx eslint src --rule '@typescript-eslint/no-explicit-any: error'` | 非测试/边界文件禁止 | 阻断 | 改为具体类型或 `unknown` + 守卫 |
|
|
11
|
+
| 函数超过 50 行 | `npx eslint src --rule 'max-lines-per-function: [error, { max: 50, skipBlankLines: true, skipComments: true }]'` | 单函数 > 50 行 | 阻断 | 拆成小函数,保持单一职责 |
|
|
12
|
+
| 未处理 Promise | `npx eslint src --rule '@typescript-eslint/no-floating-promises: error'` | 无 `await` / `.catch()` | 阻断 | 显式 `await` 或补错误处理 |
|
|
13
|
+
| 遗留 `console.log` | `npx eslint src --rule 'no-console: [error, { allow: [\"error\"] }]'` | `src/cli/runtime-logger.ts` 外禁止 | 阻断 | 换成 `runtime-logger` |
|
|
14
|
+
| 未使用 import / 变量 | `tsc --noUnusedLocals --noEmit` / `npm run lint` | 任意未使用符号 | 阻断 | 删除无用 import / 变量 |
|
|
15
|
+
| TS 源文件缺少 `[META]` / `[WHY]` | `.githooks/pre-commit` | 非测试 `.ts` 源文件必须有文件头 | 阻断 | 补文件头注释 |
|
|
8
16
|
|
|
9
|
-
|
|
10
|
-
- 可能导致安全漏洞
|
|
11
|
-
- 严重降低代码可维护性
|
|
12
|
-
- 破坏类型安全保证
|
|
13
|
-
- 违反架构分层原则
|
|
17
|
+
## 默认执行顺序
|
|
14
18
|
|
|
15
|
-
|
|
19
|
+
1. `npm run typecheck`
|
|
20
|
+
2. `npm run lint`
|
|
21
|
+
3. 变更涉及行为时再补 `npm test`
|
|
16
22
|
|
|
17
|
-
|
|
23
|
+
## 技术债例外
|
|
18
24
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
// ❌ 绝对禁止
|
|
22
|
-
const API_KEY = "sk-abc123xyz";
|
|
23
|
-
const password = "admin123";
|
|
24
|
-
const secret = "my-jwt-secret";
|
|
25
|
-
```
|
|
25
|
+
- 只允许在边界场景临时记录 `TODO-DEBT`。
|
|
26
|
+
- 例外必须写清:原因、风险、偿还计划。
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
```typescript
|
|
29
|
-
// ✅ 使用环境变量
|
|
30
|
-
const API_KEY = process.env.OPENAI_API_KEY;
|
|
31
|
-
if (!API_KEY) {
|
|
32
|
-
throw new Error('OPENAI_API_KEY is required');
|
|
33
|
-
}
|
|
34
|
-
```
|
|
28
|
+
## 最小提交前清单
|
|
35
29
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
**阻断阈值**:生产代码中出现任何明文凭证
|
|
45
|
-
|
|
46
|
-
### 2.2 `any` 类型使用
|
|
47
|
-
|
|
48
|
-
**禁止模式**:
|
|
49
|
-
```typescript
|
|
50
|
-
// ❌ 非边界文件禁止使用 any
|
|
51
|
-
function processData(data: any): any {
|
|
52
|
-
return data.value;
|
|
53
|
-
}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
**合规模式**:
|
|
57
|
-
```typescript
|
|
58
|
-
// ✅ 使用具体类型或 unknown + 类型守卫
|
|
59
|
-
interface DataPayload {
|
|
60
|
-
value: string;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function processData(data: unknown): string {
|
|
64
|
-
if (typeof data === 'object' && data !== null && 'value' in data) {
|
|
65
|
-
return (data as DataPayload).value;
|
|
66
|
-
}
|
|
67
|
-
throw new Error('Invalid data format');
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
**例外情况**(需标记 TODO-DEBT):
|
|
72
|
-
- 第三方库无类型定义时的临时处理
|
|
73
|
-
- 与遗留系统集成的边界
|
|
74
|
-
|
|
75
|
-
**检测方式**:
|
|
76
|
-
```bash
|
|
77
|
-
# TypeScript 编译器检查
|
|
78
|
-
npx tsc --noImplicitAny --noEmit
|
|
79
|
-
|
|
80
|
-
# ESLint 检查
|
|
81
|
-
npx eslint src --rule '@typescript-eslint/no-explicit-any: error'
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
**阻断阈值**:非边界文件出现 `any` 类型
|
|
85
|
-
|
|
86
|
-
### 2.3 函数超过 50 行
|
|
87
|
-
|
|
88
|
-
**计算方式**:函数体实际代码行数(不含空行、注释、类型定义)
|
|
89
|
-
|
|
90
|
-
**禁止模式**:
|
|
91
|
-
```typescript
|
|
92
|
-
// ❌ 超过 50 行的函数
|
|
93
|
-
function complexFunction(data: Data) {
|
|
94
|
-
// 行 1
|
|
95
|
-
// 行 2
|
|
96
|
-
// ... 50+ 行
|
|
97
|
-
// 行 51
|
|
98
|
-
// 行 52
|
|
99
|
-
}
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
**合规模式**:
|
|
103
|
-
```typescript
|
|
104
|
-
// ✅ 拆分为子函数
|
|
105
|
-
function complexFunction(data: Data) {
|
|
106
|
-
const validated = validateData(data);
|
|
107
|
-
const transformed = transformData(validated);
|
|
108
|
-
return persistData(transformed);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function validateData(data: Data): ValidatedData { ... }
|
|
112
|
-
function transformData(data: ValidatedData): TransformedData { ... }
|
|
113
|
-
function persistData(data: TransformedData): Result { ... }
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
**检测方式**:
|
|
117
|
-
```bash
|
|
118
|
-
# 使用 ESLint 的 max-lines-per-function 规则
|
|
119
|
-
npx eslint src --rule 'max-lines-per-function: [error, { max: 50, skipBlankLines: true, skipComments: true }]'
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
**阻断阈值**:单函数超过 50 行代码
|
|
123
|
-
|
|
124
|
-
### 2.4 未处理 Promise
|
|
125
|
-
|
|
126
|
-
**禁止模式**:
|
|
127
|
-
```typescript
|
|
128
|
-
// ❌ 未处理的异步操作
|
|
129
|
-
fetchUserData(userId); // 没有 await 或 .catch()
|
|
130
|
-
database.query(sql); // 没有错误处理
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
**合规模式**:
|
|
134
|
-
```typescript
|
|
135
|
-
// ✅ 正确处理异步操作
|
|
136
|
-
try {
|
|
137
|
-
const user = await fetchUserData(userId);
|
|
138
|
-
} catch (error) {
|
|
139
|
-
logger.error('Failed to fetch user', error);
|
|
140
|
-
throw new UserFetchError(userId);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// 或显式忽略
|
|
144
|
-
void fetchUserData(userId).catch(() => {}); // 有意的显式忽略
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
**检测方式**:
|
|
148
|
-
```bash
|
|
149
|
-
# ESLint 检查
|
|
150
|
-
npx eslint src --rule '@typescript-eslint/no-floating-promises: error'
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
**阻断阈值**:未使用 `await` 或未附加错误处理的 Promise
|
|
154
|
-
|
|
155
|
-
### 2.5 `console.log` 遗留代码
|
|
156
|
-
|
|
157
|
-
**禁止模式**:
|
|
158
|
-
```typescript
|
|
159
|
-
// ❌ 生产代码中的调试语句
|
|
160
|
-
console.log('Debug:', data);
|
|
161
|
-
console.warn('Warning');
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
**合规模式**:
|
|
165
|
-
```typescript
|
|
166
|
-
// ✅ 使用 runtime-logger
|
|
167
|
-
import { runtimeLogger } from '../cli/runtime-logger';
|
|
168
|
-
runtimeLogger.debug('Debug:', data);
|
|
169
|
-
runtimeLogger.warn('Warning');
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
**例外情况**:
|
|
173
|
-
- `src/cli/runtime-logger.ts` 本身
|
|
174
|
-
- 临时调试代码(提交前必须删除)
|
|
175
|
-
|
|
176
|
-
**检测方式**:
|
|
177
|
-
```bash
|
|
178
|
-
# ESLint 检查
|
|
179
|
-
npx eslint src --rule 'no-console: [error, { allow: ["error"] }]'
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
**阻断阈值**:非 logger 模块出现 `console.log`
|
|
183
|
-
|
|
184
|
-
### 2.6 未使用 Import
|
|
185
|
-
|
|
186
|
-
**禁止模式**:
|
|
187
|
-
```typescript
|
|
188
|
-
// ❌ 导入但未使用
|
|
189
|
-
import { unusedFunction } from './utils';
|
|
190
|
-
import type { UnusedType } from './types';
|
|
191
|
-
|
|
192
|
-
export function doSomething() {
|
|
193
|
-
// 未使用上面的导入
|
|
194
|
-
}
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
**合规模式**:
|
|
198
|
-
```typescript
|
|
199
|
-
// ✅ 删除未使用的导入
|
|
200
|
-
export function doSomething() {
|
|
201
|
-
// 干净的代码
|
|
202
|
-
}
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
**检测方式**:
|
|
206
|
-
```bash
|
|
207
|
-
# TypeScript 检查
|
|
208
|
-
npx tsc --noUnusedLocals --noEmit
|
|
209
|
-
|
|
210
|
-
# ESLint 检查
|
|
211
|
-
npx eslint src --rule '@typescript-eslint/no-unused-vars: [error, { argsIgnorePattern: "^_" }]'
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
**阻断阈值**:存在未使用的 import 或变量
|
|
215
|
-
|
|
216
|
-
### 2.7 缺少文件头注释
|
|
217
|
-
|
|
218
|
-
**禁止模式**:
|
|
219
|
-
```typescript
|
|
220
|
-
// ❌ 缺少 META 和 WHY 注释
|
|
221
|
-
export function analyze() { ... }
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
**合规模式**:
|
|
225
|
-
```typescript
|
|
226
|
-
// [META] since:2026-03 | owner:team | stable:false
|
|
227
|
-
// [WHY] 分析器主入口,负责协调解析和生成流程
|
|
228
|
-
export function analyze() { ... }
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
**检测方式**:
|
|
232
|
-
```bash
|
|
233
|
-
# pre-commit hook 自动检查
|
|
234
|
-
# 或手动检查
|
|
235
|
-
grep -L "\[META\]" src/**/*.ts | grep -v ".test.ts" | grep -v ".d.ts"
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
**阻断阈值**:TS 源文件缺少 `[META]` 或 `[WHY]` 注释
|
|
239
|
-
|
|
240
|
-
## 3. 检测自动化
|
|
241
|
-
|
|
242
|
-
### 3.1 集成到 CI
|
|
243
|
-
|
|
244
|
-
```yaml
|
|
245
|
-
# .github/workflows/ci-gateway.yml
|
|
246
|
-
- name: Check code quality redlines
|
|
247
|
-
run: |
|
|
248
|
-
npx eslint src \
|
|
249
|
-
--rule '@typescript-eslint/no-explicit-any: error' \
|
|
250
|
-
--rule '@typescript-eslint/no-floating-promises: error' \
|
|
251
|
-
--rule 'no-console: [error, { allow: ["error"] }]'
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
### 3.2 本地检查脚本
|
|
255
|
-
|
|
256
|
-
```json
|
|
257
|
-
// package.json
|
|
258
|
-
{
|
|
259
|
-
"scripts": {
|
|
260
|
-
"check:redlines": "npm run check:types && npm run check:lint",
|
|
261
|
-
"check:types": "tsc --noImplicitAny --noUnusedLocals --noEmit",
|
|
262
|
-
"check:lint": "eslint src --ext .ts"
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
## 4. 自动修复策略
|
|
268
|
-
|
|
269
|
-
| 红线 | 自动修复 | 修复命令 |
|
|
270
|
-
|------|---------|---------|
|
|
271
|
-
| `any` 类型 | 部分可行 | 使用类型推导工具(如 TS 语言服务) |
|
|
272
|
-
| 未使用 import | 完全可行 | `eslint --fix` |
|
|
273
|
-
| `console.log` | 部分可行 | 替换为 logger 引用(需人工确认) |
|
|
274
|
-
| 函数长度 | 不可行 | 需人工重构 |
|
|
275
|
-
| 未处理 Promise | 部分可行 | 添加 `await` 或 `.catch()`(需人工确认逻辑) |
|
|
276
|
-
| 敏感信息 | 不可行 | 需人工替换为环境变量 |
|
|
277
|
-
| 缺少文件头 | 部分可行 | 使用代码片段模板 |
|
|
278
|
-
|
|
279
|
-
## 5. 例外处理
|
|
280
|
-
|
|
281
|
-
### 5.1 技术债务标记
|
|
282
|
-
|
|
283
|
-
若因特殊原因必须违反红线,必须标记为技术债务:
|
|
284
|
-
|
|
285
|
-
```typescript
|
|
286
|
-
// TODO-DEBT [L1] [日期:2026-03-17] [作者:AI] [原因:第三方库无类型定义]
|
|
287
|
-
// 问题:被迫使用 any 类型处理无类型的第三方库
|
|
288
|
-
// 风险:丢失类型安全
|
|
289
|
-
// 偿还计划:提交 PR 给第三方库添加类型定义,或使用 @types 包
|
|
290
|
-
function handleLegacyAPI(response: any): any {
|
|
291
|
-
return response.data;
|
|
292
|
-
}
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
### 5.2 边界文件例外
|
|
296
|
-
|
|
297
|
-
以下文件类型允许适当的灵活性:
|
|
298
|
-
- 测试文件(`.test.ts`)
|
|
299
|
-
- 类型声明文件(`.d.ts`)
|
|
300
|
-
- 配置文件(如 `vitest.config.ts`)
|
|
301
|
-
- 脚本文件(`scripts/` 目录)
|
|
302
|
-
|
|
303
|
-
## 6. 验收检查清单
|
|
304
|
-
|
|
305
|
-
提交代码前检查:
|
|
306
|
-
|
|
307
|
-
- [ ] 无敏感信息硬编码
|
|
308
|
-
- [ ] 无 `any` 类型(或已标记 TODO-DEBT)
|
|
309
|
-
- [ ] 函数长度 <= 50 行(或已拆分为子函数)
|
|
310
|
-
- [ ] 所有 Promise 都有错误处理
|
|
311
|
-
- [ ] 无 `console.log` 遗留
|
|
312
|
-
- [ ] 无未使用的 import
|
|
313
|
-
- [ ] TS 源文件有 `[META]` 和 `[WHY]` 注释
|
|
314
|
-
- [ ] `npm run check:redlines` 通过
|
|
315
|
-
|
|
316
|
-
## 7. 相关文档
|
|
317
|
-
|
|
318
|
-
- `AGENTS.md` - 任务分级与可信度自评
|
|
319
|
-
- `CLAUDE.md` - 执行清单与验收标准
|
|
320
|
-
- `docs/rules/engineering-with-codex-openai.md` - 工程规则
|
|
321
|
-
- `docs/rules/architecture-guardrails.md` - 架构护栏
|
|
30
|
+
- [ ] 无明文凭证
|
|
31
|
+
- [ ] 无多余 `any`
|
|
32
|
+
- [ ] 无漂浮 Promise
|
|
33
|
+
- [ ] 无遗留 `console.log`
|
|
34
|
+
- [ ] 无未使用 import
|
|
35
|
+
- [ ] `.ts` 文件头完整
|
|
@@ -45,18 +45,28 @@
|
|
|
45
45
|
- 仓库内调试与验证优先使用 `node dist/cli/index.js <command>`,因为当前真实 CLI 入口是 `dist/cli/index.js`。
|
|
46
46
|
- 需求澄清、影响分析、引用定位优先走 `query`、`analyze`、`deps`、`impact`,不要直接全仓漫游。
|
|
47
47
|
- 修改 `design`、`analyze`、`query`、`ci`、`workflow` 等高影响命令时,至少验证:
|
|
48
|
+
- `node dist/cli/index.js generate --symbol-level` 只在显式开启时新增 symbol-level `call` 依赖;默认 `generate` 路径不得被悄悄改变;
|
|
48
49
|
- `node dist/cli/index.js design validate mycodemap.design.md --json` 的成功/失败路径符合文档;
|
|
49
50
|
- `node dist/cli/index.js design map mycodemap.design.md --json` 的 success/blocker 路径、`candidates` / `unknowns` / `diagnostics` 与文档一致;
|
|
50
51
|
- `node dist/cli/index.js design handoff mycodemap.design.md --json` 的 `readyForExecution` / `approvals` / `assumptions` / `openQuestions` 与文档一致;
|
|
51
52
|
- `node dist/cli/index.js design verify mycodemap.design.md --json` 的 `checklist` / `drift` / `diagnostics` / `readyForExecution` 与文档一致,并保持 review-needed / blocker 分离语义;
|
|
53
|
+
- `node dist/cli/index.js check --contract mycodemap.design.md --against src` 的 JSON / `--human` / exit code 语义与文档一致;
|
|
54
|
+
- `node dist/cli/index.js mcp install` 必须显式标记 experimental,且只更新当前仓库 `.mcp.json`;
|
|
55
|
+
- `node dist/cli/index.js mcp start` 必须保持 `stdout` 协议纯净,不能混入欢迎信息、迁移提示或 runtime log;
|
|
56
|
+
- `codemap_query` / `codemap_impact` 必须返回显式 `graph_status` / `error.code`,并覆盖 `GRAPH_NOT_FOUND`、`SYMBOL_NOT_FOUND`、`AMBIGUOUS_EDGE`;
|
|
52
57
|
- `node dist/cli/index.js analyze --help` 与文档示例一致;
|
|
53
58
|
- `find` / `read` / `link` / `show` 中受影响的 public intent 可以在当前仓库运行;
|
|
59
|
+
- `analyze -i find -k <keyword> --json --structured` 的 stdout JSON 必须包含 `diagnostics.status`,可区分 true zero-hit、`partialFailure` 与 `failure`;
|
|
60
|
+
- `complexity -f <file> --json` 必须只返回目标 `file`,不得返回全项目 `modules`;
|
|
61
|
+
- `ci assess-risk --json` 必须输出 `status: passed | failed | skipped`,且 failed path 保持 stdout JSON 可解析;
|
|
62
|
+
- `workflow start "<task>" --json` 必须输出纯 JSON,但 workflow 边界仍限于 `find → read → link → show` analysis-only 阶段;
|
|
54
63
|
- 若文档保留 legacy alias 说明,真实输出仍会返回 `warnings[]`;
|
|
55
64
|
- 若涉及机器输出,`--json` 与 `--structured --json` 仍保持纯 JSON 契约。
|
|
56
65
|
- 修改 `README.md`、`AI_GUIDE.md`、`docs/ai-guide/OUTPUT.md`、`ARCHITECTURE.md` 这类入口文档时,必须明确区分“目标产品基线”和“当前 CLI 现实”,尤其是 `Server Layer` / `mycodemap server` 的命名边界。
|
|
57
66
|
- 修改 `docs/product-specs/*` 现行规格时,必须同步 `docs/product-specs/README.md` 与 `scripts/validate-docs.js` 的高信号断言,避免规格正文和目录索引分叉;`docs/product-specs/DESIGN_CONTRACT_TEMPLATE.md` 也属于这一约束。
|
|
58
67
|
- 若改动会影响 agent 执行手册、README 示例、测试事实或入口路由,先执行 `npm run docs:check`。
|
|
59
68
|
- 若希望通过统一 CLI 护栏入口执行同一检查,使用 `node dist/cli/index.js ci check-docs-sync`;该命令会同时执行 docs guardrail 与 `sync-analyze-docs.js --check`。
|
|
69
|
+
- 若改动涉及 repo-root contract 或 CI gate,确认 `.github/workflows/ci-gateway.yml` 中的 `node dist/cli/index.js check --contract mycodemap.design.md --against src` 仍保持 PR 显式 base / push full scan 语义。
|
|
60
70
|
- `ci check-branch --allow` 支持 `*` 通配;在 CI / PR 环境中,分支识别会回退到 `GITHUB_HEAD_REF` / `GITHUB_REF_NAME`。
|
|
61
71
|
- `generate`、`analyze` 与 `ci check-headers -d` 共享 `.gitignore` 感知文件发现模块;没有 `.gitignore` 时回退到统一默认 `exclude`。
|
|
62
72
|
- 涉及发布边界时,再补 `npm run build` 与 `npm run validate-pack`;不要把本地临时产物当成发布事实。
|
|
@@ -65,12 +75,15 @@
|
|
|
65
75
|
|
|
66
76
|
- 本地护栏:
|
|
67
77
|
- `.githooks/pre-commit` 会执行变更相关测试、文件头检查,并尝试生成 AI feed。
|
|
78
|
+
- `.githooks/pre-commit` 还会读取 `.claude/rule-system.config.json` 的 `hard_gate.mode`:`report-only` 时执行 `python3 scripts/validate-rules.py code --report-only` 并继续;`enforce` 时执行 `python3 scripts/validate-rules.py code`,其中 `1/4` 阻断、`2/3` 只告警。
|
|
68
79
|
- 当变更涉及 README、`docs/`、CLI 入口、测试配置或 CI 配置时,`.githooks/pre-commit` 还会执行 `npm run docs:check`。
|
|
69
|
-
- `.githooks/commit-msg`
|
|
80
|
+
- `.githooks/commit-msg` 只校验 `[TAG] scope: message` 格式;单次 commit 文件数量限制只保留在 `.githooks/pre-commit`。
|
|
70
81
|
- 服务端护栏:
|
|
82
|
+
- `.github/workflows/ci-gateway.yml` 包含固定命名的 `Rule validation backstop` step;即使本地使用 `git commit --no-verify` 绕过 hooks,CI 仍会运行 `python3 scripts/validate-rules.py code`,并仅在退出码 `1` 或 `4` 时 fail,`2/3` 只输出 warn-only / notice-only。
|
|
71
83
|
- `.github/workflows/ci-gateway.yml` 会执行 `npm run docs:check`、`npm run typecheck`、`npm test`、`npm run build`,并通过 `node dist/cli/index.js ci ...` 执行 `check-docs-sync`(含 docs guardrail + analyze generated block)、`check-commits`、`check-commit-size`、`check-headers`、`assess-risk`、`check-output-contract` 与 AI feed 同步检查。
|
|
72
84
|
- `check-working-tree`、`check-branch`、`check-scripts` 作为共享发布前 gate checks,由本地 `ci` 命令提供,`ship` 的 CHECK 阶段直接复用它们。
|
|
73
85
|
- `.github/workflows/publish.yml` 会在发布前执行 `npm test` 与 `npm run build`。
|
|
86
|
+
- 禁止依赖 `git commit --no-verify` 作为解决方案;它只能跳过本地 hooks,不能绕过 CI 中的 `Rule validation backstop`。
|
|
74
87
|
- 仓库协议仍然禁止通过 `--no-verify`、关闭 hook、放宽阈值、删除检查项来"修复"问题。
|
|
75
88
|
|
|
76
89
|
## 6. 代码生成红线详细规范(Harness 规范)
|
|
@@ -78,6 +78,7 @@
|
|
|
78
78
|
- 所有文件版本号必须完全一致
|
|
79
79
|
- 必须符合语义化版本规范 (`x.x.x`)
|
|
80
80
|
- 预发布版本可包含后缀 (`0.2.0-beta.1`)
|
|
81
|
+
- 预发布版本发布到 npm 时必须显式传 dist-tag(例如 `0.2.0-beta.1 -> --tag beta`)
|
|
81
82
|
|
|
82
83
|
**版本同步清单**:
|
|
83
84
|
|
|
@@ -202,8 +203,8 @@ git push origin main --tags
|
|
|
202
203
|
- Workflow Name: `publish.yml`
|
|
203
204
|
|
|
204
205
|
2. **GitHub Secrets 检查**:
|
|
205
|
-
- [ ]
|
|
206
|
-
- [ ] 如果需要
|
|
206
|
+
- [ ] 默认可不设置 `NPM_TOKEN`,优先走 OIDC Trusted Publishing
|
|
207
|
+
- [ ] 如果需要 token fallback,使用 `NPM_TOKEN` 并确保是 **Automation** 类型
|
|
207
208
|
|
|
208
209
|
3. **Workflow 权限配置**:
|
|
209
210
|
```yaml
|
|
@@ -214,9 +215,13 @@ git push origin main --tags
|
|
|
214
215
|
|
|
215
216
|
4. **发布命令**:
|
|
216
217
|
```yaml
|
|
217
|
-
#
|
|
218
|
+
# 正确:stable 版本发布到 latest
|
|
218
219
|
- name: Publish to NPM
|
|
219
|
-
run: npm publish --access public --
|
|
220
|
+
run: npm publish --access public --tag latest
|
|
221
|
+
|
|
222
|
+
# 正确:prerelease 版本显式发布到 preid 对应 tag
|
|
223
|
+
- name: Publish to NPM
|
|
224
|
+
run: npm publish --access public --tag beta
|
|
220
225
|
|
|
221
226
|
# 错误:设置 NODE_AUTH_TOKEN 会干扰 OIDC
|
|
222
227
|
# env:
|
package/docs/rules/validation.md
CHANGED
|
@@ -1,64 +1,115 @@
|
|
|
1
1
|
# 验证规则
|
|
2
2
|
|
|
3
|
+
> 原则:先跑最相关检查,再扩大范围;没有验证,不得声称“已解决”。
|
|
4
|
+
|
|
3
5
|
## 最小验证顺序
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
8. 若改动涉及 `mycodemap.config.json.storage` 或图数据库适配器,至少补跑对应 storage adapter 定点测试,并确认 `README.md`、`AI_GUIDE.md`、`docs/ai-guide/COMMANDS.md`、`docs/SETUP_GUIDE.md`、`mycodemap.config.schema.json` 与 guardrail 脚本同步。
|
|
13
|
-
9. 再扩大到 `npm run typecheck`、`npm run lint`、`npm test`。
|
|
14
|
-
10. 涉及发布或打包时,再执行 `npm run build` 与 `npm run validate-pack`。
|
|
7
|
+
| 场景 | 先跑什么 | 为什么 |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| 改 rules / CLAUDE / README / AI 文档 / 测试事实 | `npm run docs:check` | 先挡住文档漂移 |
|
|
10
|
+
| 改 repo-local 规则控制脚本或 hook 路由 | `python3 scripts/validate-rules.py code --report-only` | 先看 contract,不先硬阻断 |
|
|
11
|
+
| 改 CLI 文档入口或统一 guardrail | `node dist/cli/index.js ci check-docs-sync` | 同时验证 docs guardrail 与 analyze generated block |
|
|
12
|
+
| 改实现代码 | `npm run typecheck` → `npm run lint` → `npm test` | 从最小相关验证扩到基础回归 |
|
|
13
|
+
| 改发布/打包边界 | `npm run docs:check:pre-release` → `npm run build` → `npm run validate-pack` | 先锁版本/发布契约,再确认 shipped artifact 仍成立 |
|
|
15
14
|
|
|
16
|
-
##
|
|
15
|
+
## Repo-local rule validator
|
|
17
16
|
|
|
18
|
-
|
|
17
|
+
### `validate-rules.py` exit-code 表
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
| 命令 | 退出码 | 含义 | 默认动作 |
|
|
20
|
+
|---|---:|---|---|
|
|
21
|
+
| `python3 scripts/validate-rules.py code --report-only` | `0` | pass / report-only | 只报告,不阻断 |
|
|
22
|
+
| `python3 scripts/validate-rules.py code` | `1` | `P0` | blocker |
|
|
23
|
+
| `python3 scripts/validate-rules.py code` | `2` | `P1` | warn-only |
|
|
24
|
+
| `python3 scripts/validate-rules.py code` | `3` | `P2` | notice-only |
|
|
25
|
+
| `python3 scripts/validate-rules.py code` | `4` | `unavailable` | 依赖缺失,必须显式处理 |
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
### 当前默认值
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
- `.claude/rule-system.config.json` 默认开启 `enabled: true` 与 `route_by_edit_path: true`。
|
|
30
|
+
- `soft_gate.change_analyzer` 默认开启;`hard_gate.mode` 默认是 `report-only`。
|
|
31
|
+
- 本阶段默认 contract 是“先报告、再决定是否强阻断”,不要把 report-only 误写成 enforce。
|
|
30
32
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
-
|
|
34
|
-
|
|
33
|
+
## CI Gateway 真实顺序
|
|
34
|
+
|
|
35
|
+
当前 CI Gateway 直接执行 `check-docs-sync`、commit 格式、文件头、risk、output contract;`ship` 的本地 CHECK 阶段复用 `check-working-tree`、`check-branch`、`check-scripts`。
|
|
36
|
+
|
|
37
|
+
| 顺序 | 命令 | 说明 |
|
|
38
|
+
|---|---|---|
|
|
39
|
+
| 1 | `npm run docs:check` | 文档护栏 |
|
|
40
|
+
| 2 | `npm run typecheck` | 类型检查 |
|
|
41
|
+
| 3 | `npm run lint` | lint |
|
|
42
|
+
| 4 | `npm test` | 单元测试 |
|
|
43
|
+
| 5 | `npm run build` | 构建验证 |
|
|
44
|
+
| 6 | `node scripts/calibrate-contract-gate.mjs --max-changed-files 10 --max-false-positive-rate 0.10` | 设计 contract 校准;`changed files <= 10` 才可能进入 hard gate |
|
|
45
|
+
| 7 | `node dist/cli/index.js check --contract mycodemap.design.md --against src --base origin/main --annotation-format github` | PR 注解与 contract gate |
|
|
46
|
+
| 8 | `node dist/cli/index.js ci check-docs-sync` | 统一 docs/AI guardrail |
|
|
47
|
+
| 9 | `node dist/cli/index.js ci assess-risk --threshold=0.7` | 风险评估 |
|
|
48
|
+
|
|
49
|
+
> PR 超窗、`diff-scope-fallback` 或 `false-positive rate >10%` 时,workflow 必须明确标为 `warn-only / fallback`。
|
|
50
|
+
|
|
51
|
+
## 需要特别补跑的场景
|
|
52
|
+
|
|
53
|
+
- 若改动涉及 `mycodemap.config.json.storage` 或图数据库适配器,至少补跑对应 storage adapter 定点测试,并确认 `README.md`、`AI_GUIDE.md`、`docs/ai-guide/COMMANDS.md`、`docs/SETUP_GUIDE.md`、`mycodemap.config.schema.json` 与 guardrail 脚本同步。
|
|
54
|
+
- 若改动涉及 `check` / `ci assess-risk` / `history` / `analyze --include-git-history` 的统一 risk truth,至少补跑 `node dist/cli/index.js history --symbol createCheckCommand`、`node scripts/report-high-risk-files.mjs --top 3`、`npm run build`。
|
|
55
|
+
- 若改动涉及产品定位、输出契约、共享文件发现规则或 `Server Layer` / `mycodemap server` 边界,确认 README、AI 文档、架构文档和 guardrail 脚本使用同一套措辞。
|
|
56
|
+
|
|
57
|
+
## Design / Contract gate 速记
|
|
58
|
+
|
|
59
|
+
- 当前 canonical 设计链保持为 `design validate` / `design map` / `design handoff` / `design verify`,不要把 `workflow`、CI 或 ship 步骤混写进这条产品契约链。
|
|
60
|
+
- 需要验证完整链路时,直接运行 `design validate → design map → design handoff → design verify`。
|
|
61
|
+
- 常用命令:
|
|
62
|
+
- `node dist/cli/index.js design validate mycodemap.design.md --json`
|
|
63
|
+
- `node dist/cli/index.js design map mycodemap.design.md --json`
|
|
64
|
+
- `node dist/cli/index.js design handoff mycodemap.design.md --json`
|
|
65
|
+
- `node dist/cli/index.js design verify mycodemap.design.md --json`
|
|
66
|
+
- `node dist/cli/index.js check --contract mycodemap.design.md --against src`
|
|
67
|
+
- 裸 contract gate 片段必须保持为 `check --contract mycodemap.design.md --against src`
|
|
68
|
+
- PR 路径必须显式使用 `github.event.pull_request.base.sha`
|
|
69
|
+
- `review-needed 与 blocker 退出语义` 必须分开写;`review-needed` 不是 blocker。
|
|
35
70
|
|
|
36
71
|
## 典型失败模式
|
|
37
72
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
73
|
+
| 失败模式 | 先看哪里 | 恢复方式 |
|
|
74
|
+
|---|---|---|
|
|
75
|
+
| `schema / README / AI 文档没同步` | `npm run docs:check` | 先修文档真相,再重跑 |
|
|
76
|
+
| prerelease 发布卡在 npm publish | `.github/workflows/publish.yml` / `package.json version` | 确认 prerelease 版本显式传了 `--tag <preid>`;例如 `0.5.2-beta.1` 必须走 `--tag beta` |
|
|
77
|
+
| 文档继续把历史设计写成当前现实 | `npm run docs:check` | 把 shipped baseline 与 future intent 分开 |
|
|
78
|
+
| 旧的 `neo4j` / `kuzudb` 配置已经不受支持,但文档还把它写成正式 backend | `README.md` / `AI_GUIDE.md` / schema | 改回 `filesystem` / `sqlite` / `memory` / `auto` 真实 contract |
|
|
79
|
+
| `storage.type="sqlite"` 运行时不满足要求 | Node.js `>=20`、`better-sqlite3`、`STORAGE_BACKEND_MIGRATED`、`SQLITE_NOT_AVAILABLE` | 修运行时或改配置,不要静默 fallback |
|
|
80
|
+
| 风险 truth 漂移 | `check` / `ci assess-risk` / `history` / `analyze --include-git-history` | 统一命令输出与文档措辞 |
|
|
81
|
+
| 把 `workflow` 写回非 analysis-only | `docs/rules/engineering-with-codex-openai.md` / README | 收敛回 `find → read → link → show` |
|
|
82
|
+
| 文档声称扫描类命令会尊重 `.gitignore`,但实现仍保留手写跳过规则 | `node dist/cli/index.js ci check-docs-sync` | 改回共享文件发现 contract,再重跑 docs guardrail |
|
|
83
|
+
| 把 `workflow` 重新扩回非分析阶段,却没同步 README / AI 命令文档 / guardrail 脚本 | `npm run docs:check` | 收敛回 analysis-only 边界,再同步文档 |
|
|
48
84
|
|
|
49
85
|
## 常用命令
|
|
50
86
|
|
|
51
87
|
```bash
|
|
88
|
+
python3 scripts/validate-rules.py code --report-only
|
|
52
89
|
npm run docs:check
|
|
53
|
-
node scripts/sync-analyze-docs.js --check
|
|
54
90
|
node dist/cli/index.js ci check-docs-sync
|
|
55
|
-
node
|
|
56
|
-
node dist/cli/index.js
|
|
57
|
-
node dist/cli/index.js
|
|
58
|
-
|
|
91
|
+
node scripts/calibrate-contract-gate.mjs --max-changed-files 10 --max-false-positive-rate 0.10
|
|
92
|
+
node dist/cli/index.js check --contract mycodemap.design.md --against src
|
|
93
|
+
node dist/cli/index.js check --contract mycodemap.design.md --against src --base origin/main --annotation-format github
|
|
94
|
+
node dist/cli/index.js history --symbol createCheckCommand
|
|
95
|
+
node scripts/report-high-risk-files.mjs --top 3
|
|
59
96
|
npm run typecheck
|
|
60
|
-
npm test
|
|
61
97
|
npm run lint
|
|
98
|
+
npm test
|
|
62
99
|
npm run build
|
|
63
100
|
npm run validate-pack
|
|
64
101
|
```
|
|
102
|
+
|
|
103
|
+
## Rule Control QA
|
|
104
|
+
|
|
105
|
+
| 命令 | 目的 |
|
|
106
|
+
|---|---|
|
|
107
|
+
| `bash scripts/qa-rule-control.sh --scenario all` | 一键覆盖 capability、P0/P1/unavailable、disabled soft gate、rule-context、CI backstop 七个场景 |
|
|
108
|
+
| `python3 -m unittest scripts/tests/test_rule_control_workflow.py` | 锁住 helper scope、workflow `<rule_context>` 注入和 CI backstop 文本契约 |
|
|
109
|
+
|
|
110
|
+
## 强约束
|
|
111
|
+
|
|
112
|
+
- 没有验证,不得声称“已解决”。
|
|
113
|
+
- 失败时优先修根因,不绕过护栏。
|
|
114
|
+
- 涉及 CI / hooks / 输出契约时,必须给出失败场景与修复验证证据。
|
|
115
|
+
- 不得把 `warn-only / fallback` 伪装成 hard gate success。
|
|
@@ -47,9 +47,9 @@
|
|
|
47
47
|
"properties": {
|
|
48
48
|
"type": {
|
|
49
49
|
"type": "string",
|
|
50
|
-
"enum": ["filesystem", "
|
|
50
|
+
"enum": ["filesystem", "sqlite", "memory", "auto"],
|
|
51
51
|
"default": "filesystem",
|
|
52
|
-
"description": "Storage backend type (Neo4j
|
|
52
|
+
"description": "Storage backend type (Neo4j and KùzuDB are no longer supported)"
|
|
53
53
|
},
|
|
54
54
|
"outputPath": {
|
|
55
55
|
"type": "string",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
},
|
|
59
59
|
"databasePath": {
|
|
60
60
|
"type": "string",
|
|
61
|
-
"description": "
|
|
61
|
+
"description": "SQLite database file path relative to project root"
|
|
62
62
|
},
|
|
63
63
|
"autoThresholds": {
|
|
64
64
|
"type": "object",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mycodemap/mycodemap",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2-beta.1",
|
|
4
4
|
"description": "TypeScript 代码地图工具 - 为 AI 辅助开发提供结构化上下文",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -60,6 +60,8 @@
|
|
|
60
60
|
"license": "MIT",
|
|
61
61
|
"dependencies": {
|
|
62
62
|
"@hono/node-server": "^1.19.11",
|
|
63
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
64
|
+
"better-sqlite3": "^12.9.0",
|
|
63
65
|
"chalk": "^5.3.0",
|
|
64
66
|
"chokidar": "^3.5.3",
|
|
65
67
|
"commander": "^11.1.0",
|
|
@@ -69,14 +71,17 @@
|
|
|
69
71
|
"tree-sitter": "^0.21.1",
|
|
70
72
|
"tree-sitter-typescript": "^0.23.2",
|
|
71
73
|
"typescript": "^5.3.3",
|
|
72
|
-
"typhonjs-escomplex": "^0.1.0"
|
|
74
|
+
"typhonjs-escomplex": "^0.1.0",
|
|
75
|
+
"zod": "^4.3.6"
|
|
73
76
|
},
|
|
74
77
|
"devDependencies": {
|
|
78
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
75
79
|
"@types/glob": "^8.1.0",
|
|
76
80
|
"@types/node": "^20.10.0",
|
|
77
81
|
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
|
78
82
|
"@typescript-eslint/parser": "^6.21.0",
|
|
79
83
|
"@vitest/coverage-v8": "^1.6.1",
|
|
84
|
+
"dependency-cruiser": "^17.3.10",
|
|
80
85
|
"eslint": "^8.57.1",
|
|
81
86
|
"vitest": "^1.1.0"
|
|
82
87
|
},
|