vibe-coding-mcp 2.7.0 → 2.12.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.
- package/README.md +105 -4
- package/dist/__tests__/git.test.d.ts +2 -0
- package/dist/__tests__/git.test.d.ts.map +1 -0
- package/dist/__tests__/git.test.js +282 -0
- package/dist/__tests__/git.test.js.map +1 -0
- package/dist/core/schemas.d.ts +345 -0
- package/dist/core/schemas.d.ts.map +1 -1
- package/dist/core/schemas.js +128 -0
- package/dist/core/schemas.js.map +1 -1
- package/dist/stdio.js +32 -2
- package/dist/stdio.js.map +1 -1
- package/dist/tools/autoTag.d.ts +145 -0
- package/dist/tools/autoTag.d.ts.map +1 -0
- package/dist/tools/autoTag.js +475 -0
- package/dist/tools/autoTag.js.map +1 -0
- package/dist/tools/batch.d.ts +119 -0
- package/dist/tools/batch.d.ts.map +1 -0
- package/dist/tools/batch.js +459 -0
- package/dist/tools/batch.js.map +1 -0
- package/dist/tools/git.d.ts +226 -0
- package/dist/tools/git.d.ts.map +1 -0
- package/dist/tools/git.js +493 -0
- package/dist/tools/git.js.map +1 -0
- package/dist/tools/sessionStats.d.ts +129 -0
- package/dist/tools/sessionStats.d.ts.map +1 -0
- package/dist/tools/sessionStats.js +554 -0
- package/dist/tools/sessionStats.js.map +1 -0
- package/dist/tools/template.d.ts +127 -0
- package/dist/tools/template.d.ts.map +1 -0
- package/dist/tools/template.js +617 -0
- package/dist/tools/template.js.map +1 -0
- package/dist/utils/gitExecutor.d.ts +34 -0
- package/dist/utils/gitExecutor.d.ts.map +1 -0
- package/dist/utils/gitExecutor.js +95 -0
- package/dist/utils/gitExecutor.js.map +1 -0
- package/dist/utils/gitParsers.d.ts +90 -0
- package/dist/utils/gitParsers.d.ts.map +1 -0
- package/dist/utils/gitParsers.js +286 -0
- package/dist/utils/gitParsers.js.map +1 -0
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ MCP server that automatically collects, summarizes, documents, and publishes cod
|
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
|
-
This MCP server provides
|
|
7
|
+
This MCP server provides 15 tools for managing vibe coding documentation:
|
|
8
8
|
|
|
9
9
|
| Tool | Description |
|
|
10
10
|
|------|-------------|
|
|
@@ -18,6 +18,11 @@ This MCP server provides 10 tools for managing vibe coding documentation:
|
|
|
18
18
|
| `muse_session_history` | Manages session history - save, retrieve, search past sessions |
|
|
19
19
|
| `muse_export_session` | Exports sessions to Markdown, JSON, or HTML formats |
|
|
20
20
|
| `muse_project_profile` | Manages project-specific settings and configurations |
|
|
21
|
+
| `muse_git` | Git integration - status, log, diff, branch, snapshot, design decision extraction |
|
|
22
|
+
| `muse_session_stats` | Session analytics dashboard with productivity insights and trends |
|
|
23
|
+
| `muse_auto_tag` | AI-powered auto-tagging for sessions based on content analysis |
|
|
24
|
+
| `muse_template` | Custom template management for documents and reports |
|
|
25
|
+
| `muse_batch` | Batch operations to execute multiple tools in sequence or parallel |
|
|
21
26
|
|
|
22
27
|
### Additional Features (v2.0)
|
|
23
28
|
- **AST Parsing**: TypeScript, Python, Go code analysis
|
|
@@ -43,7 +48,7 @@ This MCP server provides 10 tools for managing vibe coding documentation:
|
|
|
43
48
|
- **Configuration Validation**: Startup validation for all platform configurations
|
|
44
49
|
- **Platform Expansion**: Full support for 6 platforms (Notion, GitHub Wiki, Obsidian, Confluence, Slack, Discord)
|
|
45
50
|
- **AST Memoization**: Cached code analysis for improved performance
|
|
46
|
-
- **Test Coverage**:
|
|
51
|
+
- **Test Coverage**: 149 tests with 85%+ coverage on core modules
|
|
47
52
|
|
|
48
53
|
### AI-Powered Analysis (v2.4)
|
|
49
54
|
- **Claude AI Integration**: Use Claude AI for enhanced design decision analysis
|
|
@@ -72,6 +77,45 @@ This MCP server provides 10 tools for managing vibe coding documentation:
|
|
|
72
77
|
- **Documentation Config**: Default document types, language, author info
|
|
73
78
|
- **Team Management**: Store team member information per project
|
|
74
79
|
|
|
80
|
+
### Git Integration (v2.8)
|
|
81
|
+
- **Repository Status**: View staged, unstaged, and untracked files
|
|
82
|
+
- **Commit History**: Browse commit log with filtering by author, date, grep
|
|
83
|
+
- **Diff Analysis**: View changes with statistics (staged, unstaged, between refs)
|
|
84
|
+
- **Branch Info**: List local and remote branches with tracking info
|
|
85
|
+
- **Git Snapshot**: Capture complete repository state for session context
|
|
86
|
+
- **Design Decision Extraction**: Auto-extract design decisions from commit messages
|
|
87
|
+
- **Session Linking**: Attach Git context to coding sessions
|
|
88
|
+
|
|
89
|
+
### Session Statistics Dashboard (v2.9)
|
|
90
|
+
- **Overview Analytics**: Total sessions, code contexts, design decisions at a glance
|
|
91
|
+
- **Language Distribution**: Breakdown of programming languages used across sessions
|
|
92
|
+
- **Timeline View**: Session activity over time (daily, weekly, monthly)
|
|
93
|
+
- **Tag Analytics**: Most used tags and tag co-occurrence analysis
|
|
94
|
+
- **Productivity Insights**: Session duration, code output, and efficiency metrics
|
|
95
|
+
- **Trend Analysis**: Compare current period with previous or average
|
|
96
|
+
|
|
97
|
+
### AI Auto-tagging (v2.10)
|
|
98
|
+
- **Smart Tag Suggestions**: Pattern-based and AI-powered tag recommendations
|
|
99
|
+
- **Confidence Scoring**: Each tag suggestion includes confidence level
|
|
100
|
+
- **Custom Tag Training**: Train the system with custom tag patterns
|
|
101
|
+
- **Configurable Rules**: Define tag rules for file extensions, keywords, patterns
|
|
102
|
+
- **Batch Tagging**: Apply tags to multiple sessions at once
|
|
103
|
+
|
|
104
|
+
### Custom Templates (v2.11)
|
|
105
|
+
- **Template Management**: Create, edit, delete custom document templates
|
|
106
|
+
- **Variable Substitution**: Support for `{{variable}}`, `${variable}`, `{variable}` formats
|
|
107
|
+
- **Built-in Templates**: README, Session Summary, Weekly Report templates included
|
|
108
|
+
- **Template Preview**: Preview rendered output before applying
|
|
109
|
+
- **Import/Export**: Share templates between projects
|
|
110
|
+
|
|
111
|
+
### Batch Operations (v2.12)
|
|
112
|
+
- **Sequential Execution**: Run multiple tools in order with dependency management
|
|
113
|
+
- **Parallel Execution**: Execute independent operations concurrently
|
|
114
|
+
- **Dependency Graph**: Topological sort for operation ordering
|
|
115
|
+
- **Job Tracking**: Monitor batch job status, cancel running jobs
|
|
116
|
+
- **Error Handling**: Stop on error or continue with remaining operations
|
|
117
|
+
- **Result Chaining**: Pass output from one operation to next using `$ref` syntax
|
|
118
|
+
|
|
75
119
|
## Installation
|
|
76
120
|
|
|
77
121
|
### Claude Code (Recommended)
|
|
@@ -157,6 +201,58 @@ User: Create a session log for today's work.
|
|
|
157
201
|
Claude: [Uses collect_code_context → create_session_log]
|
|
158
202
|
```
|
|
159
203
|
|
|
204
|
+
### 4. Git-Aware Session Documentation
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
User: Capture my current Git state and create a session with design decisions from commits.
|
|
208
|
+
|
|
209
|
+
Claude: [Uses muse_git(action='snapshot') → muse_git(action='extractDecisions') → muse_session_history(action='save')]
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### 5. Complete Session Export with Git Context
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
User: Export all my sessions from this week with Git information.
|
|
216
|
+
|
|
217
|
+
Claude: [Uses muse_git(action='linkToSession') → muse_export_session(format='markdown')]
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### 6. Session Analytics Dashboard
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
User: Show me my coding productivity statistics for this month.
|
|
224
|
+
|
|
225
|
+
Claude: [Uses muse_session_stats(action='overview') → muse_session_stats(action='productivity') → muse_session_stats(action='trends')]
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### 7. Auto-tag and Organize Sessions
|
|
229
|
+
|
|
230
|
+
```
|
|
231
|
+
User: Analyze my sessions and suggest relevant tags.
|
|
232
|
+
|
|
233
|
+
Claude: [Uses muse_auto_tag(action='suggest') → muse_auto_tag(action='apply')]
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### 8. Generate Custom Report with Template
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
User: Create a weekly report using the team report template.
|
|
240
|
+
|
|
241
|
+
Claude: [Uses muse_template(action='apply', templateId='weekly-report') → muse_publish_document]
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### 9. Batch Documentation Workflow
|
|
245
|
+
|
|
246
|
+
```
|
|
247
|
+
User: Analyze this code, generate docs, and publish to Notion in one go.
|
|
248
|
+
|
|
249
|
+
Claude: [Uses muse_batch(action='execute', operations=[
|
|
250
|
+
{tool: 'muse_analyze_code', params: {...}},
|
|
251
|
+
{tool: 'muse_generate_dev_document', params: {...}, dependsOn: ['op_0']},
|
|
252
|
+
{tool: 'muse_publish_document', params: {...}, dependsOn: ['op_1']}
|
|
253
|
+
])]
|
|
254
|
+
```
|
|
255
|
+
|
|
160
256
|
## Supported Platforms
|
|
161
257
|
|
|
162
258
|
- **Notion**: Full API integration with page creation
|
|
@@ -179,10 +275,15 @@ src/
|
|
|
179
275
|
│ ├── security.ts # Path traversal, SSRF, timeout utilities
|
|
180
276
|
│ ├── logger.ts # Structured JSON logging
|
|
181
277
|
│ └── config.ts # Platform configuration validation
|
|
182
|
-
├── tools/ #
|
|
278
|
+
├── tools/ # 15 MCP tools
|
|
183
279
|
├── platforms/ # Notion, GitHub Wiki, Obsidian, Confluence, Slack, Discord
|
|
184
280
|
├── types/ # TypeScript interfaces
|
|
185
|
-
└── utils/
|
|
281
|
+
└── utils/
|
|
282
|
+
├── markdown.ts # Markdown processing
|
|
283
|
+
├── astParser.ts # AST parsing for TypeScript, Python, Go
|
|
284
|
+
├── diagramGenerator.ts # Mermaid diagram generation
|
|
285
|
+
├── gitExecutor.ts # Safe Git command execution
|
|
286
|
+
└── gitParsers.ts # Git output parsing utilities
|
|
186
287
|
```
|
|
187
288
|
|
|
188
289
|
## Development
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/git.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { gitTool } from '../tools/git.js';
|
|
2
|
+
import { parseStatusPorcelainV2, parseLogOutput, parseDiffStat, } from '../utils/gitParsers.js';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as os from 'os';
|
|
5
|
+
// Test with the actual vibe-coding-mcp repo
|
|
6
|
+
const TEST_REPO_PATH = path.resolve(process.cwd());
|
|
7
|
+
describe('gitTool', () => {
|
|
8
|
+
describe('status action', () => {
|
|
9
|
+
it('should return repository status', async () => {
|
|
10
|
+
const result = await gitTool({
|
|
11
|
+
action: 'status',
|
|
12
|
+
repoPath: TEST_REPO_PATH,
|
|
13
|
+
});
|
|
14
|
+
expect(result.success).toBe(true);
|
|
15
|
+
expect(result.action).toBe('status');
|
|
16
|
+
expect(result.status).toBeDefined();
|
|
17
|
+
expect(result.status?.branch).toBeDefined();
|
|
18
|
+
expect(typeof result.status?.isClean).toBe('boolean');
|
|
19
|
+
expect(Array.isArray(result.status?.staged)).toBe(true);
|
|
20
|
+
expect(Array.isArray(result.status?.unstaged)).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
it('should include untracked files by default', async () => {
|
|
23
|
+
const result = await gitTool({
|
|
24
|
+
action: 'status',
|
|
25
|
+
repoPath: TEST_REPO_PATH,
|
|
26
|
+
includeUntracked: true,
|
|
27
|
+
});
|
|
28
|
+
expect(result.success).toBe(true);
|
|
29
|
+
expect(Array.isArray(result.status?.untracked)).toBe(true);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe('log action', () => {
|
|
33
|
+
it('should return commit history', async () => {
|
|
34
|
+
const result = await gitTool({
|
|
35
|
+
action: 'log',
|
|
36
|
+
repoPath: TEST_REPO_PATH,
|
|
37
|
+
limit: 5,
|
|
38
|
+
});
|
|
39
|
+
expect(result.success).toBe(true);
|
|
40
|
+
expect(result.action).toBe('log');
|
|
41
|
+
expect(result.commits).toBeDefined();
|
|
42
|
+
expect(Array.isArray(result.commits)).toBe(true);
|
|
43
|
+
expect(result.commits.length).toBeLessThanOrEqual(5);
|
|
44
|
+
if (result.commits.length > 0) {
|
|
45
|
+
const commit = result.commits[0];
|
|
46
|
+
expect(commit.hash).toBeDefined();
|
|
47
|
+
expect(commit.shortHash).toBeDefined();
|
|
48
|
+
expect(commit.author).toBeDefined();
|
|
49
|
+
expect(commit.date).toBeDefined();
|
|
50
|
+
expect(commit.message).toBeDefined();
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
it('should support oneline format', async () => {
|
|
54
|
+
const result = await gitTool({
|
|
55
|
+
action: 'log',
|
|
56
|
+
repoPath: TEST_REPO_PATH,
|
|
57
|
+
limit: 3,
|
|
58
|
+
oneline: true,
|
|
59
|
+
});
|
|
60
|
+
expect(result.success).toBe(true);
|
|
61
|
+
expect(result.commits).toBeDefined();
|
|
62
|
+
});
|
|
63
|
+
it('should filter by grep', async () => {
|
|
64
|
+
const result = await gitTool({
|
|
65
|
+
action: 'log',
|
|
66
|
+
repoPath: TEST_REPO_PATH,
|
|
67
|
+
limit: 10,
|
|
68
|
+
grep: 'feat',
|
|
69
|
+
});
|
|
70
|
+
expect(result.success).toBe(true);
|
|
71
|
+
// All returned commits should contain 'feat' in message
|
|
72
|
+
if (result.commits && result.commits.length > 0) {
|
|
73
|
+
result.commits.forEach((commit) => {
|
|
74
|
+
expect(commit.message.toLowerCase()).toContain('feat');
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe('diff action', () => {
|
|
80
|
+
it('should return diff information', async () => {
|
|
81
|
+
const result = await gitTool({
|
|
82
|
+
action: 'diff',
|
|
83
|
+
repoPath: TEST_REPO_PATH,
|
|
84
|
+
diffType: 'all',
|
|
85
|
+
stat: true,
|
|
86
|
+
});
|
|
87
|
+
expect(result.success).toBe(true);
|
|
88
|
+
expect(result.action).toBe('diff');
|
|
89
|
+
expect(result.diff).toBeDefined();
|
|
90
|
+
expect(typeof result.diff?.totalAdditions).toBe('number');
|
|
91
|
+
expect(typeof result.diff?.totalDeletions).toBe('number');
|
|
92
|
+
expect(Array.isArray(result.diff?.files)).toBe(true);
|
|
93
|
+
});
|
|
94
|
+
it('should support staged diff', async () => {
|
|
95
|
+
const result = await gitTool({
|
|
96
|
+
action: 'diff',
|
|
97
|
+
repoPath: TEST_REPO_PATH,
|
|
98
|
+
diffType: 'staged',
|
|
99
|
+
});
|
|
100
|
+
expect(result.success).toBe(true);
|
|
101
|
+
expect(result.diff).toBeDefined();
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe('branch action', () => {
|
|
105
|
+
it('should return branch information', async () => {
|
|
106
|
+
const result = await gitTool({
|
|
107
|
+
action: 'branch',
|
|
108
|
+
repoPath: TEST_REPO_PATH,
|
|
109
|
+
includeRemote: true,
|
|
110
|
+
});
|
|
111
|
+
expect(result.success).toBe(true);
|
|
112
|
+
expect(result.action).toBe('branch');
|
|
113
|
+
expect(result.branch).toBeDefined();
|
|
114
|
+
expect(result.branch?.current).toBeDefined();
|
|
115
|
+
expect(Array.isArray(result.branch?.local)).toBe(true);
|
|
116
|
+
});
|
|
117
|
+
it('should include remote branches', async () => {
|
|
118
|
+
const result = await gitTool({
|
|
119
|
+
action: 'branch',
|
|
120
|
+
repoPath: TEST_REPO_PATH,
|
|
121
|
+
includeRemote: true,
|
|
122
|
+
});
|
|
123
|
+
expect(result.success).toBe(true);
|
|
124
|
+
expect(Array.isArray(result.branch?.remote)).toBe(true);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe('snapshot action', () => {
|
|
128
|
+
it('should capture complete git snapshot', async () => {
|
|
129
|
+
const result = await gitTool({
|
|
130
|
+
action: 'snapshot',
|
|
131
|
+
repoPath: TEST_REPO_PATH,
|
|
132
|
+
includeDiff: true,
|
|
133
|
+
includeLog: true,
|
|
134
|
+
logLimit: 5,
|
|
135
|
+
});
|
|
136
|
+
expect(result.success).toBe(true);
|
|
137
|
+
expect(result.action).toBe('snapshot');
|
|
138
|
+
expect(result.snapshot).toBeDefined();
|
|
139
|
+
expect(result.snapshot?.timestamp).toBeDefined();
|
|
140
|
+
expect(result.snapshot?.repository).toBeDefined();
|
|
141
|
+
expect(result.snapshot?.status).toBeDefined();
|
|
142
|
+
expect(result.snapshot?.branch).toBeDefined();
|
|
143
|
+
expect(Array.isArray(result.snapshot?.recentCommits)).toBe(true);
|
|
144
|
+
});
|
|
145
|
+
it('should include stash when requested', async () => {
|
|
146
|
+
const result = await gitTool({
|
|
147
|
+
action: 'snapshot',
|
|
148
|
+
repoPath: TEST_REPO_PATH,
|
|
149
|
+
includeStash: true,
|
|
150
|
+
});
|
|
151
|
+
expect(result.success).toBe(true);
|
|
152
|
+
// Stashes may or may not exist
|
|
153
|
+
if (result.snapshot?.stashes) {
|
|
154
|
+
expect(Array.isArray(result.snapshot.stashes)).toBe(true);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe('extractDecisions action', () => {
|
|
159
|
+
it('should extract design decisions from commits', async () => {
|
|
160
|
+
const result = await gitTool({
|
|
161
|
+
action: 'extractDecisions',
|
|
162
|
+
repoPath: TEST_REPO_PATH,
|
|
163
|
+
limit: 50,
|
|
164
|
+
});
|
|
165
|
+
expect(result.success).toBe(true);
|
|
166
|
+
expect(result.action).toBe('extractDecisions');
|
|
167
|
+
expect(result.decisions).toBeDefined();
|
|
168
|
+
expect(Array.isArray(result.decisions)).toBe(true);
|
|
169
|
+
if (result.decisions && result.decisions.length > 0) {
|
|
170
|
+
const decision = result.decisions[0];
|
|
171
|
+
expect(decision.commitHash).toBeDefined();
|
|
172
|
+
expect(decision.title).toBeDefined();
|
|
173
|
+
expect(decision.category).toBeDefined();
|
|
174
|
+
expect(['high', 'medium', 'low']).toContain(decision.importance);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
it('should filter by since date', async () => {
|
|
178
|
+
const result = await gitTool({
|
|
179
|
+
action: 'extractDecisions',
|
|
180
|
+
repoPath: TEST_REPO_PATH,
|
|
181
|
+
since: '1 month ago',
|
|
182
|
+
limit: 20,
|
|
183
|
+
});
|
|
184
|
+
expect(result.success).toBe(true);
|
|
185
|
+
expect(result.decisions).toBeDefined();
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
describe('error handling', () => {
|
|
189
|
+
it('should handle non-git directory gracefully', async () => {
|
|
190
|
+
const nonGitPath = os.tmpdir();
|
|
191
|
+
const result = await gitTool({
|
|
192
|
+
action: 'status',
|
|
193
|
+
repoPath: nonGitPath,
|
|
194
|
+
});
|
|
195
|
+
expect(result.success).toBe(false);
|
|
196
|
+
expect(result.error).toContain('Not a git repository');
|
|
197
|
+
});
|
|
198
|
+
it('should handle non-existent path', async () => {
|
|
199
|
+
const result = await gitTool({
|
|
200
|
+
action: 'status',
|
|
201
|
+
repoPath: '/non/existent/path',
|
|
202
|
+
});
|
|
203
|
+
expect(result.success).toBe(false);
|
|
204
|
+
expect(result.error).toBeDefined();
|
|
205
|
+
});
|
|
206
|
+
it('should require sessionId for linkToSession', async () => {
|
|
207
|
+
const result = await gitTool({
|
|
208
|
+
action: 'linkToSession',
|
|
209
|
+
repoPath: TEST_REPO_PATH,
|
|
210
|
+
});
|
|
211
|
+
expect(result.success).toBe(false);
|
|
212
|
+
expect(result.error).toContain('sessionId is required');
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
describe('gitParsers', () => {
|
|
217
|
+
describe('parseStatusPorcelainV2', () => {
|
|
218
|
+
it('should parse branch info', () => {
|
|
219
|
+
const output = `# branch.oid abc123
|
|
220
|
+
# branch.head main
|
|
221
|
+
# branch.upstream origin/main
|
|
222
|
+
# branch.ab +1 -0`;
|
|
223
|
+
const result = parseStatusPorcelainV2(output);
|
|
224
|
+
expect(result.branch).toBe('main');
|
|
225
|
+
expect(result.upstream).toBe('origin/main');
|
|
226
|
+
expect(result.ahead).toBe(1);
|
|
227
|
+
expect(result.behind).toBe(0);
|
|
228
|
+
});
|
|
229
|
+
it('should parse untracked files', () => {
|
|
230
|
+
const output = `# branch.head main
|
|
231
|
+
? new-file.ts
|
|
232
|
+
? another-file.js`;
|
|
233
|
+
const result = parseStatusPorcelainV2(output);
|
|
234
|
+
expect(result.untracked.length).toBe(2);
|
|
235
|
+
expect(result.untracked[0].path).toBe('new-file.ts');
|
|
236
|
+
expect(result.untracked[0].status).toBe('untracked');
|
|
237
|
+
});
|
|
238
|
+
it('should parse modified files', () => {
|
|
239
|
+
const output = `# branch.head main
|
|
240
|
+
1 .M N... 100644 100644 100644 abc123 def456 src/index.ts`;
|
|
241
|
+
const result = parseStatusPorcelainV2(output);
|
|
242
|
+
expect(result.unstaged.length).toBe(1);
|
|
243
|
+
expect(result.unstaged[0].status).toBe('modified');
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
describe('parseLogOutput', () => {
|
|
247
|
+
it('should parse log with body', () => {
|
|
248
|
+
const output = `abc123|abc1|John|john@example.com|2024-01-01T00:00:00Z|feat: Add feature
|
|
249
|
+
This is the body
|
|
250
|
+
END_COMMIT
|
|
251
|
+
def456|def4|Jane|jane@example.com|2024-01-02T00:00:00Z|fix: Fix bug
|
|
252
|
+
Another body
|
|
253
|
+
END_COMMIT`;
|
|
254
|
+
const result = parseLogOutput(output, true);
|
|
255
|
+
expect(result.length).toBe(2);
|
|
256
|
+
expect(result[0].hash).toBe('abc123');
|
|
257
|
+
expect(result[0].author).toBe('John');
|
|
258
|
+
expect(result[0].message).toBe('feat: Add feature');
|
|
259
|
+
expect(result[0].body).toBe('This is the body');
|
|
260
|
+
});
|
|
261
|
+
it('should parse oneline format', () => {
|
|
262
|
+
const output = `abc123|abc1|John|john@example.com|2024-01-01T00:00:00Z|feat: Add feature
|
|
263
|
+
def456|def4|Jane|jane@example.com|2024-01-02T00:00:00Z|fix: Fix bug`;
|
|
264
|
+
const result = parseLogOutput(output, false);
|
|
265
|
+
expect(result.length).toBe(2);
|
|
266
|
+
expect(result[0].hash).toBe('abc123');
|
|
267
|
+
expect(result[1].hash).toBe('def456');
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
describe('parseDiffStat', () => {
|
|
271
|
+
it('should parse diff stat output', () => {
|
|
272
|
+
const output = ` src/index.ts | 10 ++++------
|
|
273
|
+
src/utils.ts | 5 ++---
|
|
274
|
+
2 files changed, 6 insertions(+), 9 deletions(-)`;
|
|
275
|
+
const result = parseDiffStat(output);
|
|
276
|
+
expect(result.files.length).toBe(2);
|
|
277
|
+
expect(result.totalAdditions).toBe(6);
|
|
278
|
+
expect(result.totalDeletions).toBe(9);
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
//# sourceMappingURL=git.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.test.js","sourceRoot":"","sources":["../../src/__tests__/git.test.ts"],"names":[],"mappings":"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"}
|