devdaily-ai 0.1.0 → 0.1.2
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 +332 -44
- package/dist/index.d.ts +2 -1
- package/dist/index.js +19 -24
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,112 +1,400 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
1
3
|
# DevDaily AI
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
**Your AI-powered developer memory**
|
|
6
|
+
|
|
7
|
+
Auto-generate standup notes, PR descriptions, and weekly summaries from your git history.
|
|
8
|
+
|
|
9
|
+
[](https://www.npmjs.com/package/devdaily-ai)
|
|
10
|
+
[](https://nodejs.org)
|
|
11
|
+
[](LICENSE)
|
|
12
|
+
[](https://github.com/hempun10/devdaily)
|
|
13
|
+
|
|
14
|
+
[Installation](#installation) • [Quick Start](#quick-start) • [Commands](#commands) • [Examples](#examples) • [Contributing](docs/CONTRIBUTING.md)
|
|
15
|
+
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Why DevDaily AI?
|
|
21
|
+
|
|
22
|
+
As developers, we spend too much time on repetitive tasks:
|
|
23
|
+
|
|
24
|
+
- ⏱️ Writing standup notes every morning
|
|
25
|
+
- 📝 Crafting PR descriptions from scratch
|
|
26
|
+
- 📊 Summarizing weekly accomplishments
|
|
27
|
+
- 🔍 Remembering what we were working on last week
|
|
4
28
|
|
|
5
|
-
|
|
29
|
+
**DevDaily AI solves this.** It analyzes your git history and uses GitHub Copilot CLI to generate professional summaries in seconds.
|
|
6
30
|
|
|
7
31
|
## Features
|
|
8
32
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
33
|
+
| Feature | Description |
|
|
34
|
+
| ---------------------------- | -------------------------------------------------------------------- |
|
|
35
|
+
| **🚀 Standup Generator** | Generate daily standup notes from recent commits in 30 seconds |
|
|
36
|
+
| **📄 Smart PR Descriptions** | Auto-generate PR titles and descriptions with commitlint integration |
|
|
37
|
+
| **📅 Weekly Summaries** | Track your impact and accomplishments over time |
|
|
38
|
+
| **🔄 Interactive Workflow** | Preview, edit, and create PRs with interactive menus |
|
|
39
|
+
| **📋 Auto-Copy** | All outputs copied to clipboard automatically |
|
|
40
|
+
| **🎨 Professional Output** | Clean terminal UI with no emojis (terminal.shop inspired) |
|
|
41
|
+
| **🔧 Multi-Format** | Export to Markdown, Slack, or plain text |
|
|
13
42
|
|
|
14
43
|
## Installation
|
|
15
44
|
|
|
45
|
+
**Prerequisites:**
|
|
46
|
+
|
|
47
|
+
- Node.js >= 18.0.0
|
|
48
|
+
- Git repository
|
|
49
|
+
- GitHub CLI with Copilot extension
|
|
50
|
+
|
|
51
|
+
### 1. Install GitHub CLI (if not already installed)
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# macOS
|
|
55
|
+
brew install gh
|
|
56
|
+
|
|
57
|
+
# Windows
|
|
58
|
+
winget install --id GitHub.cli
|
|
59
|
+
|
|
60
|
+
# Linux
|
|
61
|
+
sudo apt install gh # Debian/Ubuntu
|
|
62
|
+
sudo dnf install gh # Fedora/RHEL
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Or visit [cli.github.com](https://cli.github.com) for other installation methods.
|
|
66
|
+
|
|
67
|
+
### 2. Install GitHub Copilot CLI Extension
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
gh extension install github/gh-copilot
|
|
71
|
+
gh auth login
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 3. Install DevDaily AI
|
|
75
|
+
|
|
16
76
|
```bash
|
|
17
77
|
npm install -g devdaily-ai
|
|
18
78
|
```
|
|
19
79
|
|
|
80
|
+
### Verify Installation
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
devdaily --version
|
|
84
|
+
devdaily --help
|
|
85
|
+
```
|
|
86
|
+
|
|
20
87
|
## Quick Start
|
|
21
88
|
|
|
89
|
+
Navigate to any git repository and run:
|
|
90
|
+
|
|
22
91
|
```bash
|
|
23
92
|
# Generate standup notes
|
|
24
93
|
devdaily standup
|
|
25
94
|
|
|
26
|
-
#
|
|
95
|
+
# Generate PR description
|
|
27
96
|
devdaily pr
|
|
28
97
|
|
|
29
|
-
#
|
|
98
|
+
# Get weekly summary
|
|
30
99
|
devdaily week
|
|
31
100
|
```
|
|
32
101
|
|
|
102
|
+
All outputs are automatically copied to your clipboard! 📋
|
|
103
|
+
|
|
33
104
|
## Commands
|
|
34
105
|
|
|
35
106
|
### `devdaily standup`
|
|
36
107
|
|
|
37
|
-
Generate standup notes from your recent commits.
|
|
108
|
+
Generate daily standup notes from your recent commits.
|
|
38
109
|
|
|
39
110
|
```bash
|
|
40
|
-
|
|
41
|
-
devdaily standup
|
|
111
|
+
# Yesterday's work (default)
|
|
112
|
+
devdaily standup
|
|
113
|
+
|
|
114
|
+
# Last 3 days
|
|
115
|
+
devdaily standup --days=3
|
|
116
|
+
|
|
117
|
+
# Last week
|
|
118
|
+
devdaily standup --days=7
|
|
119
|
+
|
|
120
|
+
# Output in Slack format
|
|
42
121
|
devdaily standup --format=slack
|
|
122
|
+
|
|
123
|
+
# Plain text format
|
|
124
|
+
devdaily standup --format=plain
|
|
125
|
+
|
|
126
|
+
# Don't copy to clipboard
|
|
127
|
+
devdaily standup --no-copy
|
|
43
128
|
```
|
|
44
129
|
|
|
130
|
+
**Options:**
|
|
131
|
+
|
|
132
|
+
- `--days, -d <number>` - Number of days to analyze (default: 1)
|
|
133
|
+
- `--format, -f <format>` - Output format: markdown, slack, plain (default: markdown)
|
|
134
|
+
- `--no-copy` - Don't copy to clipboard
|
|
135
|
+
|
|
45
136
|
### `devdaily pr`
|
|
46
137
|
|
|
47
|
-
Generate comprehensive PR descriptions.
|
|
138
|
+
Generate comprehensive PR descriptions with smart title generation.
|
|
48
139
|
|
|
49
140
|
```bash
|
|
50
|
-
|
|
51
|
-
devdaily pr
|
|
52
|
-
|
|
53
|
-
|
|
141
|
+
# Generate PR description (interactive)
|
|
142
|
+
devdaily pr
|
|
143
|
+
|
|
144
|
+
# Create PR immediately
|
|
145
|
+
devdaily pr --create
|
|
146
|
+
|
|
147
|
+
# Create draft PR
|
|
148
|
+
devdaily pr --draft
|
|
149
|
+
|
|
150
|
+
# Compare to develop branch
|
|
151
|
+
devdaily pr --base=develop
|
|
152
|
+
|
|
153
|
+
# Don't copy to clipboard
|
|
154
|
+
devdaily pr --no-copy
|
|
54
155
|
```
|
|
55
156
|
|
|
157
|
+
**Options:**
|
|
158
|
+
|
|
159
|
+
- `--base, -b <branch>` - Base branch to compare against (default: main)
|
|
160
|
+
- `--create, -c` - Create PR on GitHub immediately
|
|
161
|
+
- `--draft, -d` - Create PR as draft
|
|
162
|
+
- `--no-copy` - Don't copy to clipboard
|
|
163
|
+
|
|
164
|
+
**Interactive Menu:**
|
|
165
|
+
When you run `devdaily pr` without flags, you get an interactive menu:
|
|
166
|
+
|
|
167
|
+
- 👁️ Preview in terminal
|
|
168
|
+
- 📋 Copy to clipboard
|
|
169
|
+
- 🚀 Create PR on GitHub
|
|
170
|
+
- 📝 Create draft PR
|
|
171
|
+
- ❌ Cancel
|
|
172
|
+
|
|
173
|
+
**Smart Features:**
|
|
174
|
+
|
|
175
|
+
- Automatically generates PR title from conventional commits
|
|
176
|
+
- Extracts issue numbers (e.g., "Closes #123")
|
|
177
|
+
- Categorizes PR type (feature, bugfix, breaking change)
|
|
178
|
+
- Parses commitlint messages for better titles
|
|
179
|
+
|
|
56
180
|
### `devdaily week`
|
|
57
181
|
|
|
58
|
-
|
|
182
|
+
Generate weekly summary of your accomplishments.
|
|
59
183
|
|
|
60
184
|
```bash
|
|
61
|
-
|
|
62
|
-
devdaily week
|
|
185
|
+
# Current week (default)
|
|
186
|
+
devdaily week
|
|
187
|
+
|
|
188
|
+
# Last week
|
|
189
|
+
devdaily week --last
|
|
190
|
+
|
|
191
|
+
# Custom start date
|
|
192
|
+
devdaily week --start="2026-02-01"
|
|
193
|
+
|
|
194
|
+
# Don't copy to clipboard
|
|
195
|
+
devdaily week --no-copy
|
|
63
196
|
```
|
|
64
197
|
|
|
65
|
-
|
|
198
|
+
**Options:**
|
|
66
199
|
|
|
67
|
-
-
|
|
68
|
-
-
|
|
69
|
-
-
|
|
200
|
+
- `--last, -l` - Show last week instead of current week
|
|
201
|
+
- `--start, -s <date>` - Custom start date (YYYY-MM-DD)
|
|
202
|
+
- `--no-copy` - Don't copy to clipboard
|
|
70
203
|
|
|
71
|
-
|
|
204
|
+
### `devdaily context`
|
|
72
205
|
|
|
73
|
-
|
|
74
|
-
```bash
|
|
75
|
-
brew install gh # macOS
|
|
76
|
-
# or visit https://cli.github.com
|
|
77
|
-
```
|
|
206
|
+
Recover work context from past commits (coming soon).
|
|
78
207
|
|
|
79
|
-
2. Install Copilot extension:
|
|
80
208
|
```bash
|
|
81
|
-
|
|
82
|
-
gh auth login
|
|
209
|
+
devdaily context --days=7
|
|
83
210
|
```
|
|
84
211
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
212
|
+
## Examples
|
|
213
|
+
|
|
214
|
+
See the [`examples/`](examples/) directory for detailed output samples:
|
|
215
|
+
|
|
216
|
+
- [Standup Output](examples/standup-output.md)
|
|
217
|
+
- [PR Description Output](examples/pr-output.md)
|
|
218
|
+
- [Weekly Summary Output](examples/week-output.md)
|
|
219
|
+
|
|
220
|
+
## How It Works
|
|
221
|
+
|
|
222
|
+
1. **Analyzes Git History** - Uses `simple-git` to parse commits, diffs, and file changes
|
|
223
|
+
2. **Extracts Context** - Parses conventional commits, issue numbers, and PR types
|
|
224
|
+
3. **AI Summarization** - Leverages GitHub Copilot CLI to generate human-readable summaries
|
|
225
|
+
4. **Professional Output** - Formats with clean terminal UI (chalk, boxen, ora)
|
|
226
|
+
5. **Auto-Copy** - Copies results to clipboard for immediate use
|
|
227
|
+
|
|
228
|
+
## Configuration
|
|
229
|
+
|
|
230
|
+
DevDaily AI works out of the box with sensible defaults. No configuration file needed!
|
|
231
|
+
|
|
232
|
+
All settings can be controlled via command-line flags.
|
|
89
233
|
|
|
90
234
|
## Development
|
|
91
235
|
|
|
236
|
+
Want to contribute? See our [Contributing Guide](docs/CONTRIBUTING.md).
|
|
237
|
+
|
|
92
238
|
```bash
|
|
93
|
-
# Clone
|
|
94
|
-
git clone https://github.com/
|
|
95
|
-
cd devdaily
|
|
239
|
+
# Clone the repository
|
|
240
|
+
git clone https://github.com/hempun10/devdaily.git
|
|
241
|
+
cd devdaily
|
|
96
242
|
|
|
97
243
|
# Install dependencies
|
|
98
244
|
npm install
|
|
99
245
|
|
|
100
|
-
# Run in
|
|
246
|
+
# Run in development mode
|
|
101
247
|
npm run dev
|
|
102
248
|
|
|
103
|
-
# Build
|
|
104
|
-
npm run build
|
|
105
|
-
|
|
106
249
|
# Run tests
|
|
107
250
|
npm test
|
|
251
|
+
|
|
252
|
+
# Run tests in watch mode
|
|
253
|
+
npm test -- --watch
|
|
254
|
+
|
|
255
|
+
# Type checking
|
|
256
|
+
npm run typecheck
|
|
257
|
+
|
|
258
|
+
# Lint code
|
|
259
|
+
npm run lint
|
|
260
|
+
npm run lint:fix
|
|
261
|
+
|
|
262
|
+
# Format code
|
|
263
|
+
npm run format
|
|
264
|
+
|
|
265
|
+
# Build for production
|
|
266
|
+
npm run build
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Project Structure
|
|
270
|
+
|
|
271
|
+
```
|
|
272
|
+
devdaily-ai/
|
|
273
|
+
├── src/
|
|
274
|
+
│ ├── commands/ # CLI command implementations
|
|
275
|
+
│ │ ├── standup.ts # Standup generator
|
|
276
|
+
│ │ ├── pr.ts # PR description generator
|
|
277
|
+
│ │ ├── week.ts # Weekly summary
|
|
278
|
+
│ │ └── context.ts # Context recovery
|
|
279
|
+
│ ├── core/ # Core business logic
|
|
280
|
+
│ │ ├── git-analyzer.ts # Git operations
|
|
281
|
+
│ │ └── copilot.ts # Copilot CLI integration
|
|
282
|
+
│ ├── utils/ # Utilities
|
|
283
|
+
│ │ ├── ui.ts # Terminal UI helpers
|
|
284
|
+
│ │ ├── helpers.ts # Date, clipboard utilities
|
|
285
|
+
│ │ └── commitlint.ts # Commit parser
|
|
286
|
+
│ ├── types/ # TypeScript type definitions
|
|
287
|
+
│ └── index.ts # CLI entry point
|
|
288
|
+
├── tests/ # Test files
|
|
289
|
+
├── docs/ # Documentation
|
|
290
|
+
├── examples/ # Usage examples
|
|
291
|
+
└── dist/ # Build output
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## Tech Stack
|
|
295
|
+
|
|
296
|
+
- **TypeScript** - Type-safe development
|
|
297
|
+
- **Commander.js** - CLI framework
|
|
298
|
+
- **simple-git** - Git operations
|
|
299
|
+
- **execa** - Subprocess execution for Copilot CLI
|
|
300
|
+
- **inquirer** - Interactive prompts
|
|
301
|
+
- **chalk** - Terminal styling
|
|
302
|
+
- **boxen** - Terminal boxes
|
|
303
|
+
- **ora** - Loading spinners
|
|
304
|
+
- **clipboardy** - Clipboard operations
|
|
305
|
+
|
|
306
|
+
## FAQ
|
|
307
|
+
|
|
308
|
+
**Q: Does this work offline?**
|
|
309
|
+
A: No, DevDaily AI requires GitHub Copilot CLI which needs an internet connection for AI summaries.
|
|
310
|
+
|
|
311
|
+
**Q: What git hosting providers are supported?**
|
|
312
|
+
A: DevDaily AI works with any git repository. GitHub CLI is only needed for creating PRs.
|
|
313
|
+
|
|
314
|
+
**Q: Is my code sent to GitHub?**
|
|
315
|
+
A: Only commit messages and diffs are sent to GitHub Copilot CLI for summarization. Full file contents are not shared.
|
|
316
|
+
|
|
317
|
+
**Q: Can I customize the output format?**
|
|
318
|
+
A: Yes! Use `--format` flag for standup command. PR and weekly commands support markdown by default.
|
|
319
|
+
|
|
320
|
+
**Q: Does it work with monorepos?**
|
|
321
|
+
A: Yes! DevDaily AI analyzes the entire git history of your current directory.
|
|
322
|
+
|
|
323
|
+
**Q: What about conventional commits?**
|
|
324
|
+
A: DevDaily AI parses conventional commits automatically and uses them for smart PR title generation.
|
|
325
|
+
|
|
326
|
+
## Troubleshooting
|
|
327
|
+
|
|
328
|
+
### Command not found: devdaily
|
|
329
|
+
|
|
330
|
+
Make sure you installed globally:
|
|
331
|
+
|
|
332
|
+
```bash
|
|
333
|
+
npm install -g devdaily-ai
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### GitHub Copilot CLI not found
|
|
337
|
+
|
|
338
|
+
Install the Copilot extension:
|
|
339
|
+
|
|
340
|
+
```bash
|
|
341
|
+
gh extension install github/gh-copilot
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### Not in a git repository
|
|
345
|
+
|
|
346
|
+
DevDaily AI only works inside git repositories. Run:
|
|
347
|
+
|
|
348
|
+
```bash
|
|
349
|
+
git init # Initialize a new repo
|
|
350
|
+
# or
|
|
351
|
+
cd /path/to/your/git/repo
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### No commits found
|
|
355
|
+
|
|
356
|
+
Make sure you have commits in your repository:
|
|
357
|
+
|
|
358
|
+
```bash
|
|
359
|
+
git log # Check commit history
|
|
108
360
|
```
|
|
109
361
|
|
|
362
|
+
For more help, see our [documentation](docs/) or [open an issue](https://github.com/hempun10/devdaily/issues).
|
|
363
|
+
|
|
364
|
+
## Roadmap
|
|
365
|
+
|
|
366
|
+
- [ ] Support for Ollama (local AI models)
|
|
367
|
+
- [ ] Analytics and tracking dashboard
|
|
368
|
+
- [ ] Context recovery with AI-powered reminders
|
|
369
|
+
- [ ] PR template detection and auto-fill
|
|
370
|
+
- [ ] Integration with Jira/Linear/Asana
|
|
371
|
+
- [ ] Team collaboration features
|
|
372
|
+
- [ ] VS Code extension
|
|
373
|
+
|
|
374
|
+
## Contributing
|
|
375
|
+
|
|
376
|
+
We welcome contributions! See [CONTRIBUTING.md](docs/CONTRIBUTING.md) for guidelines.
|
|
377
|
+
|
|
110
378
|
## License
|
|
111
379
|
|
|
112
|
-
MIT
|
|
380
|
+
MIT © [Hem Pun](https://github.com/hempun10)
|
|
381
|
+
|
|
382
|
+
## Acknowledgments
|
|
383
|
+
|
|
384
|
+
Built for the [GitHub Copilot CLI Challenge](https://dev.to/devteam/join-the-github-copilot-cli-challenge-win-github-universe-tickets-copilot-pro-subscriptions-and-50af).
|
|
385
|
+
|
|
386
|
+
Special thanks to:
|
|
387
|
+
|
|
388
|
+
- GitHub Copilot CLI team
|
|
389
|
+
- terminal.shop for UI inspiration
|
|
390
|
+
- The awesome TypeScript community
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
<div align="center">
|
|
395
|
+
|
|
396
|
+
**[⬆ back to top](#devdaily-ai)**
|
|
397
|
+
|
|
398
|
+
Made with ❤️ by developers, for developers
|
|
399
|
+
|
|
400
|
+
</div>
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
|
|
2
|
+
export { }
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
#!/usr/bin/env node
|
|
3
2
|
|
|
4
3
|
// src/index.ts
|
|
5
4
|
import { Command as Command5 } from "commander";
|
|
@@ -27,32 +26,30 @@ var GitAnalyzer = class {
|
|
|
27
26
|
return branch.trim();
|
|
28
27
|
}
|
|
29
28
|
async getCommits(options = {}) {
|
|
30
|
-
const
|
|
31
|
-
format: {
|
|
32
|
-
hash: "%H",
|
|
33
|
-
message: "%s",
|
|
34
|
-
body: "%b",
|
|
35
|
-
author: "%an",
|
|
36
|
-
date: "%ai"
|
|
37
|
-
}
|
|
38
|
-
};
|
|
29
|
+
const args = ["log"];
|
|
39
30
|
if (options.since) {
|
|
40
|
-
|
|
31
|
+
args.push(`--since=${options.since.toISOString()}`);
|
|
41
32
|
}
|
|
42
33
|
if (options.until) {
|
|
43
|
-
|
|
34
|
+
args.push(`--until=${options.until.toISOString()}`);
|
|
44
35
|
}
|
|
45
36
|
if (options.author) {
|
|
46
|
-
|
|
37
|
+
args.push(`--author=${options.author}`);
|
|
47
38
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
39
|
+
args.push("--format=%H|%s|%b|%an|%ae|%ai");
|
|
40
|
+
const result = await this.git.raw(args);
|
|
41
|
+
const commits = result.trim().split("\n").filter(Boolean).map((line) => {
|
|
42
|
+
const parts = line.split("|");
|
|
43
|
+
const [hash, message, body, author, _authorEmail, date] = parts;
|
|
44
|
+
return {
|
|
45
|
+
hash,
|
|
46
|
+
message,
|
|
47
|
+
author,
|
|
48
|
+
date: new Date(date),
|
|
49
|
+
body: body || ""
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
return commits;
|
|
56
53
|
}
|
|
57
54
|
async getDiff(base = "main", head = "HEAD") {
|
|
58
55
|
const diff = await this.git.diff([`${base}...${head}`]);
|
|
@@ -366,12 +363,10 @@ var standupCommand = new Command("standup").description("Generate standup notes
|
|
|
366
363
|
}
|
|
367
364
|
const load = spinner("Analyzing your work...").start();
|
|
368
365
|
try {
|
|
369
|
-
const user = await git.getCurrentUser();
|
|
370
366
|
const days = parseInt(options.days, 10);
|
|
371
367
|
const since = getDaysAgo(days);
|
|
372
368
|
const commits = await git.getCommits({
|
|
373
|
-
since
|
|
374
|
-
author: user.email
|
|
369
|
+
since
|
|
375
370
|
});
|
|
376
371
|
if (commits.length === 0) {
|
|
377
372
|
load.stop();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/standup.ts","../src/core/git-analyzer.ts","../src/core/copilot.ts","../src/utils/ui.ts","../src/utils/helpers.ts","../src/commands/pr.ts","../src/utils/commitlint.ts","../src/commands/week.ts","../src/commands/context.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { standupCommand } from './commands/standup.js';\nimport { prCommand } from './commands/pr.js';\nimport { weekCommand } from './commands/week.js';\nimport { contextCommand } from './commands/context.js';\n\nconst program = new Command();\n\nprogram.name('devdaily').description('Your AI memory for developer work').version('1.0.0');\n\n// Register commands\nprogram.addCommand(standupCommand);\nprogram.addCommand(prCommand);\nprogram.addCommand(weekCommand);\nprogram.addCommand(contextCommand);\n\n// Parse and execute\nprogram.parse();\n","import { Command } from 'commander';\nimport { GitAnalyzer } from '../core/git-analyzer.js';\nimport { CopilotClient } from '../core/copilot.js';\nimport { UI } from '../utils/ui.js';\nimport { spinner, copyToClipboard, getDaysAgo } from '../utils/helpers.js';\n\nexport const standupCommand = new Command('standup')\n .description('Generate standup notes from your recent commits')\n .option('-d, --days <number>', 'Number of days to look back', '1')\n .option('-f, --format <type>', 'Output format (markdown|slack|plain)', 'markdown')\n .option('--no-copy', 'Do not copy to clipboard')\n .action(async (options) => {\n const git = new GitAnalyzer();\n const copilot = new CopilotClient();\n\n // Check if in git repo\n if (!(await git.isRepository())) {\n console.log(UI.error('Not a git repository'));\n console.log(UI.info('Run this command inside a git repository'));\n process.exit(1);\n }\n\n // Check if Copilot CLI is installed\n if (!(await copilot.isInstalled())) {\n console.log(UI.error('GitHub Copilot CLI not found'));\n console.log(UI.info('Install with: gh extension install github/gh-copilot'));\n process.exit(1);\n }\n\n const load = spinner('Analyzing your work...').start();\n\n try {\n // Get user info\n const user = await git.getCurrentUser();\n\n // Get commits\n const days = parseInt(options.days, 10);\n const since = getDaysAgo(days);\n const commits = await git.getCommits({\n since,\n author: user.email,\n });\n\n if (commits.length === 0) {\n load.stop();\n console.log(UI.warning(`No commits found in the last ${days} day(s)`));\n console.log(UI.info(`Try: devdaily standup --days=${days + 1}`));\n process.exit(0);\n }\n\n load.text = 'Generating standup notes with Copilot CLI...';\n\n // Generate standup using Copilot\n const commitMessages = commits.map((c) => c.message);\n const standup = await copilot.summarizeCommits(commitMessages);\n\n load.stop();\n\n // Format output\n const title = days === 1 ? 'Your Standup' : `Your Work (Last ${days} Days)`;\n const content = `${standup}\\n\\n${UI.divider()}\\n${UI.dim(`${commits.length} commits analyzed`)}`;\n\n console.log(UI.box(content, title));\n\n // Copy to clipboard\n if (options.copy) {\n await copyToClipboard(standup);\n }\n } catch (error) {\n load.stop();\n console.log(UI.error('Failed to generate standup'));\n console.log(UI.dim((error as Error).message));\n process.exit(1);\n }\n });\n","import simpleGit, { SimpleGit, LogResult } from 'simple-git';\nimport type { Commit, CommitOptions, DiffStats } from '../types/index.js';\n\nexport class GitAnalyzer {\n private git: SimpleGit;\n\n constructor(repoPath?: string) {\n this.git = simpleGit(repoPath || process.cwd());\n }\n\n async isRepository(): Promise<boolean> {\n try {\n await this.git.revparse(['--is-inside-work-tree']);\n return true;\n } catch {\n return false;\n }\n }\n\n async getCurrentBranch(): Promise<string> {\n const branch = await this.git.revparse(['--abbrev-ref', 'HEAD']);\n return branch.trim();\n }\n\n async getCommits(options: CommitOptions = {}): Promise<Commit[]> {\n const logOptions: any = {\n format: {\n hash: '%H',\n message: '%s',\n body: '%b',\n author: '%an',\n date: '%ai',\n },\n };\n\n if (options.since) {\n logOptions.from = options.since.toISOString();\n }\n\n if (options.until) {\n logOptions.to = options.until.toISOString();\n }\n\n if (options.author) {\n logOptions.author = options.author;\n }\n\n const log: LogResult = await this.git.log(logOptions);\n\n return log.all.map((commit: any) => ({\n hash: commit.hash,\n message: commit.message,\n author: commit.author,\n date: new Date(commit.date),\n body: commit.body,\n }));\n }\n\n async getDiff(base: string = 'main', head: string = 'HEAD'): Promise<string> {\n const diff = await this.git.diff([`${base}...${head}`]);\n return diff;\n }\n\n async getDiffStats(base: string = 'main', head: string = 'HEAD'): Promise<DiffStats> {\n const diffSummary = await this.git.diffSummary([`${base}...${head}`]);\n\n return {\n filesChanged: diffSummary.files.length,\n insertions: diffSummary.insertions,\n deletions: diffSummary.deletions,\n };\n }\n\n async getChangedFiles(base: string = 'main', head: string = 'HEAD'): Promise<string[]> {\n const diff = await this.git.diff([`${base}...${head}`, '--name-only']);\n return diff.split('\\n').filter(Boolean);\n }\n\n async getCurrentUser(): Promise<{ name: string; email: string }> {\n const name = await this.git.getConfig('user.name');\n const email = await this.git.getConfig('user.email');\n\n return {\n name: name.value || '',\n email: email.value || '',\n };\n }\n\n async getStatus(): Promise<{ modified: string[]; untracked: string[] }> {\n const status = await this.git.status();\n\n return {\n modified: status.modified,\n untracked: status.not_added,\n };\n }\n\n async hasUncommittedChanges(): Promise<boolean> {\n const status = await this.git.status();\n return !status.isClean();\n }\n}\n","import { execa } from 'execa';\n\nexport class CopilotClient {\n async isInstalled(): Promise<boolean> {\n try {\n await execa('gh', ['copilot', '--version']);\n return true;\n } catch {\n return false;\n }\n }\n\n async suggest(prompt: string): Promise<string> {\n try {\n const { stdout } = await execa('gh', ['copilot', 'suggest', '-t', 'shell', prompt]);\n\n return this.parseOutput(stdout);\n } catch (error) {\n throw new Error(`Copilot CLI error: ${error}`);\n }\n }\n\n async explain(code: string): Promise<string> {\n try {\n const { stdout } = await execa('gh', ['copilot', 'explain', code]);\n return this.parseOutput(stdout);\n } catch (error) {\n throw new Error(`Copilot CLI error: ${error}`);\n }\n }\n\n private parseOutput(raw: string): string {\n // The gh copilot CLI wraps output in UI elements\n // We need to extract just the AI response\n\n // Remove ANSI codes\n // eslint-disable-next-line no-control-regex\n const cleaned = raw.replace(/\\x1B\\[[0-9;]*[a-zA-Z]/g, '');\n\n // Extract the actual suggestion (between prompts)\n const lines = cleaned.split('\\n');\n const relevantLines = lines.filter(\n (line) =>\n line.trim() &&\n !line.includes('Suggestion:') &&\n !line.includes('Explain command:') &&\n !line.includes('?')\n );\n\n return relevantLines.join('\\n').trim();\n }\n\n async summarizeCommits(commits: string[]): Promise<string> {\n const prompt = `\nYou are helping a developer write their standup notes.\n\nHere are their git commits from yesterday:\n${commits.map((c, i) => `${i + 1}. ${c}`).join('\\n')}\n\nGenerate a professional standup update following this format:\n\nYesterday I:\n- [achievement 1 with impact]\n- [achievement 2 with impact]\n- [achievement 3 with impact]\n\nToday I'm working on:\n- [planned work based on commits]\n\nBlockers: None\n\nRequirements:\n- Make it sound natural and professional\n- Focus on WHAT was accomplished, not HOW\n- Highlight business impact when possible\n- Keep it concise (3-5 bullet points max)\n- No emojis\n`;\n\n return this.suggest(prompt);\n }\n\n async generatePRDescription(data: {\n branch: string;\n commits: string[];\n files: string[];\n issues: string[];\n }): Promise<string> {\n const prompt = `\nYou are helping a developer create a Pull Request description.\n\nBranch: ${data.branch}\n\nCommits:\n${data.commits.map((c, i) => `${i + 1}. ${c}`).join('\\n')}\n\nFiles changed:\n${data.files.join('\\n')}\n\nRelated issues: ${data.issues.length > 0 ? data.issues.join(', ') : 'None'}\n\nGenerate a comprehensive PR description following this template:\n\n## What Changed\n- [bullet point 1]\n- [bullet point 2]\n- [bullet point 3]\n\n## Why\n[Business or technical reason for these changes]\n${data.issues.length > 0 ? `Closes ${data.issues.join(', ')}` : ''}\n\n## How to Test\n1. [testing step 1]\n2. [testing step 2]\n3. [testing step 3]\n\nRequirements:\n- Be specific and technical where appropriate\n- Focus on value for code reviewers\n- Keep it clear and concise\n- No emojis\n`;\n\n return this.suggest(prompt);\n }\n\n async generateWeeklySummary(data: {\n commits: string[];\n stats: {\n commits: number;\n linesAdded: number;\n linesRemoved: number;\n };\n }): Promise<string> {\n const prompt = `\nYou are helping a developer create their weekly work summary.\n\nThis week's commits:\n${data.commits.map((c, i) => `${i + 1}. ${c}`).join('\\n')}\n\nStatistics:\n- ${data.stats.commits} commits\n- ${data.stats.linesAdded} lines added\n- ${data.stats.linesRemoved} lines removed\n\nGenerate a professional weekly summary following this format:\n\nKey Accomplishments:\n1. [Major accomplishment with impact]\n2. [Second accomplishment]\n3. [Third accomplishment]\n4. [Fourth accomplishment]\n5. [Fifth accomplishment]\n\nTop Achievement:\n[Single sentence highlighting the most impactful work]\n\nRequirements:\n- Focus on business value and impact\n- Be suitable for sharing with manager or team\n- Highlight 3-5 key accomplishments\n- Keep it professional\n- No emojis\n`;\n\n return this.suggest(prompt);\n }\n}\n","import chalk from 'chalk';\nimport boxen from 'boxen';\n\n// Clean, minimal UI inspired by terminal.shop\n// No emojis, professional output\n\nexport class UI {\n static readonly colors = {\n primary: chalk.blue,\n success: chalk.green,\n warning: chalk.yellow,\n error: chalk.red,\n dim: chalk.gray,\n bold: chalk.bold,\n };\n\n static header(title: string): string {\n return this.colors.bold(title);\n }\n\n static section(title: string, content: string): string {\n return `\\n${this.colors.primary(title)}\\n${content}`;\n }\n\n static box(content: string, title?: string): string {\n return boxen(content, {\n padding: 1,\n margin: 1,\n borderStyle: 'round',\n borderColor: 'blue',\n title: title,\n titleAlignment: 'left',\n });\n }\n\n static list(items: string[]): string {\n return items.map((item) => ` ${this.colors.dim('>')} ${item}`).join('\\n');\n }\n\n static success(message: string): string {\n return this.colors.success(`✓ ${message}`);\n }\n\n static error(message: string): string {\n return this.colors.error(`✗ ${message}`);\n }\n\n static warning(message: string): string {\n return this.colors.warning(`! ${message}`);\n }\n\n static info(message: string): string {\n return this.colors.dim(`i ${message}`);\n }\n\n static divider(): string {\n return this.colors.dim('─'.repeat(50));\n }\n\n static dim(text: string): string {\n return this.colors.dim(text);\n }\n\n static table(headers: string[], rows: string[][]): string {\n const colWidths = headers.map((h, i) => {\n const maxRowWidth = Math.max(...rows.map((r) => r[i]?.length || 0));\n return Math.max(h.length, maxRowWidth);\n });\n\n const headerRow = headers.map((h, i) => h.padEnd(colWidths[i])).join(' ');\n\n const separator = colWidths.map((w) => '─'.repeat(w)).join(' ');\n\n const dataRows = rows\n .map((row) => row.map((cell, i) => cell.padEnd(colWidths[i])).join(' '))\n .join('\\n');\n\n return `${this.colors.bold(headerRow)}\\n${this.colors.dim(separator)}\\n${dataRows}`;\n }\n\n static progress(current: number, total: number, label: string): string {\n const percentage = Math.round((current / total) * 100);\n const barLength = 30;\n const filled = Math.round((barLength * current) / total);\n const bar = '█'.repeat(filled) + '░'.repeat(barLength - filled);\n\n return `${label} ${this.colors.primary(bar)} ${percentage}%`;\n }\n}\n","import ora from 'ora';\nimport clipboard from 'clipboardy';\nimport { UI } from './ui.js';\n\nexport async function copyToClipboard(text: string): Promise<void> {\n try {\n await clipboard.write(text);\n console.log(UI.success('Copied to clipboard'));\n } catch {\n console.log(UI.warning('Failed to copy to clipboard'));\n }\n}\n\nexport function spinner(text: string) {\n return ora({\n text,\n spinner: 'dots',\n color: 'blue',\n });\n}\n\nexport function formatDate(date: Date): string {\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n}\n\nexport function formatDateRange(start: Date, end: Date): string {\n return `${formatDate(start)} - ${formatDate(end)}`;\n}\n\nexport function getWeekStart(weeksAgo: number = 0): Date {\n const now = new Date();\n const dayOfWeek = now.getDay();\n const monday = new Date(now);\n monday.setDate(now.getDate() - dayOfWeek + (dayOfWeek === 0 ? -6 : 1));\n monday.setDate(monday.getDate() - weeksAgo * 7);\n monday.setHours(0, 0, 0, 0);\n return monday;\n}\n\nexport function getWeekEnd(weeksAgo: number = 0): Date {\n const start = getWeekStart(weeksAgo);\n const end = new Date(start);\n end.setDate(start.getDate() + 6);\n end.setHours(23, 59, 59, 999);\n return end;\n}\n\nexport function getDaysAgo(days: number): Date {\n const date = new Date();\n date.setDate(date.getDate() - days);\n date.setHours(0, 0, 0, 0);\n return date;\n}\n","import { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport { execa } from 'execa';\nimport open from 'open';\nimport { GitAnalyzer } from '../core/git-analyzer.js';\nimport { CopilotClient } from '../core/copilot.js';\nimport { UI } from '../utils/ui.js';\nimport { spinner, copyToClipboard } from '../utils/helpers.js';\nimport { extractIssueNumbers, generatePRTitle, categorizePRType } from '../utils/commitlint.js';\n\nexport const prCommand = new Command('pr')\n .description('Generate PR description from current branch')\n .option('-b, --base <branch>', 'Base branch to compare against', 'main')\n .option('-c, --create', 'Create PR on GitHub')\n .option('-d, --draft', 'Create as draft PR')\n .option('-e, --edit', 'Edit description before creating')\n .action(async (options) => {\n const git = new GitAnalyzer();\n const copilot = new CopilotClient();\n\n // Check if in git repo\n if (!(await git.isRepository())) {\n console.log(UI.error('Not a git repository'));\n process.exit(1);\n }\n\n // Check if Copilot CLI is installed\n if (!(await copilot.isInstalled())) {\n console.log(UI.error('GitHub Copilot CLI not found'));\n console.log(UI.info('Install with: gh extension install github/gh-copilot'));\n process.exit(1);\n }\n\n const load = spinner('Analyzing branch...').start();\n\n try {\n // Get current branch\n const currentBranch = await git.getCurrentBranch();\n\n if (currentBranch === options.base) {\n load.stop();\n console.log(UI.error(`Cannot create PR from ${options.base} branch`));\n console.log(UI.info('Switch to a feature branch first'));\n process.exit(1);\n }\n\n // Get commits on this branch\n const commits = await git.getCommits();\n\n if (commits.length === 0) {\n load.stop();\n console.log(UI.warning('No commits on this branch'));\n process.exit(0);\n }\n\n // Get changed files\n const files = await git.getChangedFiles(options.base);\n\n // Extract issue numbers\n const commitMessages = commits.map((c) => c.message);\n const allText = commitMessages.join(' ');\n const issues = extractIssueNumbers(allText);\n\n // Generate PR title from commits\n const suggestedTitle = generatePRTitle(commitMessages);\n const prType = categorizePRType(commitMessages);\n\n load.text = 'Generating PR description with Copilot CLI...';\n\n // Generate description\n const description = await copilot.generatePRDescription({\n branch: currentBranch,\n commits: commitMessages,\n files,\n issues,\n });\n\n load.stop();\n\n // Display\n console.log(\n UI.box(\n `${UI.colors.bold(suggestedTitle)}\\n\\n${description}\\n\\n${UI.divider()}\\n${UI.dim(`${commits.length} commits • ${files.length} files changed • ${prType}`)}`,\n `PR Description for ${currentBranch}`\n )\n );\n\n // Interactive options\n const { action } = await inquirer.prompt([\n {\n type: 'list',\n name: 'action',\n message: 'What would you like to do?',\n choices: [\n { name: 'Preview in browser (render markdown)', value: 'preview' },\n { name: 'Copy to clipboard', value: 'copy' },\n { name: 'Create PR on GitHub', value: 'create' },\n { name: 'Create draft PR', value: 'draft' },\n { name: 'Exit', value: 'exit' },\n ],\n },\n ]);\n\n if (action === 'copy') {\n await copyToClipboard(description);\n } else if (action === 'preview') {\n // Create temporary markdown file and open in browser\n console.log(UI.info('Opening preview in browser...'));\n // TODO: Implement preview (save to temp file, open with `open` package)\n await open(`https://github.com`);\n } else if (action === 'create' || action === 'draft') {\n const isDraft = action === 'draft' || options.draft;\n\n const createSpinner = spinner(`Creating ${isDraft ? 'draft ' : ''}PR...`).start();\n\n try {\n const args = [\n 'pr',\n 'create',\n '--title',\n suggestedTitle,\n '--body',\n description,\n '--base',\n options.base,\n ];\n\n if (isDraft) {\n args.push('--draft');\n }\n\n const { stdout } = await execa('gh', args);\n\n createSpinner.stop();\n console.log(UI.success('PR created successfully'));\n console.log(UI.dim(stdout));\n } catch (error) {\n createSpinner.stop();\n console.log(UI.error('Failed to create PR'));\n console.log(UI.dim((error as Error).message));\n }\n }\n } catch (error) {\n load.stop();\n console.log(UI.error('Failed to generate PR description'));\n console.log(UI.dim((error as Error).message));\n process.exit(1);\n }\n });\n","import type { ConventionalCommit } from '../types/index.js';\n\nconst COMMIT_PATTERN =\n // eslint-disable-next-line no-useless-escape\n /^(feat|fix|docs|style|refactor|test|chore|perf|ci|build|revert)(\\([^\\)]+\\))?(!)?:\\s*(.+)$/;\n\nexport function parseConventionalCommit(message: string): ConventionalCommit | null {\n const match = message.match(COMMIT_PATTERN);\n\n if (!match) {\n return null;\n }\n\n const [, type, scope, breaking, subject] = match;\n\n return {\n type: type as ConventionalCommit['type'],\n scope: scope?.replace(/[()]/g, ''),\n subject: subject.trim(),\n breaking: breaking === '!',\n };\n}\n\nexport function extractIssueNumbers(text: string): string[] {\n const issuePattern = /#(\\d+)/g;\n const matches = text.matchAll(issuePattern);\n return Array.from(matches, (m) => `#${m[1]}`);\n}\n\nexport function generatePRTitle(commits: string[]): string {\n // Try to parse conventional commits\n const parsed = commits\n .map(parseConventionalCommit)\n .filter((c): c is ConventionalCommit => c !== null);\n\n if (parsed.length === 0) {\n // Fallback: use first commit message\n return commits[0] || 'Update';\n }\n\n // Group by type\n const features = parsed.filter((c) => c.type === 'feat');\n const fixes = parsed.filter((c) => c.type === 'fix');\n\n if (features.length > 0) {\n return features[0].subject;\n }\n\n if (fixes.length > 0) {\n return `Fix: ${fixes[0].subject}`;\n }\n\n return parsed[0].subject;\n}\n\nexport function categorizePRType(commits: string[]): string {\n const parsed = commits\n .map(parseConventionalCommit)\n .filter((c): c is ConventionalCommit => c !== null);\n\n const hasFeatures = parsed.some((c) => c.type === 'feat');\n const hasFixes = parsed.some((c) => c.type === 'fix');\n const hasBreaking = parsed.some((c) => c.breaking);\n\n if (hasBreaking) return 'breaking';\n if (hasFeatures) return 'feature';\n if (hasFixes) return 'bugfix';\n return 'chore';\n}\n","import { Command } from 'commander';\nimport { GitAnalyzer } from '../core/git-analyzer.js';\nimport { CopilotClient } from '../core/copilot.js';\nimport { UI } from '../utils/ui.js';\nimport {\n spinner,\n copyToClipboard,\n getWeekStart,\n getWeekEnd,\n formatDateRange,\n} from '../utils/helpers.js';\n\nexport const weekCommand = new Command('week')\n .description('Generate weekly work summary')\n .option('-l, --last', 'Last week instead of current week')\n .option('--no-copy', 'Do not copy to clipboard')\n .action(async (options) => {\n const git = new GitAnalyzer();\n const copilot = new CopilotClient();\n\n // Check if in git repo\n if (!(await git.isRepository())) {\n console.log(UI.error('Not a git repository'));\n process.exit(1);\n }\n\n // Check if Copilot CLI is installed\n if (!(await copilot.isInstalled())) {\n console.log(UI.error('GitHub Copilot CLI not found'));\n process.exit(1);\n }\n\n const load = spinner('Analyzing your week...').start();\n\n try {\n const weeksAgo = options.last ? 1 : 0;\n const start = getWeekStart(weeksAgo);\n const end = getWeekEnd(weeksAgo);\n\n // Get user info\n const user = await git.getCurrentUser();\n\n // Get commits\n const commits = await git.getCommits({\n since: start,\n until: end,\n author: user.email,\n });\n\n if (commits.length === 0) {\n load.stop();\n console.log(UI.warning('No commits found this week'));\n process.exit(0);\n }\n\n // Get stats\n const stats = await git.getDiffStats();\n\n load.text = 'Generating summary with Copilot CLI...';\n\n // Generate summary\n const commitMessages = commits.map((c) => c.message);\n const summary = await copilot.generateWeeklySummary({\n commits: commitMessages,\n stats: {\n commits: commits.length,\n linesAdded: stats.insertions,\n linesRemoved: stats.deletions,\n },\n });\n\n load.stop();\n\n // Display\n const title = `Week in Review (${formatDateRange(start, end)})`;\n const content = `${summary}\\n\\n${UI.divider()}\\n${UI.dim(`${commits.length} commits • ${stats.insertions}+ ${stats.deletions}- lines`)}`;\n\n console.log(UI.box(content, title));\n\n // Copy to clipboard\n if (options.copy) {\n await copyToClipboard(summary);\n }\n } catch (error) {\n load.stop();\n console.log(UI.error('Failed to generate weekly summary'));\n console.log(UI.dim((error as Error).message));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { UI } from '../utils/ui.js';\n\nexport const contextCommand = new Command('context')\n .description('Recover what you were working on (coming soon)')\n .action(async () => {\n console.log(UI.info('Context recovery feature coming soon!'));\n console.log(UI.dim('This will help you remember what you were working on after interruptions'));\n });\n"],"mappings":"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","names":["Command","Command","execa","Command","execa","Command","Command","Command","Command","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/standup.ts","../src/core/git-analyzer.ts","../src/core/copilot.ts","../src/utils/ui.ts","../src/utils/helpers.ts","../src/commands/pr.ts","../src/utils/commitlint.ts","../src/commands/week.ts","../src/commands/context.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { standupCommand } from './commands/standup.js';\nimport { prCommand } from './commands/pr.js';\nimport { weekCommand } from './commands/week.js';\nimport { contextCommand } from './commands/context.js';\n\nconst program = new Command();\n\nprogram.name('devdaily').description('Your AI memory for developer work').version('1.0.0');\n\n// Register commands\nprogram.addCommand(standupCommand);\nprogram.addCommand(prCommand);\nprogram.addCommand(weekCommand);\nprogram.addCommand(contextCommand);\n\n// Parse and execute\nprogram.parse();\n","import { Command } from 'commander';\nimport { GitAnalyzer } from '../core/git-analyzer.js';\nimport { CopilotClient } from '../core/copilot.js';\nimport { UI } from '../utils/ui.js';\nimport { spinner, copyToClipboard, getDaysAgo } from '../utils/helpers.js';\n\nexport const standupCommand = new Command('standup')\n .description('Generate standup notes from your recent commits')\n .option('-d, --days <number>', 'Number of days to look back', '1')\n .option('-f, --format <type>', 'Output format (markdown|slack|plain)', 'markdown')\n .option('--no-copy', 'Do not copy to clipboard')\n .action(async (options) => {\n const git = new GitAnalyzer();\n const copilot = new CopilotClient();\n\n // Check if in git repo\n if (!(await git.isRepository())) {\n console.log(UI.error('Not a git repository'));\n console.log(UI.info('Run this command inside a git repository'));\n process.exit(1);\n }\n\n // Check if Copilot CLI is installed\n if (!(await copilot.isInstalled())) {\n console.log(UI.error('GitHub Copilot CLI not found'));\n console.log(UI.info('Install with: gh extension install github/gh-copilot'));\n process.exit(1);\n }\n\n const load = spinner('Analyzing your work...').start();\n\n try {\n // Get commits\n const days = parseInt(options.days, 10);\n const since = getDaysAgo(days);\n const commits = await git.getCommits({\n since,\n });\n\n if (commits.length === 0) {\n load.stop();\n console.log(UI.warning(`No commits found in the last ${days} day(s)`));\n console.log(UI.info(`Try: devdaily standup --days=${days + 1}`));\n process.exit(0);\n }\n\n load.text = 'Generating standup notes with Copilot CLI...';\n\n // Generate standup using Copilot\n const commitMessages = commits.map((c) => c.message);\n const standup = await copilot.summarizeCommits(commitMessages);\n\n load.stop();\n\n // Format output\n const title = days === 1 ? 'Your Standup' : `Your Work (Last ${days} Days)`;\n const content = `${standup}\\n\\n${UI.divider()}\\n${UI.dim(`${commits.length} commits analyzed`)}`;\n\n console.log(UI.box(content, title));\n\n // Copy to clipboard\n if (options.copy) {\n await copyToClipboard(standup);\n }\n } catch (error) {\n load.stop();\n console.log(UI.error('Failed to generate standup'));\n console.log(UI.dim((error as Error).message));\n process.exit(1);\n }\n });\n","import simpleGit, { SimpleGit, DiffResult } from 'simple-git';\nimport type { Commit, CommitOptions, DiffStats } from '../types/index.js';\n\nexport class GitAnalyzer {\n private git: SimpleGit;\n\n constructor(repoPath?: string) {\n this.git = simpleGit(repoPath || process.cwd());\n }\n\n async isRepository(): Promise<boolean> {\n try {\n await this.git.revparse(['--is-inside-work-tree']);\n return true;\n } catch {\n return false;\n }\n }\n\n async getCurrentBranch(): Promise<string> {\n const branch = await this.git.revparse(['--abbrev-ref', 'HEAD']);\n return branch.trim();\n }\n\n async getCommits(options: CommitOptions = {}): Promise<Commit[]> {\n const args: string[] = ['log'];\n\n if (options.since) {\n args.push(`--since=${options.since.toISOString()}`);\n }\n\n if (options.until) {\n args.push(`--until=${options.until.toISOString()}`);\n }\n\n if (options.author) {\n args.push(`--author=${options.author}`);\n }\n\n args.push('--format=%H|%s|%b|%an|%ae|%ai');\n\n const result = await this.git.raw(args);\n\n const commits = result\n .trim()\n .split('\\n')\n .filter(Boolean)\n .map((line) => {\n const parts = line.split('|');\n const [hash, message, body, author, _authorEmail, date] = parts;\n return {\n hash,\n message,\n author,\n date: new Date(date),\n body: body || '',\n };\n });\n\n return commits;\n }\n\n async getDiff(base: string = 'main', head: string = 'HEAD'): Promise<string> {\n const diff = await this.git.diff([`${base}...${head}`]);\n return diff;\n }\n\n async getDiffStats(base: string = 'main', head: string = 'HEAD'): Promise<DiffStats> {\n const diffSummary = await this.git.diffSummary([`${base}...${head}`]);\n\n return {\n filesChanged: diffSummary.files.length,\n insertions: diffSummary.insertions,\n deletions: diffSummary.deletions,\n };\n }\n\n async getChangedFiles(base: string = 'main', head: string = 'HEAD'): Promise<string[]> {\n const diff = await this.git.diff([`${base}...${head}`, '--name-only']);\n return diff.split('\\n').filter(Boolean);\n }\n\n async getCurrentUser(): Promise<{ name: string; email: string }> {\n const name = await this.git.getConfig('user.name');\n const email = await this.git.getConfig('user.email');\n\n return {\n name: name.value || '',\n email: email.value || '',\n };\n }\n\n async getStatus(): Promise<{ modified: string[]; untracked: string[] }> {\n const status = await this.git.status();\n\n return {\n modified: status.modified,\n untracked: status.not_added,\n };\n }\n\n async hasUncommittedChanges(): Promise<boolean> {\n const status = await this.git.status();\n return !status.isClean();\n }\n}\n","import { execa } from 'execa';\n\nexport class CopilotClient {\n async isInstalled(): Promise<boolean> {\n try {\n await execa('gh', ['copilot', '--version']);\n return true;\n } catch {\n return false;\n }\n }\n\n async suggest(prompt: string): Promise<string> {\n try {\n const { stdout } = await execa('gh', ['copilot', 'suggest', '-t', 'shell', prompt]);\n\n return this.parseOutput(stdout);\n } catch (error) {\n throw new Error(`Copilot CLI error: ${error}`);\n }\n }\n\n async explain(code: string): Promise<string> {\n try {\n const { stdout } = await execa('gh', ['copilot', 'explain', code]);\n return this.parseOutput(stdout);\n } catch (error) {\n throw new Error(`Copilot CLI error: ${error}`);\n }\n }\n\n private parseOutput(raw: string): string {\n // The gh copilot CLI wraps output in UI elements\n // We need to extract just the AI response\n\n // Remove ANSI codes\n // eslint-disable-next-line no-control-regex\n const cleaned = raw.replace(/\\x1B\\[[0-9;]*[a-zA-Z]/g, '');\n\n // Extract the actual suggestion (between prompts)\n const lines = cleaned.split('\\n');\n const relevantLines = lines.filter(\n (line) =>\n line.trim() &&\n !line.includes('Suggestion:') &&\n !line.includes('Explain command:') &&\n !line.includes('?')\n );\n\n return relevantLines.join('\\n').trim();\n }\n\n async summarizeCommits(commits: string[]): Promise<string> {\n const prompt = `\nYou are helping a developer write their standup notes.\n\nHere are their git commits from yesterday:\n${commits.map((c, i) => `${i + 1}. ${c}`).join('\\n')}\n\nGenerate a professional standup update following this format:\n\nYesterday I:\n- [achievement 1 with impact]\n- [achievement 2 with impact]\n- [achievement 3 with impact]\n\nToday I'm working on:\n- [planned work based on commits]\n\nBlockers: None\n\nRequirements:\n- Make it sound natural and professional\n- Focus on WHAT was accomplished, not HOW\n- Highlight business impact when possible\n- Keep it concise (3-5 bullet points max)\n- No emojis\n`;\n\n return this.suggest(prompt);\n }\n\n async generatePRDescription(data: {\n branch: string;\n commits: string[];\n files: string[];\n issues: string[];\n }): Promise<string> {\n const prompt = `\nYou are helping a developer create a Pull Request description.\n\nBranch: ${data.branch}\n\nCommits:\n${data.commits.map((c, i) => `${i + 1}. ${c}`).join('\\n')}\n\nFiles changed:\n${data.files.join('\\n')}\n\nRelated issues: ${data.issues.length > 0 ? data.issues.join(', ') : 'None'}\n\nGenerate a comprehensive PR description following this template:\n\n## What Changed\n- [bullet point 1]\n- [bullet point 2]\n- [bullet point 3]\n\n## Why\n[Business or technical reason for these changes]\n${data.issues.length > 0 ? `Closes ${data.issues.join(', ')}` : ''}\n\n## How to Test\n1. [testing step 1]\n2. [testing step 2]\n3. [testing step 3]\n\nRequirements:\n- Be specific and technical where appropriate\n- Focus on value for code reviewers\n- Keep it clear and concise\n- No emojis\n`;\n\n return this.suggest(prompt);\n }\n\n async generateWeeklySummary(data: {\n commits: string[];\n stats: {\n commits: number;\n linesAdded: number;\n linesRemoved: number;\n };\n }): Promise<string> {\n const prompt = `\nYou are helping a developer create their weekly work summary.\n\nThis week's commits:\n${data.commits.map((c, i) => `${i + 1}. ${c}`).join('\\n')}\n\nStatistics:\n- ${data.stats.commits} commits\n- ${data.stats.linesAdded} lines added\n- ${data.stats.linesRemoved} lines removed\n\nGenerate a professional weekly summary following this format:\n\nKey Accomplishments:\n1. [Major accomplishment with impact]\n2. [Second accomplishment]\n3. [Third accomplishment]\n4. [Fourth accomplishment]\n5. [Fifth accomplishment]\n\nTop Achievement:\n[Single sentence highlighting the most impactful work]\n\nRequirements:\n- Focus on business value and impact\n- Be suitable for sharing with manager or team\n- Highlight 3-5 key accomplishments\n- Keep it professional\n- No emojis\n`;\n\n return this.suggest(prompt);\n }\n}\n","import chalk from 'chalk';\nimport boxen from 'boxen';\n\n// Clean, minimal UI inspired by terminal.shop\n// No emojis, professional output\n\nexport class UI {\n static readonly colors = {\n primary: chalk.blue,\n success: chalk.green,\n warning: chalk.yellow,\n error: chalk.red,\n dim: chalk.gray,\n bold: chalk.bold,\n };\n\n static header(title: string): string {\n return this.colors.bold(title);\n }\n\n static section(title: string, content: string): string {\n return `\\n${this.colors.primary(title)}\\n${content}`;\n }\n\n static box(content: string, title?: string): string {\n return boxen(content, {\n padding: 1,\n margin: 1,\n borderStyle: 'round',\n borderColor: 'blue',\n title: title,\n titleAlignment: 'left',\n });\n }\n\n static list(items: string[]): string {\n return items.map((item) => ` ${this.colors.dim('>')} ${item}`).join('\\n');\n }\n\n static success(message: string): string {\n return this.colors.success(`✓ ${message}`);\n }\n\n static error(message: string): string {\n return this.colors.error(`✗ ${message}`);\n }\n\n static warning(message: string): string {\n return this.colors.warning(`! ${message}`);\n }\n\n static info(message: string): string {\n return this.colors.dim(`i ${message}`);\n }\n\n static divider(): string {\n return this.colors.dim('─'.repeat(50));\n }\n\n static dim(text: string): string {\n return this.colors.dim(text);\n }\n\n static table(headers: string[], rows: string[][]): string {\n const colWidths = headers.map((h, i) => {\n const maxRowWidth = Math.max(...rows.map((r) => r[i]?.length || 0));\n return Math.max(h.length, maxRowWidth);\n });\n\n const headerRow = headers.map((h, i) => h.padEnd(colWidths[i])).join(' ');\n\n const separator = colWidths.map((w) => '─'.repeat(w)).join(' ');\n\n const dataRows = rows\n .map((row) => row.map((cell, i) => cell.padEnd(colWidths[i])).join(' '))\n .join('\\n');\n\n return `${this.colors.bold(headerRow)}\\n${this.colors.dim(separator)}\\n${dataRows}`;\n }\n\n static progress(current: number, total: number, label: string): string {\n const percentage = Math.round((current / total) * 100);\n const barLength = 30;\n const filled = Math.round((barLength * current) / total);\n const bar = '█'.repeat(filled) + '░'.repeat(barLength - filled);\n\n return `${label} ${this.colors.primary(bar)} ${percentage}%`;\n }\n}\n","import ora from 'ora';\nimport clipboard from 'clipboardy';\nimport { UI } from './ui.js';\n\nexport async function copyToClipboard(text: string): Promise<void> {\n try {\n await clipboard.write(text);\n console.log(UI.success('Copied to clipboard'));\n } catch {\n console.log(UI.warning('Failed to copy to clipboard'));\n }\n}\n\nexport function spinner(text: string) {\n return ora({\n text,\n spinner: 'dots',\n color: 'blue',\n });\n}\n\nexport function formatDate(date: Date): string {\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n}\n\nexport function formatDateRange(start: Date, end: Date): string {\n return `${formatDate(start)} - ${formatDate(end)}`;\n}\n\nexport function getWeekStart(weeksAgo: number = 0): Date {\n const now = new Date();\n const dayOfWeek = now.getDay();\n const monday = new Date(now);\n monday.setDate(now.getDate() - dayOfWeek + (dayOfWeek === 0 ? -6 : 1));\n monday.setDate(monday.getDate() - weeksAgo * 7);\n monday.setHours(0, 0, 0, 0);\n return monday;\n}\n\nexport function getWeekEnd(weeksAgo: number = 0): Date {\n const start = getWeekStart(weeksAgo);\n const end = new Date(start);\n end.setDate(start.getDate() + 6);\n end.setHours(23, 59, 59, 999);\n return end;\n}\n\nexport function getDaysAgo(days: number): Date {\n const date = new Date();\n date.setDate(date.getDate() - days);\n date.setHours(0, 0, 0, 0);\n return date;\n}\n","import { Command } from 'commander';\nimport inquirer from 'inquirer';\nimport { execa } from 'execa';\nimport open from 'open';\nimport { GitAnalyzer } from '../core/git-analyzer.js';\nimport { CopilotClient } from '../core/copilot.js';\nimport { UI } from '../utils/ui.js';\nimport { spinner, copyToClipboard } from '../utils/helpers.js';\nimport { extractIssueNumbers, generatePRTitle, categorizePRType } from '../utils/commitlint.js';\n\nexport const prCommand = new Command('pr')\n .description('Generate PR description from current branch')\n .option('-b, --base <branch>', 'Base branch to compare against', 'main')\n .option('-c, --create', 'Create PR on GitHub')\n .option('-d, --draft', 'Create as draft PR')\n .option('-e, --edit', 'Edit description before creating')\n .action(async (options) => {\n const git = new GitAnalyzer();\n const copilot = new CopilotClient();\n\n // Check if in git repo\n if (!(await git.isRepository())) {\n console.log(UI.error('Not a git repository'));\n process.exit(1);\n }\n\n // Check if Copilot CLI is installed\n if (!(await copilot.isInstalled())) {\n console.log(UI.error('GitHub Copilot CLI not found'));\n console.log(UI.info('Install with: gh extension install github/gh-copilot'));\n process.exit(1);\n }\n\n const load = spinner('Analyzing branch...').start();\n\n try {\n // Get current branch\n const currentBranch = await git.getCurrentBranch();\n\n if (currentBranch === options.base) {\n load.stop();\n console.log(UI.error(`Cannot create PR from ${options.base} branch`));\n console.log(UI.info('Switch to a feature branch first'));\n process.exit(1);\n }\n\n // Get commits on this branch\n const commits = await git.getCommits();\n\n if (commits.length === 0) {\n load.stop();\n console.log(UI.warning('No commits on this branch'));\n process.exit(0);\n }\n\n // Get changed files\n const files = await git.getChangedFiles(options.base);\n\n // Extract issue numbers\n const commitMessages = commits.map((c) => c.message);\n const allText = commitMessages.join(' ');\n const issues = extractIssueNumbers(allText);\n\n // Generate PR title from commits\n const suggestedTitle = generatePRTitle(commitMessages);\n const prType = categorizePRType(commitMessages);\n\n load.text = 'Generating PR description with Copilot CLI...';\n\n // Generate description\n const description = await copilot.generatePRDescription({\n branch: currentBranch,\n commits: commitMessages,\n files,\n issues,\n });\n\n load.stop();\n\n // Display\n console.log(\n UI.box(\n `${UI.colors.bold(suggestedTitle)}\\n\\n${description}\\n\\n${UI.divider()}\\n${UI.dim(`${commits.length} commits • ${files.length} files changed • ${prType}`)}`,\n `PR Description for ${currentBranch}`\n )\n );\n\n // Interactive options\n const { action } = await inquirer.prompt([\n {\n type: 'list',\n name: 'action',\n message: 'What would you like to do?',\n choices: [\n { name: 'Preview in browser (render markdown)', value: 'preview' },\n { name: 'Copy to clipboard', value: 'copy' },\n { name: 'Create PR on GitHub', value: 'create' },\n { name: 'Create draft PR', value: 'draft' },\n { name: 'Exit', value: 'exit' },\n ],\n },\n ]);\n\n if (action === 'copy') {\n await copyToClipboard(description);\n } else if (action === 'preview') {\n // Create temporary markdown file and open in browser\n console.log(UI.info('Opening preview in browser...'));\n // TODO: Implement preview (save to temp file, open with `open` package)\n await open(`https://github.com`);\n } else if (action === 'create' || action === 'draft') {\n const isDraft = action === 'draft' || options.draft;\n\n const createSpinner = spinner(`Creating ${isDraft ? 'draft ' : ''}PR...`).start();\n\n try {\n const args = [\n 'pr',\n 'create',\n '--title',\n suggestedTitle,\n '--body',\n description,\n '--base',\n options.base,\n ];\n\n if (isDraft) {\n args.push('--draft');\n }\n\n const { stdout } = await execa('gh', args);\n\n createSpinner.stop();\n console.log(UI.success('PR created successfully'));\n console.log(UI.dim(stdout));\n } catch (error) {\n createSpinner.stop();\n console.log(UI.error('Failed to create PR'));\n console.log(UI.dim((error as Error).message));\n }\n }\n } catch (error) {\n load.stop();\n console.log(UI.error('Failed to generate PR description'));\n console.log(UI.dim((error as Error).message));\n process.exit(1);\n }\n });\n","import type { ConventionalCommit } from '../types/index.js';\n\nconst COMMIT_PATTERN =\n // eslint-disable-next-line no-useless-escape\n /^(feat|fix|docs|style|refactor|test|chore|perf|ci|build|revert)(\\([^\\)]+\\))?(!)?:\\s*(.+)$/;\n\nexport function parseConventionalCommit(message: string): ConventionalCommit | null {\n const match = message.match(COMMIT_PATTERN);\n\n if (!match) {\n return null;\n }\n\n const [, type, scope, breaking, subject] = match;\n\n return {\n type: type as ConventionalCommit['type'],\n scope: scope?.replace(/[()]/g, ''),\n subject: subject.trim(),\n breaking: breaking === '!',\n };\n}\n\nexport function extractIssueNumbers(text: string): string[] {\n const issuePattern = /#(\\d+)/g;\n const matches = text.matchAll(issuePattern);\n return Array.from(matches, (m) => `#${m[1]}`);\n}\n\nexport function generatePRTitle(commits: string[]): string {\n // Try to parse conventional commits\n const parsed = commits\n .map(parseConventionalCommit)\n .filter((c): c is ConventionalCommit => c !== null);\n\n if (parsed.length === 0) {\n // Fallback: use first commit message\n return commits[0] || 'Update';\n }\n\n // Group by type\n const features = parsed.filter((c) => c.type === 'feat');\n const fixes = parsed.filter((c) => c.type === 'fix');\n\n if (features.length > 0) {\n return features[0].subject;\n }\n\n if (fixes.length > 0) {\n return `Fix: ${fixes[0].subject}`;\n }\n\n return parsed[0].subject;\n}\n\nexport function categorizePRType(commits: string[]): string {\n const parsed = commits\n .map(parseConventionalCommit)\n .filter((c): c is ConventionalCommit => c !== null);\n\n const hasFeatures = parsed.some((c) => c.type === 'feat');\n const hasFixes = parsed.some((c) => c.type === 'fix');\n const hasBreaking = parsed.some((c) => c.breaking);\n\n if (hasBreaking) return 'breaking';\n if (hasFeatures) return 'feature';\n if (hasFixes) return 'bugfix';\n return 'chore';\n}\n","import { Command } from 'commander';\nimport { GitAnalyzer } from '../core/git-analyzer.js';\nimport { CopilotClient } from '../core/copilot.js';\nimport { UI } from '../utils/ui.js';\nimport {\n spinner,\n copyToClipboard,\n getWeekStart,\n getWeekEnd,\n formatDateRange,\n} from '../utils/helpers.js';\n\nexport const weekCommand = new Command('week')\n .description('Generate weekly work summary')\n .option('-l, --last', 'Last week instead of current week')\n .option('--no-copy', 'Do not copy to clipboard')\n .action(async (options) => {\n const git = new GitAnalyzer();\n const copilot = new CopilotClient();\n\n // Check if in git repo\n if (!(await git.isRepository())) {\n console.log(UI.error('Not a git repository'));\n process.exit(1);\n }\n\n // Check if Copilot CLI is installed\n if (!(await copilot.isInstalled())) {\n console.log(UI.error('GitHub Copilot CLI not found'));\n process.exit(1);\n }\n\n const load = spinner('Analyzing your week...').start();\n\n try {\n const weeksAgo = options.last ? 1 : 0;\n const start = getWeekStart(weeksAgo);\n const end = getWeekEnd(weeksAgo);\n\n // Get user info\n const user = await git.getCurrentUser();\n\n // Get commits\n const commits = await git.getCommits({\n since: start,\n until: end,\n author: user.email,\n });\n\n if (commits.length === 0) {\n load.stop();\n console.log(UI.warning('No commits found this week'));\n process.exit(0);\n }\n\n // Get stats\n const stats = await git.getDiffStats();\n\n load.text = 'Generating summary with Copilot CLI...';\n\n // Generate summary\n const commitMessages = commits.map((c) => c.message);\n const summary = await copilot.generateWeeklySummary({\n commits: commitMessages,\n stats: {\n commits: commits.length,\n linesAdded: stats.insertions,\n linesRemoved: stats.deletions,\n },\n });\n\n load.stop();\n\n // Display\n const title = `Week in Review (${formatDateRange(start, end)})`;\n const content = `${summary}\\n\\n${UI.divider()}\\n${UI.dim(`${commits.length} commits • ${stats.insertions}+ ${stats.deletions}- lines`)}`;\n\n console.log(UI.box(content, title));\n\n // Copy to clipboard\n if (options.copy) {\n await copyToClipboard(summary);\n }\n } catch (error) {\n load.stop();\n console.log(UI.error('Failed to generate weekly summary'));\n console.log(UI.dim((error as Error).message));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport { UI } from '../utils/ui.js';\n\nexport const contextCommand = new Command('context')\n .description('Recover what you were working on (coming soon)')\n .action(async () => {\n console.log(UI.info('Context recovery feature coming soon!'));\n console.log(UI.dim('This will help you remember what you were working on after interruptions'));\n });\n"],"mappings":"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","names":["Command","Command","execa","Command","execa","Command","Command","Command","Command","Command"]}
|