@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.
Files changed (328) hide show
  1. package/CHANGELOG.md +163 -0
  2. package/README.md +241 -67
  3. package/dist/cli/commands/ci.d.ts +7 -1
  4. package/dist/cli/commands/ci.d.ts.map +1 -1
  5. package/dist/cli/commands/ci.js +38 -0
  6. package/dist/cli/commands/ci.js.map +1 -1
  7. package/dist/cli/commands/export.d.ts +6 -0
  8. package/dist/cli/commands/export.d.ts.map +1 -0
  9. package/dist/cli/commands/export.js +108 -0
  10. package/dist/cli/commands/export.js.map +1 -0
  11. package/dist/cli/commands/generate.d.ts.map +1 -1
  12. package/dist/cli/commands/generate.js +96 -0
  13. package/dist/cli/commands/generate.js.map +1 -1
  14. package/dist/cli/commands/server.d.ts +9 -0
  15. package/dist/cli/commands/server.d.ts.map +1 -0
  16. package/dist/cli/commands/server.js +68 -0
  17. package/dist/cli/commands/server.js.map +1 -0
  18. package/dist/cli/commands/ship/analyzer.d.ts +26 -0
  19. package/dist/cli/commands/ship/analyzer.d.ts.map +1 -0
  20. package/dist/cli/commands/ship/analyzer.js +143 -0
  21. package/dist/cli/commands/ship/analyzer.js.map +1 -0
  22. package/dist/cli/commands/ship/checker.d.ts +20 -0
  23. package/dist/cli/commands/ship/checker.d.ts.map +1 -0
  24. package/dist/cli/commands/ship/checker.js +86 -0
  25. package/dist/cli/commands/ship/checker.js.map +1 -0
  26. package/dist/cli/commands/ship/index.d.ts +17 -0
  27. package/dist/cli/commands/ship/index.d.ts.map +1 -0
  28. package/dist/cli/commands/ship/index.js +51 -0
  29. package/dist/cli/commands/ship/index.js.map +1 -0
  30. package/dist/cli/commands/ship/monitor.d.ts +19 -0
  31. package/dist/cli/commands/ship/monitor.d.ts.map +1 -0
  32. package/dist/cli/commands/ship/monitor.js +105 -0
  33. package/dist/cli/commands/ship/monitor.js.map +1 -0
  34. package/dist/cli/commands/ship/pipeline.d.ts +23 -0
  35. package/dist/cli/commands/ship/pipeline.d.ts.map +1 -0
  36. package/dist/cli/commands/ship/pipeline.js +146 -0
  37. package/dist/cli/commands/ship/pipeline.js.map +1 -0
  38. package/dist/cli/commands/ship/publisher.d.ts +11 -0
  39. package/dist/cli/commands/ship/publisher.d.ts.map +1 -0
  40. package/dist/cli/commands/ship/publisher.js +75 -0
  41. package/dist/cli/commands/ship/publisher.js.map +1 -0
  42. package/dist/cli/commands/ship/rules/confidence-rules.d.ts +48 -0
  43. package/dist/cli/commands/ship/rules/confidence-rules.d.ts.map +1 -0
  44. package/dist/cli/commands/ship/rules/confidence-rules.js +122 -0
  45. package/dist/cli/commands/ship/rules/confidence-rules.js.map +1 -0
  46. package/dist/cli/commands/ship/rules/quality-rules.d.ts +25 -0
  47. package/dist/cli/commands/ship/rules/quality-rules.d.ts.map +1 -0
  48. package/dist/cli/commands/ship/rules/quality-rules.js +134 -0
  49. package/dist/cli/commands/ship/rules/quality-rules.js.map +1 -0
  50. package/dist/cli/commands/ship/rules/version-rules.d.ts +24 -0
  51. package/dist/cli/commands/ship/rules/version-rules.d.ts.map +1 -0
  52. package/dist/cli/commands/ship/rules/version-rules.js +75 -0
  53. package/dist/cli/commands/ship/rules/version-rules.js.map +1 -0
  54. package/dist/cli/commands/ship/versioner.d.ts +12 -0
  55. package/dist/cli/commands/ship/versioner.d.ts.map +1 -0
  56. package/dist/cli/commands/ship/versioner.js +92 -0
  57. package/dist/cli/commands/ship/versioner.js.map +1 -0
  58. package/dist/cli/index.js +31 -1
  59. package/dist/cli/index.js.map +1 -1
  60. package/dist/cli-new/commands/export.d.ts +15 -0
  61. package/dist/cli-new/commands/export.d.ts.map +1 -0
  62. package/dist/cli-new/commands/export.js +107 -0
  63. package/dist/cli-new/commands/export.js.map +1 -0
  64. package/dist/cli-new/commands/query.d.ts +14 -0
  65. package/dist/cli-new/commands/query.d.ts.map +1 -0
  66. package/dist/cli-new/commands/query.js +120 -0
  67. package/dist/cli-new/commands/query.js.map +1 -0
  68. package/dist/cli-new/commands/server.d.ts +13 -0
  69. package/dist/cli-new/commands/server.d.ts.map +1 -0
  70. package/dist/cli-new/commands/server.js +94 -0
  71. package/dist/cli-new/commands/server.js.map +1 -0
  72. package/dist/cli-new/index.d.ts +11 -0
  73. package/dist/cli-new/index.d.ts.map +1 -0
  74. package/dist/cli-new/index.js +63 -0
  75. package/dist/cli-new/index.js.map +1 -0
  76. package/dist/cli-new/types/index.d.ts +88 -0
  77. package/dist/cli-new/types/index.d.ts.map +1 -0
  78. package/dist/cli-new/types/index.js +7 -0
  79. package/dist/cli-new/types/index.js.map +1 -0
  80. package/dist/domain/entities/CodeGraph.d.ts +134 -0
  81. package/dist/domain/entities/CodeGraph.d.ts.map +1 -0
  82. package/dist/domain/entities/CodeGraph.js +316 -0
  83. package/dist/domain/entities/CodeGraph.js.map +1 -0
  84. package/dist/domain/entities/Dependency.d.ts +78 -0
  85. package/dist/domain/entities/Dependency.d.ts.map +1 -0
  86. package/dist/domain/entities/Dependency.js +132 -0
  87. package/dist/domain/entities/Dependency.js.map +1 -0
  88. package/dist/domain/entities/Module.d.ts +75 -0
  89. package/dist/domain/entities/Module.d.ts.map +1 -0
  90. package/dist/domain/entities/Module.js +151 -0
  91. package/dist/domain/entities/Module.js.map +1 -0
  92. package/dist/domain/entities/Project.d.ts +50 -0
  93. package/dist/domain/entities/Project.d.ts.map +1 -0
  94. package/dist/domain/entities/Project.js +99 -0
  95. package/dist/domain/entities/Project.js.map +1 -0
  96. package/dist/domain/entities/Symbol.d.ts +75 -0
  97. package/dist/domain/entities/Symbol.d.ts.map +1 -0
  98. package/dist/domain/entities/Symbol.js +130 -0
  99. package/dist/domain/entities/Symbol.js.map +1 -0
  100. package/dist/domain/events/DomainEvent.d.ts +76 -0
  101. package/dist/domain/events/DomainEvent.d.ts.map +1 -0
  102. package/dist/domain/events/DomainEvent.js +153 -0
  103. package/dist/domain/events/DomainEvent.js.map +1 -0
  104. package/dist/domain/index.d.ts +10 -0
  105. package/dist/domain/index.d.ts.map +1 -0
  106. package/dist/domain/index.js +18 -0
  107. package/dist/domain/index.js.map +1 -0
  108. package/dist/domain/repositories/CodeGraphRepository.d.ts +58 -0
  109. package/dist/domain/repositories/CodeGraphRepository.d.ts.map +1 -0
  110. package/dist/domain/repositories/CodeGraphRepository.js +37 -0
  111. package/dist/domain/repositories/CodeGraphRepository.js.map +1 -0
  112. package/dist/domain/services/CodeGraphBuilder.d.ts +50 -0
  113. package/dist/domain/services/CodeGraphBuilder.d.ts.map +1 -0
  114. package/dist/domain/services/CodeGraphBuilder.js +121 -0
  115. package/dist/domain/services/CodeGraphBuilder.js.map +1 -0
  116. package/dist/infrastructure/parser/implementations/GoParser.d.ts +25 -0
  117. package/dist/infrastructure/parser/implementations/GoParser.d.ts.map +1 -0
  118. package/dist/infrastructure/parser/implementations/GoParser.js +158 -0
  119. package/dist/infrastructure/parser/implementations/GoParser.js.map +1 -0
  120. package/dist/infrastructure/parser/implementations/PythonParser.d.ts +30 -0
  121. package/dist/infrastructure/parser/implementations/PythonParser.d.ts.map +1 -0
  122. package/dist/infrastructure/parser/implementations/PythonParser.js +201 -0
  123. package/dist/infrastructure/parser/implementations/PythonParser.js.map +1 -0
  124. package/dist/infrastructure/parser/implementations/TypeScriptParser.d.ts +63 -0
  125. package/dist/infrastructure/parser/implementations/TypeScriptParser.d.ts.map +1 -0
  126. package/dist/infrastructure/parser/implementations/TypeScriptParser.js +420 -0
  127. package/dist/infrastructure/parser/implementations/TypeScriptParser.js.map +1 -0
  128. package/dist/infrastructure/parser/index.d.ts +13 -0
  129. package/dist/infrastructure/parser/index.d.ts.map +1 -0
  130. package/dist/infrastructure/parser/index.js +32 -0
  131. package/dist/infrastructure/parser/index.js.map +1 -0
  132. package/dist/infrastructure/parser/interfaces/ParserBase.d.ts +124 -0
  133. package/dist/infrastructure/parser/interfaces/ParserBase.d.ts.map +1 -0
  134. package/dist/infrastructure/parser/interfaces/ParserBase.js +200 -0
  135. package/dist/infrastructure/parser/interfaces/ParserBase.js.map +1 -0
  136. package/dist/infrastructure/parser/registry/ParserRegistry.d.ts +68 -0
  137. package/dist/infrastructure/parser/registry/ParserRegistry.d.ts.map +1 -0
  138. package/dist/infrastructure/parser/registry/ParserRegistry.js +116 -0
  139. package/dist/infrastructure/parser/registry/ParserRegistry.js.map +1 -0
  140. package/dist/infrastructure/repositories/CodeGraphRepositoryImpl.d.ts +44 -0
  141. package/dist/infrastructure/repositories/CodeGraphRepositoryImpl.d.ts.map +1 -0
  142. package/dist/infrastructure/repositories/CodeGraphRepositoryImpl.js +129 -0
  143. package/dist/infrastructure/repositories/CodeGraphRepositoryImpl.js.map +1 -0
  144. package/dist/infrastructure/repositories/index.d.ts +3 -0
  145. package/dist/infrastructure/repositories/index.d.ts.map +1 -0
  146. package/dist/infrastructure/repositories/index.js +7 -0
  147. package/dist/infrastructure/repositories/index.js.map +1 -0
  148. package/dist/infrastructure/storage/StorageFactory.d.ts +53 -0
  149. package/dist/infrastructure/storage/StorageFactory.d.ts.map +1 -0
  150. package/dist/infrastructure/storage/StorageFactory.js +150 -0
  151. package/dist/infrastructure/storage/StorageFactory.js.map +1 -0
  152. package/dist/infrastructure/storage/adapters/FileSystemStorage.d.ts +52 -0
  153. package/dist/infrastructure/storage/adapters/FileSystemStorage.d.ts.map +1 -0
  154. package/dist/infrastructure/storage/adapters/FileSystemStorage.js +315 -0
  155. package/dist/infrastructure/storage/adapters/FileSystemStorage.js.map +1 -0
  156. package/dist/infrastructure/storage/adapters/KuzuDBStorage.d.ts +52 -0
  157. package/dist/infrastructure/storage/adapters/KuzuDBStorage.d.ts.map +1 -0
  158. package/dist/infrastructure/storage/adapters/KuzuDBStorage.js +235 -0
  159. package/dist/infrastructure/storage/adapters/KuzuDBStorage.js.map +1 -0
  160. package/dist/infrastructure/storage/adapters/MemoryStorage.d.ts +37 -0
  161. package/dist/infrastructure/storage/adapters/MemoryStorage.d.ts.map +1 -0
  162. package/dist/infrastructure/storage/adapters/MemoryStorage.js +229 -0
  163. package/dist/infrastructure/storage/adapters/MemoryStorage.js.map +1 -0
  164. package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts +49 -0
  165. package/dist/infrastructure/storage/adapters/Neo4jStorage.d.ts.map +1 -0
  166. package/dist/infrastructure/storage/adapters/Neo4jStorage.js +222 -0
  167. package/dist/infrastructure/storage/adapters/Neo4jStorage.js.map +1 -0
  168. package/dist/infrastructure/storage/index.d.ts +6 -0
  169. package/dist/infrastructure/storage/index.d.ts.map +1 -0
  170. package/dist/infrastructure/storage/index.js +13 -0
  171. package/dist/infrastructure/storage/index.js.map +1 -0
  172. package/dist/infrastructure/storage/interfaces/StorageBase.d.ts +76 -0
  173. package/dist/infrastructure/storage/interfaces/StorageBase.d.ts.map +1 -0
  174. package/dist/infrastructure/storage/interfaces/StorageBase.js +116 -0
  175. package/dist/infrastructure/storage/interfaces/StorageBase.js.map +1 -0
  176. package/dist/interface/config/index.d.ts +102 -0
  177. package/dist/interface/config/index.d.ts.map +1 -0
  178. package/dist/interface/config/index.js +7 -0
  179. package/dist/interface/config/index.js.map +1 -0
  180. package/dist/interface/types/index.d.ts +425 -0
  181. package/dist/interface/types/index.d.ts.map +1 -0
  182. package/dist/interface/types/index.js +8 -0
  183. package/dist/interface/types/index.js.map +1 -0
  184. package/dist/interface/types/parser.d.ts +103 -0
  185. package/dist/interface/types/parser.d.ts.map +1 -0
  186. package/dist/interface/types/parser.js +7 -0
  187. package/dist/interface/types/parser.js.map +1 -0
  188. package/dist/interface/types/storage.d.ts +98 -0
  189. package/dist/interface/types/storage.d.ts.map +1 -0
  190. package/dist/interface/types/storage.js +7 -0
  191. package/dist/interface/types/storage.js.map +1 -0
  192. package/dist/orchestrator/test-linker.js +1 -1
  193. package/dist/orchestrator/test-linker.js.map +1 -1
  194. package/dist/server/CodeMapServer.d.ts +51 -0
  195. package/dist/server/CodeMapServer.d.ts.map +1 -0
  196. package/dist/server/CodeMapServer.js +146 -0
  197. package/dist/server/CodeMapServer.js.map +1 -0
  198. package/dist/server/handlers/AnalysisHandler.d.ts +82 -0
  199. package/dist/server/handlers/AnalysisHandler.d.ts.map +1 -0
  200. package/dist/server/handlers/AnalysisHandler.js +196 -0
  201. package/dist/server/handlers/AnalysisHandler.js.map +1 -0
  202. package/dist/server/handlers/QueryHandler.d.ts +57 -0
  203. package/dist/server/handlers/QueryHandler.d.ts.map +1 -0
  204. package/dist/server/handlers/QueryHandler.js +260 -0
  205. package/dist/server/handlers/QueryHandler.js.map +1 -0
  206. package/dist/server/index.d.ts +7 -0
  207. package/dist/server/index.d.ts.map +1 -0
  208. package/dist/server/index.js +13 -0
  209. package/dist/server/index.js.map +1 -0
  210. package/dist/server/routes/api.d.ts +8 -0
  211. package/dist/server/routes/api.d.ts.map +1 -0
  212. package/dist/server/routes/api.js +372 -0
  213. package/dist/server/routes/api.js.map +1 -0
  214. package/dist/server/types/index.d.ts +171 -0
  215. package/dist/server/types/index.d.ts.map +1 -0
  216. package/dist/server/types/index.js +7 -0
  217. package/dist/server/types/index.js.map +1 -0
  218. package/dist/types/index.d.ts +6 -372
  219. package/dist/types/index.d.ts.map +1 -1
  220. package/dist/types/index.js +9 -3
  221. package/dist/types/index.js.map +1 -1
  222. package/docs/AI_ASSISTANT_SETUP.md +68 -0
  223. package/docs/PUBLISHING.md +472 -0
  224. package/docs/README.md +37 -0
  225. package/docs/SETUP_GUIDE.md +91 -5
  226. package/docs/ai-guide/COMMANDS.md +403 -0
  227. package/docs/ai-guide/INTEGRATION.md +513 -0
  228. package/docs/ai-guide/OUTPUT.md +465 -0
  229. package/docs/ai-guide/PATTERNS.md +409 -0
  230. package/docs/ai-guide/PROMPTS.md +414 -0
  231. package/docs/ai-guide/QUICKSTART.md +114 -0
  232. package/docs/ai-guide/README.md +66 -0
  233. package/docs/archive/AI_INTEGRATION_GUIDE_ARCHIVED.md +7 -1
  234. package/docs/archive/ARCHIVE.md +39 -0
  235. package/docs/archive/MYCLAUDE_GUIDE.md +305 -0
  236. package/docs/archive/PUBLISH_NPM_DESIGN_V1.md +6 -0
  237. package/docs/archive/PUBLISH_NPM_DESIGN_V2.md +6 -0
  238. package/docs/archive/README.md +29 -0
  239. package/docs/archive/TASK_DESIGN_COVERAGE_REPORT.md +6 -0
  240. package/docs/archive/TEST_SUMMARY.md +140 -0
  241. package/docs/archive/comprehensive_test_report.md +337 -0
  242. package/docs/{CI_GATEWAY_DESIGN.md → archive/design-docs/CI_GATEWAY_DESIGN.md} +6 -0
  243. package/docs/{PUBLISH_NPM_DESIGN_FINAL.md → archive/design-docs/PUBLISH_NPM_DESIGN_FINAL.md} +7 -1
  244. package/docs/{REFACTOR_ARCHITECTURE_OVERVIEW.md → archive/design-docs/REFACTOR_ARCHITECTURE_OVERVIEW.md} +8 -2
  245. package/docs/{REFACTOR_CONFIDENCE_DESIGN.md → archive/design-docs/REFACTOR_CONFIDENCE_DESIGN.md} +6 -0
  246. package/docs/{REFACTOR_GIT_ANALYZER_DESIGN.md → archive/design-docs/REFACTOR_GIT_ANALYZER_DESIGN.md} +8 -2
  247. package/docs/{REFACTOR_ORCHESTRATOR_DESIGN.md → archive/design-docs/REFACTOR_ORCHESTRATOR_DESIGN.md} +6 -0
  248. package/docs/{REFACTOR_RESULT_FUSION_DESIGN.md → archive/design-docs/REFACTOR_RESULT_FUSION_DESIGN.md} +6 -0
  249. package/docs/{REFACTOR_TEST_LINKER_DESIGN.md → archive/design-docs/REFACTOR_TEST_LINKER_DESIGN.md} +6 -0
  250. package/docs/archive/myclaude.md +1084 -0
  251. package/docs/archive/plans/2026-03-14-go-language-support-design.md +92 -0
  252. package/docs/{REFACTOR_REQUIREMENTS.md → archive/product-specs/REFACTOR_REQUIREMENTS.md} +11 -5
  253. package/docs/archive/scenario-2-deps-analysis.md +353 -0
  254. package/docs/design-docs/README.md +26 -0
  255. package/docs/exec-plans/MVP3-IMPLEMENTATION-ROADMAP.md +524 -0
  256. package/docs/exec-plans/README.md +29 -0
  257. package/docs/exec-plans/active/.gitkeep +0 -0
  258. package/docs/exec-plans/completed/.gitkeep +0 -0
  259. package/docs/{plans/POST_TASK_PLAN.md → exec-plans/completed/2026-03-03-post-task-plan.md} +9 -3
  260. package/docs/exec-plans/completed/harness-engineering-rollout.md +184 -0
  261. package/docs/exec-plans/tech-debt/.gitkeep +0 -0
  262. package/docs/exec-plans/tech-debt/2026-03-15-lint-guardrail-gap.md +30 -0
  263. package/docs/generated/README.md +19 -0
  264. package/docs/product-specs/MVP3-ARCHITECTURE-COMPARISON.md +504 -0
  265. package/docs/product-specs/MVP3-ARCHITECTURE-REDESIGN-PRD.md +322 -0
  266. package/docs/product-specs/MVP3-ARCHITECTURE-REDESIGN-TECH-PRD.md +1374 -0
  267. package/docs/product-specs/README.md +22 -0
  268. package/docs/references/README.md +15 -0
  269. package/docs/references/tmp.md +527 -0
  270. package/docs/rules/README.md +16 -0
  271. package/docs/rules/architecture-guardrails.md +349 -0
  272. package/docs/rules/code-quality-redlines.md +321 -0
  273. package/docs/rules/deployment.md +23 -0
  274. package/docs/rules/engineering-with-codex-openai.md +202 -0
  275. package/docs/rules/pre-release-checklist.md +426 -0
  276. package/docs/rules/testing.md +73 -0
  277. package/docs/rules/validation.md +39 -0
  278. package/package.json +26 -7
  279. package/scripts/.githooks/commit-msg +31 -0
  280. package/scripts/.githooks/pre-commit +55 -0
  281. package/scripts/benchmark.ts +209 -0
  282. package/scripts/hooks/commit-msg +24 -0
  283. package/scripts/hooks/install-hooks.sh +29 -0
  284. package/scripts/hooks/pre-commit +60 -0
  285. package/scripts/pre-release-check.js +717 -0
  286. package/scripts/release.sh +142 -0
  287. package/scripts/run-benchmark.sh +29 -0
  288. package/scripts/validate-ai-docs.js +294 -0
  289. package/scripts/validate-docs.js +238 -0
  290. package/scripts/validate-pack.js +86 -0
  291. package/dist/ai/claude.d.ts +0 -38
  292. package/dist/ai/claude.d.ts.map +0 -1
  293. package/dist/ai/claude.js +0 -169
  294. package/dist/ai/claude.js.map +0 -1
  295. package/dist/ai/codex.d.ts +0 -38
  296. package/dist/ai/codex.d.ts.map +0 -1
  297. package/dist/ai/codex.js +0 -169
  298. package/dist/ai/codex.js.map +0 -1
  299. package/dist/ai/factory.d.ts +0 -48
  300. package/dist/ai/factory.d.ts.map +0 -1
  301. package/dist/ai/factory.js +0 -95
  302. package/dist/ai/factory.js.map +0 -1
  303. package/dist/ai/index.d.ts +0 -12
  304. package/dist/ai/index.d.ts.map +0 -1
  305. package/dist/ai/index.js +0 -29
  306. package/dist/ai/index.js.map +0 -1
  307. package/dist/ai/provider.d.ts +0 -70
  308. package/dist/ai/provider.d.ts.map +0 -1
  309. package/dist/ai/provider.js +0 -31
  310. package/dist/ai/provider.js.map +0 -1
  311. package/dist/ai/subagent-caller.d.ts +0 -90
  312. package/dist/ai/subagent-caller.d.ts.map +0 -1
  313. package/dist/ai/subagent-caller.js +0 -280
  314. package/dist/ai/subagent-caller.js.map +0 -1
  315. package/dist/ai/types.d.ts +0 -70
  316. package/dist/ai/types.d.ts.map +0 -1
  317. package/dist/ai/types.js +0 -5
  318. package/dist/ai/types.js.map +0 -1
  319. package/dist/generator/ai-overview.d.ts +0 -51
  320. package/dist/generator/ai-overview.d.ts.map +0 -1
  321. package/dist/generator/ai-overview.js +0 -160
  322. package/dist/generator/ai-overview.js.map +0 -1
  323. package/dist/orchestrator/ai-feed-generator.d.ts +0 -210
  324. package/dist/orchestrator/ai-feed-generator.d.ts.map +0 -1
  325. package/dist/orchestrator/ai-feed-generator.js +0 -377
  326. package/dist/orchestrator/ai-feed-generator.js.map +0 -1
  327. package/docs/OMC_TEAM_DEBUG_REPORT.md +0 -285
  328. /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