@mycodemap/mycodemap 0.1.1 → 0.3.4
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 +163 -0
- package/README.md +241 -67
- package/dist/cli/commands/ci.d.ts +7 -1
- package/dist/cli/commands/ci.d.ts.map +1 -1
- package/dist/cli/commands/ci.js +38 -0
- package/dist/cli/commands/ci.js.map +1 -1
- package/dist/cli/commands/export.d.ts +6 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +108 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +96 -0
- package/dist/cli/commands/generate.js.map +1 -1
- 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 +68 -0
- package/dist/cli/commands/server.js.map +1 -0
- package/dist/cli/commands/ship/analyzer.d.ts +26 -0
- package/dist/cli/commands/ship/analyzer.d.ts.map +1 -0
- package/dist/cli/commands/ship/analyzer.js +143 -0
- package/dist/cli/commands/ship/analyzer.js.map +1 -0
- package/dist/cli/commands/ship/checker.d.ts +20 -0
- package/dist/cli/commands/ship/checker.d.ts.map +1 -0
- package/dist/cli/commands/ship/checker.js +86 -0
- package/dist/cli/commands/ship/checker.js.map +1 -0
- package/dist/cli/commands/ship/index.d.ts +17 -0
- package/dist/cli/commands/ship/index.d.ts.map +1 -0
- package/dist/cli/commands/ship/index.js +51 -0
- package/dist/cli/commands/ship/index.js.map +1 -0
- package/dist/cli/commands/ship/monitor.d.ts +19 -0
- package/dist/cli/commands/ship/monitor.d.ts.map +1 -0
- package/dist/cli/commands/ship/monitor.js +105 -0
- package/dist/cli/commands/ship/monitor.js.map +1 -0
- package/dist/cli/commands/ship/pipeline.d.ts +23 -0
- package/dist/cli/commands/ship/pipeline.d.ts.map +1 -0
- package/dist/cli/commands/ship/pipeline.js +146 -0
- package/dist/cli/commands/ship/pipeline.js.map +1 -0
- package/dist/cli/commands/ship/publisher.d.ts +11 -0
- package/dist/cli/commands/ship/publisher.d.ts.map +1 -0
- package/dist/cli/commands/ship/publisher.js +75 -0
- package/dist/cli/commands/ship/publisher.js.map +1 -0
- package/dist/cli/commands/ship/rules/confidence-rules.d.ts +48 -0
- package/dist/cli/commands/ship/rules/confidence-rules.d.ts.map +1 -0
- package/dist/cli/commands/ship/rules/confidence-rules.js +122 -0
- package/dist/cli/commands/ship/rules/confidence-rules.js.map +1 -0
- package/dist/cli/commands/ship/rules/quality-rules.d.ts +25 -0
- package/dist/cli/commands/ship/rules/quality-rules.d.ts.map +1 -0
- package/dist/cli/commands/ship/rules/quality-rules.js +134 -0
- package/dist/cli/commands/ship/rules/quality-rules.js.map +1 -0
- package/dist/cli/commands/ship/rules/version-rules.d.ts +24 -0
- package/dist/cli/commands/ship/rules/version-rules.d.ts.map +1 -0
- package/dist/cli/commands/ship/rules/version-rules.js +75 -0
- package/dist/cli/commands/ship/rules/version-rules.js.map +1 -0
- package/dist/cli/commands/ship/versioner.d.ts +12 -0
- package/dist/cli/commands/ship/versioner.d.ts.map +1 -0
- package/dist/cli/commands/ship/versioner.js +92 -0
- package/dist/cli/commands/ship/versioner.js.map +1 -0
- package/dist/cli/index.js +31 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli-new/commands/export.d.ts +15 -0
- package/dist/cli-new/commands/export.d.ts.map +1 -0
- package/dist/cli-new/commands/export.js +107 -0
- package/dist/cli-new/commands/export.js.map +1 -0
- package/dist/cli-new/commands/query.d.ts +14 -0
- package/dist/cli-new/commands/query.d.ts.map +1 -0
- package/dist/cli-new/commands/query.js +120 -0
- package/dist/cli-new/commands/query.js.map +1 -0
- 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 +94 -0
- package/dist/cli-new/commands/server.js.map +1 -0
- package/dist/cli-new/index.d.ts +11 -0
- package/dist/cli-new/index.d.ts.map +1 -0
- package/dist/cli-new/index.js +63 -0
- package/dist/cli-new/index.js.map +1 -0
- package/dist/cli-new/types/index.d.ts +88 -0
- package/dist/cli-new/types/index.d.ts.map +1 -0
- package/dist/cli-new/types/index.js +7 -0
- package/dist/cli-new/types/index.js.map +1 -0
- package/dist/domain/entities/CodeGraph.d.ts +134 -0
- package/dist/domain/entities/CodeGraph.d.ts.map +1 -0
- package/dist/domain/entities/CodeGraph.js +316 -0
- package/dist/domain/entities/CodeGraph.js.map +1 -0
- package/dist/domain/entities/Dependency.d.ts +78 -0
- package/dist/domain/entities/Dependency.d.ts.map +1 -0
- package/dist/domain/entities/Dependency.js +132 -0
- package/dist/domain/entities/Dependency.js.map +1 -0
- package/dist/domain/entities/Module.d.ts +75 -0
- package/dist/domain/entities/Module.d.ts.map +1 -0
- package/dist/domain/entities/Module.js +151 -0
- package/dist/domain/entities/Module.js.map +1 -0
- package/dist/domain/entities/Project.d.ts +50 -0
- package/dist/domain/entities/Project.d.ts.map +1 -0
- package/dist/domain/entities/Project.js +99 -0
- package/dist/domain/entities/Project.js.map +1 -0
- package/dist/domain/entities/Symbol.d.ts +75 -0
- package/dist/domain/entities/Symbol.d.ts.map +1 -0
- package/dist/domain/entities/Symbol.js +130 -0
- package/dist/domain/entities/Symbol.js.map +1 -0
- package/dist/domain/events/DomainEvent.d.ts +76 -0
- package/dist/domain/events/DomainEvent.d.ts.map +1 -0
- package/dist/domain/events/DomainEvent.js +153 -0
- package/dist/domain/events/DomainEvent.js.map +1 -0
- package/dist/domain/index.d.ts +10 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +18 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/repositories/CodeGraphRepository.d.ts +58 -0
- package/dist/domain/repositories/CodeGraphRepository.d.ts.map +1 -0
- package/dist/domain/repositories/CodeGraphRepository.js +37 -0
- package/dist/domain/repositories/CodeGraphRepository.js.map +1 -0
- package/dist/domain/services/CodeGraphBuilder.d.ts +50 -0
- package/dist/domain/services/CodeGraphBuilder.d.ts.map +1 -0
- package/dist/domain/services/CodeGraphBuilder.js +121 -0
- package/dist/domain/services/CodeGraphBuilder.js.map +1 -0
- package/dist/infrastructure/parser/implementations/GoParser.d.ts +25 -0
- package/dist/infrastructure/parser/implementations/GoParser.d.ts.map +1 -0
- package/dist/infrastructure/parser/implementations/GoParser.js +158 -0
- package/dist/infrastructure/parser/implementations/GoParser.js.map +1 -0
- package/dist/infrastructure/parser/implementations/PythonParser.d.ts +30 -0
- package/dist/infrastructure/parser/implementations/PythonParser.d.ts.map +1 -0
- package/dist/infrastructure/parser/implementations/PythonParser.js +201 -0
- package/dist/infrastructure/parser/implementations/PythonParser.js.map +1 -0
- package/dist/infrastructure/parser/implementations/TypeScriptParser.d.ts +63 -0
- package/dist/infrastructure/parser/implementations/TypeScriptParser.d.ts.map +1 -0
- package/dist/infrastructure/parser/implementations/TypeScriptParser.js +420 -0
- package/dist/infrastructure/parser/implementations/TypeScriptParser.js.map +1 -0
- package/dist/infrastructure/parser/index.d.ts +13 -0
- package/dist/infrastructure/parser/index.d.ts.map +1 -0
- package/dist/infrastructure/parser/index.js +32 -0
- package/dist/infrastructure/parser/index.js.map +1 -0
- package/dist/infrastructure/parser/interfaces/ParserBase.d.ts +124 -0
- package/dist/infrastructure/parser/interfaces/ParserBase.d.ts.map +1 -0
- package/dist/infrastructure/parser/interfaces/ParserBase.js +200 -0
- package/dist/infrastructure/parser/interfaces/ParserBase.js.map +1 -0
- package/dist/infrastructure/parser/registry/ParserRegistry.d.ts +68 -0
- package/dist/infrastructure/parser/registry/ParserRegistry.d.ts.map +1 -0
- package/dist/infrastructure/parser/registry/ParserRegistry.js +116 -0
- package/dist/infrastructure/parser/registry/ParserRegistry.js.map +1 -0
- package/dist/infrastructure/repositories/CodeGraphRepositoryImpl.d.ts +44 -0
- package/dist/infrastructure/repositories/CodeGraphRepositoryImpl.d.ts.map +1 -0
- package/dist/infrastructure/repositories/CodeGraphRepositoryImpl.js +129 -0
- package/dist/infrastructure/repositories/CodeGraphRepositoryImpl.js.map +1 -0
- package/dist/infrastructure/repositories/index.d.ts +3 -0
- package/dist/infrastructure/repositories/index.d.ts.map +1 -0
- package/dist/infrastructure/repositories/index.js +7 -0
- package/dist/infrastructure/repositories/index.js.map +1 -0
- package/dist/infrastructure/storage/StorageFactory.d.ts +53 -0
- package/dist/infrastructure/storage/StorageFactory.d.ts.map +1 -0
- package/dist/infrastructure/storage/StorageFactory.js +150 -0
- package/dist/infrastructure/storage/StorageFactory.js.map +1 -0
- package/dist/infrastructure/storage/adapters/FileSystemStorage.d.ts +52 -0
- package/dist/infrastructure/storage/adapters/FileSystemStorage.d.ts.map +1 -0
- package/dist/infrastructure/storage/adapters/FileSystemStorage.js +315 -0
- package/dist/infrastructure/storage/adapters/FileSystemStorage.js.map +1 -0
- package/dist/infrastructure/storage/adapters/KuzuDBStorage.d.ts +52 -0
- package/dist/infrastructure/storage/adapters/KuzuDBStorage.d.ts.map +1 -0
- package/dist/infrastructure/storage/adapters/KuzuDBStorage.js +235 -0
- package/dist/infrastructure/storage/adapters/KuzuDBStorage.js.map +1 -0
- package/dist/infrastructure/storage/adapters/MemoryStorage.d.ts +37 -0
- package/dist/infrastructure/storage/adapters/MemoryStorage.d.ts.map +1 -0
- package/dist/infrastructure/storage/adapters/MemoryStorage.js +229 -0
- package/dist/infrastructure/storage/adapters/MemoryStorage.js.map +1 -0
- package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts +49 -0
- package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts.map +1 -0
- package/dist/infrastructure/storage/adapters/Neo4jStorage.js +222 -0
- package/dist/infrastructure/storage/adapters/Neo4jStorage.js.map +1 -0
- package/dist/infrastructure/storage/index.d.ts +6 -0
- package/dist/infrastructure/storage/index.d.ts.map +1 -0
- package/dist/infrastructure/storage/index.js +13 -0
- package/dist/infrastructure/storage/index.js.map +1 -0
- package/dist/infrastructure/storage/interfaces/StorageBase.d.ts +76 -0
- package/dist/infrastructure/storage/interfaces/StorageBase.d.ts.map +1 -0
- package/dist/infrastructure/storage/interfaces/StorageBase.js +116 -0
- package/dist/infrastructure/storage/interfaces/StorageBase.js.map +1 -0
- package/dist/interface/config/index.d.ts +102 -0
- package/dist/interface/config/index.d.ts.map +1 -0
- package/dist/interface/config/index.js +7 -0
- package/dist/interface/config/index.js.map +1 -0
- package/dist/interface/types/index.d.ts +425 -0
- package/dist/interface/types/index.d.ts.map +1 -0
- package/dist/interface/types/index.js +8 -0
- package/dist/interface/types/index.js.map +1 -0
- package/dist/interface/types/parser.d.ts +103 -0
- package/dist/interface/types/parser.d.ts.map +1 -0
- package/dist/interface/types/parser.js +7 -0
- package/dist/interface/types/parser.js.map +1 -0
- package/dist/interface/types/storage.d.ts +98 -0
- package/dist/interface/types/storage.d.ts.map +1 -0
- package/dist/interface/types/storage.js +7 -0
- package/dist/interface/types/storage.js.map +1 -0
- package/dist/orchestrator/test-linker.js +1 -1
- package/dist/orchestrator/test-linker.js.map +1 -1
- package/dist/server/CodeMapServer.d.ts +51 -0
- package/dist/server/CodeMapServer.d.ts.map +1 -0
- package/dist/server/CodeMapServer.js +146 -0
- package/dist/server/CodeMapServer.js.map +1 -0
- package/dist/server/handlers/AnalysisHandler.d.ts +82 -0
- package/dist/server/handlers/AnalysisHandler.d.ts.map +1 -0
- package/dist/server/handlers/AnalysisHandler.js +196 -0
- package/dist/server/handlers/AnalysisHandler.js.map +1 -0
- package/dist/server/handlers/QueryHandler.d.ts +57 -0
- package/dist/server/handlers/QueryHandler.d.ts.map +1 -0
- package/dist/server/handlers/QueryHandler.js +260 -0
- package/dist/server/handlers/QueryHandler.js.map +1 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +13 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes/api.d.ts +8 -0
- package/dist/server/routes/api.d.ts.map +1 -0
- package/dist/server/routes/api.js +372 -0
- package/dist/server/routes/api.js.map +1 -0
- package/dist/server/types/index.d.ts +171 -0
- package/dist/server/types/index.d.ts.map +1 -0
- package/dist/server/types/index.js +7 -0
- package/dist/server/types/index.js.map +1 -0
- package/dist/types/index.d.ts +6 -372
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +9 -3
- package/dist/types/index.js.map +1 -1
- package/docs/AI_ASSISTANT_SETUP.md +68 -0
- package/docs/PUBLISHING.md +472 -0
- package/docs/README.md +37 -0
- package/docs/SETUP_GUIDE.md +91 -5
- package/docs/ai-guide/COMMANDS.md +403 -0
- package/docs/ai-guide/INTEGRATION.md +513 -0
- package/docs/ai-guide/OUTPUT.md +465 -0
- package/docs/ai-guide/PATTERNS.md +409 -0
- package/docs/ai-guide/PROMPTS.md +414 -0
- package/docs/ai-guide/QUICKSTART.md +114 -0
- package/docs/ai-guide/README.md +66 -0
- package/docs/archive/AI_INTEGRATION_GUIDE_ARCHIVED.md +7 -1
- package/docs/archive/ARCHIVE.md +39 -0
- package/docs/archive/MYCLAUDE_GUIDE.md +305 -0
- package/docs/archive/PUBLISH_NPM_DESIGN_V1.md +6 -0
- package/docs/archive/PUBLISH_NPM_DESIGN_V2.md +6 -0
- package/docs/archive/README.md +29 -0
- package/docs/archive/TASK_DESIGN_COVERAGE_REPORT.md +6 -0
- package/docs/archive/TEST_SUMMARY.md +140 -0
- package/docs/archive/comprehensive_test_report.md +337 -0
- package/docs/{CI_GATEWAY_DESIGN.md → archive/design-docs/CI_GATEWAY_DESIGN.md} +6 -0
- package/docs/{PUBLISH_NPM_DESIGN_FINAL.md → archive/design-docs/PUBLISH_NPM_DESIGN_FINAL.md} +7 -1
- package/docs/{REFACTOR_ARCHITECTURE_OVERVIEW.md → archive/design-docs/REFACTOR_ARCHITECTURE_OVERVIEW.md} +8 -2
- package/docs/{REFACTOR_CONFIDENCE_DESIGN.md → archive/design-docs/REFACTOR_CONFIDENCE_DESIGN.md} +6 -0
- package/docs/{REFACTOR_GIT_ANALYZER_DESIGN.md → archive/design-docs/REFACTOR_GIT_ANALYZER_DESIGN.md} +8 -2
- package/docs/{REFACTOR_ORCHESTRATOR_DESIGN.md → archive/design-docs/REFACTOR_ORCHESTRATOR_DESIGN.md} +6 -0
- package/docs/{REFACTOR_RESULT_FUSION_DESIGN.md → archive/design-docs/REFACTOR_RESULT_FUSION_DESIGN.md} +6 -0
- package/docs/{REFACTOR_TEST_LINKER_DESIGN.md → archive/design-docs/REFACTOR_TEST_LINKER_DESIGN.md} +6 -0
- package/docs/archive/myclaude.md +1084 -0
- package/docs/archive/plans/2026-03-14-go-language-support-design.md +92 -0
- package/docs/{REFACTOR_REQUIREMENTS.md → archive/product-specs/REFACTOR_REQUIREMENTS.md} +11 -5
- package/docs/archive/scenario-2-deps-analysis.md +353 -0
- package/docs/design-docs/README.md +26 -0
- package/docs/exec-plans/MVP3-IMPLEMENTATION-ROADMAP.md +524 -0
- package/docs/exec-plans/README.md +29 -0
- package/docs/exec-plans/active/.gitkeep +0 -0
- package/docs/exec-plans/completed/.gitkeep +0 -0
- package/docs/{plans/POST_TASK_PLAN.md → exec-plans/completed/2026-03-03-post-task-plan.md} +9 -3
- package/docs/exec-plans/completed/harness-engineering-rollout.md +184 -0
- package/docs/exec-plans/tech-debt/.gitkeep +0 -0
- package/docs/exec-plans/tech-debt/2026-03-15-lint-guardrail-gap.md +30 -0
- package/docs/generated/README.md +19 -0
- package/docs/product-specs/MVP3-ARCHITECTURE-COMPARISON.md +504 -0
- package/docs/product-specs/MVP3-ARCHITECTURE-REDESIGN-PRD.md +322 -0
- package/docs/product-specs/MVP3-ARCHITECTURE-REDESIGN-TECH-PRD.md +1374 -0
- package/docs/product-specs/README.md +22 -0
- package/docs/references/README.md +15 -0
- package/docs/references/tmp.md +527 -0
- package/docs/rules/README.md +16 -0
- package/docs/rules/architecture-guardrails.md +349 -0
- package/docs/rules/code-quality-redlines.md +321 -0
- package/docs/rules/deployment.md +23 -0
- package/docs/rules/engineering-with-codex-openai.md +202 -0
- package/docs/rules/pre-release-checklist.md +426 -0
- package/docs/rules/testing.md +73 -0
- package/docs/rules/validation.md +39 -0
- package/package.json +26 -7
- package/scripts/.githooks/commit-msg +31 -0
- package/scripts/.githooks/pre-commit +55 -0
- package/scripts/benchmark.ts +209 -0
- package/scripts/hooks/commit-msg +24 -0
- package/scripts/hooks/install-hooks.sh +29 -0
- package/scripts/hooks/pre-commit +60 -0
- package/scripts/pre-release-check.js +717 -0
- package/scripts/release.sh +142 -0
- package/scripts/run-benchmark.sh +29 -0
- package/scripts/validate-ai-docs.js +294 -0
- package/scripts/validate-docs.js +238 -0
- package/scripts/validate-pack.js +86 -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/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/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/OMC_TEAM_DEBUG_REPORT.md +0 -285
- /package/docs/{plans/archive → exec-plans/completed}/2026-03-03-deps-path-extension-fix.md +0 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { CommitAnalysis } from './version-rules.js';
|
|
2
|
+
export interface ConfidenceConfig {
|
|
3
|
+
baseScore: number;
|
|
4
|
+
range: {
|
|
5
|
+
min: number;
|
|
6
|
+
max: number;
|
|
7
|
+
};
|
|
8
|
+
bonuses: {
|
|
9
|
+
condition: string;
|
|
10
|
+
points: number;
|
|
11
|
+
}[];
|
|
12
|
+
penalties: {
|
|
13
|
+
condition: string;
|
|
14
|
+
points: number;
|
|
15
|
+
}[];
|
|
16
|
+
thresholds: {
|
|
17
|
+
autoRelease: number;
|
|
18
|
+
confirmRequired: number;
|
|
19
|
+
blockBelow: number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export declare const confidenceConfig: ConfidenceConfig;
|
|
23
|
+
export interface ConfidenceInput {
|
|
24
|
+
commits: CommitAnalysis[];
|
|
25
|
+
changedFiles: string[];
|
|
26
|
+
allCommitsConventional: boolean;
|
|
27
|
+
coverageAbove80: boolean;
|
|
28
|
+
changelogUpdated: boolean;
|
|
29
|
+
hasBreaking: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface ConfidenceResult {
|
|
32
|
+
score: number;
|
|
33
|
+
breakdown: {
|
|
34
|
+
base: number;
|
|
35
|
+
bonuses: {
|
|
36
|
+
condition: string;
|
|
37
|
+
points: number;
|
|
38
|
+
}[];
|
|
39
|
+
penalties: {
|
|
40
|
+
condition: string;
|
|
41
|
+
points: number;
|
|
42
|
+
}[];
|
|
43
|
+
};
|
|
44
|
+
decision: 'auto' | 'confirm' | 'block';
|
|
45
|
+
reasons: string[];
|
|
46
|
+
}
|
|
47
|
+
export declare function calculateConfidence(input: ConfidenceInput): ConfidenceResult;
|
|
48
|
+
//# sourceMappingURL=confidence-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidence-rules.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/ship/rules/confidence-rules.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD,SAAS,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACnD,UAAU,EAAE;QACV,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,eAAO,MAAM,gBAAgB,EAAE,gBA6B9B,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,sBAAsB,EAAE,OAAO,CAAC;IAChC,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QACjD,SAAS,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KACpD,CAAC;IACF,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACvC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAsG5E"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// [META] since:2026-03 | owner:cli-team | stable:false
|
|
2
|
+
// [WHY] 定义置信度计算规则,用于决定是否自动发布
|
|
3
|
+
import { versionRules } from './version-rules.js';
|
|
4
|
+
export const confidenceConfig = {
|
|
5
|
+
baseScore: 50,
|
|
6
|
+
range: { min: 0, max: 100 },
|
|
7
|
+
// 加分项
|
|
8
|
+
bonuses: [
|
|
9
|
+
{ condition: 'allCommitsConventional', points: 20 },
|
|
10
|
+
{ condition: 'coverageAbove80', points: 10 },
|
|
11
|
+
{ condition: 'noRiskyModules', points: 10 },
|
|
12
|
+
{ condition: 'changelogUpdated', points: 5 },
|
|
13
|
+
{ condition: 'singleFeature', points: 5 },
|
|
14
|
+
{ condition: 'cleanHistory', points: 5 }
|
|
15
|
+
],
|
|
16
|
+
// 减分项
|
|
17
|
+
penalties: [
|
|
18
|
+
{ condition: 'hasBreaking', points: -15 },
|
|
19
|
+
{ condition: 'manyFilesChanged', points: -10 },
|
|
20
|
+
{ condition: 'touchesRiskyModules', points: -10 },
|
|
21
|
+
{ condition: 'coverageBelow80', points: -5 },
|
|
22
|
+
{ condition: 'nonConventionalCommits', points: -5 }
|
|
23
|
+
],
|
|
24
|
+
// 判定阈值
|
|
25
|
+
thresholds: {
|
|
26
|
+
autoRelease: 75,
|
|
27
|
+
confirmRequired: 60,
|
|
28
|
+
blockBelow: 60
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
export function calculateConfidence(input) {
|
|
32
|
+
const { baseScore, bonuses, penalties, thresholds } = confidenceConfig;
|
|
33
|
+
let score = baseScore;
|
|
34
|
+
const appliedBonuses = [];
|
|
35
|
+
const appliedPenalties = [];
|
|
36
|
+
const reasons = [];
|
|
37
|
+
// 计算加分项
|
|
38
|
+
if (input.allCommitsConventional) {
|
|
39
|
+
const bonus = bonuses.find(b => b.condition === 'allCommitsConventional');
|
|
40
|
+
score += bonus.points;
|
|
41
|
+
appliedBonuses.push(bonus);
|
|
42
|
+
reasons.push(`所有 commit 遵循规范 (+${bonus.points})`);
|
|
43
|
+
}
|
|
44
|
+
if (input.coverageAbove80) {
|
|
45
|
+
const bonus = bonuses.find(b => b.condition === 'coverageAbove80');
|
|
46
|
+
score += bonus.points;
|
|
47
|
+
appliedBonuses.push(bonus);
|
|
48
|
+
reasons.push(`测试覆盖率 > 80% (+${bonus.points})`);
|
|
49
|
+
}
|
|
50
|
+
// 检查是否修改高风险模块
|
|
51
|
+
const touchesRisky = input.changedFiles.some(f => versionRules.riskyModules.some(pattern => f.startsWith(pattern.replace('/**', ''))));
|
|
52
|
+
if (!touchesRisky) {
|
|
53
|
+
const bonus = bonuses.find(b => b.condition === 'noRiskyModules');
|
|
54
|
+
score += bonus.points;
|
|
55
|
+
appliedBonuses.push(bonus);
|
|
56
|
+
reasons.push(`未修改高风险模块 (+${bonus.points})`);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const penalty = penalties.find(p => p.condition === 'touchesRiskyModules');
|
|
60
|
+
score += penalty.points;
|
|
61
|
+
appliedPenalties.push(penalty);
|
|
62
|
+
reasons.push(`修改了高风险模块 (${penalty.points})`);
|
|
63
|
+
}
|
|
64
|
+
if (input.changelogUpdated) {
|
|
65
|
+
const bonus = bonuses.find(b => b.condition === 'changelogUpdated');
|
|
66
|
+
score += bonus.points;
|
|
67
|
+
appliedBonuses.push(bonus);
|
|
68
|
+
reasons.push(`CHANGELOG 已更新 (+${bonus.points})`);
|
|
69
|
+
}
|
|
70
|
+
// 检查 commit 数量(单一功能)
|
|
71
|
+
if (input.commits.length <= 5) {
|
|
72
|
+
const bonus = bonuses.find(b => b.condition === 'singleFeature');
|
|
73
|
+
score += bonus.points;
|
|
74
|
+
appliedBonuses.push(bonus);
|
|
75
|
+
reasons.push(`单一功能提交 (+${bonus.points})`);
|
|
76
|
+
}
|
|
77
|
+
// 检查文件变更数量
|
|
78
|
+
if (input.changedFiles.length > 20) {
|
|
79
|
+
const penalty = penalties.find(p => p.condition === 'manyFilesChanged');
|
|
80
|
+
score += penalty.points;
|
|
81
|
+
appliedPenalties.push(penalty);
|
|
82
|
+
reasons.push(`修改文件较多 (${penalty.points})`);
|
|
83
|
+
}
|
|
84
|
+
// 检查破坏性变更
|
|
85
|
+
if (input.hasBreaking) {
|
|
86
|
+
const penalty = penalties.find(p => p.condition === 'hasBreaking');
|
|
87
|
+
score += penalty.points;
|
|
88
|
+
appliedPenalties.push(penalty);
|
|
89
|
+
reasons.push(`检测到破坏性变更 (${penalty.points})`);
|
|
90
|
+
}
|
|
91
|
+
// 检查 conventional commits
|
|
92
|
+
if (!input.allCommitsConventional) {
|
|
93
|
+
const penalty = penalties.find(p => p.condition === 'nonConventionalCommits');
|
|
94
|
+
score += penalty.points;
|
|
95
|
+
appliedPenalties.push(penalty);
|
|
96
|
+
reasons.push(`部分 commit 未遵循规范 (${penalty.points})`);
|
|
97
|
+
}
|
|
98
|
+
// 确保分数在有效范围内
|
|
99
|
+
score = Math.max(confidenceConfig.range.min, Math.min(confidenceConfig.range.max, score));
|
|
100
|
+
// 决定发布策略
|
|
101
|
+
let decision;
|
|
102
|
+
if (score >= thresholds.autoRelease) {
|
|
103
|
+
decision = 'auto';
|
|
104
|
+
}
|
|
105
|
+
else if (score >= thresholds.blockBelow) {
|
|
106
|
+
decision = 'confirm';
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
decision = 'block';
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
score,
|
|
113
|
+
breakdown: {
|
|
114
|
+
base: baseScore,
|
|
115
|
+
bonuses: appliedBonuses,
|
|
116
|
+
penalties: appliedPenalties
|
|
117
|
+
},
|
|
118
|
+
decision,
|
|
119
|
+
reasons
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=confidence-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confidence-rules.js","sourceRoot":"","sources":["../../../../../src/cli/commands/ship/rules/confidence-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { CommitAnalysis } from './version-rules.js';
|
|
2
|
+
export interface CheckContext {
|
|
3
|
+
commits: CommitAnalysis[];
|
|
4
|
+
changedFiles: string[];
|
|
5
|
+
currentVersion: string;
|
|
6
|
+
branch: string;
|
|
7
|
+
}
|
|
8
|
+
export interface CheckResult {
|
|
9
|
+
passed: boolean;
|
|
10
|
+
message?: string;
|
|
11
|
+
details?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface QualityRule {
|
|
14
|
+
name: string;
|
|
15
|
+
check: (ctx: CheckContext) => CheckResult | Promise<CheckResult>;
|
|
16
|
+
message: string;
|
|
17
|
+
blocking: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare const mustPassRules: QualityRule[];
|
|
20
|
+
export declare const shouldPassRules: QualityRule[];
|
|
21
|
+
export declare function runChecks(ctx: CheckContext): Promise<{
|
|
22
|
+
mustPassResults: Map<string, CheckResult>;
|
|
23
|
+
shouldPassResults: Map<string, CheckResult>;
|
|
24
|
+
}>;
|
|
25
|
+
//# sourceMappingURL=quality-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-rules.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/ship/rules/quality-rules.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAGD,eAAO,MAAM,aAAa,EAAE,WAAW,EAiDtC,CAAC;AAGF,eAAO,MAAM,eAAe,EAAE,WAAW,EAoExC,CAAC;AAEF,wBAAsB,SAAS,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC;IAC1D,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC1C,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CAC7C,CAAC,CAiBD"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// [META] since:2026-03 | owner:cli-team | stable:false
|
|
2
|
+
// [WHY] 定义质量检查规则,包括 mustPass 和 shouldPass 检查项
|
|
3
|
+
import { execSync } from 'child_process';
|
|
4
|
+
import fs from 'fs/promises';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
// mustPass 检查(失败即停止)
|
|
7
|
+
export const mustPassRules = [
|
|
8
|
+
{
|
|
9
|
+
name: 'workingTreeClean',
|
|
10
|
+
message: '工作区有未提交的变更',
|
|
11
|
+
blocking: true,
|
|
12
|
+
check: () => {
|
|
13
|
+
const status = execSync('git status --porcelain', { encoding: 'utf-8' }).trim();
|
|
14
|
+
const isClean = status === '';
|
|
15
|
+
return {
|
|
16
|
+
passed: isClean,
|
|
17
|
+
message: isClean ? undefined : '工作区有未提交的变更',
|
|
18
|
+
details: isClean ? undefined : status
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: 'correctBranch',
|
|
24
|
+
message: '只能在 main/master 分支发布',
|
|
25
|
+
blocking: true,
|
|
26
|
+
check: (ctx) => {
|
|
27
|
+
const allowedBranches = ['main', 'master'];
|
|
28
|
+
const isCorrect = allowedBranches.includes(ctx.branch);
|
|
29
|
+
return {
|
|
30
|
+
passed: isCorrect,
|
|
31
|
+
message: isCorrect ? undefined : `当前分支 "${ctx.branch}" 不能发布`,
|
|
32
|
+
details: isCorrect ? undefined : `允许的分支: ${allowedBranches.join(', ')}`
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'noBreakingWithoutMajor',
|
|
38
|
+
message: '检测到破坏性变更,必须使用 major 版本',
|
|
39
|
+
blocking: true,
|
|
40
|
+
check: (ctx) => {
|
|
41
|
+
const hasBreaking = ctx.commits.some(c => c.isBreaking);
|
|
42
|
+
// 检查 message 中是否包含破坏性变更标记
|
|
43
|
+
const breakingInMessage = ctx.commits.some(c => /breaking[_-]change|BREAKING/i.test(c.message));
|
|
44
|
+
const hasBreakingChange = hasBreaking || breakingInMessage;
|
|
45
|
+
// 如果有破坏性变更,不阻止(让 versioner 决定 bump 到 major)
|
|
46
|
+
// 这里只检查是否在 non-master 分支有破坏性变更
|
|
47
|
+
return {
|
|
48
|
+
passed: true, // 让发布流程继续,版本计算会处理
|
|
49
|
+
message: undefined
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
];
|
|
54
|
+
// shouldPass 检查(影响置信度,不阻塞)
|
|
55
|
+
export const shouldPassRules = [
|
|
56
|
+
{
|
|
57
|
+
name: 'testCoverageAbove80',
|
|
58
|
+
message: '测试覆盖率应该 > 80%',
|
|
59
|
+
blocking: false,
|
|
60
|
+
check: async () => {
|
|
61
|
+
try {
|
|
62
|
+
// 尝试读取 coverage/lcov.info
|
|
63
|
+
const coveragePath = path.join(process.cwd(), 'coverage', 'lcov.info');
|
|
64
|
+
await fs.access(coveragePath);
|
|
65
|
+
const content = await fs.readFile(coveragePath, 'utf-8');
|
|
66
|
+
const lineCoverageMatch = content.match(/LF:\d+\s+LH:\d+\s+BRF:\d+\s+BRH:\d+/g);
|
|
67
|
+
if (lineCoverageMatch) {
|
|
68
|
+
// 简单的覆盖率估算
|
|
69
|
+
const hasGoodCoverage = lineCoverageMatch.length > 0;
|
|
70
|
+
return {
|
|
71
|
+
passed: hasGoodCoverage,
|
|
72
|
+
message: hasGoodCoverage ? undefined : '测试覆盖率可能不足'
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// coverage 文件不存在,跳过此检查
|
|
78
|
+
}
|
|
79
|
+
return { passed: true, message: undefined }; // 跳过,不影响
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: 'changelogUpdated',
|
|
84
|
+
message: 'CHANGELOG 应该更新',
|
|
85
|
+
blocking: false,
|
|
86
|
+
check: async (ctx) => {
|
|
87
|
+
try {
|
|
88
|
+
const changelogPath = path.join(process.cwd(), 'CHANGELOG.md');
|
|
89
|
+
const changelogStat = await fs.stat(changelogPath);
|
|
90
|
+
const changelogModified = changelogStat.mtime;
|
|
91
|
+
// 获取最新 commit 的时间
|
|
92
|
+
const latestCommitTime = execSync('git log -1 --format=%ct', { encoding: 'utf-8' }).trim();
|
|
93
|
+
const commitTime = new Date(parseInt(latestCommitTime) * 1000);
|
|
94
|
+
const isUpdated = changelogModified >= commitTime;
|
|
95
|
+
return {
|
|
96
|
+
passed: isUpdated,
|
|
97
|
+
message: isUpdated ? undefined : 'CHANGELOG.md 自上次提交后未更新'
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return { passed: true, message: undefined }; // 文件不存在,跳过
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
name: 'commitsFollowConvention',
|
|
107
|
+
message: 'Commit 消息应该遵循 conventional commits 规范',
|
|
108
|
+
blocking: false,
|
|
109
|
+
check: (ctx) => {
|
|
110
|
+
const conventionalPattern = /^(feat|fix|docs|style|refactor|test|chore|ci|perf|breaking)(\(.+\))?:/;
|
|
111
|
+
const allFollowConvention = ctx.commits.every(c => conventionalPattern.test(c.type + ':' + c.message));
|
|
112
|
+
return {
|
|
113
|
+
passed: allFollowConvention,
|
|
114
|
+
message: allFollowConvention ? undefined : '部分 commit 未遵循 conventional commits 规范'
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
];
|
|
119
|
+
export async function runChecks(ctx) {
|
|
120
|
+
const mustPassResults = new Map();
|
|
121
|
+
const shouldPassResults = new Map();
|
|
122
|
+
// 运行 mustPass 检查
|
|
123
|
+
for (const rule of mustPassRules) {
|
|
124
|
+
const result = await rule.check(ctx);
|
|
125
|
+
mustPassResults.set(rule.name, result);
|
|
126
|
+
}
|
|
127
|
+
// 运行 shouldPass 检查
|
|
128
|
+
for (const rule of shouldPassRules) {
|
|
129
|
+
const result = await rule.check(ctx);
|
|
130
|
+
shouldPassResults.set(rule.name, result);
|
|
131
|
+
}
|
|
132
|
+
return { mustPassResults, shouldPassResults };
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=quality-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-rules.js","sourceRoot":"","sources":["../../../../../src/cli/commands/ship/rules/quality-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface VersionRuleConfig {
|
|
2
|
+
bump: {
|
|
3
|
+
major: string[];
|
|
4
|
+
minor: string[];
|
|
5
|
+
patch: string[];
|
|
6
|
+
none: string[];
|
|
7
|
+
};
|
|
8
|
+
noBumpPaths: string[];
|
|
9
|
+
riskyModules: string[];
|
|
10
|
+
breakingPatterns: RegExp[];
|
|
11
|
+
}
|
|
12
|
+
export declare const versionRules: VersionRuleConfig;
|
|
13
|
+
export type VersionType = 'major' | 'minor' | 'patch' | 'none';
|
|
14
|
+
export interface CommitAnalysis {
|
|
15
|
+
type: string;
|
|
16
|
+
scope?: string;
|
|
17
|
+
message: string;
|
|
18
|
+
hash: string;
|
|
19
|
+
isBreaking: boolean;
|
|
20
|
+
files?: string[];
|
|
21
|
+
}
|
|
22
|
+
export declare function calculateVersionType(commits: CommitAnalysis[]): VersionType;
|
|
23
|
+
export declare function shouldBumpVersion(commits: CommitAnalysis[], changedFiles: string[]): boolean;
|
|
24
|
+
//# sourceMappingURL=version-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-rules.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/ship/rules/version-rules.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,IAAI,EAAE,MAAM,EAAE,CAAC;KAChB,CAAC;IACF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,eAAO,MAAM,YAAY,EAAE,iBAiC1B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAE/D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,WAAW,CAuB3E;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAW5F"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// [META] since:2026-03 | owner:cli-team | stable:false
|
|
2
|
+
// [WHY] 定义版本号计算规则,支持 conventional commits 规范
|
|
3
|
+
export const versionRules = {
|
|
4
|
+
// 版本递增规则
|
|
5
|
+
bump: {
|
|
6
|
+
major: ['breaking', 'breaking-change', 'BREAKING'],
|
|
7
|
+
minor: ['feat', 'feature', 'enhance', 'improvement'],
|
|
8
|
+
patch: ['fix', 'bugfix', 'hotfix'],
|
|
9
|
+
none: ['docs', 'style', 'refactor', 'test', 'chore', 'ci', 'perf', 'WIP', 'config', 'CONFIG', 'infra', 'INFRA']
|
|
10
|
+
},
|
|
11
|
+
// 不触发版本变更的文件
|
|
12
|
+
noBumpPaths: [
|
|
13
|
+
'*.md',
|
|
14
|
+
'*.txt',
|
|
15
|
+
'LICENSE',
|
|
16
|
+
'.gitignore',
|
|
17
|
+
'docs/**',
|
|
18
|
+
'.github/**',
|
|
19
|
+
'*.lock'
|
|
20
|
+
],
|
|
21
|
+
// 高风险模块(修改时降低置信度)
|
|
22
|
+
riskyModules: [
|
|
23
|
+
'src/core/**',
|
|
24
|
+
'src/parser/**',
|
|
25
|
+
'src/domain/entities/**'
|
|
26
|
+
],
|
|
27
|
+
// 破坏性变更检测模式
|
|
28
|
+
breakingPatterns: [
|
|
29
|
+
/breaking[_-]change/i,
|
|
30
|
+
/^.+!:/, // feat!:
|
|
31
|
+
/BREAKING/i
|
|
32
|
+
]
|
|
33
|
+
};
|
|
34
|
+
export function calculateVersionType(commits) {
|
|
35
|
+
let highestVersion = 'none';
|
|
36
|
+
for (const commit of commits) {
|
|
37
|
+
const type = commit.type.toLowerCase();
|
|
38
|
+
// 检查破坏性变更
|
|
39
|
+
if (commit.isBreaking || versionRules.breakingPatterns.some(p => p.test(commit.message))) {
|
|
40
|
+
return 'major';
|
|
41
|
+
}
|
|
42
|
+
// 检查 feat 类型 -> minor
|
|
43
|
+
if (versionRules.bump.minor.some(t => type.includes(t)) && highestVersion === 'none') {
|
|
44
|
+
highestVersion = 'minor';
|
|
45
|
+
}
|
|
46
|
+
// 检查 fix 类型 -> patch
|
|
47
|
+
if (versionRules.bump.patch.some(t => type.includes(t)) && highestVersion === 'none') {
|
|
48
|
+
highestVersion = 'patch';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return highestVersion;
|
|
52
|
+
}
|
|
53
|
+
export function shouldBumpVersion(commits, changedFiles) {
|
|
54
|
+
// 如果有影响代码功能的 commit,触发版本更新
|
|
55
|
+
const versionType = calculateVersionType(commits);
|
|
56
|
+
if (versionType !== 'none') {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
// 检查是否有代码文件变更
|
|
60
|
+
const codeFilePattern = /\.(ts|js|tsx|jsx|py|go)$/;
|
|
61
|
+
return changedFiles.some(f => codeFilePattern.test(f) &&
|
|
62
|
+
!versionRules.noBumpPaths.some(p => matchPath(f, p)));
|
|
63
|
+
}
|
|
64
|
+
function matchPath(file, pattern) {
|
|
65
|
+
if (pattern.includes('**')) {
|
|
66
|
+
const prefix = pattern.replace('/**', '');
|
|
67
|
+
return file.startsWith(prefix);
|
|
68
|
+
}
|
|
69
|
+
if (pattern.includes('*')) {
|
|
70
|
+
const regex = new RegExp('^' + pattern.replace(/\./g, '\\.').replace(/\*/g, '.*') + '$');
|
|
71
|
+
return regex.test(file);
|
|
72
|
+
}
|
|
73
|
+
return file === pattern || file.endsWith('/' + pattern);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=version-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-rules.js","sourceRoot":"","sources":["../../../../../src/cli/commands/ship/rules/version-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AnalyzeResult } from './analyzer.js';
|
|
2
|
+
import { VersionType } from './rules/version-rules.js';
|
|
3
|
+
export interface VersionResult {
|
|
4
|
+
currentVersion: string;
|
|
5
|
+
suggestedVersion: string;
|
|
6
|
+
versionType: VersionType;
|
|
7
|
+
reason: string;
|
|
8
|
+
shouldRelease: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function calculateVersion(analyzeResult: AnalyzeResult): Promise<VersionResult>;
|
|
11
|
+
export declare function formatVersionOutput(result: VersionResult): string;
|
|
12
|
+
//# sourceMappingURL=versioner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versioner.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ship/versioner.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAqB,MAAM,0BAA0B,CAAC;AAE1E,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;CACxB;AAuDD,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAwB3F;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAajE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// [META] since:2026-03 | owner:cli-team | stable:false
|
|
2
|
+
// [WHY] Step 2: 根据 commit 分析结果计算版本号
|
|
3
|
+
import { execSync } from 'child_process';
|
|
4
|
+
import { shouldBumpVersion } from './rules/version-rules.js';
|
|
5
|
+
function parseCurrentVersion() {
|
|
6
|
+
try {
|
|
7
|
+
// 从 package.json 读取版本
|
|
8
|
+
const pkg = execSync('node -p "require(\'./package.json\').version"', {
|
|
9
|
+
encoding: 'utf-8'
|
|
10
|
+
}).trim();
|
|
11
|
+
return pkg;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// 尝试从 git tag 获取
|
|
15
|
+
try {
|
|
16
|
+
const tags = execSync('git tag --sort=-version:refname | head -1', {
|
|
17
|
+
encoding: 'utf-8'
|
|
18
|
+
}).trim();
|
|
19
|
+
return tags.replace(/^v/, '');
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return '0.0.0';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function bumpVersion(version, type) {
|
|
27
|
+
const parts = version.split('.').map(p => parseInt(p, 10) || 0);
|
|
28
|
+
switch (type) {
|
|
29
|
+
case 'major':
|
|
30
|
+
return `${parts[0] + 1}.0.0`;
|
|
31
|
+
case 'minor':
|
|
32
|
+
return `${parts[0]}.${parts[1] + 1}.0`;
|
|
33
|
+
case 'patch':
|
|
34
|
+
return `${parts[0]}.${parts[1]}.${parts[2] + 1}`;
|
|
35
|
+
case 'none':
|
|
36
|
+
default:
|
|
37
|
+
return version;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function getVersionReason(type, result) {
|
|
41
|
+
switch (type) {
|
|
42
|
+
case 'major':
|
|
43
|
+
return '检测到破坏性变更 (breaking changes)';
|
|
44
|
+
case 'minor':
|
|
45
|
+
return `包含 ${result.summary.features} 个新功能`;
|
|
46
|
+
case 'patch':
|
|
47
|
+
return `包含 ${result.summary.bugfixes} 个 bug 修复`;
|
|
48
|
+
case 'none':
|
|
49
|
+
default:
|
|
50
|
+
if (result.changedFiles.length > 0) {
|
|
51
|
+
return '有代码变更但无功能性 commit';
|
|
52
|
+
}
|
|
53
|
+
return '无可发布的变更';
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export async function calculateVersion(analyzeResult) {
|
|
57
|
+
const currentVersion = parseCurrentVersion();
|
|
58
|
+
const versionType = analyzeResult.versionType;
|
|
59
|
+
const shouldRelease = shouldBumpVersion(analyzeResult.commits, analyzeResult.changedFiles);
|
|
60
|
+
let suggestedVersion = currentVersion;
|
|
61
|
+
let finalVersionType = 'none';
|
|
62
|
+
// 强制 major 如果有破坏性变更
|
|
63
|
+
if (analyzeResult.breakingChanges) {
|
|
64
|
+
finalVersionType = 'major';
|
|
65
|
+
suggestedVersion = bumpVersion(currentVersion, 'major');
|
|
66
|
+
}
|
|
67
|
+
else if (shouldRelease) {
|
|
68
|
+
finalVersionType = versionType;
|
|
69
|
+
suggestedVersion = bumpVersion(currentVersion, versionType);
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
currentVersion,
|
|
73
|
+
suggestedVersion,
|
|
74
|
+
versionType: finalVersionType,
|
|
75
|
+
reason: getVersionReason(finalVersionType, analyzeResult),
|
|
76
|
+
shouldRelease
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export function formatVersionOutput(result) {
|
|
80
|
+
const lines = [];
|
|
81
|
+
if (!result.shouldRelease) {
|
|
82
|
+
lines.push(`推荐版本: 无需发布`);
|
|
83
|
+
lines.push(` 原因: ${result.reason}`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
const typeLabel = result.versionType.toUpperCase();
|
|
87
|
+
lines.push(`推荐版本: v${result.suggestedVersion} (${result.versionType})`);
|
|
88
|
+
lines.push(` 原因: ${result.reason}`);
|
|
89
|
+
}
|
|
90
|
+
return lines.join('\n');
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=versioner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versioner.js","sourceRoot":"","sources":["../../../../src/cli/commands/ship/versioner.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -10,11 +10,13 @@ import { depsCommand } from './commands/deps.js';
|
|
|
10
10
|
import { cyclesCommand } from './commands/cycles.js';
|
|
11
11
|
import { complexityCommand } from './commands/complexity.js';
|
|
12
12
|
import { impactCommand } from './commands/impact.js';
|
|
13
|
-
import { analyzeCommand } from './commands/analyze.js';
|
|
14
13
|
import { ciCommand } from './commands/ci.js';
|
|
15
14
|
import { workflowCommand } from './commands/workflow.js';
|
|
16
15
|
import { reportCommand } from './commands/report.js';
|
|
17
16
|
import { logsCommand } from './commands/logs.js';
|
|
17
|
+
import { serverCommand } from './commands/server.js';
|
|
18
|
+
import { exportCommand } from './commands/export.js';
|
|
19
|
+
import { shipCommand } from './commands/ship/index.js';
|
|
18
20
|
import { setupRuntimeLogging } from './runtime-logger.js';
|
|
19
21
|
import { runFirstRunGuide } from './first-run-guide.js';
|
|
20
22
|
import { printMigrationWarning } from './paths.js';
|
|
@@ -143,6 +145,7 @@ program
|
|
|
143
145
|
.option('--structured', '输出完全结构化的 JSON(不包含自然语言字符串,需要配合 --json 或 --output-mode=machine 使用)')
|
|
144
146
|
.option('--output-mode <mode>', '输出模式 (machine|human)')
|
|
145
147
|
.action(async () => {
|
|
148
|
+
const { analyzeCommand } = await import('./commands/analyze.js');
|
|
146
149
|
// 跳过 program name 和 command name
|
|
147
150
|
await analyzeCommand(process.argv.slice(2));
|
|
148
151
|
});
|
|
@@ -174,5 +177,32 @@ program
|
|
|
174
177
|
.action(async (subcommand, options) => {
|
|
175
178
|
await logsCommand(subcommand, options);
|
|
176
179
|
});
|
|
180
|
+
// ============================================
|
|
181
|
+
// MVP3 新架构命令
|
|
182
|
+
// ============================================
|
|
183
|
+
// Server 命令
|
|
184
|
+
program
|
|
185
|
+
.command('server')
|
|
186
|
+
.description('启动 CodeMap HTTP API 服务器 (MVP3)')
|
|
187
|
+
.option('-p, --port <number>', '服务器端口', '3000')
|
|
188
|
+
.option('-h, --host <string>', '服务器主机', '0.0.0.0')
|
|
189
|
+
.option('--cors', '启用 CORS', false)
|
|
190
|
+
.option('--open', '自动打开浏览器', false)
|
|
191
|
+
.action(serverCommand);
|
|
192
|
+
// Export 命令
|
|
193
|
+
program
|
|
194
|
+
.command('export')
|
|
195
|
+
.description('导出代码图到各种格式 (MVP3)')
|
|
196
|
+
.argument('<format>', '导出格式: json, graphml, dot, mermaid')
|
|
197
|
+
.option('-o, --output <path>', '输出文件路径')
|
|
198
|
+
.action(exportCommand);
|
|
199
|
+
// Ship 命令
|
|
200
|
+
program
|
|
201
|
+
.command('ship')
|
|
202
|
+
.description('一键智能发布 - 自动分析变更、计算版本、运行检查、发布 npm')
|
|
203
|
+
.option('--dry-run', '仅分析,不发布')
|
|
204
|
+
.option('--verbose', '显示详细输出')
|
|
205
|
+
.option('--yes, -y', '置信度 60-75 时自动确认(不询问)')
|
|
206
|
+
.action(shipCommand);
|
|
177
207
|
program.parse();
|
|
178
208
|
//# sourceMappingURL=index.js.map
|