@mycodemap/mycodemap 0.4.2 → 0.5.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 +105 -3
- package/README.md +192 -53
- package/dist/ai/claude.d.ts +38 -0
- package/dist/ai/claude.d.ts.map +1 -0
- package/dist/ai/claude.js +169 -0
- package/dist/ai/claude.js.map +1 -0
- package/dist/ai/codex.d.ts +38 -0
- package/dist/ai/codex.d.ts.map +1 -0
- package/dist/ai/codex.js +169 -0
- package/dist/ai/codex.js.map +1 -0
- package/dist/ai/factory.d.ts +48 -0
- package/dist/ai/factory.d.ts.map +1 -0
- package/dist/ai/factory.js +95 -0
- package/dist/ai/factory.js.map +1 -0
- package/dist/ai/index.d.ts +12 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +29 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/provider.d.ts +70 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +31 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/ai/subagent-caller.d.ts +90 -0
- package/dist/ai/subagent-caller.d.ts.map +1 -0
- package/dist/ai/subagent-caller.js +280 -0
- package/dist/ai/subagent-caller.js.map +1 -0
- package/dist/ai/types.d.ts +70 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +5 -0
- package/dist/ai/types.js.map +1 -0
- 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 +52 -0
- package/dist/cli/commands/design.d.ts.map +1 -0
- package/dist/cli/commands/design.js +274 -0
- package/dist/cli/commands/design.js.map +1 -0
- 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/server.d.ts +9 -0
- package/dist/cli/commands/server.d.ts.map +1 -0
- package/dist/cli/commands/server.js +65 -0
- package/dist/cli/commands/server.js.map +1 -0
- package/dist/cli/commands/ship/pipeline.d.ts.map +1 -1
- package/dist/cli/commands/ship/pipeline.js +8 -1
- package/dist/cli/commands/ship/pipeline.js.map +1 -1
- package/dist/cli/commands/ship/publisher.d.ts +9 -1
- package/dist/cli/commands/ship/publisher.d.ts.map +1 -1
- package/dist/cli/commands/ship/publisher.js +149 -6
- package/dist/cli/commands/ship/publisher.js.map +1 -1
- 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 +15 -0
- package/dist/cli/design-contract-loader.d.ts.map +1 -0
- package/dist/cli/design-contract-loader.js +527 -0
- package/dist/cli/design-contract-loader.js.map +1 -0
- package/dist/cli/design-contract-schema.d.ts +11 -0
- package/dist/cli/design-contract-schema.d.ts.map +1 -0
- package/dist/cli/design-contract-schema.js +75 -0
- package/dist/cli/design-contract-schema.js.map +1 -0
- package/dist/cli/design-handoff-builder.d.ts +15 -0
- package/dist/cli/design-handoff-builder.d.ts.map +1 -0
- package/dist/cli/design-handoff-builder.js +345 -0
- package/dist/cli/design-handoff-builder.js.map +1 -0
- package/dist/cli/design-scope-resolver.d.ts +8 -0
- package/dist/cli/design-scope-resolver.d.ts.map +1 -0
- package/dist/cli/design-scope-resolver.js +760 -0
- package/dist/cli/design-scope-resolver.js.map +1 -0
- package/dist/cli/design-verification-builder.d.ts +8 -0
- package/dist/cli/design-verification-builder.d.ts.map +1 -0
- package/dist/cli/design-verification-builder.js +369 -0
- package/dist/cli/design-verification-builder.js.map +1 -0
- package/dist/cli/index.js +20 -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/cli-new/commands/server.d.ts +13 -0
- package/dist/cli-new/commands/server.d.ts.map +1 -0
- package/dist/cli-new/commands/server.js +90 -0
- package/dist/cli-new/commands/server.js.map +1 -0
- 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/generator/ai-overview.d.ts +51 -0
- package/dist/generator/ai-overview.d.ts.map +1 -0
- package/dist/generator/ai-overview.js +160 -0
- package/dist/generator/ai-overview.js.map +1 -0
- package/dist/infrastructure/storage/StorageFactory.d.ts +13 -5
- package/dist/infrastructure/storage/StorageFactory.d.ts.map +1 -1
- package/dist/infrastructure/storage/StorageFactory.js +62 -16
- 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/Neo4jStorage.d.ts +41 -0
- package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts.map +1 -0
- package/dist/infrastructure/storage/adapters/Neo4jStorage.js +162 -0
- package/dist/infrastructure/storage/adapters/Neo4jStorage.js.map +1 -0
- 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 +123 -0
- package/dist/interface/types/design-contract.d.ts.map +1 -0
- package/dist/interface/types/design-contract.js +7 -0
- package/dist/interface/types/design-contract.js.map +1 -0
- package/dist/interface/types/design-handoff.d.ts +68 -0
- package/dist/interface/types/design-handoff.d.ts.map +1 -0
- package/dist/interface/types/design-handoff.js +4 -0
- package/dist/interface/types/design-handoff.js.map +1 -0
- package/dist/interface/types/design-mapping.d.ts +51 -0
- package/dist/interface/types/design-mapping.d.ts.map +1 -0
- package/dist/interface/types/design-mapping.js +4 -0
- package/dist/interface/types/design-mapping.js.map +1 -0
- package/dist/interface/types/design-verification.d.ts +49 -0
- package/dist/interface/types/design-verification.d.ts.map +1 -0
- package/dist/interface/types/design-verification.js +4 -0
- package/dist/interface/types/design-verification.js.map +1 -0
- 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 +20 -1
- 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/ai-feed-generator.d.ts +210 -0
- package/dist/orchestrator/ai-feed-generator.d.ts.map +1 -0
- package/dist/orchestrator/ai-feed-generator.js +377 -0
- package/dist/orchestrator/ai-feed-generator.js.map +1 -0
- 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/SETUP_GUIDE.md +6 -6
- package/docs/ai-guide/COMMANDS.md +171 -4
- package/docs/ai-guide/INTEGRATION.md +137 -433
- package/docs/ai-guide/OUTPUT.md +890 -5
- package/docs/ai-guide/PATTERNS.md +54 -14
- package/docs/ai-guide/PROMPTS.md +17 -6
- package/docs/archive/test-report-symbol-search.md +384 -0
- package/docs/archive/test-scenario-4-complexity-analysis.md +460 -0
- package/docs/archive/test_report_scenario5.md +615 -0
- package/docs/archive/test_scenario_3_impact_analysis_report.md +520 -0
- 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 +126 -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/product-specs/README.md +2 -1
- 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 +20 -3
- package/docs/rules/validation.md +90 -37
- 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/experiments/arcadedb-http-smoke.mjs +90 -0
- 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 +479 -25
- package/scripts/validate-rules.py +254 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* [META] since:2026-04-15 | owner:cli-team | stable:false
|
|
3
|
+
* [WHY] Expose symbol-first git history as a public machine-first CLI command backed by the canonical history risk service
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { cwd } from 'node:process';
|
|
7
|
+
import { GitHistoryService } from '../../orchestrator/history-risk-service.js';
|
|
8
|
+
import { createConfiguredStorage } from '../storage-runtime.js';
|
|
9
|
+
function toHistoryCommandResult(result) {
|
|
10
|
+
return {
|
|
11
|
+
query: result.query,
|
|
12
|
+
status: result.diagnostics.status,
|
|
13
|
+
symbol: result.symbol,
|
|
14
|
+
candidates: result.candidates,
|
|
15
|
+
files: result.files,
|
|
16
|
+
timeline: result.timeline,
|
|
17
|
+
risk: result.risk,
|
|
18
|
+
warnings: [...result.diagnostics.reasons],
|
|
19
|
+
diagnostics: result.diagnostics,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function renderHistoryResult(result) {
|
|
23
|
+
const lines = [
|
|
24
|
+
`History status: ${result.status}`,
|
|
25
|
+
`Query: ${result.query}`,
|
|
26
|
+
`Confidence: ${result.diagnostics.confidence}`,
|
|
27
|
+
`Freshness: ${result.diagnostics.freshness}`,
|
|
28
|
+
];
|
|
29
|
+
if (result.symbol) {
|
|
30
|
+
lines.push(`Symbol: ${result.symbol.name} (${result.symbol.kind}) @ ${result.symbol.file}:${result.symbol.line}`);
|
|
31
|
+
}
|
|
32
|
+
if (result.candidates.length > 1) {
|
|
33
|
+
lines.push('Candidates:');
|
|
34
|
+
for (const candidate of result.candidates) {
|
|
35
|
+
lines.push(`- ${candidate.symbolId} ${candidate.name} ${candidate.kind} ${candidate.file}:${candidate.line}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
lines.push(`Risk: ${result.risk.level}`);
|
|
39
|
+
if (result.risk.riskFactors.length > 0) {
|
|
40
|
+
lines.push(`Risk Factors: ${result.risk.riskFactors.join(', ')}`);
|
|
41
|
+
}
|
|
42
|
+
lines.push('Timeline:');
|
|
43
|
+
if (result.timeline.length === 0) {
|
|
44
|
+
lines.push('- none');
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
for (const entry of result.timeline) {
|
|
48
|
+
lines.push(`- ${entry.date} [${entry.tagType}] ${entry.author}: ${entry.subject}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
lines.push('Warnings:');
|
|
52
|
+
if (result.warnings.length === 0) {
|
|
53
|
+
lines.push('- none');
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
for (const warning of result.warnings) {
|
|
57
|
+
lines.push(`- ${warning}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return lines.join('\n');
|
|
61
|
+
}
|
|
62
|
+
export async function executeHistoryCommand(options) {
|
|
63
|
+
const { storage } = await createConfiguredStorage(cwd());
|
|
64
|
+
try {
|
|
65
|
+
const service = new GitHistoryService({
|
|
66
|
+
projectRoot: cwd(),
|
|
67
|
+
storage,
|
|
68
|
+
});
|
|
69
|
+
const result = await service.analyzeSymbol(options.symbol, { persist: true });
|
|
70
|
+
return toHistoryCommandResult(result);
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
await storage.close();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function handleHistoryCommand(options) {
|
|
77
|
+
const result = await executeHistoryCommand(options);
|
|
78
|
+
if (options.human) {
|
|
79
|
+
console.log(renderHistoryResult(result));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
console.log(JSON.stringify(result, null, 2));
|
|
83
|
+
}
|
|
84
|
+
export function createHistoryCommand() {
|
|
85
|
+
return new Command('history')
|
|
86
|
+
.description('查询符号级 git history 与 risk 摘要(默认 JSON)')
|
|
87
|
+
.requiredOption('--symbol <name>', '目标符号名或 symbol id')
|
|
88
|
+
.option('--human', '使用人类可读输出(默认 JSON)')
|
|
89
|
+
.action(handleHistoryCommand);
|
|
90
|
+
}
|
|
91
|
+
export const historyCommand = createHistoryCommand();
|
|
92
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/cli/commands/history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
export declare const DEFAULT_MCP_SERVER_NAME = "mycodemap-experimental";
|
|
3
|
+
export declare function isMcpStartInvocation(argv: string[]): boolean;
|
|
4
|
+
export declare function installMcpServer(rootDir?: string): Promise<{
|
|
5
|
+
serverName: string;
|
|
6
|
+
configPath: string;
|
|
7
|
+
updated: boolean;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function handleMcpStart(): Promise<void>;
|
|
10
|
+
export declare function handleMcpInstall(): Promise<void>;
|
|
11
|
+
export declare function createMcpCommand(): Command;
|
|
12
|
+
export declare const mcpCommand: Command;
|
|
13
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;AA4BhE,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAE5D;AAED,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC,CA2CD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAOpD;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAetD;AAED,wBAAgB,gBAAgB,IAAI,OAAO,CAe1C;AAED,eAAO,MAAM,UAAU,SAAqB,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// [META] since:2026-04-19 | owner:cli-team | stable:false
|
|
2
|
+
// [WHY] Expose the experimental local-only MCP stdio surface without polluting stdout during server startup
|
|
3
|
+
import { cwd } from 'node:process';
|
|
4
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
import { startCodeMapMcpServer } from '../../server/mcp/index.js';
|
|
8
|
+
export const DEFAULT_MCP_SERVER_NAME = 'mycodemap-experimental';
|
|
9
|
+
function isRecord(value) {
|
|
10
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
11
|
+
}
|
|
12
|
+
function createDefaultConfig() {
|
|
13
|
+
return {
|
|
14
|
+
mcpServers: {},
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function createExperimentalServerEntry(rootDir) {
|
|
18
|
+
return {
|
|
19
|
+
command: 'node',
|
|
20
|
+
args: ['dist/cli/index.js', 'mcp', 'start'],
|
|
21
|
+
cwd: rootDir,
|
|
22
|
+
env: {
|
|
23
|
+
MYCODEMAP_RUNTIME_LOG_ENABLED: 'false',
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export function isMcpStartInvocation(argv) {
|
|
28
|
+
return argv[0] === 'mcp' && argv[1] === 'start';
|
|
29
|
+
}
|
|
30
|
+
export async function installMcpServer(rootDir = cwd()) {
|
|
31
|
+
const configPath = path.join(rootDir, '.mcp.json');
|
|
32
|
+
const nextEntry = createExperimentalServerEntry(rootDir);
|
|
33
|
+
let existingConfig = createDefaultConfig();
|
|
34
|
+
try {
|
|
35
|
+
const rawConfig = await readFile(configPath, 'utf8');
|
|
36
|
+
const parsedConfig = JSON.parse(rawConfig);
|
|
37
|
+
if (!isRecord(parsedConfig)) {
|
|
38
|
+
throw new Error('`.mcp.json` 必须是 JSON 对象');
|
|
39
|
+
}
|
|
40
|
+
existingConfig = {
|
|
41
|
+
...parsedConfig,
|
|
42
|
+
mcpServers: isRecord(parsedConfig.mcpServers)
|
|
43
|
+
? { ...parsedConfig.mcpServers }
|
|
44
|
+
: {},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
if (error instanceof SyntaxError) {
|
|
49
|
+
throw new Error(`无法解析 ${configPath}: ${error.message}`);
|
|
50
|
+
}
|
|
51
|
+
const nodeError = error;
|
|
52
|
+
if (nodeError.code !== 'ENOENT') {
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const currentEntry = existingConfig.mcpServers?.[DEFAULT_MCP_SERVER_NAME];
|
|
57
|
+
const updated = JSON.stringify(currentEntry) !== JSON.stringify(nextEntry);
|
|
58
|
+
existingConfig.mcpServers = {
|
|
59
|
+
...(existingConfig.mcpServers ?? {}),
|
|
60
|
+
[DEFAULT_MCP_SERVER_NAME]: nextEntry,
|
|
61
|
+
};
|
|
62
|
+
await writeFile(configPath, `${JSON.stringify(existingConfig, null, 2)}\n`, 'utf8');
|
|
63
|
+
return {
|
|
64
|
+
serverName: DEFAULT_MCP_SERVER_NAME,
|
|
65
|
+
configPath,
|
|
66
|
+
updated,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export async function handleMcpStart() {
|
|
70
|
+
try {
|
|
71
|
+
await startCodeMapMcpServer();
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export async function handleMcpInstall() {
|
|
79
|
+
try {
|
|
80
|
+
const result = await installMcpServer();
|
|
81
|
+
const statusText = result.updated ? 'installed' : 'already-installed';
|
|
82
|
+
console.log([
|
|
83
|
+
`Experimental MCP server ${statusText}: ${result.serverName}`,
|
|
84
|
+
`Config: ${result.configPath}`,
|
|
85
|
+
'Surface: local-only stdio, read-only, experimental',
|
|
86
|
+
'Run `mycodemap generate --symbol-level` before invoking MCP tools.',
|
|
87
|
+
].join('\n'));
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export function createMcpCommand() {
|
|
95
|
+
const command = new Command('mcp');
|
|
96
|
+
command.description('Experimental MCP integration (local-only, read-only, stdio first)');
|
|
97
|
+
command
|
|
98
|
+
.command('start')
|
|
99
|
+
.description('Start the experimental local MCP stdio server')
|
|
100
|
+
.action(handleMcpStart);
|
|
101
|
+
command
|
|
102
|
+
.command('install')
|
|
103
|
+
.description('Install the experimental local MCP server into the current repo `.mcp.json`')
|
|
104
|
+
.action(handleMcpInstall);
|
|
105
|
+
return command;
|
|
106
|
+
}
|
|
107
|
+
export const mcpCommand = createMcpCommand();
|
|
108
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/server.ts"],"names":[],"mappings":"AASA,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgEzE"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// [META] since:2026-03 | owner:architecture-team | stable:true
|
|
2
|
+
// [WHY] Server command - starts the CodeMap HTTP API server (MVP3 architecture)
|
|
3
|
+
// ============================================
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { CodeGraphBuilder } from '../../domain/services/CodeGraphBuilder.js';
|
|
6
|
+
import { CodeMapServer } from '../../server/CodeMapServer.js';
|
|
7
|
+
import { createConfiguredStorage } from '../storage-runtime.js';
|
|
8
|
+
export async function serverCommand(options) {
|
|
9
|
+
try {
|
|
10
|
+
const port = parseInt(options.port ?? '3000', 10);
|
|
11
|
+
const host = options.host ?? '0.0.0.0';
|
|
12
|
+
console.log(chalk.blue('🔧 初始化 CodeMap 服务器...\n'));
|
|
13
|
+
// 创建存储实例
|
|
14
|
+
const { storage } = await createConfiguredStorage(process.cwd());
|
|
15
|
+
// 创建代码图构建器
|
|
16
|
+
const builder = CodeGraphBuilder.create({
|
|
17
|
+
mode: 'fast',
|
|
18
|
+
rootDir: process.cwd(),
|
|
19
|
+
});
|
|
20
|
+
// 创建并启动服务器
|
|
21
|
+
const server = CodeMapServer.create(storage, builder, {
|
|
22
|
+
port,
|
|
23
|
+
host,
|
|
24
|
+
cors: options.cors ? { origin: '*', credentials: true } : undefined,
|
|
25
|
+
});
|
|
26
|
+
const { url } = await server.start();
|
|
27
|
+
console.log(chalk.green(`\n✅ 服务器已启动!\n`));
|
|
28
|
+
console.log(chalk.white(`📡 API 地址: ${chalk.cyan(`${url}/api/v1`)}`));
|
|
29
|
+
console.log(chalk.white(`🏥 健康检查: ${chalk.cyan(`${url}/api/v1/health`)}`));
|
|
30
|
+
console.log(chalk.white(`📊 项目统计: ${chalk.cyan(`${url}/api/v1/stats`)}`));
|
|
31
|
+
console.log(chalk.white(`🔍 符号搜索: ${chalk.cyan(`${url}/api/v1/search/symbols?q=`)}`));
|
|
32
|
+
console.log();
|
|
33
|
+
// 自动打开浏览器
|
|
34
|
+
if (options.open) {
|
|
35
|
+
try {
|
|
36
|
+
const { exec } = await import('child_process');
|
|
37
|
+
const platform = process.platform;
|
|
38
|
+
const cmd = platform === 'darwin' ? 'open' : platform === 'win32' ? 'start' : 'xdg-open';
|
|
39
|
+
exec(`${cmd} ${url}`);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// 忽略打开浏览器失败
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// 优雅关闭
|
|
46
|
+
process.on('SIGINT', async () => {
|
|
47
|
+
console.log(chalk.yellow('\n\n🛑 正在关闭服务器...'));
|
|
48
|
+
await server.stop();
|
|
49
|
+
await storage.close();
|
|
50
|
+
process.exit(0);
|
|
51
|
+
});
|
|
52
|
+
process.on('SIGTERM', async () => {
|
|
53
|
+
await server.stop();
|
|
54
|
+
await storage.close();
|
|
55
|
+
process.exit(0);
|
|
56
|
+
});
|
|
57
|
+
// 保持进程运行
|
|
58
|
+
await new Promise(() => { });
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.error(chalk.red('\n❌ 服务器启动失败:'), error);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/cli/commands/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ship/pipeline.ts"],"names":[],"mappings":"AAMA,OAAO,EAAuC,aAAa,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAyC,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAA2D,WAAW,EAAE,MAAM,cAAc,CAAC;AACpG,OAAO,EAAgC,aAAa,
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ship/pipeline.ts"],"names":[],"mappings":"AAMA,OAAO,EAAuC,aAAa,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAyC,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAA2D,WAAW,EAAE,MAAM,cAAc,CAAC;AACpG,OAAO,EAAgC,aAAa,EAA6C,MAAM,gBAAgB,CAAC;AACxH,OAAO,EAAkC,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7E,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA8DD,wBAAsB,eAAe,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,CA6MvF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAKlE"}
|
|
@@ -6,7 +6,7 @@ import chalk from 'chalk';
|
|
|
6
6
|
import { analyzeCommits, formatAnalyzeOutput } from './analyzer.js';
|
|
7
7
|
import { calculateVersion, formatVersionOutput } from './versioner.js';
|
|
8
8
|
import { runQualityChecks, formatCheckOutput, shouldBlockRelease } from './checker.js';
|
|
9
|
-
import { publish, formatPublishOutput } from './publisher.js';
|
|
9
|
+
import { publish, formatPublishOutput, isLargeRelease, formatLargeReleaseWarning } from './publisher.js';
|
|
10
10
|
import { monitorCI, formatMonitorOutput } from './monitor.js';
|
|
11
11
|
const SEPARATOR = '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━';
|
|
12
12
|
const CONFIRM_TIMEOUT_MS = 30_000;
|
|
@@ -71,6 +71,13 @@ export async function runShipPipeline(ctx) {
|
|
|
71
71
|
if (!analyzeStep || !analyzeResult) {
|
|
72
72
|
return { ...result, blocked: true, blockReason: '变更分析失败' };
|
|
73
73
|
}
|
|
74
|
+
// 检测大规模发布并显示警告
|
|
75
|
+
if (isLargeRelease(analyzeResult.commits)) {
|
|
76
|
+
const warningLines = formatLargeReleaseWarning(analyzeResult.commits);
|
|
77
|
+
for (const line of warningLines) {
|
|
78
|
+
console.log(line);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
74
81
|
// Step 2: VERSION
|
|
75
82
|
const versionStep = await runStep('版本计算', async () => {
|
|
76
83
|
versionResult = await calculateVersion(analyzeResult);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../../src/cli/commands/ship/pipeline.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,wBAAwB;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAiB,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAiB,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EAAe,MAAM,cAAc,CAAC;AACpG,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAiB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../../src/cli/commands/ship/pipeline.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,wBAAwB;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAiB,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAiB,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EAAe,MAAM,cAAc,CAAC;AACpG,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAiB,cAAc,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AACxH,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAiB,MAAM,cAAc,CAAC;AAmB7E,MAAM,SAAS,GAAG,iCAAiC,CAAC;AACpD,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,KAAK,UAAU,OAAO,CACpB,IAAY,EACZ,EAAuB,EACvB,MAAoB;IAEpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC;QACzC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,4BAA4B,CACzC,OAAe,EACf,WAAwB;IAExB,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClC,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,WAAW,CAAC,UAAU,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC;IAEnF,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO;SAC5C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SACvF,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEf,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QACnC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC,CAAC;IAE/C,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAErE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QACvD,OAAO,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAwB;IAC5D,MAAM,MAAM,GAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAElD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IACzC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,aAAwC,CAAC;IAC7C,IAAI,aAAwC,CAAC;IAC7C,IAAI,WAAoC,CAAC;IAEzC,kBAAkB;IAClB,MAAM,WAAW,GAAG,MAAM,OAAO,CAC/B,MAAM,EACN,KAAK,IAAI,EAAE;QACT,aAAa,GAAG,MAAM,cAAc,EAAE,CAAC;IACzC,CAAC,EACD,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,mBAAmB,CAAC,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAC3E,CAAC;IAEF,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa,EAAE,CAAC;QACnC,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;IAC7D,CAAC;IAED,eAAe;IACf,IAAI,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG,yBAAyB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACtE,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,MAAM,WAAW,GAAG,MAAM,OAAO,CAC/B,MAAM,EACN,KAAK,IAAI,EAAE;QACT,aAAa,GAAG,MAAM,gBAAgB,CAAC,aAAc,CAAC,CAAC;IACzD,CAAC,EACD,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,mBAAmB,CAAC,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAC3E,CAAC;IAEF,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa,EAAE,CAAC;QACnC,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACzE,CAAC;IAED,0CAA0C;IAC1C,IAAI,aAAa,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACzE,CAAC;IAED,gBAAgB;IAChB,MAAM,SAAS,GAAG,MAAM,OAAO,CAC7B,MAAM,EACN,KAAK,IAAI,EAAE;QACT,WAAW,GAAG,MAAM,gBAAgB,CAAC,aAAc,EAAE,aAAc,CAAC,CAAC;IACvE,CAAC,EACD,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CACrE,CAAC;IAEF,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;IAC7D,CAAC;IAED,aAAa;IACb,IAAI,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACzC,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,WAAW,CAAC,UAAU,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;iBAC7D,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;iBAC5B,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,aAAa;YACb,aAAa;YACb,WAAW;YACX,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,SAAS;SACvB,CAAC;IACJ,CAAC;IAED,iBAAiB;IACjB,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QACtE,MAAM,aAAa,GAAG,MAAM,4BAA4B,CAAC,aAAa,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;QACtG,IAAI,aAAa,KAAK,WAAW,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvB,IAAI,aAAa,KAAK,aAAa,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;YAC5D,CAAC;iBAAM,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YACvC,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,aAAa;gBACb,aAAa;gBACb,WAAW;gBACX,OAAO,EAAE,IAAI;gBACb,WAAW,EAAE,QAAQ;aACtB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,IAAI,aAAwC,CAAC;IAC7C,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAEvC,aAAa,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,gBAAgB,EAAE;YAC5D,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,aAAa;SACd,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAE7D,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YACjC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,aAAa;gBACb,aAAa;gBACb,WAAW;gBACX,aAAa;gBACb,OAAO,EAAE,IAAI;gBACb,WAAW,EAAE,MAAM;aACpB,CAAC;QACJ,CAAC;QAED,kBAAkB;QAClB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC;YACpC,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO,EAAE,aAAa,CAAC,OAAO;YAC9B,OAAO,EAAE,aAAa,CAAC,OAAO;YAC9B,WAAW,EAAE,aAAa,CAAC,UAAU;SACtC,CAAC,CAAC;QACH,MAAM,aAAa,GAAG,mBAAmB,CAAC,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;QAE9F,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,aAAa;gBACb,aAAa;gBACb,WAAW;gBACX,aAAa;gBACb,aAAa;gBACb,OAAO,EAAE,IAAI;gBACb,WAAW,EAAE,aAAa,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB;aACpF,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,aAAa,GAAG,aAAa,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,aAAa,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAE9C,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,aAAa,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAEtC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,aAAa;YACb,aAAa;YACb,WAAW;SACZ,CAAC;IACJ,CAAC;IAED,OAAO;IACP,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,gBAAgB,MAAM,CAAC,CAAC,CAAC;IACtE,IAAI,MAAM,CAAC,aAAa,EAAE,UAAU,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,aAAa;QACb,aAAa;QACb,WAAW;QACX,aAAa;QACb,aAAa,EAAE,MAAM,CAAC,aAAa;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAsB;IACxD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,UAAU,MAAM,CAAC,WAAW,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,8 +1,16 @@
|
|
|
1
|
-
import { AnalyzeResult } from './analyzer.js';
|
|
1
|
+
import { AnalyzeResult, GitCommit } from './analyzer.js';
|
|
2
2
|
export interface PublishOptions {
|
|
3
3
|
dryRun?: boolean;
|
|
4
4
|
analyzeResult?: AnalyzeResult;
|
|
5
5
|
}
|
|
6
|
+
/**
|
|
7
|
+
* 检查是否为大规模发布,需要额外注意
|
|
8
|
+
*/
|
|
9
|
+
export declare function isLargeRelease(commits: GitCommit[]): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* 生成大规模发布警告
|
|
12
|
+
*/
|
|
13
|
+
export declare function formatLargeReleaseWarning(commits: GitCommit[]): string[];
|
|
6
14
|
export interface PublishResult {
|
|
7
15
|
success: boolean;
|
|
8
16
|
version: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ship/publisher.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ship/publisher.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAgGD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAE5D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAwBxE;AAkQD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CA2EnG;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAyBjE"}
|
|
@@ -5,6 +5,104 @@ import { execSync } from 'child_process';
|
|
|
5
5
|
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
6
6
|
const CHANGELOG_HEADER = '# Changelog\n\nAll notable changes to this project will be documented in this file.\n\n';
|
|
7
7
|
const COMMAND_MAX_BUFFER = 20 * 1024 * 1024;
|
|
8
|
+
// Commit 数量警告阈值
|
|
9
|
+
const LARGE_RELEASE_COMMIT_THRESHOLD = 20;
|
|
10
|
+
/**
|
|
11
|
+
* 检测 commit 是否属于 milestone 相关
|
|
12
|
+
* 基于 commit message 中的关键词识别 milestone/phase 变更
|
|
13
|
+
*/
|
|
14
|
+
function detectMilestoneKeywords(message) {
|
|
15
|
+
const lowerMsg = message.toLowerCase();
|
|
16
|
+
// Phase 相关
|
|
17
|
+
const phaseMatch = message.match(/phase\s*(\d+)/i);
|
|
18
|
+
const phase = phaseMatch ? `Phase ${phaseMatch[1]}` : undefined;
|
|
19
|
+
// 检测 milestone 生命周期
|
|
20
|
+
if (/\bstart\s+(v?\d+\.\d+|milestone)/i.test(message) || /启动.*milestone/i.test(message)) {
|
|
21
|
+
return { isMilestone: true, phase, type: 'start' };
|
|
22
|
+
}
|
|
23
|
+
if (/\b(close|complete|finish)\s+(v?\d+\.\d+|milestone)/i.test(message) || /完成.*milestone/i.test(message)) {
|
|
24
|
+
return { isMilestone: true, phase, type: 'close' };
|
|
25
|
+
}
|
|
26
|
+
if (/\barchive\b/i.test(message) || /归档/i.test(message)) {
|
|
27
|
+
return { isMilestone: true, phase, type: 'archive' };
|
|
28
|
+
}
|
|
29
|
+
// 检测 planning 文档变更
|
|
30
|
+
if (/planning:/i.test(message) || /\.planning\//i.test(message)) {
|
|
31
|
+
return { isMilestone: true, phase, type: 'progress' };
|
|
32
|
+
}
|
|
33
|
+
return { isMilestone: false };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 从 commits 中提取 milestone 信息
|
|
37
|
+
*/
|
|
38
|
+
function extractMilestoneInfo(commits) {
|
|
39
|
+
// 查找 milestone close/start 的 commit
|
|
40
|
+
for (const commit of commits) {
|
|
41
|
+
const milestoneMatch = commit.message.match(/v?(\d+\.\d+)\s*milestone/i);
|
|
42
|
+
if (milestoneMatch) {
|
|
43
|
+
const closeMatch = /\b(close|complete|finish)\b/i.test(commit.message);
|
|
44
|
+
return {
|
|
45
|
+
milestoneName: `v${milestoneMatch[1]}`,
|
|
46
|
+
hasCompleteMilestone: closeMatch
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { hasCompleteMilestone: false };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 按 milestone/phase 分组 commits
|
|
54
|
+
*/
|
|
55
|
+
function groupCommitsByMilestone(commits) {
|
|
56
|
+
const groups = new Map();
|
|
57
|
+
for (const commit of commits) {
|
|
58
|
+
const milestoneInfo = detectMilestoneKeywords(commit.message);
|
|
59
|
+
if (milestoneInfo.isMilestone && milestoneInfo.phase) {
|
|
60
|
+
const key = milestoneInfo.phase;
|
|
61
|
+
const existing = groups.get(key);
|
|
62
|
+
if (existing) {
|
|
63
|
+
existing.commits.push(commit);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
groups.set(key, {
|
|
67
|
+
name: key,
|
|
68
|
+
description: `${key} Delivery`,
|
|
69
|
+
commits: [commit]
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return groups;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 检查是否为大规模发布,需要额外注意
|
|
78
|
+
*/
|
|
79
|
+
export function isLargeRelease(commits) {
|
|
80
|
+
return commits.length > LARGE_RELEASE_COMMIT_THRESHOLD;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 生成大规模发布警告
|
|
84
|
+
*/
|
|
85
|
+
export function formatLargeReleaseWarning(commits) {
|
|
86
|
+
const lines = [];
|
|
87
|
+
lines.push('');
|
|
88
|
+
lines.push(chalk.yellow('⚠️ 检测到大规模发布'));
|
|
89
|
+
lines.push(chalk.gray(` 本次发布包含 ${commits.length} 个 commits,超过阈值 ${LARGE_RELEASE_COMMIT_THRESHOLD}`));
|
|
90
|
+
// 分析 milestone 分布
|
|
91
|
+
const milestoneGroups = groupCommitsByMilestone(commits);
|
|
92
|
+
if (milestoneGroups.size > 0) {
|
|
93
|
+
lines.push(chalk.gray(' 发现以下 Phase/Milestone 分组:'));
|
|
94
|
+
for (const [name, group] of milestoneGroups) {
|
|
95
|
+
lines.push(chalk.gray(` - ${name}: ${group.commits.length} commits`));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const { milestoneName, hasCompleteMilestone } = extractMilestoneInfo(commits);
|
|
99
|
+
if (milestoneName) {
|
|
100
|
+
lines.push(chalk.gray(` Milestone: ${milestoneName} ${hasCompleteMilestone ? '(已完成)' : '(进行中)'}`));
|
|
101
|
+
}
|
|
102
|
+
lines.push(chalk.gray(' 建议: 请仔细 review 生成的 CHANGELOG,确保 milestone 变更已完整记录'));
|
|
103
|
+
lines.push('');
|
|
104
|
+
return lines;
|
|
105
|
+
}
|
|
8
106
|
function updateFileByRules(rules) {
|
|
9
107
|
for (const rule of rules) {
|
|
10
108
|
if (!existsSync(rule.file)) {
|
|
@@ -99,14 +197,59 @@ function buildChangelogSections(analyzeResult) {
|
|
|
99
197
|
'- Automated release triggered by `codemap ship`'
|
|
100
198
|
];
|
|
101
199
|
}
|
|
102
|
-
const
|
|
103
|
-
|
|
200
|
+
const { commits } = analyzeResult;
|
|
201
|
+
const lines = [];
|
|
202
|
+
// 1. 检查是否为大规模发布,添加 milestone 摘要
|
|
203
|
+
const { milestoneName, hasCompleteMilestone } = extractMilestoneInfo(commits);
|
|
204
|
+
if (milestoneName && hasCompleteMilestone) {
|
|
205
|
+
lines.push(`### 🏗️ ${milestoneName} Milestone`);
|
|
206
|
+
lines.push('');
|
|
207
|
+
lines.push(`${milestoneName} milestone 完成。`);
|
|
208
|
+
lines.push('');
|
|
209
|
+
}
|
|
210
|
+
// 2. 按 Phase 分组(如果存在)
|
|
211
|
+
const phaseGroups = groupCommitsByMilestone(commits);
|
|
212
|
+
if (phaseGroups.size > 0) {
|
|
213
|
+
// 按 Phase 编号排序
|
|
214
|
+
const sortedPhases = Array.from(phaseGroups.entries())
|
|
215
|
+
.sort((a, b) => {
|
|
216
|
+
const numA = parseInt(a[0].match(/\d+/)?.[0] || '0', 10);
|
|
217
|
+
const numB = parseInt(b[0].match(/\d+/)?.[0] || '0', 10);
|
|
218
|
+
return numA - numB;
|
|
219
|
+
});
|
|
220
|
+
for (const [phaseName, group] of sortedPhases) {
|
|
221
|
+
lines.push(`#### ${group.description}`);
|
|
222
|
+
lines.push('');
|
|
223
|
+
for (const commit of group.commits.slice(0, 10)) { // 限制每个 phase 显示 10 条
|
|
224
|
+
lines.push(formatCommitLine(commit));
|
|
225
|
+
}
|
|
226
|
+
if (group.commits.length > 10) {
|
|
227
|
+
lines.push(`- ... and ${group.commits.length - 10} more commits`);
|
|
228
|
+
}
|
|
229
|
+
lines.push('');
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// 3. 剩余 commits 按类型分组
|
|
233
|
+
const remainingCommits = commits.filter(c => !detectMilestoneKeywords(c.message).isMilestone);
|
|
234
|
+
const typeGroups = new Map();
|
|
235
|
+
for (const commit of remainingCommits) {
|
|
104
236
|
const section = classifyCommitSection(commit.type);
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
237
|
+
const sectionLines = typeGroups.get(section) ?? [];
|
|
238
|
+
sectionLines.push(formatCommitLine(commit));
|
|
239
|
+
typeGroups.set(section, sectionLines);
|
|
240
|
+
}
|
|
241
|
+
// 4. 按优先级输出类型分组
|
|
242
|
+
const priority = ['### 🚀 New Features', '### 🐛 Bug Fixes', '### 📚 Documentation', '### ♻️ Refactors', '### 🔧 Maintenance'];
|
|
243
|
+
for (const section of priority) {
|
|
244
|
+
const sectionLines = typeGroups.get(section);
|
|
245
|
+
if (sectionLines && sectionLines.length > 0) {
|
|
246
|
+
lines.push(section);
|
|
247
|
+
lines.push('');
|
|
248
|
+
lines.push(...sectionLines);
|
|
249
|
+
lines.push('');
|
|
250
|
+
}
|
|
108
251
|
}
|
|
109
|
-
return
|
|
252
|
+
return lines;
|
|
110
253
|
}
|
|
111
254
|
function ensureChangelogEntry(version, analyzeResult) {
|
|
112
255
|
const versionStr = version.replace(/^v/, '');
|