@muverse/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.md +22 -0
  2. package/dist/adapters/gradle/constants.d.ts +13 -0
  3. package/dist/adapters/gradle/constants.d.ts.map +1 -0
  4. package/dist/adapters/gradle/constants.js +12 -0
  5. package/dist/adapters/gradle/gradle-project-information.d.ts +18 -0
  6. package/dist/adapters/gradle/gradle-project-information.d.ts.map +1 -0
  7. package/dist/adapters/gradle/gradle-project-information.js +93 -0
  8. package/dist/adapters/gradle/gradle-properties.d.ts +15 -0
  9. package/dist/adapters/gradle/gradle-properties.d.ts.map +1 -0
  10. package/dist/adapters/gradle/gradle-properties.js +46 -0
  11. package/dist/adapters/gradle/init-project-information.gradle.kts +143 -0
  12. package/dist/adapters/gradle/services/gradle-adapter-identifier.d.ts +21 -0
  13. package/dist/adapters/gradle/services/gradle-adapter-identifier.d.ts.map +1 -0
  14. package/dist/adapters/gradle/services/gradle-adapter-identifier.js +44 -0
  15. package/dist/adapters/gradle/services/gradle-module-detector.d.ts +18 -0
  16. package/dist/adapters/gradle/services/gradle-module-detector.d.ts.map +1 -0
  17. package/dist/adapters/gradle/services/gradle-module-detector.js +26 -0
  18. package/dist/adapters/gradle/services/gradle-module-system-factory.d.ts +23 -0
  19. package/dist/adapters/gradle/services/gradle-module-system-factory.d.ts.map +1 -0
  20. package/dist/adapters/gradle/services/gradle-module-system-factory.js +27 -0
  21. package/dist/adapters/gradle/services/gradle-version-update-strategy.d.ts +21 -0
  22. package/dist/adapters/gradle/services/gradle-version-update-strategy.d.ts.map +1 -0
  23. package/dist/adapters/gradle/services/gradle-version-update-strategy.js +36 -0
  24. package/dist/adapters/project-information.d.ts +58 -0
  25. package/dist/adapters/project-information.d.ts.map +1 -0
  26. package/dist/adapters/project-information.js +1 -0
  27. package/dist/changelog/index.d.ts +27 -0
  28. package/dist/changelog/index.d.ts.map +1 -0
  29. package/dist/changelog/index.js +204 -0
  30. package/dist/config/index.d.ts +122 -0
  31. package/dist/config/index.d.ts.map +1 -0
  32. package/dist/config/index.js +115 -0
  33. package/dist/factories/adapter-identifier-registry.d.ts +12 -0
  34. package/dist/factories/adapter-identifier-registry.d.ts.map +1 -0
  35. package/dist/factories/adapter-identifier-registry.js +24 -0
  36. package/dist/factories/module-system-factory.d.ts +10 -0
  37. package/dist/factories/module-system-factory.d.ts.map +1 -0
  38. package/dist/factories/module-system-factory.js +18 -0
  39. package/dist/git/index.d.ts +253 -0
  40. package/dist/git/index.d.ts.map +1 -0
  41. package/dist/git/index.js +581 -0
  42. package/dist/index.d.ts +23 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +22 -0
  45. package/dist/semver/index.d.ts +85 -0
  46. package/dist/semver/index.d.ts.map +1 -0
  47. package/dist/semver/index.js +176 -0
  48. package/dist/services/adapter-identifier-registry.d.ts +38 -0
  49. package/dist/services/adapter-identifier-registry.d.ts.map +1 -0
  50. package/dist/services/adapter-identifier-registry.js +59 -0
  51. package/dist/services/adapter-identifier.d.ts +31 -0
  52. package/dist/services/adapter-identifier.d.ts.map +1 -0
  53. package/dist/services/adapter-identifier.js +1 -0
  54. package/dist/services/adapter-metadata-provider.d.ts +51 -0
  55. package/dist/services/adapter-metadata-provider.d.ts.map +1 -0
  56. package/dist/services/adapter-metadata-provider.js +66 -0
  57. package/dist/services/changelog-generator.d.ts +13 -0
  58. package/dist/services/changelog-generator.d.ts.map +1 -0
  59. package/dist/services/changelog-generator.js +26 -0
  60. package/dist/services/commit-analyzer.d.ts +44 -0
  61. package/dist/services/commit-analyzer.d.ts.map +1 -0
  62. package/dist/services/commit-analyzer.js +86 -0
  63. package/dist/services/configuration-loader.d.ts +23 -0
  64. package/dist/services/configuration-loader.d.ts.map +1 -0
  65. package/dist/services/configuration-loader.js +79 -0
  66. package/dist/services/configuration-validator.d.ts +16 -0
  67. package/dist/services/configuration-validator.d.ts.map +1 -0
  68. package/dist/services/configuration-validator.js +24 -0
  69. package/dist/services/git-operations.d.ts +16 -0
  70. package/dist/services/git-operations.d.ts.map +1 -0
  71. package/dist/services/git-operations.js +89 -0
  72. package/dist/services/module-detector.d.ts +24 -0
  73. package/dist/services/module-detector.d.ts.map +1 -0
  74. package/dist/services/module-detector.js +1 -0
  75. package/dist/services/module-registry.d.ts +45 -0
  76. package/dist/services/module-registry.d.ts.map +1 -0
  77. package/dist/services/module-registry.js +57 -0
  78. package/dist/services/module-system-factory.d.ts +24 -0
  79. package/dist/services/module-system-factory.d.ts.map +1 -0
  80. package/dist/services/module-system-factory.js +1 -0
  81. package/dist/services/verse-runner.d.ts +45 -0
  82. package/dist/services/verse-runner.d.ts.map +1 -0
  83. package/dist/services/verse-runner.js +182 -0
  84. package/dist/services/version-applier.d.ts +26 -0
  85. package/dist/services/version-applier.d.ts.map +1 -0
  86. package/dist/services/version-applier.js +63 -0
  87. package/dist/services/version-bumper.d.ts +156 -0
  88. package/dist/services/version-bumper.d.ts.map +1 -0
  89. package/dist/services/version-bumper.js +291 -0
  90. package/dist/services/version-manager.d.ts +68 -0
  91. package/dist/services/version-manager.d.ts.map +1 -0
  92. package/dist/services/version-manager.js +94 -0
  93. package/dist/services/version-update-strategy.d.ts +18 -0
  94. package/dist/services/version-update-strategy.d.ts.map +1 -0
  95. package/dist/services/version-update-strategy.js +1 -0
  96. package/dist/utils/banner.d.ts +2 -0
  97. package/dist/utils/banner.d.ts.map +1 -0
  98. package/dist/utils/banner.js +8 -0
  99. package/dist/utils/commits.d.ts +12 -0
  100. package/dist/utils/commits.d.ts.map +1 -0
  101. package/dist/utils/commits.js +24 -0
  102. package/dist/utils/file.d.ts +7 -0
  103. package/dist/utils/file.d.ts.map +1 -0
  104. package/dist/utils/file.js +19 -0
  105. package/dist/utils/index.d.ts +6 -0
  106. package/dist/utils/index.d.ts.map +1 -0
  107. package/dist/utils/index.js +5 -0
  108. package/dist/utils/logger.d.ts +14 -0
  109. package/dist/utils/logger.d.ts.map +1 -0
  110. package/dist/utils/logger.js +22 -0
  111. package/dist/utils/properties.d.ts +16 -0
  112. package/dist/utils/properties.d.ts.map +1 -0
  113. package/dist/utils/properties.js +62 -0
  114. package/dist/utils/versioning.d.ts +8 -0
  115. package/dist/utils/versioning.d.ts.map +1 -0
  116. package/dist/utils/versioning.js +17 -0
  117. package/package.json +70 -0
@@ -0,0 +1,253 @@
1
+ /**
2
+ * Git operations module for μVERSE version management.
3
+ * Provides interfaces for commit analysis, tagging, and conventional commit parsing.
4
+ * Supports monorepo and multi-module projects with module-specific tag management.
5
+ */
6
+ /**
7
+ * Represents a parsed git tag with extracted module and version metadata.
8
+ * Supports module tags (moduleName@version) and general tags (v{version}).
9
+ */
10
+ export type GitTag = {
11
+ /** The full tag name as it appears in git (e.g., 'core@1.0.0', 'v2.0.0') */
12
+ readonly name: string;
13
+ /** The full SHA-1 commit hash that this tag points to */
14
+ readonly hash: string;
15
+ /**
16
+ * The module name extracted from the tag (e.g., 'core' from 'core@1.0.0').
17
+ * Undefined for general tags or unparseable tag names.
18
+ */
19
+ readonly module?: string;
20
+ /**
21
+ * The semantic version extracted from the tag (e.g., '1.0.0' from 'core@1.0.0' or 'v1.0.0').
22
+ * Undefined for unparseable tag names.
23
+ */
24
+ readonly version?: string;
25
+ };
26
+ /**
27
+ * Configuration options for executing git operations.
28
+ * @property cwd - Working directory for git commands (defaults to process.cwd())
29
+ */
30
+ export type GitOptions = {
31
+ /**
32
+ * The working directory in which to execute git commands.
33
+ * Must be inside a git repository or a subdirectory of one.
34
+ * Defaults to `process.cwd()` if not specified.
35
+ */
36
+ readonly cwd?: string;
37
+ };
38
+ /**
39
+ * Represents a parsed git commit following the Conventional Commits specification.
40
+ * Extracts type, scope, breaking changes, and descriptive content for version bumping.
41
+ */
42
+ export type CommitInfo = {
43
+ /** The full SHA-1 commit hash (40 hexadecimal characters) */
44
+ readonly hash: string;
45
+ /**
46
+ * The commit type indicating the nature of the change.
47
+ * Common values: 'feat', 'fix', 'docs', 'chore', 'refactor', 'test', 'unknown'.
48
+ * Used to determine version bump strategy.
49
+ */
50
+ readonly type: string;
51
+ /**
52
+ * Optional scope providing additional context about what was changed.
53
+ * Examples: 'api', 'core', 'ui', 'auth'.
54
+ * Not used for version bumping but useful for changelog organization.
55
+ */
56
+ readonly scope?: string;
57
+ /**
58
+ * The commit subject line without type and scope prefix.
59
+ * Should be a concise description of the change.
60
+ */
61
+ readonly subject: string;
62
+ /**
63
+ * The full commit body text, if present.
64
+ * May contain detailed explanations, breaking change descriptions, and footer metadata.
65
+ */
66
+ readonly body?: string;
67
+ /**
68
+ * Whether this commit introduces breaking changes.
69
+ * Detected from 'BREAKING CHANGE:' footer or '!' suffix in commit message.
70
+ * When true, always triggers a major version bump.
71
+ */
72
+ readonly breaking: boolean;
73
+ /**
74
+ * Optional module name if the commit is specific to a module in a monorepo.
75
+ * Not currently extracted by the parser but reserved for future use.
76
+ */
77
+ readonly module?: string;
78
+ };
79
+ /**
80
+ * Retrieves all commits for a module since its last release tag.
81
+ * Handles monorepo and single-repo scenarios with path filtering.
82
+ * @param modulePath - Relative path to module from repository root (use '.' for root)
83
+ * @param moduleName - Module name used for tag searching
84
+ * @param moduleType - 'root' for general tags, 'module' for module-specific tags
85
+ * @param options - Git operation options
86
+ * @param excludePaths - Paths to exclude using git pathspec syntax
87
+ * @returns Promise resolving to array of parsed commits (oldest to newest)
88
+ */
89
+ export declare function getCommitsSinceLastTag(modulePath: string, moduleName: string, moduleType: "root" | "module", options?: GitOptions, excludePaths?: string[]): Promise<CommitInfo[]>;
90
+ /**
91
+ * Retrieves commits within a specific git revision range with path filtering.
92
+ * Uses git's native pathspec syntax for efficient filtering in monorepos.
93
+ * @param range - Git revision range (e.g., 'tag1..tag2', 'tag..HEAD', or '' for all)
94
+ * @param pathFilter - Optional path to filter commits (use '.' for root)
95
+ * @param options - Git operation options
96
+ * @param excludePaths - Paths to exclude using ':(exclude)path' syntax
97
+ * @returns Promise resolving to array of parsed commits (oldest to newest)
98
+ */
99
+ export declare function getCommitsInRange(range: string, pathFilter?: string, options?: GitOptions, excludePaths?: string[]): Promise<CommitInfo[]>;
100
+ /**
101
+ * Finds the most recent git tag for a specific module with fallback to general tags.
102
+ * Searches module-specific tags first (moduleName@*), then falls back to general tags.
103
+ * @param moduleName - Module name for tag pattern construction
104
+ * @param moduleType - 'root' skips module tags, 'module' tries module tags first
105
+ * @param options - Git operation options
106
+ * @returns Most recent tag name or null if no tags exist
107
+ */
108
+ export declare function getLastTagForModule(moduleName: string, moduleType: "root" | "module", options?: GitOptions): Promise<string | null>;
109
+ /**
110
+ * Retrieves all git tags in the repository with parsed metadata.
111
+ * Returns array with tag name, commit hash, and parsed module/version information.
112
+ * @param options - Git operation options
113
+ * @returns Promise resolving to array of GitTag objects (empty array if no tags exist)
114
+ */
115
+ export declare function getAllTags(options?: GitOptions): Promise<GitTag[]>;
116
+ /**
117
+ * Creates an annotated git tag at the current HEAD commit.
118
+ * Annotated tags include tagger metadata, date, message, and can be GPG signed.
119
+ * @param tagName - The tag name (e.g., 'core@1.0.0' or 'v1.0.0'). Must not already exist
120
+ * @param message - The annotation message for the tag
121
+ * @param options - Git operation options
122
+ * @returns Promise that resolves when the tag is successfully created
123
+ * @throws {Error} If tag creation fails (tag exists, invalid name, etc.)
124
+ */
125
+ export declare function createTag(tagName: string, message: string, options?: GitOptions): Promise<void>;
126
+ /**
127
+ * Pushes all local tags to the configured remote repository.
128
+ * Only pushes tags that don't exist on remote. Does NOT push commits.
129
+ * @param options - Git operation options
130
+ * @returns Promise that resolves when all tags are successfully pushed
131
+ * @throws {Error} If push fails (no remote, authentication, network, conflicts, etc.)
132
+ */
133
+ export declare function pushTags(options?: GitOptions): Promise<void>;
134
+ /**
135
+ * Checks if the git working directory is clean (no uncommitted changes).
136
+ * Uses `git status --porcelain` to detect modified, staged, deleted, or untracked files.
137
+ * @param options - Git operation options
138
+ * @returns Promise resolving to true if clean, false if there are changes or on error
139
+ */
140
+ export declare function isWorkingDirectoryClean(options?: GitOptions): Promise<boolean>;
141
+ /**
142
+ * Retrieves the name of the currently checked out git branch.
143
+ *
144
+ * This function returns the active branch name, which is useful for:
145
+ * - Conditional logic based on branch (e.g., only release from 'main')
146
+ * - CI/CD branch-specific workflows
147
+ * - Logging and debugging
148
+ * - Branch validation before operations
149
+ *
150
+ * Returns empty string if in detached HEAD state.
151
+ * @param options - Git operation options
152
+ * @returns Promise resolving to the current branch name (empty string if detached HEAD)
153
+ * @throws {Error} If git command fails
154
+ */
155
+ export declare function getCurrentBranch(options?: GitOptions): Promise<string>;
156
+ /**
157
+ * Retrieves the abbreviated (short) SHA-1 hash of the current HEAD commit.
158
+ *
159
+ * This function returns a shortened version of the commit hash (typically 7 characters),
160
+ * which is:
161
+ * - Human-readable and easier to reference
162
+ * - Suitable for build metadata in semantic versions
163
+ * - Commonly used in CI/CD for build identification
164
+ * - Still unique enough for most repositories
165
+ *
166
+ * The short SHA is git's default abbreviated format and balances uniqueness with brevity.
167
+ *
168
+ * @param options - Git operation options, primarily for specifying working directory.
169
+ *
170
+ * @returns Promise resolving to the abbreviated commit SHA.
171
+ * Typically 7 characters (e.g., 'abc1234').
172
+ * Length may vary based on repository size to ensure uniqueness.
173
+ *
174
+ * @throws {Error} If git command fails:
175
+ * - Not in a git repository
176
+ * - No commits exist (empty repository)
177
+ * - Permissions issues
178
+ */
179
+ export declare function getCurrentCommitShortSha(options?: GitOptions): Promise<string>;
180
+ /**
181
+ * Stages all changed files in the working directory for the next commit.
182
+ *
183
+ * This function executes `git add .` which stages:
184
+ * - All modified tracked files
185
+ * - All new untracked files
186
+ * - All deleted files
187
+ *
188
+ * **Warning**: This stages **everything** in the working directory. Use with caution
189
+ * in interactive environments. For selective staging, use git commands directly.
190
+ *
191
+ * @param options - Git operation options, primarily for specifying working directory.
192
+ *
193
+ * @returns Promise that resolves when all files are successfully staged.
194
+ *
195
+ * @throws {Error} If git add command fails:
196
+ * - Not in a git repository
197
+ * - Permissions issues
198
+ * - Invalid .gitignore patterns
199
+ */
200
+ export declare function addChangedFiles(options?: GitOptions): Promise<void>;
201
+ /**
202
+ * Creates a git commit with the specified message using currently staged changes.
203
+ * Files must be staged first (via `git add`). Follows Conventional Commits format.
204
+ * @param message - The commit message (e.g., 'feat: description', 'fix: description')
205
+ * @param options - Git operation options
206
+ * @returns Promise that resolves when commit is created
207
+ * @throws {Error} If commit fails (no staged changes, no git user, empty message, etc.)
208
+ */
209
+ export declare function commitChanges(message: string, options?: GitOptions): Promise<void>;
210
+ /**
211
+ * Pushes local commits to the remote repository.
212
+ *
213
+ * This function uploads all commits from the current branch that don't exist
214
+ * on the remote. It uses `git push` without arguments, which:
215
+ * - Pushes the current branch to its configured upstream
216
+ * - Only pushes commits (use `pushTags()` for tags)
217
+ * - Requires network access and authentication
218
+ *
219
+ * @param options - Git operation options, primarily for specifying working directory.
220
+ *
221
+ * @returns Promise that resolves when commits are successfully pushed.
222
+ *
223
+ * @throws {Error} If push fails:
224
+ * - No remote configured
225
+ * - No upstream branch set
226
+ * - Authentication failure
227
+ * - Network issues
228
+ * - Remote rejects (e.g., force push needed, protected branch)
229
+ */
230
+ export declare function pushCommits(options?: GitOptions): Promise<void>;
231
+ /**
232
+ * Checks if there are any changes in the working directory or staging area.
233
+ *
234
+ * This function is similar to `isWorkingDirectoryClean()` but returns the opposite
235
+ * boolean value. It's useful when you want to check if there's work to commit.
236
+ *
237
+ * Uses `git status --porcelain` to detect:
238
+ * - Modified tracked files
239
+ * - New untracked files
240
+ * - Deleted files
241
+ * - Staged changes
242
+ *
243
+ * @param options - Git operation options, primarily for specifying working directory.
244
+ *
245
+ * @returns Promise resolving to:
246
+ * - `true`: There are changes (modified, staged, untracked files)
247
+ * - `false`: Working directory is clean OR git command failed
248
+ *
249
+ * @throws {Error} If git status command fails.
250
+ * Unlike `isWorkingDirectoryClean()`, this function throws on errors.
251
+ */
252
+ export declare function hasChangesToCommit(options?: GitOptions): Promise<boolean>;
253
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/git/index.ts"],"names":[],"mappings":"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"}