gent-cli 6.0.1 → 8.0.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/QUICKSTART.md CHANGED
@@ -1,198 +1,229 @@
1
- # Quick Start Guide - Gent CLI
1
+ # Gent CLI — Quick Start Guide
2
2
 
3
- ## Installation & Setup
3
+ ## Requirements
4
+
5
+ - Node.js **18 or newer**
6
+ - npm
7
+
8
+ ## Installation
4
9
 
5
10
  ```bash
6
- # Navigate to the CLI directory
7
11
  cd apps/Cli
8
-
9
- # Install dependencies
10
12
  npm install
11
-
12
- # Test the CLI
13
13
  node src/index.js --help
14
14
  ```
15
15
 
16
- ## Make it Globally Available (Optional)
16
+ Make `gent` available globally:
17
17
 
18
18
  ```bash
19
- # Link the CLI globally
20
19
  npm link
21
-
22
- # Now you can use 'gent' from anywhere
23
20
  gent --help
24
21
  ```
25
22
 
23
+ ---
24
+
26
25
  ## Your First Repository
27
26
 
28
27
  ### 1. Initialize
28
+
29
29
  ```bash
30
- # Create a new directory
31
30
  mkdir my-project
32
31
  cd my-project
33
-
34
- # Initialize gent repository
35
32
  gent init
36
33
  ```
37
34
 
38
- You'll be prompted for:
39
- - Your name
40
- - Your email
41
- - Repository name
42
- - Repository description
35
+ Skip the interactive prompts:
43
36
 
44
- Or skip prompts with `-y`:
45
37
  ```bash
46
38
  gent init -y
47
39
  ```
48
40
 
49
41
  ### 2. Add Files
42
+
50
43
  ```bash
51
- # Create some files
52
44
  echo "console.log('Hello');" > index.js
53
-
54
- # Add to staging area
55
45
  gent add index.js
56
-
57
- # Or add all files
46
+ # or add everything
58
47
  gent add .
59
48
  ```
60
49
 
61
50
  ### 3. Check Status
51
+
62
52
  ```bash
63
53
  gent status
54
+ gent status -s # short format
64
55
  ```
65
56
 
66
- ### 4. Commit Changes
57
+ ### 4. Commit
58
+
67
59
  ```bash
68
- # With message flag
69
60
  gent commit -m "Initial commit"
61
+ ```
62
+
63
+ Let AI suggest a message from your staged diff (requires `ANTHROPIC_API_KEY`):
70
64
 
71
- # Or interactive
72
- gent commit
65
+ ```bash
66
+ gent commit --ai
73
67
  ```
74
68
 
75
69
  ### 5. View History
70
+
76
71
  ```bash
77
- # See all commits
78
72
  gent log
79
-
80
- # Compact view
81
73
  gent log --oneline
82
-
83
- # Limit commits shown
84
74
  gent log -n 5
75
+ gent log --graph # ASCII commit graph with branches and merges
85
76
  ```
86
77
 
78
+ ---
79
+
87
80
  ## Working with Branches
88
81
 
89
- ### Create a Branch
90
82
  ```bash
91
- gent branch feature-name
83
+ gent branch feature-name # create
84
+ gent checkout feature-name # switch
85
+ gent checkout -b new-feature # create and switch
86
+ gent branch # list all
87
+ gent branch -d old-feature # delete (undoable)
92
88
  ```
93
89
 
94
- ### Switch to Branch
95
- ```bash
96
- gent checkout feature-name
97
- ```
90
+ ---
91
+
92
+ ## Merging
98
93
 
99
- ### Create and Switch
100
94
  ```bash
101
- gent checkout -b new-feature
95
+ gent checkout main
96
+ gent merge feature-login
102
97
  ```
103
98
 
104
- ### List Branches
99
+ If the merge is clean it commits automatically. If there are conflicts:
100
+
105
101
  ```bash
106
- gent branch
102
+ gent resolve # walk each conflict hunk interactively → Ours / Theirs / Both / Edit / Ask AI
103
+ gent push
107
104
  ```
108
105
 
109
- ### Delete Branch
106
+ Or resolve markers by hand then:
107
+
110
108
  ```bash
111
- gent branch -d old-feature
109
+ gent add .
110
+ gent commit -m "Resolve merge"
112
111
  ```
113
112
 
113
+ ---
114
+
114
115
  ## Common Workflows
115
116
 
116
- ### Feature Development
117
+ ### Feature development
118
+
117
119
  ```bash
118
- # Start a new feature
119
120
  gent checkout -b feature-login
120
121
 
121
- # Make changes
122
122
  echo "// Login code" > login.js
123
123
  gent add login.js
124
124
  gent commit -m "Add login feature"
125
125
 
126
- # View your work
127
- gent log
128
-
129
- # Switch back to main
130
126
  gent checkout main
127
+ gent merge feature-login
128
+ gent log --graph
131
129
  ```
132
130
 
133
- ### Quick Commit All
131
+ ### Made a mistake? Undo it.
132
+
134
133
  ```bash
135
- # Stage and commit all changes
136
- gent add .
137
- gent commit -m "Update all files"
134
+ gent undo # reverse the last commit / merge / reset / checkout
135
+ gent undo --list # see what can be undone
136
+ gent redo # re-apply the last undone operation
138
137
  ```
139
138
 
140
- ### Check What Changed
141
- ```bash
142
- # See status
143
- gent status
139
+ Undo never deletes your working files. For hard-reset / fast-forward merges it
140
+ also restores file content from the object store.
141
+
142
+ ### Understand what changed
144
143
 
145
- # Short format
146
- gent status -s
144
+ ```bash
145
+ gent explain # explain the latest commit in plain language
146
+ gent explain <commit_hash> # explain a specific commit
147
+ gent explain --staged # explain what is currently staged
147
148
  ```
148
149
 
149
- ## Tips & Tricks
150
+ ### Repository health
151
+
152
+ ```bash
153
+ gent summary # branch counts, contributors, most-changed files, store size
154
+ gent summary --ai # + a short AI-written health narrative
155
+ ```
150
156
 
151
- 1. **Use .gentignore** - Exclude files like `node_modules/`
152
- 2. **Commit Often** - Small commits are easier to track
153
- 3. **Descriptive Messages** - Write clear commit messages
154
- 4. **Branch for Features** - Keep main branch stable
155
- 5. **Check Status** - Always review before committing
157
+ ---
156
158
 
157
- ## Running the Demo
159
+ ## Optional AI Features
158
160
 
159
- See the CLI in action:
161
+ All AI features are off by default and have a non-AI fallback.
160
162
 
161
163
  ```bash
162
- chmod +x demo.sh
163
- ./demo.sh
164
+ export ANTHROPIC_API_KEY=sk-ant-...
165
+ export GENT_AI_MODEL=claude-haiku-4-5 # optional; default is claude-opus-4-8
166
+
167
+ gent commit --ai # AI-suggested commit message
168
+ gent explain # plain-language diff summary
169
+ gent resolve # adds "Ask AI" option per conflict hunk
170
+ gent summary --ai # health narrative
164
171
  ```
165
172
 
173
+ ---
174
+
175
+ ## Tips & Tricks
176
+
177
+ 1. **Undo freely** — `gent undo` reverses history-changing commands without deleting files.
178
+ 2. **Use `gent resolve` for conflicts** — faster than editing conflict markers by hand.
179
+ 3. **Run `gent summary`** after a sprint to see who changed what and how big the repo has grown.
180
+ 4. **`gent log --graph`** gives you a visual picture of your branch and merge history.
181
+ 5. **Commit often** — small commits are easier to track and undo individually.
182
+ 6. **Use `.gentignore`** — exclude `node_modules/`, `.env`, build artifacts.
183
+ 7. **Descriptive messages** — `gent commit --ai` can help when you are stuck.
184
+ 8. **Branch for features** — keep `main` stable.
185
+
186
+ ---
187
+
166
188
  ## Troubleshooting
167
189
 
168
- **Not a gent repository error?**
190
+ **Not a gent repository?**
169
191
  ```bash
170
- # Make sure you initialized
171
192
  gent init
172
193
  ```
173
194
 
174
- **No changes to commit?**
195
+ **Nothing to commit?**
175
196
  ```bash
176
- # Add files first
177
197
  gent add <files>
198
+ gent status
178
199
  ```
179
200
 
180
201
  **Command not found?**
181
202
  ```bash
182
- # Use node directly
203
+ # Run without linking
183
204
  node src/index.js <command>
184
-
185
205
  # Or link globally
186
206
  npm link
187
207
  ```
188
208
 
189
- ## Next Steps
209
+ **Merge left conflict markers?**
210
+ ```bash
211
+ gent resolve # interactive resolver
212
+ # or edit files, then:
213
+ gent add .
214
+ gent commit -m "Resolve conflicts"
215
+ ```
190
216
 
191
- - Read the full [README.md](README.md)
192
- - Explore the [source code](src/)
193
- - Try the [demo script](demo.sh)
194
- - Build your own commands!
217
+ **Undo went too far?**
218
+ ```bash
219
+ gent redo
220
+ ```
195
221
 
196
222
  ---
197
223
 
198
- **Happy coding with Gent! 🚀**
224
+ ## Next Steps
225
+
226
+ - Full command reference: [docs/COMMANDS.md](docs/COMMANDS.md)
227
+ - How the algorithms work: [docs/ALGORITHMS.md](docs/ALGORITHMS.md)
228
+ - Architecture overview: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)
229
+ - Full workflow with remote sync: [README.md](README.md)
package/README.md CHANGED
@@ -12,10 +12,23 @@ The CLI is configured in `src/utils/constants.js` to use that deployed API. Do n
12
12
 
13
13
  ## Requirements
14
14
 
15
- - Node.js 14 or newer
16
- - Internet access to `https://gent-api.onrender.com`
15
+ - Node.js 18 or newer
16
+ - Internet access to `https://gent-api.onrender.com` (only for remote/auth commands; local commands work offline)
17
17
  - A Gent account, created with `gent register`
18
18
 
19
+ ## What makes Gent "smart"
20
+
21
+ Beyond a faithful git-like workflow, Gent adds:
22
+
23
+ - **diff3 three-way merge** with language-aware auto-resolution (JSON key merge, import unioning) that resolves more conflicts correctly and never merges unsafely.
24
+ - **`gent undo` / `gent redo`** — a one-command safety net over an operation journal (friendlier than `git reflog`).
25
+ - **`gent resolve`** — an interactive conflict resolver (ours / theirs / both / edit / AI).
26
+ - **`gent summary`** — a repository health dashboard, plus **`gent log --graph`**.
27
+ - **Optional AI** (`gent commit --ai`, `gent explain`, `gent summary --ai`, AI option in `gent resolve`) — off by default, enabled with `ANTHROPIC_API_KEY`.
28
+
29
+ See [docs/COMMANDS.md](docs/COMMANDS.md) for the full reference and
30
+ [docs/ALGORITHMS.md](docs/ALGORITHMS.md) for how the engines work.
31
+
19
32
  ## Install
20
33
 
21
34
  From npm:
@@ -309,7 +322,14 @@ gent merge feature-login
309
322
  gent push
310
323
  ```
311
324
 
312
- If there are conflicts, resolve the files, then:
325
+ If there are conflicts, resolve them interactively (recommended):
326
+
327
+ ```bash
328
+ gent resolve # walk each conflict; it can finalize the merge commit for you
329
+ gent push
330
+ ```
331
+
332
+ Or resolve the markers by hand, then:
313
333
 
314
334
  ```bash
315
335
  gent add .
@@ -450,6 +470,42 @@ gent checkout <branch>
450
470
  gent checkout -b <branch>
451
471
  gent merge <branch>
452
472
  gent merge <branch> -m "Merge message"
473
+ gent resolve # interactively resolve merge conflicts
474
+ ```
475
+
476
+ ### Safety Net (undo / redo)
477
+
478
+ ```bash
479
+ gent undo # reverse the last commit/merge/reset/checkout
480
+ gent undo --list # show the operation history
481
+ gent redo # re-apply the last undone operation
482
+ ```
483
+
484
+ Undo never deletes your working files; for content-discarding operations
485
+ (`reset --hard`, fast-forward merge, pull) it restores them from the object store.
486
+
487
+ ### Insight
488
+
489
+ ```bash
490
+ gent summary # repository health & statistics dashboard
491
+ gent summary --ai # + a short AI-written assessment (needs a key)
492
+ gent log --graph # ASCII commit graph with branches and merges
493
+ gent explain # explain the latest commit in plain language
494
+ gent explain <commit> # explain a specific commit
495
+ gent explain --staged # explain currently staged changes
496
+ ```
497
+
498
+ ### Optional AI features
499
+
500
+ AI is off by default and every feature has a non-AI fallback. Enable it with:
501
+
502
+ ```bash
503
+ export ANTHROPIC_API_KEY=sk-ant-...
504
+ export GENT_AI_MODEL=claude-haiku-4-5 # optional; default is claude-opus-4-8
505
+
506
+ gent commit --ai # suggest a commit message from the staged diff
507
+ gent explain # narrate a diff instead of just printing it
508
+ gent resolve # adds an "Ask AI" choice per conflict hunk
453
509
  ```
454
510
 
455
511
  ### Tags
@@ -515,6 +571,7 @@ Inside each repo:
515
571
  ├── config.json
516
572
  ├── commits.json
517
573
  ├── staging.json
574
+ ├── journal.json # operation journal for undo/redo (created on first op)
518
575
  ├── HEAD
519
576
  ├── objects/
520
577
  └── refs/
package/package.json CHANGED
@@ -1,14 +1,16 @@
1
1
  {
2
2
  "name": "gent-cli",
3
- "version": "6.0.1",
4
- "description": "A modern, Git-like version control CLI with built-in cloud authentication and global user identity management.",
3
+ "version": "8.0.0",
4
+ "description": "A modern, Git-like version control CLI with cloud sync, AI-powered superpowers (ask/review/docs/changelog), and zero-friction setup (gent setup/doctor/config).",
5
5
  "main": "src/index.js",
6
6
  "bin": {
7
7
  "gent": "src/index.js"
8
8
  },
9
9
  "scripts": {
10
10
  "start": "node src/index.js",
11
- "test": "node --check src/index.js && node --check tests/remote-e2e.js",
11
+ "test": "node --check src/index.js && node --test tests/diff.test.js tests/merge.test.js tests/hash.test.js tests/merge-base.test.js && node tests/offline-e2e.js",
12
+ "test:unit": "node --test tests/diff.test.js tests/merge.test.js tests/hash.test.js tests/merge-base.test.js",
13
+ "test:e2e": "node tests/offline-e2e.js",
12
14
  "test:remote:e2e": "node tests/remote-e2e.js",
13
15
  "demo": "bash demo.sh",
14
16
  "link": "npm link",
@@ -47,7 +49,7 @@
47
49
  "ora": "^5.4.1"
48
50
  },
49
51
  "engines": {
50
- "node": ">=14.0.0"
52
+ "node": ">=18.0.0"
51
53
  },
52
54
  "files": [
53
55
  "src/",
@@ -0,0 +1,82 @@
1
+ /**
2
+ * AI Command - Manage and verify AI integration.
3
+ *
4
+ * gent ai status → show key source, model, where it came from
5
+ * gent ai test → make a tiny live request to confirm it works
6
+ * gent ai models → list the model ids gent suggests
7
+ */
8
+
9
+ const chalk = require('chalk');
10
+ const ora = require('ora');
11
+ const ai = require('../utils/ai-service');
12
+ const userConfig = require('../utils/user-config');
13
+
14
+ const SUGGESTED_MODELS = [
15
+ { id: 'claude-opus-4-7', tag: 'flagship', note: 'Highest quality' },
16
+ { id: 'claude-sonnet-4-6', tag: 'balanced', note: 'Strong, faster, cheaper' },
17
+ { id: 'claude-haiku-4-5', tag: 'fastest', note: 'Fastest & cheapest' },
18
+ ];
19
+
20
+ async function aiCommand(subcommand) {
21
+ const sub = (subcommand || 'status').toLowerCase();
22
+ switch (sub) {
23
+ case 'status': return status();
24
+ case 'test': return test();
25
+ case 'models': return models();
26
+ default:
27
+ console.error(chalk.red(`Unknown subcommand '${sub}'`));
28
+ console.log(chalk.gray('Usage: gent ai <status|test|models>'));
29
+ process.exit(1);
30
+ }
31
+ }
32
+
33
+ async function status() {
34
+ const { value: key, source: keySource } = await ai.resolveKey();
35
+ const model = await ai.resolveModel();
36
+ const { source: modelSource } = await userConfig.getResolved('ai.model');
37
+
38
+ console.log(chalk.bold.cyan('\nGent AI status\n'));
39
+ if (key) {
40
+ console.log(` ${chalk.green('●')} API key: ${userConfig.maskSecret(key)} ${chalk.gray(`[${keySource}]`)}`);
41
+ } else {
42
+ console.log(` ${chalk.gray('○')} API key: ${chalk.gray('not set')}`);
43
+ console.log(chalk.gray(' ↳ ' + ai.disabledHint()));
44
+ }
45
+ console.log(` ${chalk.green('●')} Model: ${model} ${chalk.gray(`[${modelSource}]`)}`);
46
+ console.log(chalk.gray('\n Run `gent ai test` to verify the key actually works.'));
47
+ console.log();
48
+ }
49
+
50
+ async function test() {
51
+ const { value: key } = await ai.resolveKey();
52
+ if (!key) {
53
+ console.error(chalk.red('No AI key configured.'));
54
+ console.log(chalk.yellow('Set one with `gent config set ai.api_key <key>`.'));
55
+ process.exit(1);
56
+ }
57
+
58
+ const model = await ai.resolveModel();
59
+ const spinner = ora(`Pinging Anthropic (${model})...`).start();
60
+ try {
61
+ const reply = await ai.complete({
62
+ prompt: 'Reply with the single word: pong',
63
+ maxTokens: 8,
64
+ });
65
+ spinner.succeed(chalk.green(`✓ Reachable. Reply: "${reply}"`));
66
+ } catch (err) {
67
+ spinner.fail(chalk.red(err.message));
68
+ process.exit(1);
69
+ }
70
+ }
71
+
72
+ async function models() {
73
+ const current = await ai.resolveModel();
74
+ console.log(chalk.bold.cyan('\nSuggested Claude models\n'));
75
+ for (const m of SUGGESTED_MODELS) {
76
+ const active = m.id === current ? chalk.green(' (current)') : '';
77
+ console.log(` ${chalk.cyan(m.id.padEnd(22))} ${chalk.gray(m.tag.padEnd(10))} ${m.note}${active}`);
78
+ }
79
+ console.log(chalk.gray('\n Switch with: gent config set ai.model <id>\n'));
80
+ }
81
+
82
+ module.exports = aiCommand;
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Ask Command - Plain-English Q&A about the current repo.
3
+ *
4
+ * gent ask "what does this project do?"
5
+ * gent ask "who has touched src/server.js recently?"
6
+ * gent ask "what's pending on the current branch?"
7
+ *
8
+ * Builds a compact repo summary (README + last N commits + tree listing) and
9
+ * sends it as context. Falls back to a useful text dump if no AI key is set.
10
+ */
11
+
12
+ const path = require('path');
13
+ const chalk = require('chalk');
14
+ const ora = require('ora');
15
+ const { getGentPath, readJSON, pathExists } = require('../utils/fileSystem');
16
+ const fs = require('fs').promises;
17
+ const { COMMITS_FILE, CONFIG_FILE } = require('../utils/constants');
18
+ const ai = require('../utils/ai-service');
19
+
20
+ const MAX_CONTEXT_CHARS = 14000;
21
+ const MAX_COMMITS = 25;
22
+
23
+ async function ask(question, options = {}) {
24
+ try {
25
+ if (!question || !question.trim()) {
26
+ console.error(chalk.red('Usage: gent ask "<your question>"'));
27
+ process.exit(1);
28
+ }
29
+
30
+ const gentPath = await getGentPath();
31
+ const context = await buildRepoContext(gentPath);
32
+
33
+ if (!ai.isEnabled()) {
34
+ console.log(chalk.yellow(ai.disabledHint()));
35
+ console.log(chalk.gray('\nHere is the raw repo context you can pipe into another tool:\n'));
36
+ console.log(context);
37
+ return;
38
+ }
39
+
40
+ const spinner = ora(`Asking ${ai.getModel()}...`).start();
41
+ try {
42
+ const answer = await ai.complete({
43
+ system:
44
+ 'You are a senior engineer answering questions about a software repository. ' +
45
+ 'Be concrete and concise. If the answer is not in the context, say so. ' +
46
+ 'Reference filenames and short commit hashes when helpful.',
47
+ prompt: `Repository context:\n\n${context}\n\nQuestion: ${question}`,
48
+ maxTokens: 1024,
49
+ });
50
+ spinner.stop();
51
+ console.log('\n' + answer + '\n');
52
+ } catch (err) {
53
+ spinner.fail(chalk.red(err.message));
54
+ process.exit(1);
55
+ }
56
+ } catch (error) {
57
+ if (error.code === 'ENOENT' && error.message.includes('.gent')) {
58
+ console.error(chalk.red('Error: Not a gent repository'));
59
+ console.log(chalk.yellow('Run "gent init" to initialize a repository'));
60
+ } else {
61
+ console.error(chalk.red('Error:'), error.message);
62
+ }
63
+ process.exit(1);
64
+ }
65
+ }
66
+
67
+ async function buildRepoContext(gentPath) {
68
+ const cwd = process.cwd();
69
+ const parts = [];
70
+
71
+ // Project name + description from config
72
+ try {
73
+ const config = await readJSON(path.join(gentPath, CONFIG_FILE));
74
+ const repo = config.repository || {};
75
+ parts.push(`# Project\nname: ${repo.name || '(unnamed)'}\ndescription: ${repo.description || ''}`);
76
+ } catch { /* missing config — fine */ }
77
+
78
+ // README if present (any case, common extensions)
79
+ const readme = await findReadme(cwd);
80
+ if (readme) {
81
+ const text = await fs.readFile(readme.path, 'utf-8').catch(() => '');
82
+ if (text) parts.push(`# README (${readme.rel})\n${text.slice(0, 4000)}`);
83
+ }
84
+
85
+ // Recent commits
86
+ try {
87
+ const repository = await readJSON(path.join(gentPath, COMMITS_FILE));
88
+ const commits = (repository.commits || []).slice(-MAX_COMMITS).reverse();
89
+ const branch = repository.currentBranch || 'main';
90
+ const lines = commits.map(c =>
91
+ `- ${(c.hash || '').slice(0, 7)} (${(c.author?.name || 'unknown')}): ${(c.message || '').split('\n')[0]}`
92
+ );
93
+ parts.push(`# Recent commits on '${branch}'\n${lines.join('\n')}`);
94
+ } catch { /* no commits yet — fine */ }
95
+
96
+ // Top-level layout
97
+ try {
98
+ const entries = await fs.readdir(cwd, { withFileTypes: true });
99
+ const layout = entries
100
+ .filter(e => !e.name.startsWith('.') && e.name !== 'node_modules')
101
+ .map(e => e.isDirectory() ? `${e.name}/` : e.name)
102
+ .slice(0, 60);
103
+ parts.push(`# Top-level layout\n${layout.join('\n')}`);
104
+ } catch { /* unreadable — fine */ }
105
+
106
+ const joined = parts.join('\n\n');
107
+ return joined.length > MAX_CONTEXT_CHARS
108
+ ? joined.slice(0, MAX_CONTEXT_CHARS) + '\n... (context truncated)'
109
+ : joined;
110
+ }
111
+
112
+ async function findReadme(cwd) {
113
+ const candidates = ['README.md', 'readme.md', 'README.txt', 'README', 'README.rst'];
114
+ for (const c of candidates) {
115
+ const p = path.join(cwd, c);
116
+ if (await pathExists(p)) return { path: p, rel: c };
117
+ }
118
+ return null;
119
+ }
120
+
121
+ module.exports = ask;
@@ -10,6 +10,7 @@ const { getGentPath, readJSON, writeJSON } = require('../utils/fileSystem');
10
10
  const { COMMITS_FILE, CONFIG_FILE, API_ENDPOINTS, buildRepoUrl, parseRemoteUrl } = require('../utils/constants');
11
11
  const apiClient = require('../utils/api-client');
12
12
  const authStorage = require('../utils/auth-storage');
13
+ const journal = require('../utils/journal');
13
14
 
14
15
  /**
15
16
  * Manage branches
@@ -110,6 +111,8 @@ async function deleteBranch(name, repository, gentPath) {
110
111
  process.exit(1);
111
112
  }
112
113
 
114
+ await journal.recordOp(gentPath, 'branch-delete', `delete branch '${name}'`);
115
+
113
116
  delete branches[name];
114
117
  repository.branches = branches;
115
118