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 CHANGED
@@ -1,112 +1,400 @@
1
+ <div align="center">
2
+
1
3
  # DevDaily AI
2
4
 
3
- > Your AI memory for developer work
5
+ **Your AI-powered developer memory**
6
+
7
+ Auto-generate standup notes, PR descriptions, and weekly summaries from your git history.
8
+
9
+ [![NPM Version](https://img.shields.io/npm/v/devdaily-ai)](https://www.npmjs.com/package/devdaily-ai)
10
+ [![Node Version](https://img.shields.io/node/v/devdaily-ai)](https://nodejs.org)
11
+ [![License](https://img.shields.io/npm/l/devdaily-ai)](LICENSE)
12
+ [![GitHub Stars](https://img.shields.io/github/stars/hempun10/devdaily)](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
- Never forget what you did. Auto-generate PR descriptions, standup notes, and work summaries from your git history.
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
- - **Standup Generator** - Yesterday's work in 30 seconds
10
- - **PR Descriptions** - AI-generated from your commits
11
- - **Weekly Summaries** - Track your impact over time
12
- - **Smart Context** - Remember what you were working on
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
- # Create PR description
95
+ # Generate PR description
27
96
  devdaily pr
28
97
 
29
- # Weekly summary
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
- devdaily standup # Yesterday's work
41
- devdaily standup --days=3 # Last 3 days
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
- devdaily pr # Generate description
51
- devdaily pr --create # Create PR on GitHub
52
- devdaily pr --draft # Create as draft
53
- devdaily pr --base=develop # Compare to develop
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
- Get a weekly summary of your work.
182
+ Generate weekly summary of your accomplishments.
59
183
 
60
184
  ```bash
61
- devdaily week # Current week
62
- devdaily week --last # Last 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
- ## Requirements
198
+ **Options:**
66
199
 
67
- - Node.js >= 18
68
- - Git repository
69
- - GitHub CLI (`gh`) with Copilot extension
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
- ## Setup
204
+ ### `devdaily context`
72
205
 
73
- 1. Install GitHub CLI:
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
- gh extension install github/gh-copilot
82
- gh auth login
209
+ devdaily context --days=7
83
210
  ```
84
211
 
85
- 3. Install DevDaily:
86
- ```bash
87
- npm install -g devdaily-ai
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 repo
94
- git clone https://github.com/yourusername/devdaily-ai
95
- cd devdaily-ai
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 dev mode
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
- #!/usr/bin/env node
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 logOptions = {
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
- logOptions.from = options.since.toISOString();
31
+ args.push(`--since=${options.since.toISOString()}`);
41
32
  }
42
33
  if (options.until) {
43
- logOptions.to = options.until.toISOString();
34
+ args.push(`--until=${options.until.toISOString()}`);
44
35
  }
45
36
  if (options.author) {
46
- logOptions.author = options.author;
37
+ args.push(`--author=${options.author}`);
47
38
  }
48
- const log = await this.git.log(logOptions);
49
- return log.all.map((commit) => ({
50
- hash: commit.hash,
51
- message: commit.message,
52
- author: commit.author,
53
- date: new Date(commit.date),
54
- body: commit.body
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":";;;AAAA,SAAS,WAAAA,gBAAe;;;ACAxB,SAAS,eAAe;;;ACAxB,OAAO,eAA0C;AAG1C,IAAM,cAAN,MAAkB;AAAA,EACf;AAAA,EAER,YAAY,UAAmB;AAC7B,SAAK,MAAM,UAAU,YAAY,QAAQ,IAAI,CAAC;AAAA,EAChD;AAAA,EAEA,MAAM,eAAiC;AACrC,QAAI;AACF,YAAM,KAAK,IAAI,SAAS,CAAC,uBAAuB,CAAC;AACjD,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,mBAAoC;AACxC,UAAM,SAAS,MAAM,KAAK,IAAI,SAAS,CAAC,gBAAgB,MAAM,CAAC;AAC/D,WAAO,OAAO,KAAK;AAAA,EACrB;AAAA,EAEA,MAAM,WAAW,UAAyB,CAAC,GAAsB;AAC/D,UAAM,OAAiB,CAAC,KAAK;AAE7B,QAAI,QAAQ,OAAO;AACjB,WAAK,KAAK,WAAW,QAAQ,MAAM,YAAY,CAAC,EAAE;AAAA,IACpD;AAEA,QAAI,QAAQ,OAAO;AACjB,WAAK,KAAK,WAAW,QAAQ,MAAM,YAAY,CAAC,EAAE;AAAA,IACpD;AAEA,QAAI,QAAQ,QAAQ;AAClB,WAAK,KAAK,YAAY,QAAQ,MAAM,EAAE;AAAA,IACxC;AAEA,SAAK,KAAK,+BAA+B;AAEzC,UAAM,SAAS,MAAM,KAAK,IAAI,IAAI,IAAI;AAEtC,UAAM,UAAU,OACb,KAAK,EACL,MAAM,IAAI,EACV,OAAO,OAAO,EACd,IAAI,CAAC,SAAS;AACb,YAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,YAAM,CAAC,MAAM,SAAS,MAAM,QAAQ,cAAc,IAAI,IAAI;AAC1D,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM,IAAI,KAAK,IAAI;AAAA,QACnB,MAAM,QAAQ;AAAA,MAChB;AAAA,IACF,CAAC;AAEH,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,OAAe,QAAQ,OAAe,QAAyB;AAC3E,UAAM,OAAO,MAAM,KAAK,IAAI,KAAK,CAAC,GAAG,IAAI,MAAM,IAAI,EAAE,CAAC;AACtD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,OAAe,QAAQ,OAAe,QAA4B;AACnF,UAAM,cAAc,MAAM,KAAK,IAAI,YAAY,CAAC,GAAG,IAAI,MAAM,IAAI,EAAE,CAAC;AAEpE,WAAO;AAAA,MACL,cAAc,YAAY,MAAM;AAAA,MAChC,YAAY,YAAY;AAAA,MACxB,WAAW,YAAY;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,OAAe,QAAQ,OAAe,QAA2B;AACrF,UAAM,OAAO,MAAM,KAAK,IAAI,KAAK,CAAC,GAAG,IAAI,MAAM,IAAI,IAAI,aAAa,CAAC;AACrE,WAAO,KAAK,MAAM,IAAI,EAAE,OAAO,OAAO;AAAA,EACxC;AAAA,EAEA,MAAM,iBAA2D;AAC/D,UAAM,OAAO,MAAM,KAAK,IAAI,UAAU,WAAW;AACjD,UAAM,QAAQ,MAAM,KAAK,IAAI,UAAU,YAAY;AAEnD,WAAO;AAAA,MACL,MAAM,KAAK,SAAS;AAAA,MACpB,OAAO,MAAM,SAAS;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAM,YAAkE;AACtE,UAAM,SAAS,MAAM,KAAK,IAAI,OAAO;AAErC,WAAO;AAAA,MACL,UAAU,OAAO;AAAA,MACjB,WAAW,OAAO;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAM,wBAA0C;AAC9C,UAAM,SAAS,MAAM,KAAK,IAAI,OAAO;AACrC,WAAO,CAAC,OAAO,QAAQ;AAAA,EACzB;AACF;;;ACzGA,SAAS,aAAa;AAEf,IAAM,gBAAN,MAAoB;AAAA,EACzB,MAAM,cAAgC;AACpC,QAAI;AACF,YAAM,MAAM,MAAM,CAAC,WAAW,WAAW,CAAC;AAC1C,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,QAAiC;AAC7C,QAAI;AACF,YAAM,EAAE,OAAO,IAAI,MAAM,MAAM,MAAM,CAAC,WAAW,WAAW,MAAM,SAAS,MAAM,CAAC;AAElF,aAAO,KAAK,YAAY,MAAM;AAAA,IAChC,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,sBAAsB,KAAK,EAAE;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,MAA+B;AAC3C,QAAI;AACF,YAAM,EAAE,OAAO,IAAI,MAAM,MAAM,MAAM,CAAC,WAAW,WAAW,IAAI,CAAC;AACjE,aAAO,KAAK,YAAY,MAAM;AAAA,IAChC,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,sBAAsB,KAAK,EAAE;AAAA,IAC/C;AAAA,EACF;AAAA,EAEQ,YAAY,KAAqB;AAMvC,UAAM,UAAU,IAAI,QAAQ,0BAA0B,EAAE;AAGxD,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,UAAM,gBAAgB,MAAM;AAAA,MAC1B,CAAC,SACC,KAAK,KAAK,KACV,CAAC,KAAK,SAAS,aAAa,KAC5B,CAAC,KAAK,SAAS,kBAAkB,KACjC,CAAC,KAAK,SAAS,GAAG;AAAA,IACtB;AAEA,WAAO,cAAc,KAAK,IAAI,EAAE,KAAK;AAAA,EACvC;AAAA,EAEA,MAAM,iBAAiB,SAAoC;AACzD,UAAM,SAAS;AAAA;AAAA;AAAA;AAAA,EAIjB,QAAQ,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBhD,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC5B;AAAA,EAEA,MAAM,sBAAsB,MAKR;AAClB,UAAM,SAAS;AAAA;AAAA;AAAA,UAGT,KAAK,MAAM;AAAA;AAAA;AAAA,EAGnB,KAAK,QAAQ,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,EAGvD,KAAK,MAAM,KAAK,IAAI,CAAC;AAAA;AAAA,kBAEL,KAAK,OAAO,SAAS,IAAI,KAAK,OAAO,KAAK,IAAI,IAAI,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWxE,KAAK,OAAO,SAAS,IAAI,UAAU,KAAK,OAAO,KAAK,IAAI,CAAC,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAc9D,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC5B;AAAA,EAEA,MAAM,sBAAsB,MAOR;AAClB,UAAM,SAAS;AAAA;AAAA;AAAA;AAAA,EAIjB,KAAK,QAAQ,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,IAGrD,KAAK,MAAM,OAAO;AAAA,IAClB,KAAK,MAAM,UAAU;AAAA,IACrB,KAAK,MAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBvB,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC5B;AACF;;;ACxKA,OAAO,WAAW;AAClB,OAAO,WAAW;AAKX,IAAM,KAAN,MAAS;AAAA,EACd,OAAgB,SAAS;AAAA,IACvB,SAAS,MAAM;AAAA,IACf,SAAS,MAAM;AAAA,IACf,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,IACb,KAAK,MAAM;AAAA,IACX,MAAM,MAAM;AAAA,EACd;AAAA,EAEA,OAAO,OAAO,OAAuB;AACnC,WAAO,KAAK,OAAO,KAAK,KAAK;AAAA,EAC/B;AAAA,EAEA,OAAO,QAAQ,OAAe,SAAyB;AACrD,WAAO;AAAA,EAAK,KAAK,OAAO,QAAQ,KAAK,CAAC;AAAA,EAAK,OAAO;AAAA,EACpD;AAAA,EAEA,OAAO,IAAI,SAAiB,OAAwB;AAClD,WAAO,MAAM,SAAS;AAAA,MACpB,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,aAAa;AAAA,MACb;AAAA,MACA,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,KAAK,OAAyB;AACnC,WAAO,MAAM,IAAI,CAAC,SAAS,KAAK,KAAK,OAAO,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,KAAK,IAAI;AAAA,EAC3E;AAAA,EAEA,OAAO,QAAQ,SAAyB;AACtC,WAAO,KAAK,OAAO,QAAQ,UAAK,OAAO,EAAE;AAAA,EAC3C;AAAA,EAEA,OAAO,MAAM,SAAyB;AACpC,WAAO,KAAK,OAAO,MAAM,UAAK,OAAO,EAAE;AAAA,EACzC;AAAA,EAEA,OAAO,QAAQ,SAAyB;AACtC,WAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,EAAE;AAAA,EAC3C;AAAA,EAEA,OAAO,KAAK,SAAyB;AACnC,WAAO,KAAK,OAAO,IAAI,KAAK,OAAO,EAAE;AAAA,EACvC;AAAA,EAEA,OAAO,UAAkB;AACvB,WAAO,KAAK,OAAO,IAAI,SAAI,OAAO,EAAE,CAAC;AAAA,EACvC;AAAA,EAEA,OAAO,IAAI,MAAsB;AAC/B,WAAO,KAAK,OAAO,IAAI,IAAI;AAAA,EAC7B;AAAA,EAEA,OAAO,MAAM,SAAmB,MAA0B;AACxD,UAAM,YAAY,QAAQ,IAAI,CAAC,GAAG,MAAM;AACtC,YAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC;AAClE,aAAO,KAAK,IAAI,EAAE,QAAQ,WAAW;AAAA,IACvC,CAAC;AAED,UAAM,YAAY,QAAQ,IAAI,CAAC,GAAG,MAAM,EAAE,OAAO,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI;AAEzE,UAAM,YAAY,UAAU,IAAI,CAAC,MAAM,SAAI,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI;AAE/D,UAAM,WAAW,KACd,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,MAAM,KAAK,OAAO,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EACvE,KAAK,IAAI;AAEZ,WAAO,GAAG,KAAK,OAAO,KAAK,SAAS,CAAC;AAAA,EAAK,KAAK,OAAO,IAAI,SAAS,CAAC;AAAA,EAAK,QAAQ;AAAA,EACnF;AAAA,EAEA,OAAO,SAAS,SAAiB,OAAe,OAAuB;AACrE,UAAM,aAAa,KAAK,MAAO,UAAU,QAAS,GAAG;AACrD,UAAM,YAAY;AAClB,UAAM,SAAS,KAAK,MAAO,YAAY,UAAW,KAAK;AACvD,UAAM,MAAM,SAAI,OAAO,MAAM,IAAI,SAAI,OAAO,YAAY,MAAM;AAE9D,WAAO,GAAG,KAAK,IAAI,KAAK,OAAO,QAAQ,GAAG,CAAC,IAAI,UAAU;AAAA,EAC3D;AACF;;;ACxFA,OAAO,SAAS;AAChB,OAAO,eAAe;AAGtB,eAAsB,gBAAgB,MAA6B;AACjE,MAAI;AACF,UAAM,UAAU,MAAM,IAAI;AAC1B,YAAQ,IAAI,GAAG,QAAQ,qBAAqB,CAAC;AAAA,EAC/C,QAAQ;AACN,YAAQ,IAAI,GAAG,QAAQ,6BAA6B,CAAC;AAAA,EACvD;AACF;AAEO,SAAS,QAAQ,MAAc;AACpC,SAAO,IAAI;AAAA,IACT;AAAA,IACA,SAAS;AAAA,IACT,OAAO;AAAA,EACT,CAAC;AACH;AAEO,SAAS,WAAW,MAAoB;AAC7C,SAAO,KAAK,mBAAmB,SAAS;AAAA,IACtC,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,EACR,CAAC;AACH;AAEO,SAAS,gBAAgB,OAAa,KAAmB;AAC9D,SAAO,GAAG,WAAW,KAAK,CAAC,MAAM,WAAW,GAAG,CAAC;AAClD;AAEO,SAAS,aAAa,WAAmB,GAAS;AACvD,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,YAAY,IAAI,OAAO;AAC7B,QAAM,SAAS,IAAI,KAAK,GAAG;AAC3B,SAAO,QAAQ,IAAI,QAAQ,IAAI,aAAa,cAAc,IAAI,KAAK,EAAE;AACrE,SAAO,QAAQ,OAAO,QAAQ,IAAI,WAAW,CAAC;AAC9C,SAAO,SAAS,GAAG,GAAG,GAAG,CAAC;AAC1B,SAAO;AACT;AAEO,SAAS,WAAW,WAAmB,GAAS;AACrD,QAAM,QAAQ,aAAa,QAAQ;AACnC,QAAM,MAAM,IAAI,KAAK,KAAK;AAC1B,MAAI,QAAQ,MAAM,QAAQ,IAAI,CAAC;AAC/B,MAAI,SAAS,IAAI,IAAI,IAAI,GAAG;AAC5B,SAAO;AACT;AAEO,SAAS,WAAW,MAAoB;AAC7C,QAAM,OAAO,oBAAI,KAAK;AACtB,OAAK,QAAQ,KAAK,QAAQ,IAAI,IAAI;AAClC,OAAK,SAAS,GAAG,GAAG,GAAG,CAAC;AACxB,SAAO;AACT;;;AJlDO,IAAM,iBAAiB,IAAI,QAAQ,SAAS,EAChD,YAAY,iDAAiD,EAC7D,OAAO,uBAAuB,+BAA+B,GAAG,EAChE,OAAO,uBAAuB,wCAAwC,UAAU,EAChF,OAAO,aAAa,0BAA0B,EAC9C,OAAO,OAAO,YAAY;AACzB,QAAM,MAAM,IAAI,YAAY;AAC5B,QAAM,UAAU,IAAI,cAAc;AAGlC,MAAI,CAAE,MAAM,IAAI,aAAa,GAAI;AAC/B,YAAQ,IAAI,GAAG,MAAM,sBAAsB,CAAC;AAC5C,YAAQ,IAAI,GAAG,KAAK,0CAA0C,CAAC;AAC/D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,CAAE,MAAM,QAAQ,YAAY,GAAI;AAClC,YAAQ,IAAI,GAAG,MAAM,8BAA8B,CAAC;AACpD,YAAQ,IAAI,GAAG,KAAK,sDAAsD,CAAC;AAC3E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,OAAO,QAAQ,wBAAwB,EAAE,MAAM;AAErD,MAAI;AAEF,UAAM,OAAO,SAAS,QAAQ,MAAM,EAAE;AACtC,UAAM,QAAQ,WAAW,IAAI;AAC7B,UAAM,UAAU,MAAM,IAAI,WAAW;AAAA,MACnC;AAAA,IACF,CAAC;AAED,QAAI,QAAQ,WAAW,GAAG;AACxB,WAAK,KAAK;AACV,cAAQ,IAAI,GAAG,QAAQ,gCAAgC,IAAI,SAAS,CAAC;AACrE,cAAQ,IAAI,GAAG,KAAK,gCAAgC,OAAO,CAAC,EAAE,CAAC;AAC/D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,SAAK,OAAO;AAGZ,UAAM,iBAAiB,QAAQ,IAAI,CAAC,MAAM,EAAE,OAAO;AACnD,UAAM,UAAU,MAAM,QAAQ,iBAAiB,cAAc;AAE7D,SAAK,KAAK;AAGV,UAAM,QAAQ,SAAS,IAAI,iBAAiB,mBAAmB,IAAI;AACnE,UAAM,UAAU,GAAG,OAAO;AAAA;AAAA,EAAO,GAAG,QAAQ,CAAC;AAAA,EAAK,GAAG,IAAI,GAAG,QAAQ,MAAM,mBAAmB,CAAC;AAE9F,YAAQ,IAAI,GAAG,IAAI,SAAS,KAAK,CAAC;AAGlC,QAAI,QAAQ,MAAM;AAChB,YAAM,gBAAgB,OAAO;AAAA,IAC/B;AAAA,EACF,SAAS,OAAO;AACd,SAAK,KAAK;AACV,YAAQ,IAAI,GAAG,MAAM,4BAA4B,CAAC;AAClD,YAAQ,IAAI,GAAG,IAAK,MAAgB,OAAO,CAAC;AAC5C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;;;AKtEH,SAAS,WAAAC,gBAAe;AACxB,OAAO,cAAc;AACrB,SAAS,SAAAC,cAAa;AACtB,OAAO,UAAU;;;ACDjB,IAAM;AAAA;AAAA,EAEJ;AAAA;AAEK,SAAS,wBAAwB,SAA4C;AAClF,QAAM,QAAQ,QAAQ,MAAM,cAAc;AAE1C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,EAAE,MAAM,OAAO,UAAU,OAAO,IAAI;AAE3C,SAAO;AAAA,IACL;AAAA,IACA,OAAO,OAAO,QAAQ,SAAS,EAAE;AAAA,IACjC,SAAS,QAAQ,KAAK;AAAA,IACtB,UAAU,aAAa;AAAA,EACzB;AACF;AAEO,SAAS,oBAAoB,MAAwB;AAC1D,QAAM,eAAe;AACrB,QAAM,UAAU,KAAK,SAAS,YAAY;AAC1C,SAAO,MAAM,KAAK,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE;AAC9C;AAEO,SAAS,gBAAgB,SAA2B;AAEzD,QAAM,SAAS,QACZ,IAAI,uBAAuB,EAC3B,OAAO,CAAC,MAA+B,MAAM,IAAI;AAEpD,MAAI,OAAO,WAAW,GAAG;AAEvB,WAAO,QAAQ,CAAC,KAAK;AAAA,EACvB;AAGA,QAAM,WAAW,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AACvD,QAAM,QAAQ,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK;AAEnD,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO,SAAS,CAAC,EAAE;AAAA,EACrB;AAEA,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO,QAAQ,MAAM,CAAC,EAAE,OAAO;AAAA,EACjC;AAEA,SAAO,OAAO,CAAC,EAAE;AACnB;AAEO,SAAS,iBAAiB,SAA2B;AAC1D,QAAM,SAAS,QACZ,IAAI,uBAAuB,EAC3B,OAAO,CAAC,MAA+B,MAAM,IAAI;AAEpD,QAAM,cAAc,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AACxD,QAAM,WAAW,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK;AACpD,QAAM,cAAc,OAAO,KAAK,CAAC,MAAM,EAAE,QAAQ;AAEjD,MAAI,YAAa,QAAO;AACxB,MAAI,YAAa,QAAO;AACxB,MAAI,SAAU,QAAO;AACrB,SAAO;AACT;;;AD1DO,IAAM,YAAY,IAAIC,SAAQ,IAAI,EACtC,YAAY,6CAA6C,EACzD,OAAO,uBAAuB,kCAAkC,MAAM,EACtE,OAAO,gBAAgB,qBAAqB,EAC5C,OAAO,eAAe,oBAAoB,EAC1C,OAAO,cAAc,kCAAkC,EACvD,OAAO,OAAO,YAAY;AACzB,QAAM,MAAM,IAAI,YAAY;AAC5B,QAAM,UAAU,IAAI,cAAc;AAGlC,MAAI,CAAE,MAAM,IAAI,aAAa,GAAI;AAC/B,YAAQ,IAAI,GAAG,MAAM,sBAAsB,CAAC;AAC5C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,CAAE,MAAM,QAAQ,YAAY,GAAI;AAClC,YAAQ,IAAI,GAAG,MAAM,8BAA8B,CAAC;AACpD,YAAQ,IAAI,GAAG,KAAK,sDAAsD,CAAC;AAC3E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,OAAO,QAAQ,qBAAqB,EAAE,MAAM;AAElD,MAAI;AAEF,UAAM,gBAAgB,MAAM,IAAI,iBAAiB;AAEjD,QAAI,kBAAkB,QAAQ,MAAM;AAClC,WAAK,KAAK;AACV,cAAQ,IAAI,GAAG,MAAM,yBAAyB,QAAQ,IAAI,SAAS,CAAC;AACpE,cAAQ,IAAI,GAAG,KAAK,kCAAkC,CAAC;AACvD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,UAAU,MAAM,IAAI,WAAW;AAErC,QAAI,QAAQ,WAAW,GAAG;AACxB,WAAK,KAAK;AACV,cAAQ,IAAI,GAAG,QAAQ,2BAA2B,CAAC;AACnD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,QAAQ,MAAM,IAAI,gBAAgB,QAAQ,IAAI;AAGpD,UAAM,iBAAiB,QAAQ,IAAI,CAAC,MAAM,EAAE,OAAO;AACnD,UAAM,UAAU,eAAe,KAAK,GAAG;AACvC,UAAM,SAAS,oBAAoB,OAAO;AAG1C,UAAM,iBAAiB,gBAAgB,cAAc;AACrD,UAAM,SAAS,iBAAiB,cAAc;AAE9C,SAAK,OAAO;AAGZ,UAAM,cAAc,MAAM,QAAQ,sBAAsB;AAAA,MACtD,QAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF,CAAC;AAED,SAAK,KAAK;AAGV,YAAQ;AAAA,MACN,GAAG;AAAA,QACD,GAAG,GAAG,OAAO,KAAK,cAAc,CAAC;AAAA;AAAA,EAAO,WAAW;AAAA;AAAA,EAAO,GAAG,QAAQ,CAAC;AAAA,EAAK,GAAG,IAAI,GAAG,QAAQ,MAAM,mBAAc,MAAM,MAAM,yBAAoB,MAAM,EAAE,CAAC;AAAA,QAC1J,sBAAsB,aAAa;AAAA,MACrC;AAAA,IACF;AAGA,UAAM,EAAE,OAAO,IAAI,MAAM,SAAS,OAAO;AAAA,MACvC;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,UACP,EAAE,MAAM,wCAAwC,OAAO,UAAU;AAAA,UACjE,EAAE,MAAM,qBAAqB,OAAO,OAAO;AAAA,UAC3C,EAAE,MAAM,uBAAuB,OAAO,SAAS;AAAA,UAC/C,EAAE,MAAM,mBAAmB,OAAO,QAAQ;AAAA,UAC1C,EAAE,MAAM,QAAQ,OAAO,OAAO;AAAA,QAChC;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,WAAW,QAAQ;AACrB,YAAM,gBAAgB,WAAW;AAAA,IACnC,WAAW,WAAW,WAAW;AAE/B,cAAQ,IAAI,GAAG,KAAK,+BAA+B,CAAC;AAEpD,YAAM,KAAK,oBAAoB;AAAA,IACjC,WAAW,WAAW,YAAY,WAAW,SAAS;AACpD,YAAM,UAAU,WAAW,WAAW,QAAQ;AAE9C,YAAM,gBAAgB,QAAQ,YAAY,UAAU,WAAW,EAAE,OAAO,EAAE,MAAM;AAEhF,UAAI;AACF,cAAM,OAAO;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,QACV;AAEA,YAAI,SAAS;AACX,eAAK,KAAK,SAAS;AAAA,QACrB;AAEA,cAAM,EAAE,OAAO,IAAI,MAAMC,OAAM,MAAM,IAAI;AAEzC,sBAAc,KAAK;AACnB,gBAAQ,IAAI,GAAG,QAAQ,yBAAyB,CAAC;AACjD,gBAAQ,IAAI,GAAG,IAAI,MAAM,CAAC;AAAA,MAC5B,SAAS,OAAO;AACd,sBAAc,KAAK;AACnB,gBAAQ,IAAI,GAAG,MAAM,qBAAqB,CAAC;AAC3C,gBAAQ,IAAI,GAAG,IAAK,MAAgB,OAAO,CAAC;AAAA,MAC9C;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,SAAK,KAAK;AACV,YAAQ,IAAI,GAAG,MAAM,mCAAmC,CAAC;AACzD,YAAQ,IAAI,GAAG,IAAK,MAAgB,OAAO,CAAC;AAC5C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;;;AEpJH,SAAS,WAAAC,gBAAe;AAYjB,IAAM,cAAc,IAAIC,SAAQ,MAAM,EAC1C,YAAY,8BAA8B,EAC1C,OAAO,cAAc,mCAAmC,EACxD,OAAO,aAAa,0BAA0B,EAC9C,OAAO,OAAO,YAAY;AACzB,QAAM,MAAM,IAAI,YAAY;AAC5B,QAAM,UAAU,IAAI,cAAc;AAGlC,MAAI,CAAE,MAAM,IAAI,aAAa,GAAI;AAC/B,YAAQ,IAAI,GAAG,MAAM,sBAAsB,CAAC;AAC5C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,CAAE,MAAM,QAAQ,YAAY,GAAI;AAClC,YAAQ,IAAI,GAAG,MAAM,8BAA8B,CAAC;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,OAAO,QAAQ,wBAAwB,EAAE,MAAM;AAErD,MAAI;AACF,UAAM,WAAW,QAAQ,OAAO,IAAI;AACpC,UAAM,QAAQ,aAAa,QAAQ;AACnC,UAAM,MAAM,WAAW,QAAQ;AAG/B,UAAM,OAAO,MAAM,IAAI,eAAe;AAGtC,UAAM,UAAU,MAAM,IAAI,WAAW;AAAA,MACnC,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ,KAAK;AAAA,IACf,CAAC;AAED,QAAI,QAAQ,WAAW,GAAG;AACxB,WAAK,KAAK;AACV,cAAQ,IAAI,GAAG,QAAQ,4BAA4B,CAAC;AACpD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,QAAQ,MAAM,IAAI,aAAa;AAErC,SAAK,OAAO;AAGZ,UAAM,iBAAiB,QAAQ,IAAI,CAAC,MAAM,EAAE,OAAO;AACnD,UAAM,UAAU,MAAM,QAAQ,sBAAsB;AAAA,MAClD,SAAS;AAAA,MACT,OAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,YAAY,MAAM;AAAA,QAClB,cAAc,MAAM;AAAA,MACtB;AAAA,IACF,CAAC;AAED,SAAK,KAAK;AAGV,UAAM,QAAQ,mBAAmB,gBAAgB,OAAO,GAAG,CAAC;AAC5D,UAAM,UAAU,GAAG,OAAO;AAAA;AAAA,EAAO,GAAG,QAAQ,CAAC;AAAA,EAAK,GAAG,IAAI,GAAG,QAAQ,MAAM,mBAAc,MAAM,UAAU,KAAK,MAAM,SAAS,SAAS,CAAC;AAEtI,YAAQ,IAAI,GAAG,IAAI,SAAS,KAAK,CAAC;AAGlC,QAAI,QAAQ,MAAM;AAChB,YAAM,gBAAgB,OAAO;AAAA,IAC/B;AAAA,EACF,SAAS,OAAO;AACd,SAAK,KAAK;AACV,YAAQ,IAAI,GAAG,MAAM,mCAAmC,CAAC;AACzD,YAAQ,IAAI,GAAG,IAAK,MAAgB,OAAO,CAAC;AAC5C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;;;ACzFH,SAAS,WAAAC,gBAAe;AAGjB,IAAM,iBAAiB,IAAIC,SAAQ,SAAS,EAChD,YAAY,gDAAgD,EAC5D,OAAO,YAAY;AAClB,UAAQ,IAAI,GAAG,KAAK,uCAAuC,CAAC;AAC5D,UAAQ,IAAI,GAAG,IAAI,0EAA0E,CAAC;AAChG,CAAC;;;ATFH,IAAM,UAAU,IAAIC,SAAQ;AAE5B,QAAQ,KAAK,UAAU,EAAE,YAAY,mCAAmC,EAAE,QAAQ,OAAO;AAGzF,QAAQ,WAAW,cAAc;AACjC,QAAQ,WAAW,SAAS;AAC5B,QAAQ,WAAW,WAAW;AAC9B,QAAQ,WAAW,cAAc;AAGjC,QAAQ,MAAM;","names":["Command","Command","execa","Command","execa","Command","Command","Command","Command","Command"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devdaily-ai",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Your AI memory for developer work - auto-generate PR descriptions, standup notes, and work summaries",
5
5
  "type": "module",
6
6
  "bin": {