@contractspec/bundle.workspace 1.45.2 → 1.45.3
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/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/services/doctor/checks/deps.js +7 -0
- package/dist/services/doctor/checks/deps.js.map +1 -1
- package/dist/services/index.d.ts +2 -1
- package/dist/services/index.js +1 -0
- package/dist/services/sync.d.ts.map +1 -1
- package/dist/services/versioning/changelog-formatter.d.ts +24 -0
- package/dist/services/versioning/changelog-formatter.d.ts.map +1 -0
- package/dist/services/versioning/changelog-formatter.js +155 -0
- package/dist/services/versioning/changelog-formatter.js.map +1 -0
- package/dist/services/versioning/index.d.ts +11 -0
- package/dist/services/versioning/index.d.ts.map +1 -0
- package/dist/services/versioning/index.js +17 -0
- package/dist/services/versioning/index.js.map +1 -0
- package/dist/services/versioning/types.d.ts +133 -0
- package/dist/services/versioning/types.d.ts.map +1 -0
- package/dist/services/versioning/versioning-service.d.ts +32 -0
- package/dist/services/versioning/versioning-service.d.ts.map +1 -0
- package/dist/services/versioning/versioning-service.js +359 -0
- package/dist/services/versioning/versioning-service.js.map +1 -0
- package/package.json +7 -7
package/dist/index.d.ts
CHANGED
|
@@ -89,6 +89,7 @@ import { formatQuickstartPreview, isContractSpecInstalled, runQuickstart } from
|
|
|
89
89
|
import { DocsServiceOptions, DocsServiceResult, generateDocsFromSpecs } from "./services/docs/docs-service.js";
|
|
90
90
|
import { index_d_exports as index_d_exports$1 } from "./services/impact/index.js";
|
|
91
91
|
import { FormatterOptions, formatFiles } from "./services/formatter.js";
|
|
92
|
+
import { index_d_exports as index_d_exports$4 } from "./services/versioning/index.js";
|
|
92
93
|
import "./services/index.js";
|
|
93
94
|
import { index_d_exports } from "./formatters/index.js";
|
|
94
95
|
import { AIClient } from "./ai/client.js";
|
|
@@ -102,4 +103,4 @@ import { OpenAICodexAgent } from "./ai/agents/openai-codex-agent.js";
|
|
|
102
103
|
import { index_d_exports as index_d_exports$2 } from "./ai/prompts/index.js";
|
|
103
104
|
import "./ai/index.js";
|
|
104
105
|
import * as module from "@contractspec/module.workspace";
|
|
105
|
-
export { AIClient, AIGenerator, AIReviewResult, ALL_CHECK_CATEGORIES, ALL_CI_CHECK_CATEGORIES, ALL_SETUP_TARGETS, AgentAdapter, AgentConfig, AgentGuideConfig, AgentGuideService, type AgentMode, AgentOrchestrator, AgentProvider, AgentResult, AgentTask, AiAdapter, AiGenerateOptions, AiGenerateResult, AiGenerateStructuredOptions, type AiProvider, AiValidationResult, AnalyzeDepsOptions, AnalyzeDepsResult, BehaviorCheck, BlueprintValidationResult, BuildSpecOptions, BuildSpecResult, BuildTarget, BuildTargetResult, CHECK_CATEGORY_LABELS, CICheckCategory, CICheckCategorySummary, CICheckOptions, CICheckResult, CIFormatOptions, CIIssue, CIIssueSeverity, CIOutputFormat, CI_CHECK_CATEGORY_LABELS, CacheEntryMeta, CacheKeyString, CacheLookupResult, CacheMissReason, CacheStats, CacheStorageAdapter, CheckCategory, CheckContext, CheckResult, CheckStatus, ClaudeCodeAdapter, ClaudeCodeAgent, CleanOptions, CleanResult, CompareSpecsOptions, CompareSpecsResult, type Config, CoverageByType, CreateAdaptersOptions, CreateRegeneratorOptions, CursorAgent, CursorCLIAdapter, DEFAULT_CACHE_CONFIG, DiagramOptions, DiagramType, DiscoverOptions, DiscoveryOptions, DocsServiceOptions, DocsServiceResult, DoctorOptions, DoctorPromptCallbacks, DoctorResult, ExtendedWorkspaceInfo, FULL_DEPENDENCIES, FieldMapping, FieldMatchType, FileStat, FileSystemCacheStorage, FixAction, FixResult, FormatOptions, FormatterOptions, FsAdapter, GenericMCPAdapter, GitAdapter, GitCleanOptions, GuideOptions, GuideResult, ImplementationSource, ImplementationStatus, ImplementationValidationResult, ImplementationValidatorOptions, InMemoryCacheStorage, IntegrityAnalysisOptions, IntegrityAnalysisResult, IntegrityIssue, IntentAlignment, KeyValueStore, LayerDiscoveryOptions, LayerDiscoveryResult, LayerInventory, LayerLocation, OpenApiExportOptions as LegacyOpenApiExportOptions, OpenApiExportResult as LegacyOpenApiExportResult, ListSpecsOptions, LogLevel, LoggerAdapter, MINIMAL_DEPENDENCIES, MetaRepoInfo, MonorepoConfig, OpenAICodexAgent, OpenApiExportServiceOptions, OpenApiExportServiceResult, OpenApiImportServiceOptions, OpenApiImportServiceResult, OpenApiSyncServiceOptions, OpenApiSyncServiceResult, OpenApiValidateServiceOptions, OpenApiValidateServiceResult, PackageInstallResult, PackageManager, ProgressReporter, ProgressUpdate, QuickstartDependency, QuickstartMode, QuickstartOptions, QuickstartPromptCallbacks, QuickstartResult, RegistryClient, RegistryClientOptions, RepositoryType, ResolvedImplementation, ResolverOptions, RunTestsResult, SETUP_TARGET_LABELS, SemanticVerificationResult, SetupFileResult, SetupOptions, SetupPromptCallbacks, SetupResult, SetupScope, SetupTarget, SimpleAgent, SpecCreatorService, SpecImplementationResult, SpecInventory, SpecLocation, SpecReferenceMatch, StructureCheck, SubmoduleInfo, SyncBuildFn, SyncSpecsOptions, SyncSpecsResult, SyncSpecsRunResult, SyncValidateFn, TenantValidationContext, TenantValidationResult, TestServiceOptions, TestServiceResult, ValidateImplementationOptions, ValidateImplementationResult, ValidateSpecOptions, ValidateSpecResult, VerificationCacheConfig, VerificationCacheEntry, VerificationCacheKey, VerificationCacheService, VerificationIssue, VerifyConfig, VerifyInput, VerifyOptions, VerifyResult, VerifyService, WatchBuildFn, WatchEvent, WatchEventHandler, WatchEventType, WatchOptions, WatchSpecsOptions, WatchValidateFn, Watcher, WatcherAdapter, WorkspaceAdapters, WorkspaceConfigInfo, WorkspaceInfo, WorkspaceStateCacheStorage, addToRegistry, agentAdapters, agentGuideService, analyzeDeps, analyzeIntegrity, buildSpec, cacheKeyToString, claudeCodeAdapter, cleanArtifacts, compareSpecs, computeContentHash, createAgentGuideService, createConsoleLoggerAdapter, createEmptyLayerInventory, createFileSystemCacheStorage, createInMemoryCacheStorage, createNodeAdapters, createNodeAiAdapter, createNodeFsAdapter, createNodeGitAdapter, createNodeWatcherAdapter, createNoopLoggerAdapter, createQuickAIReview, createRegeneratorService, createSpecCreator, createVerificationCacheService, createVerifyService, createWorkspaceStateCacheStorage, cursorCLIAdapter, deepMergeOverwrite, deepMergePreserve, detectPackageManager, detectRepositoryType, discoverAllImplementations, discoverImplementationsForSpec, discoverLayers, exportGraphAsDot, exportOpenApi, exportSpecForLLM, extractSpecReferences, filterIssuesBySeverity, filterIssuesByType, findAllConfigFiles, findMetaRepoRoot, findPackageRoot, findWorkspaceRoot, formatCheckResult, formatDoctorSummary, formatFiles, formatJson, formatQuickstartPreview, formatVerificationReport, formatWorkspaceInfo, index_d_exports as formatters, generateAgentsMd, generateAppBlueprintSpec, generateClaudeMcpConfig, generateComponentTemplate, generateContractsrcConfig, generateCursorMcpConfig, generateCursorRules, generateCursorRulesFromParsedSpec, generateDataViewSpec, generateDocsFromSpecs, generateEventSpec, generateExperimentSpec, generateFeatureContextMarkdown, generateGuideFromParsedSpec, generateHandlerTemplate, generateIntegrationSpec, generateKnowledgeSpaceSpec, generateMermaidDiagram, generateMigrationSpec, generateOperationSpec, generatePresentationSpec, generateTelemetrySpec, generateTestTemplate, generateVscodeSettings, generateWorkflowRunnerTemplate, generateWorkflowSpec, genericMCPAdapter, getAIProvider, getAgentAdapter, getAllLayerLocations, getAllSpecs, getApiKey, getClaudeDesktopConfigPath, getContractNode, getDependencies, getDevDependencies, getExecCommand, getExtendedWorkspaceInfo, getGraphStats, getImplementationSummary, getInstallCommand, getMetaRepoInfo, getPackageName, getProductionDependencies, getRecommendedModels, getRunCommand, getWorkspaceInfo, getWorkspacePackages, groupSpecsByType, index_d_exports$1 as impact, importFromOpenApiService, inferImplementationType, isContractSpecInstalled, isMonorepo, listAgentTypes, listFromRegistry, listSpecs, loadWorkspaceConfig, mergeMonorepoConfigs, module, parseGitModules, index_d_exports$2 as prompts, resolveAllImplementations, resolveImplementations, resolveRegistryUrl, runCIChecks, runDoctor, runQuickstart, runSetup, runTestSpecs, runTests, safeParseJson, searchRegistry, stringToCacheKey, syncSpecs, syncWithOpenApiService, index_d_exports$3 as templates, validateAgainstOpenApiService, validateBlueprint, validateImplementationFiles, validateImplementationWithAgent, validateProvider, validateSpec, validateSpecs, validateTenantConfig, verifyBehavior, verifyImplementationAgainstParsedSpec, verifySemanticFields, verifyService, verifyStructure, verifyWithAI, verifyWithAIEnhanced, watchSpecs };
|
|
106
|
+
export { AIClient, AIGenerator, AIReviewResult, ALL_CHECK_CATEGORIES, ALL_CI_CHECK_CATEGORIES, ALL_SETUP_TARGETS, AgentAdapter, AgentConfig, AgentGuideConfig, AgentGuideService, type AgentMode, AgentOrchestrator, AgentProvider, AgentResult, AgentTask, AiAdapter, AiGenerateOptions, AiGenerateResult, AiGenerateStructuredOptions, type AiProvider, AiValidationResult, AnalyzeDepsOptions, AnalyzeDepsResult, BehaviorCheck, BlueprintValidationResult, BuildSpecOptions, BuildSpecResult, BuildTarget, BuildTargetResult, CHECK_CATEGORY_LABELS, CICheckCategory, CICheckCategorySummary, CICheckOptions, CICheckResult, CIFormatOptions, CIIssue, CIIssueSeverity, CIOutputFormat, CI_CHECK_CATEGORY_LABELS, CacheEntryMeta, CacheKeyString, CacheLookupResult, CacheMissReason, CacheStats, CacheStorageAdapter, CheckCategory, CheckContext, CheckResult, CheckStatus, ClaudeCodeAdapter, ClaudeCodeAgent, CleanOptions, CleanResult, CompareSpecsOptions, CompareSpecsResult, type Config, CoverageByType, CreateAdaptersOptions, CreateRegeneratorOptions, CursorAgent, CursorCLIAdapter, DEFAULT_CACHE_CONFIG, DiagramOptions, DiagramType, DiscoverOptions, DiscoveryOptions, DocsServiceOptions, DocsServiceResult, DoctorOptions, DoctorPromptCallbacks, DoctorResult, ExtendedWorkspaceInfo, FULL_DEPENDENCIES, FieldMapping, FieldMatchType, FileStat, FileSystemCacheStorage, FixAction, FixResult, FormatOptions, FormatterOptions, FsAdapter, GenericMCPAdapter, GitAdapter, GitCleanOptions, GuideOptions, GuideResult, ImplementationSource, ImplementationStatus, ImplementationValidationResult, ImplementationValidatorOptions, InMemoryCacheStorage, IntegrityAnalysisOptions, IntegrityAnalysisResult, IntegrityIssue, IntentAlignment, KeyValueStore, LayerDiscoveryOptions, LayerDiscoveryResult, LayerInventory, LayerLocation, OpenApiExportOptions as LegacyOpenApiExportOptions, OpenApiExportResult as LegacyOpenApiExportResult, ListSpecsOptions, LogLevel, LoggerAdapter, MINIMAL_DEPENDENCIES, MetaRepoInfo, MonorepoConfig, OpenAICodexAgent, OpenApiExportServiceOptions, OpenApiExportServiceResult, OpenApiImportServiceOptions, OpenApiImportServiceResult, OpenApiSyncServiceOptions, OpenApiSyncServiceResult, OpenApiValidateServiceOptions, OpenApiValidateServiceResult, PackageInstallResult, PackageManager, ProgressReporter, ProgressUpdate, QuickstartDependency, QuickstartMode, QuickstartOptions, QuickstartPromptCallbacks, QuickstartResult, RegistryClient, RegistryClientOptions, RepositoryType, ResolvedImplementation, ResolverOptions, RunTestsResult, SETUP_TARGET_LABELS, SemanticVerificationResult, SetupFileResult, SetupOptions, SetupPromptCallbacks, SetupResult, SetupScope, SetupTarget, SimpleAgent, SpecCreatorService, SpecImplementationResult, SpecInventory, SpecLocation, SpecReferenceMatch, StructureCheck, SubmoduleInfo, SyncBuildFn, SyncSpecsOptions, SyncSpecsResult, SyncSpecsRunResult, SyncValidateFn, TenantValidationContext, TenantValidationResult, TestServiceOptions, TestServiceResult, ValidateImplementationOptions, ValidateImplementationResult, ValidateSpecOptions, ValidateSpecResult, VerificationCacheConfig, VerificationCacheEntry, VerificationCacheKey, VerificationCacheService, VerificationIssue, VerifyConfig, VerifyInput, VerifyOptions, VerifyResult, VerifyService, WatchBuildFn, WatchEvent, WatchEventHandler, WatchEventType, WatchOptions, WatchSpecsOptions, WatchValidateFn, Watcher, WatcherAdapter, WorkspaceAdapters, WorkspaceConfigInfo, WorkspaceInfo, WorkspaceStateCacheStorage, addToRegistry, agentAdapters, agentGuideService, analyzeDeps, analyzeIntegrity, buildSpec, cacheKeyToString, claudeCodeAdapter, cleanArtifacts, compareSpecs, computeContentHash, createAgentGuideService, createConsoleLoggerAdapter, createEmptyLayerInventory, createFileSystemCacheStorage, createInMemoryCacheStorage, createNodeAdapters, createNodeAiAdapter, createNodeFsAdapter, createNodeGitAdapter, createNodeWatcherAdapter, createNoopLoggerAdapter, createQuickAIReview, createRegeneratorService, createSpecCreator, createVerificationCacheService, createVerifyService, createWorkspaceStateCacheStorage, cursorCLIAdapter, deepMergeOverwrite, deepMergePreserve, detectPackageManager, detectRepositoryType, discoverAllImplementations, discoverImplementationsForSpec, discoverLayers, exportGraphAsDot, exportOpenApi, exportSpecForLLM, extractSpecReferences, filterIssuesBySeverity, filterIssuesByType, findAllConfigFiles, findMetaRepoRoot, findPackageRoot, findWorkspaceRoot, formatCheckResult, formatDoctorSummary, formatFiles, formatJson, formatQuickstartPreview, formatVerificationReport, formatWorkspaceInfo, index_d_exports as formatters, generateAgentsMd, generateAppBlueprintSpec, generateClaudeMcpConfig, generateComponentTemplate, generateContractsrcConfig, generateCursorMcpConfig, generateCursorRules, generateCursorRulesFromParsedSpec, generateDataViewSpec, generateDocsFromSpecs, generateEventSpec, generateExperimentSpec, generateFeatureContextMarkdown, generateGuideFromParsedSpec, generateHandlerTemplate, generateIntegrationSpec, generateKnowledgeSpaceSpec, generateMermaidDiagram, generateMigrationSpec, generateOperationSpec, generatePresentationSpec, generateTelemetrySpec, generateTestTemplate, generateVscodeSettings, generateWorkflowRunnerTemplate, generateWorkflowSpec, genericMCPAdapter, getAIProvider, getAgentAdapter, getAllLayerLocations, getAllSpecs, getApiKey, getClaudeDesktopConfigPath, getContractNode, getDependencies, getDevDependencies, getExecCommand, getExtendedWorkspaceInfo, getGraphStats, getImplementationSummary, getInstallCommand, getMetaRepoInfo, getPackageName, getProductionDependencies, getRecommendedModels, getRunCommand, getWorkspaceInfo, getWorkspacePackages, groupSpecsByType, index_d_exports$1 as impact, importFromOpenApiService, inferImplementationType, isContractSpecInstalled, isMonorepo, listAgentTypes, listFromRegistry, listSpecs, loadWorkspaceConfig, mergeMonorepoConfigs, module, parseGitModules, index_d_exports$2 as prompts, resolveAllImplementations, resolveImplementations, resolveRegistryUrl, runCIChecks, runDoctor, runQuickstart, runSetup, runTestSpecs, runTests, safeParseJson, searchRegistry, stringToCacheKey, syncSpecs, syncWithOpenApiService, index_d_exports$3 as templates, validateAgainstOpenApiService, validateBlueprint, validateImplementationFiles, validateImplementationWithAgent, validateProvider, validateSpec, validateSpecs, validateTenantConfig, verifyBehavior, verifyImplementationAgainstParsedSpec, verifySemanticFields, verifyService, verifyStructure, verifyWithAI, verifyWithAIEnhanced, index_d_exports$4 as versioning, watchSpecs };
|
package/dist/index.js
CHANGED
|
@@ -83,6 +83,7 @@ import { formatQuickstartPreview, isContractSpecInstalled, runQuickstart } from
|
|
|
83
83
|
import { generateDocsFromSpecs } from "./services/docs/docs-service.js";
|
|
84
84
|
import { impact_exports } from "./services/impact/index.js";
|
|
85
85
|
import { formatFiles } from "./services/formatter.js";
|
|
86
|
+
import { versioning_exports } from "./services/versioning/index.js";
|
|
86
87
|
import "./services/index.js";
|
|
87
88
|
import { formatters_exports } from "./formatters/index.js";
|
|
88
89
|
import { AIClient } from "./ai/client.js";
|
|
@@ -90,4 +91,4 @@ import { prompts_exports } from "./ai/prompts/index.js";
|
|
|
90
91
|
import "./ai/index.js";
|
|
91
92
|
import * as module from "@contractspec/module.workspace";
|
|
92
93
|
|
|
93
|
-
export { AIClient, AIGenerator, ALL_CHECK_CATEGORIES, ALL_CI_CHECK_CATEGORIES, ALL_SETUP_TARGETS, AgentGuideService, AgentOrchestrator, CHECK_CATEGORY_LABELS, CI_CHECK_CATEGORY_LABELS, ClaudeCodeAdapter, ClaudeCodeAgent, CursorAgent, CursorCLIAdapter, DEFAULT_CACHE_CONFIG, FULL_DEPENDENCIES, FileSystemCacheStorage, GenericMCPAdapter, InMemoryCacheStorage, MINIMAL_DEPENDENCIES, OpenAICodexAgent, RegistryClient, SETUP_TARGET_LABELS, SimpleAgent, SpecCreatorService, VerificationCacheService, VerifyService, WorkspaceStateCacheStorage, addToRegistry, agentAdapters, agentGuideService, analyzeDeps, analyzeIntegrity, buildSpec, cacheKeyToString, claudeCodeAdapter, cleanArtifacts, compareSpecs, computeContentHash, createAgentGuideService, createConsoleLoggerAdapter, createEmptyLayerInventory, createFileSystemCacheStorage, createInMemoryCacheStorage, createNodeAdapters, createNodeAiAdapter, createNodeFsAdapter, createNodeGitAdapter, createNodeWatcherAdapter, createNoopLoggerAdapter, createQuickAIReview, createRegeneratorService, createSpecCreator, createVerificationCacheService, createVerifyService, createWorkspaceStateCacheStorage, cursorCLIAdapter, deepMergeOverwrite, deepMergePreserve, detectPackageManager, detectRepositoryType, discoverAllImplementations, discoverImplementationsForSpec, discoverLayers, exportGraphAsDot, exportOpenApi, exportSpecForLLM, extractSpecReferences, filterIssuesBySeverity, filterIssuesByType, findAllConfigFiles, findMetaRepoRoot, findPackageRoot, findWorkspaceRoot, formatCheckResult, formatDoctorSummary, formatFiles, formatJson, formatQuickstartPreview, formatVerificationReport, formatWorkspaceInfo, formatters_exports as formatters, generateAgentsMd, generateAppBlueprintSpec, generateClaudeMcpConfig, generateComponentTemplate, generateContractsrcConfig, generateCursorMcpConfig, generateCursorRules, generateCursorRulesFromParsedSpec, generateDataViewSpec, generateDocsFromSpecs, generateEventSpec, generateExperimentSpec, generateFeatureContextMarkdown, generateGuideFromParsedSpec, generateHandlerTemplate, generateIntegrationSpec, generateKnowledgeSpaceSpec, generateMermaidDiagram, generateMigrationSpec, generateOperationSpec, generatePresentationSpec, generateTelemetrySpec, generateTestTemplate, generateVscodeSettings, generateWorkflowRunnerTemplate, generateWorkflowSpec, genericMCPAdapter, getAIProvider, getAgentAdapter, getAllLayerLocations, getAllSpecs, getApiKey, getClaudeDesktopConfigPath, getContractNode, getDependencies, getDevDependencies, getExecCommand, getExtendedWorkspaceInfo, getGraphStats, getImplementationSummary, getInstallCommand, getMetaRepoInfo, getPackageName, getProductionDependencies, getRecommendedModels, getRunCommand, getWorkspaceInfo, getWorkspacePackages, groupSpecsByType, impact_exports as impact, importFromOpenApiService, inferImplementationType, isContractSpecInstalled, isMonorepo, listAgentTypes, listFromRegistry, listSpecs, loadWorkspaceConfig, mergeMonorepoConfigs, module, parseGitModules, prompts_exports as prompts, resolveAllImplementations, resolveImplementations, resolveRegistryUrl, runCIChecks, runDoctor, runQuickstart, runSetup, runTestSpecs, runTests, safeParseJson, searchRegistry, stringToCacheKey, syncSpecs, syncWithOpenApiService, templates_exports as templates, validateAgainstOpenApiService, validateBlueprint, validateImplementationFiles, validateImplementationWithAgent, validateProvider, validateSpec, validateSpecs, validateTenantConfig, verifyBehavior, verifyImplementationAgainstParsedSpec, verifySemanticFields, verifyService, verifyStructure, verifyWithAI, verifyWithAIEnhanced, watchSpecs };
|
|
94
|
+
export { AIClient, AIGenerator, ALL_CHECK_CATEGORIES, ALL_CI_CHECK_CATEGORIES, ALL_SETUP_TARGETS, AgentGuideService, AgentOrchestrator, CHECK_CATEGORY_LABELS, CI_CHECK_CATEGORY_LABELS, ClaudeCodeAdapter, ClaudeCodeAgent, CursorAgent, CursorCLIAdapter, DEFAULT_CACHE_CONFIG, FULL_DEPENDENCIES, FileSystemCacheStorage, GenericMCPAdapter, InMemoryCacheStorage, MINIMAL_DEPENDENCIES, OpenAICodexAgent, RegistryClient, SETUP_TARGET_LABELS, SimpleAgent, SpecCreatorService, VerificationCacheService, VerifyService, WorkspaceStateCacheStorage, addToRegistry, agentAdapters, agentGuideService, analyzeDeps, analyzeIntegrity, buildSpec, cacheKeyToString, claudeCodeAdapter, cleanArtifacts, compareSpecs, computeContentHash, createAgentGuideService, createConsoleLoggerAdapter, createEmptyLayerInventory, createFileSystemCacheStorage, createInMemoryCacheStorage, createNodeAdapters, createNodeAiAdapter, createNodeFsAdapter, createNodeGitAdapter, createNodeWatcherAdapter, createNoopLoggerAdapter, createQuickAIReview, createRegeneratorService, createSpecCreator, createVerificationCacheService, createVerifyService, createWorkspaceStateCacheStorage, cursorCLIAdapter, deepMergeOverwrite, deepMergePreserve, detectPackageManager, detectRepositoryType, discoverAllImplementations, discoverImplementationsForSpec, discoverLayers, exportGraphAsDot, exportOpenApi, exportSpecForLLM, extractSpecReferences, filterIssuesBySeverity, filterIssuesByType, findAllConfigFiles, findMetaRepoRoot, findPackageRoot, findWorkspaceRoot, formatCheckResult, formatDoctorSummary, formatFiles, formatJson, formatQuickstartPreview, formatVerificationReport, formatWorkspaceInfo, formatters_exports as formatters, generateAgentsMd, generateAppBlueprintSpec, generateClaudeMcpConfig, generateComponentTemplate, generateContractsrcConfig, generateCursorMcpConfig, generateCursorRules, generateCursorRulesFromParsedSpec, generateDataViewSpec, generateDocsFromSpecs, generateEventSpec, generateExperimentSpec, generateFeatureContextMarkdown, generateGuideFromParsedSpec, generateHandlerTemplate, generateIntegrationSpec, generateKnowledgeSpaceSpec, generateMermaidDiagram, generateMigrationSpec, generateOperationSpec, generatePresentationSpec, generateTelemetrySpec, generateTestTemplate, generateVscodeSettings, generateWorkflowRunnerTemplate, generateWorkflowSpec, genericMCPAdapter, getAIProvider, getAgentAdapter, getAllLayerLocations, getAllSpecs, getApiKey, getClaudeDesktopConfigPath, getContractNode, getDependencies, getDevDependencies, getExecCommand, getExtendedWorkspaceInfo, getGraphStats, getImplementationSummary, getInstallCommand, getMetaRepoInfo, getPackageName, getProductionDependencies, getRecommendedModels, getRunCommand, getWorkspaceInfo, getWorkspacePackages, groupSpecsByType, impact_exports as impact, importFromOpenApiService, inferImplementationType, isContractSpecInstalled, isMonorepo, listAgentTypes, listFromRegistry, listSpecs, loadWorkspaceConfig, mergeMonorepoConfigs, module, parseGitModules, prompts_exports as prompts, resolveAllImplementations, resolveImplementations, resolveRegistryUrl, runCIChecks, runDoctor, runQuickstart, runSetup, runTestSpecs, runTests, safeParseJson, searchRegistry, stringToCacheKey, syncSpecs, syncWithOpenApiService, templates_exports as templates, validateAgainstOpenApiService, validateBlueprint, validateImplementationFiles, validateImplementationWithAgent, validateProvider, validateSpec, validateSpecs, validateTenantConfig, verifyBehavior, verifyImplementationAgainstParsedSpec, verifySemanticFields, verifyService, verifyStructure, verifyWithAI, verifyWithAIEnhanced, versioning_exports as versioning, watchSpecs };
|
|
@@ -194,6 +194,13 @@ async function checkContractsLibrary(fs, ctx) {
|
|
|
194
194
|
status: "pass",
|
|
195
195
|
message: `@contractspec/lib.contracts installed (${allDeps["@contractspec/lib.contracts"]})`
|
|
196
196
|
};
|
|
197
|
+
if (ctx.isMonorepo && ctx.packageRoot === ctx.workspaceRoot) return {
|
|
198
|
+
category: "deps",
|
|
199
|
+
name: "ContractSpec Library",
|
|
200
|
+
status: "pass",
|
|
201
|
+
message: "Monorepo root detected (library check skipped)",
|
|
202
|
+
details: "Run doctor in specific packages to verify dependencies"
|
|
203
|
+
};
|
|
197
204
|
return {
|
|
198
205
|
category: "deps",
|
|
199
206
|
name: "ContractSpec Library",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deps.js","names":["results: CheckResult[]","detectedManager: string | null"],"sources":["../../../../src/services/doctor/checks/deps.ts"],"sourcesContent":["/**\n * Dependencies health checks.\n */\n\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { FsAdapter } from '../../../ports/fs';\nimport type { CheckResult, CheckContext } from '../types';\n\nconst execAsync = promisify(exec);\n\n/**\n * Run dependency-related health checks.\n */\nexport async function runDepsChecks(\n fs: FsAdapter,\n ctx: CheckContext\n): Promise<CheckResult[]> {\n const results: CheckResult[] = [];\n\n // Check Node.js availability\n results.push(await checkNodeJs(ctx));\n\n // Check Bun availability\n results.push(await checkBun(ctx));\n\n // Check package manager\n results.push(await checkPackageManager(fs, ctx));\n\n // Check if node_modules exists\n results.push(await checkNodeModules(fs, ctx));\n\n // Check if @contractspec/lib.contracts is installed\n results.push(await checkContractsLibrary(fs, ctx));\n\n return results;\n}\n\n/**\n * Check if Node.js is available.\n */\nasync function checkNodeJs(ctx: CheckContext): Promise<CheckResult> {\n try {\n const { stdout } = await execAsync('node --version', {\n cwd: ctx.workspaceRoot,\n timeout: 5000,\n });\n\n const version = stdout.trim();\n\n return {\n category: 'deps',\n name: 'Node.js',\n status: 'pass',\n message: `Node.js ${version} available`,\n };\n } catch {\n return {\n category: 'deps',\n name: 'Node.js',\n status: 'fail',\n message: 'Node.js not found',\n details: 'Install Node.js from https://nodejs.org',\n };\n }\n}\n\n/**\n * Check if Bun is available.\n */\nasync function checkBun(ctx: CheckContext): Promise<CheckResult> {\n try {\n const { stdout } = await execAsync('bun --version', {\n cwd: ctx.workspaceRoot,\n timeout: 5000,\n });\n\n const version = stdout.trim();\n\n return {\n category: 'deps',\n name: 'Bun Runtime',\n status: 'pass',\n message: `Bun ${version} available`,\n };\n } catch {\n return {\n category: 'deps',\n name: 'Bun Runtime',\n status: 'warn',\n message: 'Bun not found (optional but recommended)',\n details: 'Install Bun from https://bun.sh for faster execution',\n };\n }\n}\n\n/**\n * Detect and check the package manager.\n */\nasync function checkPackageManager(\n fs: FsAdapter,\n ctx: CheckContext\n): Promise<CheckResult> {\n // Check for lock files to determine package manager\n const lockFiles = [\n { file: 'bun.lockb', name: 'bun' },\n { file: 'pnpm-lock.yaml', name: 'pnpm' },\n { file: 'yarn.lock', name: 'yarn' },\n { file: 'package-lock.json', name: 'npm' },\n ];\n\n let detectedManager: string | null = null;\n\n for (const { file, name } of lockFiles) {\n const lockPath = fs.join(ctx.workspaceRoot, file);\n if (await fs.exists(lockPath)) {\n detectedManager = name;\n break;\n }\n }\n\n if (!detectedManager) {\n return {\n category: 'deps',\n name: 'Package Manager',\n status: 'warn',\n message: 'No lock file found',\n details: 'Run npm install, yarn, pnpm install, or bun install',\n };\n }\n\n // Verify the package manager is available\n try {\n await execAsync(`${detectedManager} --version`, {\n cwd: ctx.workspaceRoot,\n timeout: 5000,\n });\n\n return {\n category: 'deps',\n name: 'Package Manager',\n status: 'pass',\n message: `Using ${detectedManager}`,\n };\n } catch {\n return {\n category: 'deps',\n name: 'Package Manager',\n status: 'fail',\n message: `${detectedManager} detected but not available`,\n details: `Install ${detectedManager} or use a different package manager`,\n };\n }\n}\n\n/**\n * Check if node_modules exists.\n */\nasync function checkNodeModules(\n fs: FsAdapter,\n ctx: CheckContext\n): Promise<CheckResult> {\n const nodeModulesPath = fs.join(ctx.workspaceRoot, 'node_modules');\n\n const exists = await fs.exists(nodeModulesPath);\n if (exists) {\n return {\n category: 'deps',\n name: 'Dependencies Installed',\n status: 'pass',\n message: 'node_modules directory exists',\n };\n }\n\n return {\n category: 'deps',\n name: 'Dependencies Installed',\n status: 'fail',\n message: 'node_modules not found',\n details: 'Run your package manager install command',\n fix: {\n description: 'Install dependencies',\n apply: async () => {\n try {\n // Try bun first, then npm\n try {\n await execAsync('bun install', {\n cwd: ctx.workspaceRoot,\n timeout: 120000,\n });\n return { success: true, message: 'Installed with bun' };\n } catch {\n await execAsync('npm install', {\n cwd: ctx.workspaceRoot,\n timeout: 120000,\n });\n return { success: true, message: 'Installed with npm' };\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return { success: false, message: `Failed: ${msg}` };\n }\n },\n },\n };\n}\n\n/**\n * Check if @contractspec/lib.contracts is installed.\n */\nasync function checkContractsLibrary(\n fs: FsAdapter,\n ctx: CheckContext\n): Promise<CheckResult> {\n const packageJsonPath = fs.join(ctx.workspaceRoot, 'package.json');\n\n try {\n const content = await fs.readFile(packageJsonPath);\n const packageJson = JSON.parse(content) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n const allDeps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n if ('@contractspec/lib.contracts' in allDeps) {\n return {\n category: 'deps',\n name: 'ContractSpec Library',\n status: 'pass',\n message: `@contractspec/lib.contracts installed (${allDeps['@contractspec/lib.contracts']})`,\n };\n }\n\n return {\n category: 'deps',\n name: 'ContractSpec Library',\n status: 'fail',\n message: '@contractspec/lib.contracts not installed',\n details: 'Run \"contractspec quickstart\" to install required packages',\n fix: {\n description: 'Install @contractspec/lib.contracts and dependencies',\n apply: async () => {\n try {\n // Try bun first, then npm\n try {\n await execAsync('bun add @contractspec/lib.contracts zod', {\n cwd: ctx.workspaceRoot,\n timeout: 120000,\n });\n return { success: true, message: 'Installed with bun' };\n } catch {\n await execAsync('npm install @contractspec/lib.contracts zod', {\n cwd: ctx.workspaceRoot,\n timeout: 120000,\n });\n return { success: true, message: 'Installed with npm' };\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return { success: false, message: `Failed: ${msg}` };\n }\n },\n },\n };\n } catch {\n return {\n category: 'deps',\n name: 'ContractSpec Library',\n status: 'skip',\n message: 'Could not read package.json',\n };\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"deps.js","names":["results: CheckResult[]","detectedManager: string | null"],"sources":["../../../../src/services/doctor/checks/deps.ts"],"sourcesContent":["/**\n * Dependencies health checks.\n */\n\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { FsAdapter } from '../../../ports/fs';\nimport type { CheckResult, CheckContext } from '../types';\n\nconst execAsync = promisify(exec);\n\n/**\n * Run dependency-related health checks.\n */\nexport async function runDepsChecks(\n fs: FsAdapter,\n ctx: CheckContext\n): Promise<CheckResult[]> {\n const results: CheckResult[] = [];\n\n // Check Node.js availability\n results.push(await checkNodeJs(ctx));\n\n // Check Bun availability\n results.push(await checkBun(ctx));\n\n // Check package manager\n results.push(await checkPackageManager(fs, ctx));\n\n // Check if node_modules exists\n results.push(await checkNodeModules(fs, ctx));\n\n // Check if @contractspec/lib.contracts is installed\n results.push(await checkContractsLibrary(fs, ctx));\n\n return results;\n}\n\n/**\n * Check if Node.js is available.\n */\nasync function checkNodeJs(ctx: CheckContext): Promise<CheckResult> {\n try {\n const { stdout } = await execAsync('node --version', {\n cwd: ctx.workspaceRoot,\n timeout: 5000,\n });\n\n const version = stdout.trim();\n\n return {\n category: 'deps',\n name: 'Node.js',\n status: 'pass',\n message: `Node.js ${version} available`,\n };\n } catch {\n return {\n category: 'deps',\n name: 'Node.js',\n status: 'fail',\n message: 'Node.js not found',\n details: 'Install Node.js from https://nodejs.org',\n };\n }\n}\n\n/**\n * Check if Bun is available.\n */\nasync function checkBun(ctx: CheckContext): Promise<CheckResult> {\n try {\n const { stdout } = await execAsync('bun --version', {\n cwd: ctx.workspaceRoot,\n timeout: 5000,\n });\n\n const version = stdout.trim();\n\n return {\n category: 'deps',\n name: 'Bun Runtime',\n status: 'pass',\n message: `Bun ${version} available`,\n };\n } catch {\n return {\n category: 'deps',\n name: 'Bun Runtime',\n status: 'warn',\n message: 'Bun not found (optional but recommended)',\n details: 'Install Bun from https://bun.sh for faster execution',\n };\n }\n}\n\n/**\n * Detect and check the package manager.\n */\nasync function checkPackageManager(\n fs: FsAdapter,\n ctx: CheckContext\n): Promise<CheckResult> {\n // Check for lock files to determine package manager\n const lockFiles = [\n { file: 'bun.lockb', name: 'bun' },\n { file: 'pnpm-lock.yaml', name: 'pnpm' },\n { file: 'yarn.lock', name: 'yarn' },\n { file: 'package-lock.json', name: 'npm' },\n ];\n\n let detectedManager: string | null = null;\n\n for (const { file, name } of lockFiles) {\n const lockPath = fs.join(ctx.workspaceRoot, file);\n if (await fs.exists(lockPath)) {\n detectedManager = name;\n break;\n }\n }\n\n if (!detectedManager) {\n return {\n category: 'deps',\n name: 'Package Manager',\n status: 'warn',\n message: 'No lock file found',\n details: 'Run npm install, yarn, pnpm install, or bun install',\n };\n }\n\n // Verify the package manager is available\n try {\n await execAsync(`${detectedManager} --version`, {\n cwd: ctx.workspaceRoot,\n timeout: 5000,\n });\n\n return {\n category: 'deps',\n name: 'Package Manager',\n status: 'pass',\n message: `Using ${detectedManager}`,\n };\n } catch {\n return {\n category: 'deps',\n name: 'Package Manager',\n status: 'fail',\n message: `${detectedManager} detected but not available`,\n details: `Install ${detectedManager} or use a different package manager`,\n };\n }\n}\n\n/**\n * Check if node_modules exists.\n */\nasync function checkNodeModules(\n fs: FsAdapter,\n ctx: CheckContext\n): Promise<CheckResult> {\n const nodeModulesPath = fs.join(ctx.workspaceRoot, 'node_modules');\n\n const exists = await fs.exists(nodeModulesPath);\n if (exists) {\n return {\n category: 'deps',\n name: 'Dependencies Installed',\n status: 'pass',\n message: 'node_modules directory exists',\n };\n }\n\n return {\n category: 'deps',\n name: 'Dependencies Installed',\n status: 'fail',\n message: 'node_modules not found',\n details: 'Run your package manager install command',\n fix: {\n description: 'Install dependencies',\n apply: async () => {\n try {\n // Try bun first, then npm\n try {\n await execAsync('bun install', {\n cwd: ctx.workspaceRoot,\n timeout: 120000,\n });\n return { success: true, message: 'Installed with bun' };\n } catch {\n await execAsync('npm install', {\n cwd: ctx.workspaceRoot,\n timeout: 120000,\n });\n return { success: true, message: 'Installed with npm' };\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return { success: false, message: `Failed: ${msg}` };\n }\n },\n },\n };\n}\n\n/**\n * Check if @contractspec/lib.contracts is installed.\n */\nasync function checkContractsLibrary(\n fs: FsAdapter,\n ctx: CheckContext\n): Promise<CheckResult> {\n const packageJsonPath = fs.join(ctx.workspaceRoot, 'package.json');\n\n try {\n const content = await fs.readFile(packageJsonPath);\n const packageJson = JSON.parse(content) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n const allDeps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n if ('@contractspec/lib.contracts' in allDeps) {\n return {\n category: 'deps',\n name: 'ContractSpec Library',\n status: 'pass',\n message: `@contractspec/lib.contracts installed (${allDeps['@contractspec/lib.contracts']})`,\n };\n }\n\n // In monorepo root, we don't expect the library to be installed directly\n if (ctx.isMonorepo && ctx.packageRoot === ctx.workspaceRoot) {\n return {\n category: 'deps',\n name: 'ContractSpec Library',\n status: 'pass',\n message: 'Monorepo root detected (library check skipped)',\n details: 'Run doctor in specific packages to verify dependencies',\n };\n }\n\n return {\n category: 'deps',\n name: 'ContractSpec Library',\n status: 'fail',\n message: '@contractspec/lib.contracts not installed',\n details: 'Run \"contractspec quickstart\" to install required packages',\n fix: {\n description: 'Install @contractspec/lib.contracts and dependencies',\n apply: async () => {\n try {\n // Try bun first, then npm\n try {\n await execAsync('bun add @contractspec/lib.contracts zod', {\n cwd: ctx.workspaceRoot,\n timeout: 120000,\n });\n return { success: true, message: 'Installed with bun' };\n } catch {\n await execAsync('npm install @contractspec/lib.contracts zod', {\n cwd: ctx.workspaceRoot,\n timeout: 120000,\n });\n return { success: true, message: 'Installed with npm' };\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return { success: false, message: `Failed: ${msg}` };\n }\n },\n },\n };\n } catch {\n return {\n category: 'deps',\n name: 'ContractSpec Library',\n status: 'skip',\n message: 'Could not read package.json',\n };\n }\n}\n"],"mappings":"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"}
|
package/dist/services/index.d.ts
CHANGED
|
@@ -83,4 +83,5 @@ import { formatQuickstartPreview, isContractSpecInstalled, runQuickstart } from
|
|
|
83
83
|
import { DocsServiceOptions, DocsServiceResult, generateDocsFromSpecs } from "./docs/docs-service.js";
|
|
84
84
|
import "./docs/index.js";
|
|
85
85
|
import { index_d_exports } from "./impact/index.js";
|
|
86
|
-
import { FormatterOptions, formatFiles } from "./formatter.js";
|
|
86
|
+
import { FormatterOptions, formatFiles } from "./formatter.js";
|
|
87
|
+
import { index_d_exports as index_d_exports$1 } from "./versioning/index.js";
|
package/dist/services/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","names":[],"sources":["../../src/services/sync.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAqCY,UAxBK,gBAAA,
|
|
1
|
+
{"version":3,"file":"sync.d.ts","names":[],"sources":["../../src/services/sync.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAqCY,UAxBK,gBAAA,CA2BZ;EAEO,OAAA,CAAA,EAAA,MAAA;EAEU,UAAA,CAAA,EAAS,CAAA,MAAA,GAAA,SAAA,CAAA,EAAA;EACb,QAAA,CAAA,EAAA,OAAA;EAAmB,YAAA,CAAA,EA5BpB,IA4BoB,CA5Bf,gBA4Be,EAAA,WAAA,CAAA;EAC3B,MAAA,CAAA,EAAA,OAAA;;AAGE,UA5BK,kBAAA,CA4BL;EACG,QAAA,EAAA,MAAA;EAEJ,SAAA,CAAA,EAAA,MAAA;EAAR,UAAA,CAAA,EA5BY,kBA4BZ;EAAO,KAAA,CAAA,EAAA,OAAA;;;;;;UApBO,eAAA;;QAET;;KAGI,sEAGP,QAAQ;KAED,cAAA,yBAAuC,QAAQ;iBAErC,SAAA;MACJ;UAAmB;WAC3B,2BACC;UAEC;aACG;IAEZ,QAAQ"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ChangelogJsonExport, VersionAnalyzeResult } from "./types.js";
|
|
2
|
+
import { ChangelogEntry } from "@contractspec/lib.contracts";
|
|
3
|
+
|
|
4
|
+
//#region src/services/versioning/changelog-formatter.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Format entries as Keep a Changelog markdown.
|
|
8
|
+
*
|
|
9
|
+
* @see https://keepachangelog.com/
|
|
10
|
+
*/
|
|
11
|
+
declare function formatKeepAChangelog(entries: ChangelogEntry[]): string;
|
|
12
|
+
/**
|
|
13
|
+
* Format entries as Conventional Changelog markdown.
|
|
14
|
+
*
|
|
15
|
+
* @see https://www.conventionalcommits.org/
|
|
16
|
+
*/
|
|
17
|
+
declare function formatConventionalChangelog(entries: ChangelogEntry[]): string;
|
|
18
|
+
/**
|
|
19
|
+
* Format analysis result as JSON export.
|
|
20
|
+
*/
|
|
21
|
+
declare function formatChangelogJson(analysis: VersionAnalyzeResult, baseline?: string): ChangelogJsonExport;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { formatChangelogJson, formatConventionalChangelog, formatKeepAChangelog };
|
|
24
|
+
//# sourceMappingURL=changelog-formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changelog-formatter.d.ts","names":[],"sources":["../../../src/services/versioning/changelog-formatter.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;iBAmBgB,oBAAA,UAA8B;;;;;;iBA4G9B,2BAAA,UAAqC;;;;iBAmDrC,mBAAA,WACJ,0CAET"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
//#region src/services/versioning/changelog-formatter.ts
|
|
2
|
+
/**
|
|
3
|
+
* Format entries as Keep a Changelog markdown.
|
|
4
|
+
*
|
|
5
|
+
* @see https://keepachangelog.com/
|
|
6
|
+
*/
|
|
7
|
+
function formatKeepAChangelog(entries) {
|
|
8
|
+
const lines = [
|
|
9
|
+
"# Changelog",
|
|
10
|
+
"",
|
|
11
|
+
"All notable changes to this project will be documented in this file.",
|
|
12
|
+
"",
|
|
13
|
+
"The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),",
|
|
14
|
+
"and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).",
|
|
15
|
+
""
|
|
16
|
+
];
|
|
17
|
+
const sorted = [...entries].sort((a, b) => compareVersionsDescending(a.version, b.version));
|
|
18
|
+
for (const entry of sorted) {
|
|
19
|
+
lines.push(`## [${entry.version}] - ${entry.date}`);
|
|
20
|
+
lines.push("");
|
|
21
|
+
const added = entry.changes.filter((c) => c.type === "added");
|
|
22
|
+
const changed = entry.changes.filter((c) => c.type === "changed");
|
|
23
|
+
const deprecated = entry.changes.filter((c) => c.type === "deprecated");
|
|
24
|
+
const removed = entry.changes.filter((c) => c.type === "removed");
|
|
25
|
+
const fixed = entry.changes.filter((c) => c.type === "fixed");
|
|
26
|
+
const security = entry.changes.filter((c) => c.type === "security");
|
|
27
|
+
const breaking = entry.breakingChanges ?? entry.changes.filter((c) => c.type === "breaking");
|
|
28
|
+
if (breaking.length > 0) {
|
|
29
|
+
lines.push("### ⚠️ Breaking Changes");
|
|
30
|
+
breaking.forEach((c) => {
|
|
31
|
+
lines.push(`- ${c.description}${c.path ? ` (${c.path})` : ""}`);
|
|
32
|
+
});
|
|
33
|
+
lines.push("");
|
|
34
|
+
}
|
|
35
|
+
if (added.length > 0) {
|
|
36
|
+
lines.push("### Added");
|
|
37
|
+
added.forEach((c) => {
|
|
38
|
+
lines.push(`- ${c.description}${c.path ? ` (${c.path})` : ""}`);
|
|
39
|
+
});
|
|
40
|
+
lines.push("");
|
|
41
|
+
}
|
|
42
|
+
if (changed.length > 0) {
|
|
43
|
+
lines.push("### Changed");
|
|
44
|
+
changed.forEach((c) => {
|
|
45
|
+
lines.push(`- ${c.description}${c.path ? ` (${c.path})` : ""}`);
|
|
46
|
+
});
|
|
47
|
+
lines.push("");
|
|
48
|
+
}
|
|
49
|
+
if (deprecated.length > 0) {
|
|
50
|
+
lines.push("### Deprecated");
|
|
51
|
+
deprecated.forEach((c) => {
|
|
52
|
+
lines.push(`- ${c.description}${c.path ? ` (${c.path})` : ""}`);
|
|
53
|
+
});
|
|
54
|
+
lines.push("");
|
|
55
|
+
}
|
|
56
|
+
if (removed.length > 0) {
|
|
57
|
+
lines.push("### Removed");
|
|
58
|
+
removed.forEach((c) => {
|
|
59
|
+
lines.push(`- ${c.description}${c.path ? ` (${c.path})` : ""}`);
|
|
60
|
+
});
|
|
61
|
+
lines.push("");
|
|
62
|
+
}
|
|
63
|
+
if (fixed.length > 0) {
|
|
64
|
+
lines.push("### Fixed");
|
|
65
|
+
fixed.forEach((c) => {
|
|
66
|
+
lines.push(`- ${c.description}${c.path ? ` (${c.path})` : ""}`);
|
|
67
|
+
});
|
|
68
|
+
lines.push("");
|
|
69
|
+
}
|
|
70
|
+
if (security.length > 0) {
|
|
71
|
+
lines.push("### Security");
|
|
72
|
+
security.forEach((c) => {
|
|
73
|
+
lines.push(`- ${c.description}${c.path ? ` (${c.path})` : ""}`);
|
|
74
|
+
});
|
|
75
|
+
lines.push("");
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return lines.join("\n");
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Format entries as Conventional Changelog markdown.
|
|
82
|
+
*
|
|
83
|
+
* @see https://www.conventionalcommits.org/
|
|
84
|
+
*/
|
|
85
|
+
function formatConventionalChangelog(entries) {
|
|
86
|
+
const lines = ["# Changelog", ""];
|
|
87
|
+
const sorted = [...entries].sort((a, b) => compareVersionsDescending(a.version, b.version));
|
|
88
|
+
for (const entry of sorted) {
|
|
89
|
+
const bumpLabel = entry.bumpType === "major" ? "💥 BREAKING RELEASE" : entry.bumpType === "minor" ? "🚀 Minor Release" : "🔧 Patch Release";
|
|
90
|
+
lines.push(`## ${entry.version} (${entry.date}) - ${bumpLabel}`);
|
|
91
|
+
lines.push("");
|
|
92
|
+
const typeMapping = {
|
|
93
|
+
added: "feat",
|
|
94
|
+
changed: "refactor",
|
|
95
|
+
fixed: "fix",
|
|
96
|
+
removed: "refactor",
|
|
97
|
+
deprecated: "deprecate",
|
|
98
|
+
breaking: "feat!",
|
|
99
|
+
security: "security"
|
|
100
|
+
};
|
|
101
|
+
for (const change of entry.changes) {
|
|
102
|
+
const type = typeMapping[change.type] ?? "chore";
|
|
103
|
+
const scope = change.path ? `(${change.path})` : "";
|
|
104
|
+
const breakingMarker = change.type === "breaking" ? "!" : "";
|
|
105
|
+
lines.push(`- **${type}${scope}${breakingMarker}**: ${change.description}`);
|
|
106
|
+
}
|
|
107
|
+
lines.push("");
|
|
108
|
+
}
|
|
109
|
+
return lines.join("\n");
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Format analysis result as JSON export.
|
|
113
|
+
*/
|
|
114
|
+
function formatChangelogJson(analysis, baseline) {
|
|
115
|
+
const specsNeedingBump = analysis.analyses.filter((a) => a.needsBump);
|
|
116
|
+
const isoDateTime = (/* @__PURE__ */ new Date()).toISOString();
|
|
117
|
+
const isoDate = isoDateTime.split("T")[0] ?? "";
|
|
118
|
+
return {
|
|
119
|
+
generatedAt: isoDateTime,
|
|
120
|
+
baseline,
|
|
121
|
+
specs: specsNeedingBump.map((spec) => ({
|
|
122
|
+
key: spec.specKey,
|
|
123
|
+
version: spec.suggestedVersion,
|
|
124
|
+
path: spec.specPath,
|
|
125
|
+
entries: [{
|
|
126
|
+
version: spec.suggestedVersion,
|
|
127
|
+
date: isoDate,
|
|
128
|
+
bumpType: spec.bumpType,
|
|
129
|
+
changes: spec.changes,
|
|
130
|
+
breakingChanges: spec.changes.filter((c) => c.type === "breaking")
|
|
131
|
+
}]
|
|
132
|
+
})),
|
|
133
|
+
libraries: []
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Compare versions in descending order (newest first).
|
|
138
|
+
*/
|
|
139
|
+
function compareVersionsDescending(a, b) {
|
|
140
|
+
const parseVer = (v) => {
|
|
141
|
+
return v.split(".").map((p) => parseInt(p, 10) || 0);
|
|
142
|
+
};
|
|
143
|
+
const aParts = parseVer(a);
|
|
144
|
+
const bParts = parseVer(b);
|
|
145
|
+
for (let i = 0; i < 3; i++) {
|
|
146
|
+
const aVal = aParts[i] ?? 0;
|
|
147
|
+
const bVal = bParts[i] ?? 0;
|
|
148
|
+
if (aVal !== bVal) return bVal - aVal;
|
|
149
|
+
}
|
|
150
|
+
return 0;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
//#endregion
|
|
154
|
+
export { formatChangelogJson, formatConventionalChangelog, formatKeepAChangelog };
|
|
155
|
+
//# sourceMappingURL=changelog-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changelog-formatter.js","names":["lines: string[]","typeMapping: Record<string, string>"],"sources":["../../../src/services/versioning/changelog-formatter.ts"],"sourcesContent":["/**\n * Changelog formatters.\n *\n * Format changelog entries as Markdown (Keep a Changelog, Conventional)\n * or JSON for programmatic use.\n */\n\nimport type { ChangelogEntry, ChangeEntry } from '@contractspec/lib.contracts';\nimport type { VersionAnalyzeResult, ChangelogJsonExport } from './types';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Keep a Changelog Format\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Format entries as Keep a Changelog markdown.\n *\n * @see https://keepachangelog.com/\n */\nexport function formatKeepAChangelog(entries: ChangelogEntry[]): string {\n const lines: string[] = [\n '# Changelog',\n '',\n 'All notable changes to this project will be documented in this file.',\n '',\n 'The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),',\n 'and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).',\n '',\n ];\n\n // Sort entries by version (newest first)\n const sorted = [...entries].sort((a, b) =>\n compareVersionsDescending(a.version, b.version)\n );\n\n for (const entry of sorted) {\n lines.push(`## [${entry.version}] - ${entry.date}`);\n lines.push('');\n\n // Group changes by type\n const added = entry.changes.filter((c: ChangeEntry) => c.type === 'added');\n const changed = entry.changes.filter(\n (c: ChangeEntry) => c.type === 'changed'\n );\n const deprecated = entry.changes.filter(\n (c: ChangeEntry) => c.type === 'deprecated'\n );\n const removed = entry.changes.filter(\n (c: ChangeEntry) => c.type === 'removed'\n );\n const fixed = entry.changes.filter((c: ChangeEntry) => c.type === 'fixed');\n const security = entry.changes.filter(\n (c: ChangeEntry) => c.type === 'security'\n );\n const breaking =\n entry.breakingChanges ??\n entry.changes.filter((c: ChangeEntry) => c.type === 'breaking');\n\n if (breaking.length > 0) {\n lines.push('### ⚠️ Breaking Changes');\n breaking.forEach((c: ChangeEntry) => {\n lines.push(`- ${c.description}${c.path ? ` (${c.path})` : ''}`);\n });\n lines.push('');\n }\n\n if (added.length > 0) {\n lines.push('### Added');\n added.forEach((c: ChangeEntry) => {\n lines.push(`- ${c.description}${c.path ? ` (${c.path})` : ''}`);\n });\n lines.push('');\n }\n\n if (changed.length > 0) {\n lines.push('### Changed');\n changed.forEach((c: ChangeEntry) => {\n lines.push(`- ${c.description}${c.path ? ` (${c.path})` : ''}`);\n });\n lines.push('');\n }\n\n if (deprecated.length > 0) {\n lines.push('### Deprecated');\n deprecated.forEach((c: ChangeEntry) => {\n lines.push(`- ${c.description}${c.path ? ` (${c.path})` : ''}`);\n });\n lines.push('');\n }\n\n if (removed.length > 0) {\n lines.push('### Removed');\n removed.forEach((c: ChangeEntry) => {\n lines.push(`- ${c.description}${c.path ? ` (${c.path})` : ''}`);\n });\n lines.push('');\n }\n\n if (fixed.length > 0) {\n lines.push('### Fixed');\n fixed.forEach((c: ChangeEntry) => {\n lines.push(`- ${c.description}${c.path ? ` (${c.path})` : ''}`);\n });\n lines.push('');\n }\n\n if (security.length > 0) {\n lines.push('### Security');\n security.forEach((c: ChangeEntry) => {\n lines.push(`- ${c.description}${c.path ? ` (${c.path})` : ''}`);\n });\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Conventional Changelog Format\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Format entries as Conventional Changelog markdown.\n *\n * @see https://www.conventionalcommits.org/\n */\nexport function formatConventionalChangelog(entries: ChangelogEntry[]): string {\n const lines: string[] = ['# Changelog', ''];\n\n // Sort entries by version (newest first)\n const sorted = [...entries].sort((a, b) =>\n compareVersionsDescending(a.version, b.version)\n );\n\n for (const entry of sorted) {\n const bumpLabel =\n entry.bumpType === 'major'\n ? '💥 BREAKING RELEASE'\n : entry.bumpType === 'minor'\n ? '🚀 Minor Release'\n : '🔧 Patch Release';\n\n lines.push(`## ${entry.version} (${entry.date}) - ${bumpLabel}`);\n lines.push('');\n\n // Map change types to conventional commit types\n const typeMapping: Record<string, string> = {\n added: 'feat',\n changed: 'refactor',\n fixed: 'fix',\n removed: 'refactor',\n deprecated: 'deprecate',\n breaking: 'feat!',\n security: 'security',\n };\n\n for (const change of entry.changes) {\n const type = typeMapping[change.type] ?? 'chore';\n const scope = change.path ? `(${change.path})` : '';\n const breakingMarker = change.type === 'breaking' ? '!' : '';\n lines.push(\n `- **${type}${scope}${breakingMarker}**: ${change.description}`\n );\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// JSON Format\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Format analysis result as JSON export.\n */\nexport function formatChangelogJson(\n analysis: VersionAnalyzeResult,\n baseline?: string\n): ChangelogJsonExport {\n const specsNeedingBump = analysis.analyses.filter((a) => a.needsBump);\n\n const isoDateTime = new Date().toISOString();\n const isoDate = isoDateTime.split('T')[0] ?? '';\n\n return {\n generatedAt: isoDateTime,\n baseline,\n specs: specsNeedingBump.map((spec) => ({\n key: spec.specKey,\n version: spec.suggestedVersion,\n path: spec.specPath,\n entries: [\n {\n version: spec.suggestedVersion,\n date: isoDate,\n bumpType: spec.bumpType,\n changes: spec.changes,\n breakingChanges: spec.changes.filter((c) => c.type === 'breaking'),\n },\n ],\n })),\n libraries: [], // TODO: Group by library\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Compare versions in descending order (newest first).\n */\nfunction compareVersionsDescending(a: string, b: string): number {\n const parseVer = (v: string): number[] => {\n const parts = v.split('.').map((p) => parseInt(p, 10) || 0);\n return parts;\n };\n\n const aParts = parseVer(a);\n const bParts = parseVer(b);\n\n for (let i = 0; i < 3; i++) {\n const aVal = aParts[i] ?? 0;\n const bVal = bParts[i] ?? 0;\n if (aVal !== bVal) {\n return bVal - aVal; // Descending\n }\n }\n\n return 0;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ChangeEntry, ChangelogDocBlock, ChangelogEntry, ChangelogGenerateOptions, ChangelogGenerateResult, ChangelogJsonExport, ChangelogTier, LibraryChangelogJson, SpecChangelogJson, SpecVersionAnalysis, VersionAnalyzeOptions, VersionAnalyzeResult, VersionBumpOptions, VersionBumpResult, VersionBumpType } from "./types.js";
|
|
2
|
+
import { analyzeVersions, applyVersionBump, generateChangelogs } from "./versioning-service.js";
|
|
3
|
+
import { formatChangelogJson, formatConventionalChangelog, formatKeepAChangelog } from "./changelog-formatter.js";
|
|
4
|
+
|
|
5
|
+
//#region src/services/versioning/index.d.ts
|
|
6
|
+
declare namespace index_d_exports {
|
|
7
|
+
export { ChangeEntry, ChangelogDocBlock, ChangelogEntry, ChangelogGenerateOptions, ChangelogGenerateResult, ChangelogJsonExport, ChangelogTier, LibraryChangelogJson, SpecChangelogJson, SpecVersionAnalysis, VersionAnalyzeOptions, VersionAnalyzeResult, VersionBumpOptions, VersionBumpResult, VersionBumpType, analyzeVersions, applyVersionBump, formatChangelogJson, formatConventionalChangelog, formatKeepAChangelog, generateChangelogs };
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
export { index_d_exports };
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/services/versioning/index.ts"],"sourcesContent":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { __exportAll } from "../../_virtual/rolldown_runtime.js";
|
|
2
|
+
import { formatChangelogJson, formatConventionalChangelog, formatKeepAChangelog } from "./changelog-formatter.js";
|
|
3
|
+
import { analyzeVersions, applyVersionBump, generateChangelogs } from "./versioning-service.js";
|
|
4
|
+
|
|
5
|
+
//#region src/services/versioning/index.ts
|
|
6
|
+
var versioning_exports = /* @__PURE__ */ __exportAll({
|
|
7
|
+
analyzeVersions: () => analyzeVersions,
|
|
8
|
+
applyVersionBump: () => applyVersionBump,
|
|
9
|
+
formatChangelogJson: () => formatChangelogJson,
|
|
10
|
+
formatConventionalChangelog: () => formatConventionalChangelog,
|
|
11
|
+
formatKeepAChangelog: () => formatKeepAChangelog,
|
|
12
|
+
generateChangelogs: () => generateChangelogs
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
//#endregion
|
|
16
|
+
export { versioning_exports };
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/services/versioning/index.ts"],"sourcesContent":["/**\n * Versioning service module exports.\n *\n * Provides version analysis, version bumping, and changelog generation.\n */\n\nexport * from './types';\nexport {\n analyzeVersions,\n applyVersionBump,\n generateChangelogs,\n} from './versioning-service';\nexport {\n formatKeepAChangelog,\n formatConventionalChangelog,\n formatChangelogJson,\n} from './changelog-formatter';\n"],"mappings":""}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { ChangeEntry, ChangelogDocBlock, ChangelogEntry as ChangelogEntry$1, ChangelogTier, VersionBumpType } from "@contractspec/lib.contracts";
|
|
2
|
+
|
|
3
|
+
//#region src/services/versioning/types.d.ts
|
|
4
|
+
|
|
5
|
+
/** Options for version analysis */
|
|
6
|
+
interface VersionAnalyzeOptions {
|
|
7
|
+
/** Git ref to compare against (branch, tag, commit) */
|
|
8
|
+
baseline?: string;
|
|
9
|
+
/** Glob pattern for spec discovery */
|
|
10
|
+
pattern?: string;
|
|
11
|
+
/** Workspace root directory */
|
|
12
|
+
workspaceRoot?: string;
|
|
13
|
+
/** Include paths (glob patterns) */
|
|
14
|
+
include?: string[];
|
|
15
|
+
/** Exclude paths (glob patterns) */
|
|
16
|
+
exclude?: string[];
|
|
17
|
+
}
|
|
18
|
+
/** Options for version bump */
|
|
19
|
+
interface VersionBumpOptions {
|
|
20
|
+
/** Spec file path to bump */
|
|
21
|
+
specPath: string;
|
|
22
|
+
/** Bump type (auto-detected if not specified) */
|
|
23
|
+
bumpType?: VersionBumpType;
|
|
24
|
+
/** Change description for changelog entry */
|
|
25
|
+
changeDescription?: string;
|
|
26
|
+
/** Additional change entries */
|
|
27
|
+
changes?: ChangeEntry[];
|
|
28
|
+
/** Dry run (don't write changes) */
|
|
29
|
+
dryRun?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/** Options for changelog generation */
|
|
32
|
+
interface ChangelogGenerateOptions {
|
|
33
|
+
/** Git ref to compare against */
|
|
34
|
+
baseline?: string;
|
|
35
|
+
/** Workspace root directory */
|
|
36
|
+
workspaceRoot?: string;
|
|
37
|
+
/** Changelog tiers to generate */
|
|
38
|
+
tiers?: ChangelogTier[];
|
|
39
|
+
/** Output format */
|
|
40
|
+
format?: 'keep-a-changelog' | 'conventional' | 'custom';
|
|
41
|
+
/** Custom template (for 'custom' format) */
|
|
42
|
+
template?: string;
|
|
43
|
+
}
|
|
44
|
+
/** Result of version analysis for a single spec */
|
|
45
|
+
interface SpecVersionAnalysis {
|
|
46
|
+
/** Path to the spec file */
|
|
47
|
+
specPath: string;
|
|
48
|
+
/** Spec key (e.g., "auth.login") */
|
|
49
|
+
specKey: string;
|
|
50
|
+
/** Current version in the spec */
|
|
51
|
+
currentVersion: string;
|
|
52
|
+
/** Suggested new version based on changes */
|
|
53
|
+
suggestedVersion: string;
|
|
54
|
+
/** Suggested bump type */
|
|
55
|
+
bumpType: VersionBumpType;
|
|
56
|
+
/** Detected changes requiring version bump */
|
|
57
|
+
changes: ChangeEntry[];
|
|
58
|
+
/** Whether breaking changes were detected */
|
|
59
|
+
hasBreaking: boolean;
|
|
60
|
+
/** Whether the spec needs a version bump */
|
|
61
|
+
needsBump: boolean;
|
|
62
|
+
}
|
|
63
|
+
/** Aggregated version analysis result */
|
|
64
|
+
interface VersionAnalyzeResult {
|
|
65
|
+
/** Individual spec analyses */
|
|
66
|
+
analyses: SpecVersionAnalysis[];
|
|
67
|
+
/** Total specs analyzed */
|
|
68
|
+
totalSpecs: number;
|
|
69
|
+
/** Specs needing version bump */
|
|
70
|
+
specsNeedingBump: number;
|
|
71
|
+
/** Total breaking changes across all specs */
|
|
72
|
+
totalBreaking: number;
|
|
73
|
+
/** Total non-breaking changes */
|
|
74
|
+
totalNonBreaking: number;
|
|
75
|
+
/** Git baseline used for comparison */
|
|
76
|
+
baseline?: string;
|
|
77
|
+
}
|
|
78
|
+
/** Result of version bump operation */
|
|
79
|
+
interface VersionBumpResult {
|
|
80
|
+
/** Whether the bump was successful */
|
|
81
|
+
success: boolean;
|
|
82
|
+
/** Path to the updated spec file */
|
|
83
|
+
specPath: string;
|
|
84
|
+
/** Spec key */
|
|
85
|
+
specKey: string;
|
|
86
|
+
/** Previous version */
|
|
87
|
+
previousVersion: string;
|
|
88
|
+
/** New version */
|
|
89
|
+
newVersion: string;
|
|
90
|
+
/** Bump type applied */
|
|
91
|
+
bumpType: VersionBumpType;
|
|
92
|
+
/** Changelog entry created */
|
|
93
|
+
changelogEntry: ChangelogEntry$1;
|
|
94
|
+
/** Error message if failed */
|
|
95
|
+
error?: string;
|
|
96
|
+
}
|
|
97
|
+
/** Result of changelog generation */
|
|
98
|
+
interface ChangelogGenerateResult {
|
|
99
|
+
/** Per-spec DocBlock entries */
|
|
100
|
+
specChangelogs: ChangelogDocBlock[];
|
|
101
|
+
/** Library-level markdown by package path */
|
|
102
|
+
libraryMarkdown: Map<string, string>;
|
|
103
|
+
/** Monorepo-level markdown */
|
|
104
|
+
monorepoMarkdown: string;
|
|
105
|
+
/** JSON format for programmatic use */
|
|
106
|
+
json: ChangelogJsonExport;
|
|
107
|
+
/** Total entries generated */
|
|
108
|
+
totalEntries: number;
|
|
109
|
+
}
|
|
110
|
+
/** JSON export format for changelogs */
|
|
111
|
+
interface ChangelogJsonExport {
|
|
112
|
+
generatedAt: string;
|
|
113
|
+
baseline?: string;
|
|
114
|
+
specs: SpecChangelogJson[];
|
|
115
|
+
libraries: LibraryChangelogJson[];
|
|
116
|
+
}
|
|
117
|
+
/** Spec-level changelog in JSON format */
|
|
118
|
+
interface SpecChangelogJson {
|
|
119
|
+
key: string;
|
|
120
|
+
version: string;
|
|
121
|
+
path: string;
|
|
122
|
+
entries: ChangelogEntry$1[];
|
|
123
|
+
}
|
|
124
|
+
/** Library-level changelog in JSON format */
|
|
125
|
+
interface LibraryChangelogJson {
|
|
126
|
+
name: string;
|
|
127
|
+
path: string;
|
|
128
|
+
version: string;
|
|
129
|
+
entries: ChangelogEntry$1[];
|
|
130
|
+
}
|
|
131
|
+
//#endregion
|
|
132
|
+
export { type ChangeEntry, type ChangelogDocBlock, type ChangelogEntry$1 as ChangelogEntry, ChangelogGenerateOptions, ChangelogGenerateResult, ChangelogJsonExport, type ChangelogTier, LibraryChangelogJson, SpecChangelogJson, SpecVersionAnalysis, VersionAnalyzeOptions, VersionAnalyzeResult, VersionBumpOptions, VersionBumpResult, type VersionBumpType };
|
|
133
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/services/versioning/types.ts"],"sourcesContent":[],"mappings":";;;;AA8GA;AAoBiB,UAtGA,qBAAA,CAsGuB;EAEtB;EAEC,QAAA,CAAA,EAAA,MAAA;EAIX;EAAmB,OAAA,CAAA,EAAA,MAAA;EAMV;EAQA,aAAA,CAAA,EAAA,MAAiB;EAQjB;;;;;;UAtHA,kBAAA;;;;aAIJ;;;;YAID;;;;;UAMK,wBAAA;;;;;;UAMP;;;;;;;UAYO,mBAAA;;;;;;;;;;YAUL;;WAED;;;;;;;UAQM,oBAAA;;YAEL;;;;;;;;;;;;;UAcK,iBAAA;;;;;;;;;;;;YAYL;;kBAEM;;;;;UAMD,uBAAA;;kBAEC;;mBAEC;;;;QAIX;;;;;UAMS,mBAAA;;;SAGR;aACI;;;UAII,iBAAA;;;;WAIN;;;UAIM,oBAAA;;;;WAIN"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { FsAdapter } from "../../ports/fs.js";
|
|
2
|
+
import { GitAdapter } from "../../ports/git.js";
|
|
3
|
+
import { LoggerAdapter } from "../../ports/logger.js";
|
|
4
|
+
import { ChangelogGenerateOptions, ChangelogGenerateResult, VersionAnalyzeOptions, VersionAnalyzeResult, VersionBumpOptions, VersionBumpResult } from "./types.js";
|
|
5
|
+
|
|
6
|
+
//#region src/services/versioning/versioning-service.d.ts
|
|
7
|
+
|
|
8
|
+
interface ServiceAdapters {
|
|
9
|
+
fs: FsAdapter;
|
|
10
|
+
git: GitAdapter;
|
|
11
|
+
logger: LoggerAdapter;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Analyze specs and suggest version bumps based on changes.
|
|
15
|
+
*
|
|
16
|
+
* Compares the current state against a baseline (git ref) and determines
|
|
17
|
+
* which specs need version bumps based on detected changes.
|
|
18
|
+
*/
|
|
19
|
+
declare function analyzeVersions(adapters: ServiceAdapters, options?: VersionAnalyzeOptions): Promise<VersionAnalyzeResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Apply a version bump to a spec file.
|
|
22
|
+
*
|
|
23
|
+
* Updates the version in the spec file and creates a changelog entry.
|
|
24
|
+
*/
|
|
25
|
+
declare function applyVersionBump(adapters: ServiceAdapters, options: VersionBumpOptions): Promise<VersionBumpResult>;
|
|
26
|
+
/**
|
|
27
|
+
* Generate changelogs at all configured tiers.
|
|
28
|
+
*/
|
|
29
|
+
declare function generateChangelogs(adapters: ServiceAdapters, options?: ChangelogGenerateOptions): Promise<ChangelogGenerateResult>;
|
|
30
|
+
//#endregion
|
|
31
|
+
export { analyzeVersions, applyVersionBump, generateChangelogs };
|
|
32
|
+
//# sourceMappingURL=versioning-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versioning-service.d.ts","names":[],"sources":["../../../src/services/versioning/versioning-service.ts"],"sourcesContent":[],"mappings":";;;;;;;UAmCU,eAAA,CAGa;EAaD,EAAA,EAfhB,SAegB;EACV,GAAA,EAfL,UAeK;EACD,MAAA,EAfD,aAeC;;;;AAwGX;;;;AAGG,iBA7GmB,eAAA,CA6GnB,QAAA,EA5GS,eA4GT,EAAA,OAAA,CAAA,EA3GQ,qBA2GR,CAAA,EA1GA,OA0GA,CA1GQ,oBA0GR,CAAA;;AAiGH;;;;AAGG,iBAvGmB,gBAAA,CAuGnB,QAAA,EAtGS,eAsGT,EAAA,OAAA,EArGQ,kBAqGR,CAAA,EApGA,OAoGA,CApGQ,iBAoGR,CAAA;;;;iBAHmB,kBAAA,WACV,2BACD,2BACR,QAAQ"}
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { formatChangelogJson, formatKeepAChangelog } from "./changelog-formatter.js";
|
|
2
|
+
import { bumpVersion, determineBumpType } from "@contractspec/lib.contracts";
|
|
3
|
+
|
|
4
|
+
//#region src/services/versioning/versioning-service.ts
|
|
5
|
+
/**
|
|
6
|
+
* Versioning service.
|
|
7
|
+
*
|
|
8
|
+
* Provides version analysis, version bumping, and changelog generation
|
|
9
|
+
* for ContractSpec specs.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Analyze specs and suggest version bumps based on changes.
|
|
13
|
+
*
|
|
14
|
+
* Compares the current state against a baseline (git ref) and determines
|
|
15
|
+
* which specs need version bumps based on detected changes.
|
|
16
|
+
*/
|
|
17
|
+
async function analyzeVersions(adapters, options = {}) {
|
|
18
|
+
const { fs, git, logger } = adapters;
|
|
19
|
+
const workspaceRoot = options.workspaceRoot ?? process.cwd();
|
|
20
|
+
logger.info("Starting version analysis...", { baseline: options.baseline });
|
|
21
|
+
const pattern = options.pattern ?? "**/*.{operation,event,presentation}.ts";
|
|
22
|
+
const specFiles = (await fs.glob({
|
|
23
|
+
pattern,
|
|
24
|
+
cwd: workspaceRoot
|
|
25
|
+
})).filter((f) => !f.includes(".test.") && !f.includes(".spec.") && !f.includes("node_modules"));
|
|
26
|
+
logger.debug(`Found ${specFiles.length} spec files`);
|
|
27
|
+
const analyses = [];
|
|
28
|
+
let totalBreaking = 0;
|
|
29
|
+
let totalNonBreaking = 0;
|
|
30
|
+
for (const specPath of specFiles) try {
|
|
31
|
+
const currentContent = await fs.readFile(specPath);
|
|
32
|
+
const currentMeta = extractSpecMeta(currentContent);
|
|
33
|
+
if (!currentMeta) continue;
|
|
34
|
+
let baselineContent = null;
|
|
35
|
+
if (options.baseline) try {
|
|
36
|
+
baselineContent = await git.showFile(options.baseline, specPath);
|
|
37
|
+
} catch {
|
|
38
|
+
baselineContent = null;
|
|
39
|
+
}
|
|
40
|
+
const changes = analyzeSpecChanges(currentContent, baselineContent);
|
|
41
|
+
const hasBreaking = changes.some((c) => c.type === "breaking");
|
|
42
|
+
const hasNonBreaking = changes.length > 0 && !hasBreaking;
|
|
43
|
+
const needsBump = changes.length > 0;
|
|
44
|
+
if (hasBreaking) totalBreaking++;
|
|
45
|
+
if (hasNonBreaking) totalNonBreaking++;
|
|
46
|
+
const bumpType = determineBumpType(hasBreaking, hasNonBreaking);
|
|
47
|
+
const suggestedVersion = needsBump ? bumpVersion(currentMeta.version, bumpType) : currentMeta.version;
|
|
48
|
+
analyses.push({
|
|
49
|
+
specPath,
|
|
50
|
+
specKey: currentMeta.key,
|
|
51
|
+
currentVersion: currentMeta.version,
|
|
52
|
+
suggestedVersion,
|
|
53
|
+
bumpType,
|
|
54
|
+
changes,
|
|
55
|
+
hasBreaking,
|
|
56
|
+
needsBump
|
|
57
|
+
});
|
|
58
|
+
} catch (error) {
|
|
59
|
+
logger.warn(`Failed to analyze ${specPath}:`, { error: error instanceof Error ? error.message : String(error) });
|
|
60
|
+
}
|
|
61
|
+
const specsNeedingBump = analyses.filter((a) => a.needsBump).length;
|
|
62
|
+
logger.info("Version analysis complete", {
|
|
63
|
+
totalSpecs: analyses.length,
|
|
64
|
+
specsNeedingBump,
|
|
65
|
+
totalBreaking,
|
|
66
|
+
totalNonBreaking
|
|
67
|
+
});
|
|
68
|
+
return {
|
|
69
|
+
analyses,
|
|
70
|
+
totalSpecs: analyses.length,
|
|
71
|
+
specsNeedingBump,
|
|
72
|
+
totalBreaking,
|
|
73
|
+
totalNonBreaking,
|
|
74
|
+
baseline: options.baseline
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Apply a version bump to a spec file.
|
|
79
|
+
*
|
|
80
|
+
* Updates the version in the spec file and creates a changelog entry.
|
|
81
|
+
*/
|
|
82
|
+
async function applyVersionBump(adapters, options) {
|
|
83
|
+
const { fs, logger } = adapters;
|
|
84
|
+
const { specPath, dryRun = false } = options;
|
|
85
|
+
logger.info("Applying version bump...", {
|
|
86
|
+
specPath,
|
|
87
|
+
bumpType: options.bumpType
|
|
88
|
+
});
|
|
89
|
+
try {
|
|
90
|
+
const content = await fs.readFile(specPath);
|
|
91
|
+
const meta = extractSpecMeta(content);
|
|
92
|
+
if (!meta) return {
|
|
93
|
+
success: false,
|
|
94
|
+
specPath,
|
|
95
|
+
specKey: "unknown",
|
|
96
|
+
previousVersion: "unknown",
|
|
97
|
+
newVersion: "unknown",
|
|
98
|
+
bumpType: "patch",
|
|
99
|
+
changelogEntry: createEmptyChangelogEntry(),
|
|
100
|
+
error: "Could not extract spec metadata"
|
|
101
|
+
};
|
|
102
|
+
const bumpType = options.bumpType ?? "patch";
|
|
103
|
+
const newVersion = bumpVersion(meta.version, bumpType);
|
|
104
|
+
const changes = options.changes ?? [];
|
|
105
|
+
if (options.changeDescription) changes.push({
|
|
106
|
+
type: bumpType === "major" ? "breaking" : "changed",
|
|
107
|
+
description: options.changeDescription
|
|
108
|
+
});
|
|
109
|
+
const changelogEntry = {
|
|
110
|
+
version: newVersion,
|
|
111
|
+
date: (/* @__PURE__ */ new Date()).toISOString().split("T")[0] ?? "",
|
|
112
|
+
bumpType,
|
|
113
|
+
changes,
|
|
114
|
+
breakingChanges: changes.filter((c) => c.type === "breaking")
|
|
115
|
+
};
|
|
116
|
+
if (!dryRun) {
|
|
117
|
+
const updatedContent = updateSpecVersion(content, meta.version, newVersion);
|
|
118
|
+
await fs.writeFile(specPath, updatedContent);
|
|
119
|
+
}
|
|
120
|
+
logger.info("Version bump applied", {
|
|
121
|
+
specPath,
|
|
122
|
+
previousVersion: meta.version,
|
|
123
|
+
newVersion
|
|
124
|
+
});
|
|
125
|
+
return {
|
|
126
|
+
success: true,
|
|
127
|
+
specPath,
|
|
128
|
+
specKey: meta.key,
|
|
129
|
+
previousVersion: meta.version,
|
|
130
|
+
newVersion,
|
|
131
|
+
bumpType,
|
|
132
|
+
changelogEntry
|
|
133
|
+
};
|
|
134
|
+
} catch (error) {
|
|
135
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
136
|
+
logger.error("Version bump failed", {
|
|
137
|
+
specPath,
|
|
138
|
+
error: errorMessage
|
|
139
|
+
});
|
|
140
|
+
return {
|
|
141
|
+
success: false,
|
|
142
|
+
specPath,
|
|
143
|
+
specKey: "unknown",
|
|
144
|
+
previousVersion: "unknown",
|
|
145
|
+
newVersion: "unknown",
|
|
146
|
+
bumpType: options.bumpType ?? "patch",
|
|
147
|
+
changelogEntry: createEmptyChangelogEntry(),
|
|
148
|
+
error: errorMessage
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Generate changelogs at all configured tiers.
|
|
154
|
+
*/
|
|
155
|
+
async function generateChangelogs(adapters, options = {}) {
|
|
156
|
+
const { logger } = adapters;
|
|
157
|
+
const tiers = options.tiers ?? [
|
|
158
|
+
"spec",
|
|
159
|
+
"library",
|
|
160
|
+
"monorepo"
|
|
161
|
+
];
|
|
162
|
+
const format = options.format ?? "keep-a-changelog";
|
|
163
|
+
logger.info("Generating changelogs...", {
|
|
164
|
+
tiers,
|
|
165
|
+
format
|
|
166
|
+
});
|
|
167
|
+
const analysis = await analyzeVersions(adapters, {
|
|
168
|
+
baseline: options.baseline,
|
|
169
|
+
workspaceRoot: options.workspaceRoot
|
|
170
|
+
});
|
|
171
|
+
const specChangelogs = [];
|
|
172
|
+
const libraryMarkdown = /* @__PURE__ */ new Map();
|
|
173
|
+
let monorepoMarkdown = "";
|
|
174
|
+
let totalEntries = 0;
|
|
175
|
+
if (tiers.includes("spec")) for (const spec of analysis.analyses.filter((a) => a.needsBump)) {
|
|
176
|
+
const docBlock = {
|
|
177
|
+
id: `changelog.${spec.specKey}`,
|
|
178
|
+
title: `Changelog for ${spec.specKey}`,
|
|
179
|
+
body: formatSpecChangelog(spec),
|
|
180
|
+
kind: "changelog",
|
|
181
|
+
specKey: spec.specKey,
|
|
182
|
+
specVersion: spec.suggestedVersion,
|
|
183
|
+
entries: [{
|
|
184
|
+
version: spec.suggestedVersion,
|
|
185
|
+
date: (/* @__PURE__ */ new Date()).toISOString().split("T")[0] ?? "",
|
|
186
|
+
bumpType: spec.bumpType,
|
|
187
|
+
changes: spec.changes,
|
|
188
|
+
breakingChanges: spec.changes.filter((c) => c.type === "breaking")
|
|
189
|
+
}]
|
|
190
|
+
};
|
|
191
|
+
specChangelogs.push(docBlock);
|
|
192
|
+
totalEntries++;
|
|
193
|
+
}
|
|
194
|
+
if (tiers.includes("library")) {
|
|
195
|
+
const libraryGroups = groupByLibrary(analysis.analyses);
|
|
196
|
+
for (const [libPath, specs] of libraryGroups) {
|
|
197
|
+
const entries = specs.filter((s) => s.needsBump);
|
|
198
|
+
if (entries.length > 0) {
|
|
199
|
+
libraryMarkdown.set(libPath, formatKeepAChangelog(entries.map(specToChangelogEntry)));
|
|
200
|
+
totalEntries += entries.length;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
if (tiers.includes("monorepo")) monorepoMarkdown = formatKeepAChangelog(analysis.analyses.filter((a) => a.needsBump).map(specToChangelogEntry));
|
|
205
|
+
const json = formatChangelogJson(analysis, options.baseline);
|
|
206
|
+
logger.info("Changelog generation complete", { totalEntries });
|
|
207
|
+
return {
|
|
208
|
+
specChangelogs,
|
|
209
|
+
libraryMarkdown,
|
|
210
|
+
monorepoMarkdown,
|
|
211
|
+
json,
|
|
212
|
+
totalEntries
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Extract spec metadata from file content.
|
|
217
|
+
*/
|
|
218
|
+
function extractSpecMeta(content) {
|
|
219
|
+
const keyMatch = content.match(/key:\s*['"`]([^'"`]+)['"`]/);
|
|
220
|
+
const versionMatch = content.match(/version:\s*['"`]([^'"`]+)['"`]/);
|
|
221
|
+
if (!keyMatch || !versionMatch) return null;
|
|
222
|
+
const key = keyMatch[1];
|
|
223
|
+
const version = versionMatch[1];
|
|
224
|
+
if (!key || !version) return null;
|
|
225
|
+
return {
|
|
226
|
+
key,
|
|
227
|
+
version
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Analyze changes between current and baseline spec content.
|
|
232
|
+
*/
|
|
233
|
+
function analyzeSpecChanges(current, baseline) {
|
|
234
|
+
const changes = [];
|
|
235
|
+
if (!baseline) {
|
|
236
|
+
changes.push({
|
|
237
|
+
type: "added",
|
|
238
|
+
description: "New spec added"
|
|
239
|
+
});
|
|
240
|
+
return changes;
|
|
241
|
+
}
|
|
242
|
+
const currentMeta = extractSpecMeta(current);
|
|
243
|
+
const baselineMeta = extractSpecMeta(baseline);
|
|
244
|
+
if (!currentMeta || !baselineMeta) return changes;
|
|
245
|
+
if (currentMeta.version !== baselineMeta.version) changes.push({
|
|
246
|
+
type: "changed",
|
|
247
|
+
description: `Version updated from ${baselineMeta.version} to ${currentMeta.version}`,
|
|
248
|
+
path: "meta.version"
|
|
249
|
+
});
|
|
250
|
+
const hasIoChanges = detectIoChanges(current, baseline);
|
|
251
|
+
if (hasIoChanges.breaking) changes.push({
|
|
252
|
+
type: "breaking",
|
|
253
|
+
description: "Breaking changes to input/output schema",
|
|
254
|
+
path: "io"
|
|
255
|
+
});
|
|
256
|
+
else if (hasIoChanges.nonBreaking) changes.push({
|
|
257
|
+
type: "changed",
|
|
258
|
+
description: "Non-breaking changes to input/output schema",
|
|
259
|
+
path: "io"
|
|
260
|
+
});
|
|
261
|
+
return changes;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Detect I/O changes between specs (simplified).
|
|
265
|
+
*/
|
|
266
|
+
function detectIoChanges(current, baseline) {
|
|
267
|
+
const ioPattern = /io:\s*\{[\s\S]*?\}/;
|
|
268
|
+
const currentIo = current.match(ioPattern)?.[0] ?? "";
|
|
269
|
+
const baselineIo = baseline.match(ioPattern)?.[0] ?? "";
|
|
270
|
+
if (currentIo === baselineIo) return {
|
|
271
|
+
breaking: false,
|
|
272
|
+
nonBreaking: false
|
|
273
|
+
};
|
|
274
|
+
const currentFields = extractFields(currentIo);
|
|
275
|
+
const baselineFields = extractFields(baselineIo);
|
|
276
|
+
const removedFields = baselineFields.filter((f) => !currentFields.includes(f));
|
|
277
|
+
const addedFields = currentFields.filter((f) => !baselineFields.includes(f));
|
|
278
|
+
return {
|
|
279
|
+
breaking: removedFields.length > 0,
|
|
280
|
+
nonBreaking: addedFields.length > 0 && removedFields.length === 0
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Extract field names from a code block (simplified).
|
|
285
|
+
*/
|
|
286
|
+
function extractFields(code) {
|
|
287
|
+
return [...code.matchAll(/(\w+):/g)].map((m) => m[1]).filter((field) => !!field);
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Update version in spec content.
|
|
291
|
+
*/
|
|
292
|
+
function updateSpecVersion(content, oldVersion, newVersion) {
|
|
293
|
+
return content.replace(/* @__PURE__ */ new RegExp(`version:\\s*['"\`]${oldVersion}['"\`]`), `version: '${newVersion}'`);
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Create an empty changelog entry.
|
|
297
|
+
*/
|
|
298
|
+
function createEmptyChangelogEntry() {
|
|
299
|
+
return {
|
|
300
|
+
version: "0.0.0",
|
|
301
|
+
date: (/* @__PURE__ */ new Date()).toISOString().split("T")[0] ?? "",
|
|
302
|
+
bumpType: "patch",
|
|
303
|
+
changes: []
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Format a single spec's changelog.
|
|
308
|
+
*/
|
|
309
|
+
function formatSpecChangelog(spec) {
|
|
310
|
+
const lines = [`## [${spec.suggestedVersion}] - ${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]}`, ""];
|
|
311
|
+
const breaking = spec.changes.filter((c) => c.type === "breaking");
|
|
312
|
+
const changed = spec.changes.filter((c) => c.type === "changed");
|
|
313
|
+
const added = spec.changes.filter((c) => c.type === "added");
|
|
314
|
+
if (breaking.length > 0) {
|
|
315
|
+
lines.push("### Breaking Changes");
|
|
316
|
+
breaking.forEach((c) => lines.push(`- ${c.description}`));
|
|
317
|
+
lines.push("");
|
|
318
|
+
}
|
|
319
|
+
if (added.length > 0) {
|
|
320
|
+
lines.push("### Added");
|
|
321
|
+
added.forEach((c) => lines.push(`- ${c.description}`));
|
|
322
|
+
lines.push("");
|
|
323
|
+
}
|
|
324
|
+
if (changed.length > 0) {
|
|
325
|
+
lines.push("### Changed");
|
|
326
|
+
changed.forEach((c) => lines.push(`- ${c.description}`));
|
|
327
|
+
lines.push("");
|
|
328
|
+
}
|
|
329
|
+
return lines.join("\n");
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Group specs by library (package path).
|
|
333
|
+
*/
|
|
334
|
+
function groupByLibrary(analyses) {
|
|
335
|
+
const groups = /* @__PURE__ */ new Map();
|
|
336
|
+
for (const analysis of analyses) {
|
|
337
|
+
const libPath = analysis.specPath.match(/(.+?\/src\/)/)?.[1] ?? analysis.specPath;
|
|
338
|
+
const existing = groups.get(libPath) ?? [];
|
|
339
|
+
existing.push(analysis);
|
|
340
|
+
groups.set(libPath, existing);
|
|
341
|
+
}
|
|
342
|
+
return groups;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Convert SpecVersionAnalysis to ChangelogEntry.
|
|
346
|
+
*/
|
|
347
|
+
function specToChangelogEntry(spec) {
|
|
348
|
+
return {
|
|
349
|
+
version: spec.suggestedVersion,
|
|
350
|
+
date: (/* @__PURE__ */ new Date()).toISOString().split("T")[0] ?? "",
|
|
351
|
+
bumpType: spec.bumpType,
|
|
352
|
+
changes: spec.changes,
|
|
353
|
+
breakingChanges: spec.changes.filter((c) => c.type === "breaking")
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
//#endregion
|
|
358
|
+
export { analyzeVersions, applyVersionBump, generateChangelogs };
|
|
359
|
+
//# sourceMappingURL=versioning-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versioning-service.js","names":["analyses: SpecVersionAnalysis[]","baselineContent: string | null","changes: ChangeEntry[]","changelogEntry: ChangelogEntry","specChangelogs: ChangelogDocBlock[]","docBlock: ChangelogDocBlock","lines: string[]"],"sources":["../../../src/services/versioning/versioning-service.ts"],"sourcesContent":["/**\n * Versioning service.\n *\n * Provides version analysis, version bumping, and changelog generation\n * for ContractSpec specs.\n */\n\nimport {\n bumpVersion,\n determineBumpType,\n type ChangeEntry,\n type ChangelogEntry,\n type ChangelogDocBlock,\n} from '@contractspec/lib.contracts';\nimport type { FsAdapter } from '../../ports/fs';\nimport type { GitAdapter } from '../../ports/git';\nimport type { LoggerAdapter } from '../../ports/logger';\nimport type {\n VersionAnalyzeOptions,\n VersionAnalyzeResult,\n VersionBumpOptions,\n VersionBumpResult,\n ChangelogGenerateOptions,\n ChangelogGenerateResult,\n SpecVersionAnalysis,\n} from './types';\nimport {\n formatKeepAChangelog,\n formatChangelogJson,\n} from './changelog-formatter';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Adapters Type\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface ServiceAdapters {\n fs: FsAdapter;\n git: GitAdapter;\n logger: LoggerAdapter;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Version Analysis\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Analyze specs and suggest version bumps based on changes.\n *\n * Compares the current state against a baseline (git ref) and determines\n * which specs need version bumps based on detected changes.\n */\nexport async function analyzeVersions(\n adapters: ServiceAdapters,\n options: VersionAnalyzeOptions = {}\n): Promise<VersionAnalyzeResult> {\n const { fs, git, logger } = adapters;\n const workspaceRoot = options.workspaceRoot ?? process.cwd();\n\n logger.info('Starting version analysis...', { baseline: options.baseline });\n\n // Discover spec files\n const pattern = options.pattern ?? '**/*.{operation,event,presentation}.ts';\n const files = await fs.glob({ pattern, cwd: workspaceRoot });\n\n const specFiles = files.filter(\n (f) =>\n !f.includes('.test.') &&\n !f.includes('.spec.') &&\n !f.includes('node_modules')\n );\n\n logger.debug(`Found ${specFiles.length} spec files`);\n\n const analyses: SpecVersionAnalysis[] = [];\n let totalBreaking = 0;\n let totalNonBreaking = 0;\n\n for (const specPath of specFiles) {\n try {\n // Read current spec\n const currentContent = await fs.readFile(specPath);\n const currentMeta = extractSpecMeta(currentContent);\n\n if (!currentMeta) {\n continue; // Skip files that don't have valid spec meta\n }\n\n // Get baseline content if baseline specified\n let baselineContent: string | null = null;\n if (options.baseline) {\n try {\n baselineContent = await git.showFile(options.baseline, specPath);\n } catch {\n // File doesn't exist in baseline (new file)\n baselineContent = null;\n }\n }\n\n // Analyze changes\n const changes = analyzeSpecChanges(currentContent, baselineContent);\n const hasBreaking = changes.some((c) => c.type === 'breaking');\n const hasNonBreaking = changes.length > 0 && !hasBreaking;\n const needsBump = changes.length > 0;\n\n if (hasBreaking) totalBreaking++;\n if (hasNonBreaking) totalNonBreaking++;\n\n const bumpType = determineBumpType(hasBreaking, hasNonBreaking);\n const suggestedVersion = needsBump\n ? bumpVersion(currentMeta.version, bumpType)\n : currentMeta.version;\n\n analyses.push({\n specPath,\n specKey: currentMeta.key,\n currentVersion: currentMeta.version,\n suggestedVersion,\n bumpType,\n changes,\n hasBreaking,\n needsBump,\n });\n } catch (error) {\n logger.warn(`Failed to analyze ${specPath}:`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const specsNeedingBump = analyses.filter((a) => a.needsBump).length;\n\n logger.info('Version analysis complete', {\n totalSpecs: analyses.length,\n specsNeedingBump,\n totalBreaking,\n totalNonBreaking,\n });\n\n return {\n analyses,\n totalSpecs: analyses.length,\n specsNeedingBump,\n totalBreaking,\n totalNonBreaking,\n baseline: options.baseline,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Version Bump\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Apply a version bump to a spec file.\n *\n * Updates the version in the spec file and creates a changelog entry.\n */\nexport async function applyVersionBump(\n adapters: ServiceAdapters,\n options: VersionBumpOptions\n): Promise<VersionBumpResult> {\n const { fs, logger } = adapters;\n const { specPath, dryRun = false } = options;\n\n logger.info('Applying version bump...', {\n specPath,\n bumpType: options.bumpType,\n });\n\n try {\n // Read current spec\n const content = await fs.readFile(specPath);\n const meta = extractSpecMeta(content);\n\n if (!meta) {\n return {\n success: false,\n specPath,\n specKey: 'unknown',\n previousVersion: 'unknown',\n newVersion: 'unknown',\n bumpType: 'patch',\n changelogEntry: createEmptyChangelogEntry(),\n error: 'Could not extract spec metadata',\n };\n }\n\n // Determine bump type\n const bumpType = options.bumpType ?? 'patch';\n const newVersion = bumpVersion(meta.version, bumpType);\n\n // Create changelog entry\n const changes: ChangeEntry[] = options.changes ?? [];\n if (options.changeDescription) {\n changes.push({\n type: bumpType === 'major' ? 'breaking' : 'changed',\n description: options.changeDescription,\n });\n }\n\n const changelogEntry: ChangelogEntry = {\n version: newVersion,\n date: new Date().toISOString().split('T')[0] ?? '',\n bumpType,\n changes,\n breakingChanges: changes.filter((c) => c.type === 'breaking'),\n };\n\n // Update the spec file\n if (!dryRun) {\n const updatedContent = updateSpecVersion(\n content,\n meta.version,\n newVersion\n );\n await fs.writeFile(specPath, updatedContent);\n }\n\n logger.info('Version bump applied', {\n specPath,\n previousVersion: meta.version,\n newVersion,\n });\n\n return {\n success: true,\n specPath,\n specKey: meta.key,\n previousVersion: meta.version,\n newVersion,\n bumpType,\n changelogEntry,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error('Version bump failed', { specPath, error: errorMessage });\n\n return {\n success: false,\n specPath,\n specKey: 'unknown',\n previousVersion: 'unknown',\n newVersion: 'unknown',\n bumpType: options.bumpType ?? 'patch',\n changelogEntry: createEmptyChangelogEntry(),\n error: errorMessage,\n };\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Changelog Generation\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generate changelogs at all configured tiers.\n */\nexport async function generateChangelogs(\n adapters: ServiceAdapters,\n options: ChangelogGenerateOptions = {}\n): Promise<ChangelogGenerateResult> {\n const { logger } = adapters;\n const tiers = options.tiers ?? ['spec', 'library', 'monorepo'];\n const format = options.format ?? 'keep-a-changelog';\n\n logger.info('Generating changelogs...', { tiers, format });\n\n // First, analyze versions to get changes\n const analysis = await analyzeVersions(adapters, {\n baseline: options.baseline,\n workspaceRoot: options.workspaceRoot,\n });\n\n const specChangelogs: ChangelogDocBlock[] = [];\n const libraryMarkdown = new Map<string, string>();\n let monorepoMarkdown = '';\n let totalEntries = 0;\n\n // Generate per-spec changelogs\n if (tiers.includes('spec')) {\n for (const spec of analysis.analyses.filter((a) => a.needsBump)) {\n const docBlock: ChangelogDocBlock = {\n id: `changelog.${spec.specKey}`,\n title: `Changelog for ${spec.specKey}`,\n body: formatSpecChangelog(spec),\n kind: 'changelog',\n specKey: spec.specKey,\n specVersion: spec.suggestedVersion,\n entries: [\n {\n version: spec.suggestedVersion,\n date: new Date().toISOString().split('T')[0] ?? '',\n bumpType: spec.bumpType,\n changes: spec.changes,\n breakingChanges: spec.changes.filter((c) => c.type === 'breaking'),\n },\n ],\n };\n specChangelogs.push(docBlock);\n totalEntries++;\n }\n }\n\n // Generate library-level changelogs\n if (tiers.includes('library')) {\n const libraryGroups = groupByLibrary(analysis.analyses);\n for (const [libPath, specs] of libraryGroups) {\n const entries = specs.filter((s) => s.needsBump);\n if (entries.length > 0) {\n libraryMarkdown.set(\n libPath,\n formatKeepAChangelog(entries.map(specToChangelogEntry))\n );\n totalEntries += entries.length;\n }\n }\n }\n\n // Generate monorepo-level changelog\n if (tiers.includes('monorepo')) {\n const allEntries = analysis.analyses\n .filter((a) => a.needsBump)\n .map(specToChangelogEntry);\n monorepoMarkdown = formatKeepAChangelog(allEntries);\n }\n\n // Generate JSON export\n const json = formatChangelogJson(analysis, options.baseline);\n\n logger.info('Changelog generation complete', { totalEntries });\n\n return {\n specChangelogs,\n libraryMarkdown,\n monorepoMarkdown,\n json,\n totalEntries,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface SpecMeta {\n key: string;\n version: string;\n}\n\n/**\n * Extract spec metadata from file content.\n */\nfunction extractSpecMeta(content: string): SpecMeta | null {\n // Match meta.key and meta.version patterns\n const keyMatch = content.match(/key:\\s*['\"`]([^'\"`]+)['\"`]/);\n const versionMatch = content.match(/version:\\s*['\"`]([^'\"`]+)['\"`]/);\n\n if (!keyMatch || !versionMatch) {\n return null;\n }\n\n const key = keyMatch[1];\n const version = versionMatch[1];\n\n // Type guard for regex capture groups\n if (!key || !version) {\n return null;\n }\n\n return {\n key,\n version,\n };\n}\n\n/**\n * Analyze changes between current and baseline spec content.\n */\nfunction analyzeSpecChanges(\n current: string,\n baseline: string | null\n): ChangeEntry[] {\n const changes: ChangeEntry[] = [];\n\n if (!baseline) {\n // New spec\n changes.push({\n type: 'added',\n description: 'New spec added',\n });\n return changes;\n }\n\n // Simple diff analysis - check for structural changes\n const currentMeta = extractSpecMeta(current);\n const baselineMeta = extractSpecMeta(baseline);\n\n if (!currentMeta || !baselineMeta) {\n return changes;\n }\n\n // Version change\n if (currentMeta.version !== baselineMeta.version) {\n changes.push({\n type: 'changed',\n description: `Version updated from ${baselineMeta.version} to ${currentMeta.version}`,\n path: 'meta.version',\n });\n }\n\n // Check for io changes (simplified)\n const hasIoChanges = detectIoChanges(current, baseline);\n if (hasIoChanges.breaking) {\n changes.push({\n type: 'breaking',\n description: 'Breaking changes to input/output schema',\n path: 'io',\n });\n } else if (hasIoChanges.nonBreaking) {\n changes.push({\n type: 'changed',\n description: 'Non-breaking changes to input/output schema',\n path: 'io',\n });\n }\n\n return changes;\n}\n\n/**\n * Detect I/O changes between specs (simplified).\n */\nfunction detectIoChanges(\n current: string,\n baseline: string\n): { breaking: boolean; nonBreaking: boolean } {\n // Simple heuristic: check if io section differs\n const ioPattern = /io:\\s*\\{[\\s\\S]*?\\}/;\n const currentIo = current.match(ioPattern)?.[0] ?? '';\n const baselineIo = baseline.match(ioPattern)?.[0] ?? '';\n\n if (currentIo === baselineIo) {\n return { breaking: false, nonBreaking: false };\n }\n\n // Check for removed fields (breaking) vs added fields (non-breaking)\n const currentFields = extractFields(currentIo);\n const baselineFields = extractFields(baselineIo);\n\n const removedFields = baselineFields.filter(\n (f) => !currentFields.includes(f)\n );\n const addedFields = currentFields.filter((f) => !baselineFields.includes(f));\n\n return {\n breaking: removedFields.length > 0,\n nonBreaking: addedFields.length > 0 && removedFields.length === 0,\n };\n}\n\n/**\n * Extract field names from a code block (simplified).\n */\nfunction extractFields(code: string): string[] {\n const fieldPattern = /(\\w+):/g;\n const matches = [...code.matchAll(fieldPattern)];\n return matches.map((m) => m[1]).filter((field): field is string => !!field);\n}\n\n/**\n * Update version in spec content.\n */\nfunction updateSpecVersion(\n content: string,\n oldVersion: string,\n newVersion: string\n): string {\n return content.replace(\n new RegExp(`version:\\\\s*['\"\\`]${oldVersion}['\"\\`]`),\n `version: '${newVersion}'`\n );\n}\n\n/**\n * Create an empty changelog entry.\n */\nfunction createEmptyChangelogEntry(): ChangelogEntry {\n return {\n version: '0.0.0',\n date: new Date().toISOString().split('T')[0] ?? '',\n bumpType: 'patch',\n changes: [],\n };\n}\n\n/**\n * Format a single spec's changelog.\n */\nfunction formatSpecChangelog(spec: SpecVersionAnalysis): string {\n const lines: string[] = [\n `## [${spec.suggestedVersion}] - ${new Date().toISOString().split('T')[0]}`,\n '',\n ];\n\n const breaking = spec.changes.filter((c) => c.type === 'breaking');\n const changed = spec.changes.filter((c) => c.type === 'changed');\n const added = spec.changes.filter((c) => c.type === 'added');\n\n if (breaking.length > 0) {\n lines.push('### Breaking Changes');\n breaking.forEach((c) => lines.push(`- ${c.description}`));\n lines.push('');\n }\n\n if (added.length > 0) {\n lines.push('### Added');\n added.forEach((c) => lines.push(`- ${c.description}`));\n lines.push('');\n }\n\n if (changed.length > 0) {\n lines.push('### Changed');\n changed.forEach((c) => lines.push(`- ${c.description}`));\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Group specs by library (package path).\n */\nfunction groupByLibrary(\n analyses: SpecVersionAnalysis[]\n): Map<string, SpecVersionAnalysis[]> {\n const groups = new Map<string, SpecVersionAnalysis[]>();\n\n for (const analysis of analyses) {\n // Extract library path (up to src/)\n const libMatch = analysis.specPath.match(/(.+?\\/src\\/)/);\n const matchedPath = libMatch?.[1];\n const libPath = matchedPath ?? analysis.specPath;\n\n const existing = groups.get(libPath) ?? [];\n existing.push(analysis);\n groups.set(libPath, existing);\n }\n\n return groups;\n}\n\n/**\n * Convert SpecVersionAnalysis to ChangelogEntry.\n */\nfunction specToChangelogEntry(spec: SpecVersionAnalysis): ChangelogEntry {\n return {\n version: spec.suggestedVersion,\n date: new Date().toISOString().split('T')[0] ?? '',\n bumpType: spec.bumpType,\n changes: spec.changes,\n breakingChanges: spec.changes.filter((c) => c.type === 'breaking'),\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contractspec/bundle.workspace",
|
|
3
|
-
"version": "1.45.
|
|
3
|
+
"version": "1.45.3",
|
|
4
4
|
"description": "Workspace utilities for monorepo development",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"contractspec",
|
|
@@ -34,18 +34,18 @@
|
|
|
34
34
|
"@ai-sdk/anthropic": "3.0.1",
|
|
35
35
|
"@ai-sdk/openai": "3.0.1",
|
|
36
36
|
"ollama-ai-provider": "^1.2.0",
|
|
37
|
-
"@contractspec/module.workspace": "1.45.
|
|
38
|
-
"@contractspec/lib.contracts": "1.45.
|
|
39
|
-
"@contractspec/lib.contracts-transformers": "1.45.
|
|
40
|
-
"@contractspec/lib.ai-providers": "1.45.
|
|
37
|
+
"@contractspec/module.workspace": "1.45.3",
|
|
38
|
+
"@contractspec/lib.contracts": "1.45.3",
|
|
39
|
+
"@contractspec/lib.contracts-transformers": "1.45.3",
|
|
40
|
+
"@contractspec/lib.ai-providers": "1.45.3",
|
|
41
41
|
"ai": "6.0.3",
|
|
42
42
|
"zod": "^4.1.13",
|
|
43
43
|
"glob": "^13.0.0",
|
|
44
44
|
"chokidar": "^5.0.0"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"@contractspec/tool.tsdown": "1.45.
|
|
48
|
-
"@contractspec/tool.typescript": "1.45.
|
|
47
|
+
"@contractspec/tool.tsdown": "1.45.3",
|
|
48
|
+
"@contractspec/tool.typescript": "1.45.3",
|
|
49
49
|
"@types/node": "^22.10.2",
|
|
50
50
|
"tsdown": "^0.18.3",
|
|
51
51
|
"typescript": "^5.9.3"
|