@knpkv/codecommit 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +216 -0
- package/dist/package.json +50 -0
- package/dist/src/bin.d.ts +3 -0
- package/dist/src/bin.d.ts.map +1 -0
- package/dist/src/bin.js +204 -0
- package/dist/src/bin.js.map +1 -0
- package/dist/src/main.d.ts +2 -0
- package/dist/src/main.d.ts.map +1 -0
- package/dist/src/main.js +25 -0
- package/dist/src/main.js.map +1 -0
- package/dist/src/tui/App.d.ts +6 -0
- package/dist/src/tui/App.d.ts.map +1 -0
- package/dist/src/tui/App.js +40 -0
- package/dist/src/tui/App.js.map +1 -0
- package/dist/src/tui/Constants.d.ts +11 -0
- package/dist/src/tui/Constants.d.ts.map +1 -0
- package/dist/src/tui/Constants.js +40 -0
- package/dist/src/tui/Constants.js.map +1 -0
- package/dist/src/tui/ListBuilder.d.ts +32 -0
- package/dist/src/tui/ListBuilder.d.ts.map +1 -0
- package/dist/src/tui/ListBuilder.js +145 -0
- package/dist/src/tui/ListBuilder.js.map +1 -0
- package/dist/src/tui/atoms/actions.d.ts +39 -0
- package/dist/src/tui/atoms/actions.d.ts.map +1 -0
- package/dist/src/tui/atoms/actions.js +149 -0
- package/dist/src/tui/atoms/actions.js.map +1 -0
- package/dist/src/tui/atoms/app.d.ts +42 -0
- package/dist/src/tui/atoms/app.d.ts.map +1 -0
- package/dist/src/tui/atoms/app.js +69 -0
- package/dist/src/tui/atoms/app.js.map +1 -0
- package/dist/src/tui/atoms/index.d.ts +6 -0
- package/dist/src/tui/atoms/index.d.ts.map +1 -0
- package/dist/src/tui/atoms/index.js +7 -0
- package/dist/src/tui/atoms/index.js.map +1 -0
- package/dist/src/tui/atoms/runtime.d.ts +9 -0
- package/dist/src/tui/atoms/runtime.d.ts.map +1 -0
- package/dist/src/tui/atoms/runtime.js +22 -0
- package/dist/src/tui/atoms/runtime.js.map +1 -0
- package/dist/src/tui/atoms/ui.d.ts +103 -0
- package/dist/src/tui/atoms/ui.d.ts.map +1 -0
- package/dist/src/tui/atoms/ui.js +97 -0
- package/dist/src/tui/atoms/ui.js.map +1 -0
- package/dist/src/tui/components/Badge.d.ts +13 -0
- package/dist/src/tui/components/Badge.d.ts.map +1 -0
- package/dist/src/tui/components/Badge.js +48 -0
- package/dist/src/tui/components/Badge.js.map +1 -0
- package/dist/src/tui/components/DetailsView.d.ts +6 -0
- package/dist/src/tui/components/DetailsView.d.ts.map +1 -0
- package/dist/src/tui/components/DetailsView.js +81 -0
- package/dist/src/tui/components/DetailsView.js.map +1 -0
- package/dist/src/tui/components/ErrorBoundary.d.ts +20 -0
- package/dist/src/tui/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/src/tui/components/ErrorBoundary.js +33 -0
- package/dist/src/tui/components/ErrorBoundary.js.map +1 -0
- package/dist/src/tui/components/Footer.d.ts +6 -0
- package/dist/src/tui/components/Footer.d.ts.map +1 -0
- package/dist/src/tui/components/Footer.js +29 -0
- package/dist/src/tui/components/Footer.js.map +1 -0
- package/dist/src/tui/components/Header.d.ts +6 -0
- package/dist/src/tui/components/Header.d.ts.map +1 -0
- package/dist/src/tui/components/Header.js +58 -0
- package/dist/src/tui/components/Header.js.map +1 -0
- package/dist/src/tui/components/ListItemRow.d.ts +13 -0
- package/dist/src/tui/components/ListItemRow.d.ts.map +1 -0
- package/dist/src/tui/components/ListItemRow.js +52 -0
- package/dist/src/tui/components/ListItemRow.js.map +1 -0
- package/dist/src/tui/components/MainList.d.ts +11 -0
- package/dist/src/tui/components/MainList.d.ts.map +1 -0
- package/dist/src/tui/components/MainList.js +124 -0
- package/dist/src/tui/components/MainList.js.map +1 -0
- package/dist/src/tui/components/NotificationsTable.d.ts +12 -0
- package/dist/src/tui/components/NotificationsTable.d.ts.map +1 -0
- package/dist/src/tui/components/NotificationsTable.js +72 -0
- package/dist/src/tui/components/NotificationsTable.js.map +1 -0
- package/dist/src/tui/components/QuickFilters.d.ts +6 -0
- package/dist/src/tui/components/QuickFilters.d.ts.map +1 -0
- package/dist/src/tui/components/QuickFilters.js +74 -0
- package/dist/src/tui/components/QuickFilters.js.map +1 -0
- package/dist/src/tui/components/SettingsTable.d.ts +12 -0
- package/dist/src/tui/components/SettingsTable.d.ts.map +1 -0
- package/dist/src/tui/components/SettingsTable.js +62 -0
- package/dist/src/tui/components/SettingsTable.js.map +1 -0
- package/dist/src/tui/components/Spinner.d.ts +11 -0
- package/dist/src/tui/components/Spinner.d.ts.map +1 -0
- package/dist/src/tui/components/Spinner.js +24 -0
- package/dist/src/tui/components/Spinner.js.map +1 -0
- package/dist/src/tui/components/StatusRow.d.ts +11 -0
- package/dist/src/tui/components/StatusRow.d.ts.map +1 -0
- package/dist/src/tui/components/StatusRow.js +11 -0
- package/dist/src/tui/components/StatusRow.js.map +1 -0
- package/dist/src/tui/components/Table.d.ts +20 -0
- package/dist/src/tui/components/Table.d.ts.map +1 -0
- package/dist/src/tui/components/Table.js +38 -0
- package/dist/src/tui/components/Table.js.map +1 -0
- package/dist/src/tui/components/index.d.ts +14 -0
- package/dist/src/tui/components/index.d.ts.map +1 -0
- package/dist/src/tui/components/index.js +14 -0
- package/dist/src/tui/components/index.js.map +1 -0
- package/dist/src/tui/components/mainlist-utils.d.ts +22 -0
- package/dist/src/tui/components/mainlist-utils.d.ts.map +1 -0
- package/dist/src/tui/components/mainlist-utils.js +71 -0
- package/dist/src/tui/components/mainlist-utils.js.map +1 -0
- package/dist/src/tui/components/table-utils.d.ts +25 -0
- package/dist/src/tui/components/table-utils.d.ts.map +1 -0
- package/dist/src/tui/components/table-utils.js +25 -0
- package/dist/src/tui/components/table-utils.js.map +1 -0
- package/dist/src/tui/context/dialog.d.ts +32 -0
- package/dist/src/tui/context/dialog.d.ts.map +1 -0
- package/dist/src/tui/context/dialog.js +41 -0
- package/dist/src/tui/context/dialog.js.map +1 -0
- package/dist/src/tui/context/theme.d.ts +25 -0
- package/dist/src/tui/context/theme.d.ts.map +1 -0
- package/dist/src/tui/context/theme.js +31 -0
- package/dist/src/tui/context/theme.js.map +1 -0
- package/dist/src/tui/hooks/index.d.ts +2 -0
- package/dist/src/tui/hooks/index.d.ts.map +1 -0
- package/dist/src/tui/hooks/index.js +2 -0
- package/dist/src/tui/hooks/index.js.map +1 -0
- package/dist/src/tui/hooks/useKeyboardNav.d.ts +16 -0
- package/dist/src/tui/hooks/useKeyboardNav.d.ts.map +1 -0
- package/dist/src/tui/hooks/useKeyboardNav.js +429 -0
- package/dist/src/tui/hooks/useKeyboardNav.js.map +1 -0
- package/dist/src/tui/hooks/useListNavigation.d.ts +3 -0
- package/dist/src/tui/hooks/useListNavigation.d.ts.map +1 -0
- package/dist/src/tui/hooks/useListNavigation.js +123 -0
- package/dist/src/tui/hooks/useListNavigation.js.map +1 -0
- package/dist/src/tui/mocks.d.ts +6 -0
- package/dist/src/tui/mocks.d.ts.map +1 -0
- package/dist/src/tui/mocks.js +36 -0
- package/dist/src/tui/mocks.js.map +1 -0
- package/dist/src/tui/theme/Resolver.d.ts +6 -0
- package/dist/src/tui/theme/Resolver.d.ts.map +1 -0
- package/dist/src/tui/theme/Resolver.js +73 -0
- package/dist/src/tui/theme/Resolver.js.map +1 -0
- package/dist/src/tui/theme/ThemeRegistry.d.ts +3 -0
- package/dist/src/tui/theme/ThemeRegistry.d.ts.map +1 -0
- package/dist/src/tui/theme/ThemeRegistry.js +70 -0
- package/dist/src/tui/theme/ThemeRegistry.js.map +1 -0
- package/dist/src/tui/theme/data/aura.json +69 -0
- package/dist/src/tui/theme/data/ayu.json +80 -0
- package/dist/src/tui/theme/data/carbonfox.json +248 -0
- package/dist/src/tui/theme/data/catppuccin-frappe.json +233 -0
- package/dist/src/tui/theme/data/catppuccin-macchiato.json +233 -0
- package/dist/src/tui/theme/data/catppuccin.json +112 -0
- package/dist/src/tui/theme/data/cobalt2.json +228 -0
- package/dist/src/tui/theme/data/cursor.json +249 -0
- package/dist/src/tui/theme/data/dracula.json +219 -0
- package/dist/src/tui/theme/data/everforest.json +241 -0
- package/dist/src/tui/theme/data/flexoki.json +237 -0
- package/dist/src/tui/theme/data/github.json +233 -0
- package/dist/src/tui/theme/data/gruvbox.json +242 -0
- package/dist/src/tui/theme/data/kanagawa.json +77 -0
- package/dist/src/tui/theme/data/lucent-orng.json +237 -0
- package/dist/src/tui/theme/data/material.json +235 -0
- package/dist/src/tui/theme/data/matrix.json +77 -0
- package/dist/src/tui/theme/data/mercury.json +245 -0
- package/dist/src/tui/theme/data/monokai.json +221 -0
- package/dist/src/tui/theme/data/nightowl.json +221 -0
- package/dist/src/tui/theme/data/nord.json +223 -0
- package/dist/src/tui/theme/data/one-dark.json +84 -0
- package/dist/src/tui/theme/data/opencode.json +245 -0
- package/dist/src/tui/theme/data/orng.json +249 -0
- package/dist/src/tui/theme/data/osaka-jade.json +93 -0
- package/dist/src/tui/theme/data/palenight.json +222 -0
- package/dist/src/tui/theme/data/rosepine.json +234 -0
- package/dist/src/tui/theme/data/solarized.json +223 -0
- package/dist/src/tui/theme/data/synthwave84.json +226 -0
- package/dist/src/tui/theme/data/tokyonight.json +243 -0
- package/dist/src/tui/theme/data/vercel.json +245 -0
- package/dist/src/tui/theme/data/vesper.json +218 -0
- package/dist/src/tui/theme/data/zenburn.json +223 -0
- package/dist/src/tui/theme/default.d.ts +40 -0
- package/dist/src/tui/theme/default.d.ts.map +1 -0
- package/dist/src/tui/theme/default.js +35 -0
- package/dist/src/tui/theme/default.js.map +1 -0
- package/dist/src/tui/theme/resolver-utils.d.ts +28 -0
- package/dist/src/tui/theme/resolver-utils.d.ts.map +1 -0
- package/dist/src/tui/theme/resolver-utils.js +19 -0
- package/dist/src/tui/theme/resolver-utils.js.map +1 -0
- package/dist/src/tui/theme/themes.d.ts +3 -0
- package/dist/src/tui/theme/themes.d.ts.map +1 -0
- package/dist/src/tui/theme/themes.js +13 -0
- package/dist/src/tui/theme/themes.js.map +1 -0
- package/dist/src/tui/ui/Dialog.d.ts +19 -0
- package/dist/src/tui/ui/Dialog.d.ts.map +1 -0
- package/dist/src/tui/ui/Dialog.js +39 -0
- package/dist/src/tui/ui/Dialog.js.map +1 -0
- package/dist/src/tui/ui/DialogCommand.d.ts +2 -0
- package/dist/src/tui/ui/DialogCommand.d.ts.map +1 -0
- package/dist/src/tui/ui/DialogCommand.js +182 -0
- package/dist/src/tui/ui/DialogCommand.js.map +1 -0
- package/dist/src/tui/ui/DialogCreatePR.d.ts +2 -0
- package/dist/src/tui/ui/DialogCreatePR.d.ts.map +1 -0
- package/dist/src/tui/ui/DialogCreatePR.js +397 -0
- package/dist/src/tui/ui/DialogCreatePR.js.map +1 -0
- package/dist/src/tui/ui/DialogHelp.d.ts +6 -0
- package/dist/src/tui/ui/DialogHelp.d.ts.map +1 -0
- package/dist/src/tui/ui/DialogHelp.js +93 -0
- package/dist/src/tui/ui/DialogHelp.js.map +1 -0
- package/dist/src/tui/ui/DialogTheme.d.ts +2 -0
- package/dist/src/tui/ui/DialogTheme.d.ts.map +1 -0
- package/dist/src/tui/ui/DialogTheme.js +124 -0
- package/dist/src/tui/ui/DialogTheme.js.map +1 -0
- package/dist/src/tui/ui/index.d.ts +6 -0
- package/dist/src/tui/ui/index.d.ts.map +1 -0
- package/dist/src/tui/ui/index.js +6 -0
- package/dist/src/tui/ui/index.js.map +1 -0
- package/dist/src/tui/utils/prTemplates.d.ts +19 -0
- package/dist/src/tui/utils/prTemplates.d.ts.map +1 -0
- package/dist/src/tui/utils/prTemplates.js +46 -0
- package/dist/src/tui/utils/prTemplates.js.map +1 -0
- package/dist/test/ConfigService.test.d.ts +2 -0
- package/dist/test/ConfigService.test.d.ts.map +1 -0
- package/dist/test/ConfigService.test.js +40 -0
- package/dist/test/ConfigService.test.js.map +1 -0
- package/dist/test/ListBuilder.test.d.ts +2 -0
- package/dist/test/ListBuilder.test.d.ts.map +1 -0
- package/dist/test/ListBuilder.test.js +246 -0
- package/dist/test/ListBuilder.test.js.map +1 -0
- package/dist/test/MainList.test.d.ts +2 -0
- package/dist/test/MainList.test.d.ts.map +1 -0
- package/dist/test/MainList.test.js +228 -0
- package/dist/test/MainList.test.js.map +1 -0
- package/dist/test/Resolver.test.d.ts +2 -0
- package/dist/test/Resolver.test.d.ts.map +1 -0
- package/dist/test/Resolver.test.js +81 -0
- package/dist/test/Resolver.test.js.map +1 -0
- package/dist/test/Table.test.d.ts +2 -0
- package/dist/test/Table.test.d.ts.map +1 -0
- package/dist/test/Table.test.js +100 -0
- package/dist/test/Table.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +50 -0
package/README.md
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
# @knpkv/codecommit
|
|
2
|
+
|
|
3
|
+
CLI and TUI for AWS CodeCommit pull requests.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @knpkv/codecommit
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
### TUI Mode (default)
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
codecommit
|
|
17
|
+
# or
|
|
18
|
+
codecommit tui
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Web Mode
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
codecommit web [--port 3000] [--hostname 127.0.0.1]
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Pull Request Commands
|
|
28
|
+
|
|
29
|
+
#### List PRs
|
|
30
|
+
|
|
31
|
+
List pull requests.
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
codecommit pr list [options]
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
| Option | Alias | Description | Default |
|
|
38
|
+
| ----------- | ----- | ----------------------- | ----------- |
|
|
39
|
+
| `--profile` | `-p` | AWS profile | `default` |
|
|
40
|
+
| `--region` | `-r` | AWS region | `us-east-1` |
|
|
41
|
+
| `--status` | `-s` | PR status (OPEN/CLOSED) | `OPEN` |
|
|
42
|
+
| `--all` | `-a` | Show all PRs | `false` |
|
|
43
|
+
| `--repo` | | Filter by repository | - |
|
|
44
|
+
| `--author` | | Filter by author | - |
|
|
45
|
+
| `--json` | | Output as JSON | `false` |
|
|
46
|
+
|
|
47
|
+
Example:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# List open PRs (default)
|
|
51
|
+
codecommit pr list
|
|
52
|
+
|
|
53
|
+
# List closed PRs
|
|
54
|
+
codecommit pr list --status CLOSED
|
|
55
|
+
|
|
56
|
+
# List all PRs (open and closed)
|
|
57
|
+
codecommit pr list --all
|
|
58
|
+
|
|
59
|
+
# Filter by repo
|
|
60
|
+
codecommit pr list --repo my-repo
|
|
61
|
+
|
|
62
|
+
# Filter by author
|
|
63
|
+
codecommit pr list --author andrey
|
|
64
|
+
|
|
65
|
+
# JSON output
|
|
66
|
+
codecommit pr list --json
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Output:
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
Found 3 open PR(s):
|
|
73
|
+
|
|
74
|
+
123 my-repo
|
|
75
|
+
Add feature X
|
|
76
|
+
feature/x → main
|
|
77
|
+
by alice ✓approved ✓mergeable
|
|
78
|
+
|
|
79
|
+
124 my-repo
|
|
80
|
+
Fix bug Y
|
|
81
|
+
fix/y → main
|
|
82
|
+
by bob ✗conflicts
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
With `--all`:
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
Found 5 all PR(s):
|
|
89
|
+
|
|
90
|
+
123 [OPEN] my-repo
|
|
91
|
+
Add feature X
|
|
92
|
+
...
|
|
93
|
+
|
|
94
|
+
120 [CLOSED] my-repo
|
|
95
|
+
Old feature
|
|
96
|
+
...
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
#### Create PR
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
codecommit pr create <repo> <title> -s <source-branch> [options]
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
| Option | Alias | Description | Default |
|
|
106
|
+
| --------------- | ----- | ------------------ | ----------- |
|
|
107
|
+
| `--source` | `-s` | Source branch | (required) |
|
|
108
|
+
| `--destination` | `-d` | Destination branch | `main` |
|
|
109
|
+
| `--description` | | PR description | - |
|
|
110
|
+
| `--profile` | `-p` | AWS profile | `default` |
|
|
111
|
+
| `--region` | `-r` | AWS region | `us-east-1` |
|
|
112
|
+
|
|
113
|
+
Example:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
codecommit pr create my-repo "Add feature X" -s feature/x -d main --description "Implements feature X"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
#### Export PR Comments
|
|
120
|
+
|
|
121
|
+
Export PR comments as markdown with multi-level thread structure.
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
codecommit pr export <pr-id> <repo> [options]
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
| Option | Alias | Description | Default |
|
|
128
|
+
| ----------- | ----- | ---------------- | ----------- |
|
|
129
|
+
| `--output` | `-o` | Output file path | stdout |
|
|
130
|
+
| `--profile` | `-p` | AWS profile | `default` |
|
|
131
|
+
| `--region` | `-r` | AWS region | `us-east-1` |
|
|
132
|
+
|
|
133
|
+
Example:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
# Print to stdout
|
|
137
|
+
codecommit pr export 123 my-repo
|
|
138
|
+
|
|
139
|
+
# Save to file
|
|
140
|
+
codecommit pr export 123 my-repo -o pr-comments.md
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Output format:
|
|
144
|
+
|
|
145
|
+
```markdown
|
|
146
|
+
# RPS-2585: Add CDK destroy buildspec
|
|
147
|
+
|
|
148
|
+
**Repository:** tilapia
|
|
149
|
+
**Branch:** refs/heads/feat/RPS-2585-destroy-buildspec → refs/heads/main
|
|
150
|
+
**Author:** andrey
|
|
151
|
+
**Status:** OPEN
|
|
152
|
+
**AWS Account:** core-code
|
|
153
|
+
**Link:** https://...
|
|
154
|
+
|
|
155
|
+
## Description
|
|
156
|
+
|
|
157
|
+
Adds buildspec for CDK destroy operation.
|
|
158
|
+
|
|
159
|
+
## Comments
|
|
160
|
+
|
|
161
|
+
### src/file.ts
|
|
162
|
+
|
|
163
|
+
- **alice** (2024-01-15T10:00:00Z)
|
|
164
|
+
This needs refactoring
|
|
165
|
+
- **bob** (2024-01-15T11:00:00Z)
|
|
166
|
+
Agreed, will fix
|
|
167
|
+
- **alice** (2024-01-15T12:00:00Z)
|
|
168
|
+
Thanks!
|
|
169
|
+
|
|
170
|
+
### General comments
|
|
171
|
+
|
|
172
|
+
- **charlie** (2024-01-15T09:00:00Z)
|
|
173
|
+
LGTM overall
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
#### Update PR
|
|
177
|
+
|
|
178
|
+
Update PR title or description.
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
codecommit pr update <pr-id> [options]
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
| Option | Alias | Description | Default |
|
|
185
|
+
| --------------- | ----- | ------------------ | ----------- |
|
|
186
|
+
| `--title` | `-t` | New PR title | - |
|
|
187
|
+
| `--description` | `-d` | New PR description | - |
|
|
188
|
+
| `--profile` | `-p` | AWS profile | `default` |
|
|
189
|
+
| `--region` | `-r` | AWS region | `us-east-1` |
|
|
190
|
+
|
|
191
|
+
Example:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
# Update title
|
|
195
|
+
codecommit pr update 123 -t "New title"
|
|
196
|
+
|
|
197
|
+
# Update description
|
|
198
|
+
codecommit pr update 123 -d "Updated description"
|
|
199
|
+
|
|
200
|
+
# Update both
|
|
201
|
+
codecommit pr update 123 -t "New title" -d "New description"
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## AWS Configuration
|
|
205
|
+
|
|
206
|
+
Uses standard AWS credential chain. Configure via:
|
|
207
|
+
|
|
208
|
+
- Environment variables (`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`)
|
|
209
|
+
- AWS credentials file (`~/.aws/credentials`)
|
|
210
|
+
- IAM role (when running on AWS)
|
|
211
|
+
|
|
212
|
+
Specify profile with `--profile` or `AWS_PROFILE` env var.
|
|
213
|
+
|
|
214
|
+
## License
|
|
215
|
+
|
|
216
|
+
MIT
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@knpkv/codecommit",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "TUI for browsing AWS CodeCommit PRs",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/dts/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"codecommit": "dist/src/bin.js"
|
|
10
|
+
},
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"start": "bun src/bin.ts",
|
|
19
|
+
"start:web": "bun src/bin.ts web",
|
|
20
|
+
"prepack": "tsc -b",
|
|
21
|
+
"build": "tsc -b",
|
|
22
|
+
"check": "tsc -b tsconfig.json",
|
|
23
|
+
"test": "vitest",
|
|
24
|
+
"lint": "eslint \"{src,test}/**/*.{ts,tsx}\"",
|
|
25
|
+
"docgen": "docgen"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@effect-atom/atom-react": "latest",
|
|
29
|
+
"@effect/cli": "latest",
|
|
30
|
+
"@effect/platform": "^0.94.2",
|
|
31
|
+
"@effect/platform-bun": "^0.87.1",
|
|
32
|
+
"@effect/platform-node": "latest",
|
|
33
|
+
"@knpkv/codecommit-core": "workspace:*",
|
|
34
|
+
"@knpkv/codecommit-web": "workspace:*",
|
|
35
|
+
"@opentui/core": "https://pkg.pr.new/anomalyco/opentui/@opentui/core@367a94087821b3b5feedd35bbb57df43b10a286e",
|
|
36
|
+
"@opentui/react": "https://pkg.pr.new/anomalyco/opentui/@opentui/react@367a94087821b3b5feedd35bbb57df43b10a286e",
|
|
37
|
+
"effect": "latest",
|
|
38
|
+
"open": "^10.1.0",
|
|
39
|
+
"react": "^19.1.0",
|
|
40
|
+
"tslib": "^2.8.1"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@effect/vitest": "latest",
|
|
44
|
+
"@storybook/react": "^8.6.15",
|
|
45
|
+
"@types/bun": "^1.3.6",
|
|
46
|
+
"@types/node": "latest",
|
|
47
|
+
"@types/react": "^19.1.8",
|
|
48
|
+
"vitest": "latest"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../src/bin.ts"],"names":[],"mappings":""}
|
package/dist/src/bin.js
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { Args, Command, Options } from "@effect/cli";
|
|
3
|
+
import { FileSystem } from "@effect/platform";
|
|
4
|
+
import { BunContext, BunRuntime } from "@effect/platform-bun";
|
|
5
|
+
import { NodeHttpClient } from "@effect/platform-node";
|
|
6
|
+
import { AwsClient, AwsClientConfig } from "@knpkv/codecommit-core";
|
|
7
|
+
import { makeServer } from "@knpkv/codecommit-web";
|
|
8
|
+
import { Console, Effect, Layer, Stream } from "effect";
|
|
9
|
+
import open from "open";
|
|
10
|
+
import pkg from "../package.json";
|
|
11
|
+
// TUI Command
|
|
12
|
+
const tui = Command.make("tui", {}, () => Effect.gen(function* () {
|
|
13
|
+
yield* Effect.promise(() => import("./main.js"));
|
|
14
|
+
}));
|
|
15
|
+
// Web Command
|
|
16
|
+
const web = Command.make("web", {
|
|
17
|
+
port: Options.integer("port").pipe(Options.withDefault(3000)),
|
|
18
|
+
hostname: Options.text("hostname").pipe(Options.withDefault("127.0.0.1"))
|
|
19
|
+
}, ({ hostname, port }) => Effect.gen(function* () {
|
|
20
|
+
yield* Effect.logInfo(`Starting web server at http://${hostname}:${port}`);
|
|
21
|
+
// Open browser
|
|
22
|
+
yield* Effect.promise(() => open(`http://${hostname}:${port}`));
|
|
23
|
+
// Run server with configured port/hostname
|
|
24
|
+
return yield* Layer.launch(makeServer({ port, hostname }));
|
|
25
|
+
}));
|
|
26
|
+
// PR Create Command
|
|
27
|
+
const prCreate = Command.make("create", {
|
|
28
|
+
repo: Args.text({ name: "repository" }).pipe(Args.withDescription("Repository name")),
|
|
29
|
+
title: Args.text({ name: "title" }).pipe(Args.withDescription("PR title")),
|
|
30
|
+
source: Options.text("source").pipe(Options.withAlias("s"), Options.withDescription("Source branch")),
|
|
31
|
+
destination: Options.text("destination").pipe(Options.withAlias("d"), Options.withDescription("Destination branch"), Options.withDefault("main")),
|
|
32
|
+
description: Options.text("description").pipe(Options.withDescription("PR description"), Options.optional),
|
|
33
|
+
profile: Options.text("profile").pipe(Options.withAlias("p"), Options.withDescription("AWS profile"), Options.withDefault("default")),
|
|
34
|
+
region: Options.text("region").pipe(Options.withAlias("r"), Options.withDescription("AWS region"), Options.withDefault("us-east-1"))
|
|
35
|
+
}, ({ description, destination, profile, region, repo, source, title }) => Effect.gen(function* () {
|
|
36
|
+
const aws = yield* AwsClient.AwsClient;
|
|
37
|
+
yield* Console.log(`Creating PR: ${source} -> ${destination} in ${repo}`);
|
|
38
|
+
const prId = yield* aws.createPullRequest({
|
|
39
|
+
account: { profile: profile, region: region },
|
|
40
|
+
repositoryName: repo,
|
|
41
|
+
title,
|
|
42
|
+
...(description._tag === "Some" && { description: description.value }),
|
|
43
|
+
sourceReference: source,
|
|
44
|
+
destinationReference: destination
|
|
45
|
+
});
|
|
46
|
+
const link = `https://${region}.console.aws.amazon.com/codesuite/codecommit/repositories/${repo}/pull-requests/${prId}?region=${region}`;
|
|
47
|
+
yield* Console.log(`Created PR: ${prId}`);
|
|
48
|
+
yield* Console.log(link);
|
|
49
|
+
}).pipe(Effect.provide(Layer.merge(AwsClient.AwsClientLive, NodeHttpClient.layer)))).pipe(Command.withDescription("Create a pull request"));
|
|
50
|
+
// PR List Command
|
|
51
|
+
const prList = Command.make("list", {
|
|
52
|
+
profile: Options.text("profile").pipe(Options.withAlias("p"), Options.withDescription("AWS profile"), Options.withDefault("default")),
|
|
53
|
+
region: Options.text("region").pipe(Options.withAlias("r"), Options.withDescription("AWS region"), Options.withDefault("us-east-1")),
|
|
54
|
+
status: Options.choice("status", ["OPEN", "CLOSED"]).pipe(Options.withAlias("s"), Options.withDescription("Filter by PR status"), Options.withDefault("OPEN")),
|
|
55
|
+
all: Options.boolean("all").pipe(Options.withAlias("a"), Options.withDescription("Show all PRs (both OPEN and CLOSED)"), Options.withDefault(false)),
|
|
56
|
+
repo: Options.text("repo").pipe(Options.withDescription("Filter by repository name"), Options.optional),
|
|
57
|
+
author: Options.text("author").pipe(Options.withDescription("Filter by author"), Options.optional),
|
|
58
|
+
json: Options.boolean("json").pipe(Options.withDescription("Output as JSON"), Options.withDefault(false))
|
|
59
|
+
}, ({ all, author, json, profile, region, repo, status }) => Effect.gen(function* () {
|
|
60
|
+
const aws = yield* AwsClient.AwsClient;
|
|
61
|
+
const account = { profile: profile, region: region };
|
|
62
|
+
const statusLabel = all ? "all" : status.toLowerCase();
|
|
63
|
+
yield* Console.log(`Fetching ${statusLabel} PRs...`);
|
|
64
|
+
const filterPRs = (prStream) => prStream.pipe(Stream.filter((pr) => {
|
|
65
|
+
if (repo._tag === "Some" && pr.repositoryName !== repo.value)
|
|
66
|
+
return false;
|
|
67
|
+
if (author._tag === "Some" && pr.author !== author.value)
|
|
68
|
+
return false;
|
|
69
|
+
return true;
|
|
70
|
+
}), Stream.runCollect, Effect.map((chunk) => Array.from(chunk)));
|
|
71
|
+
let prs;
|
|
72
|
+
if (all) {
|
|
73
|
+
const [openPrs, closedPrs] = yield* Effect.all([
|
|
74
|
+
filterPRs(aws.getPullRequests(account, { status: "OPEN" })),
|
|
75
|
+
filterPRs(aws.getPullRequests(account, { status: "CLOSED" }))
|
|
76
|
+
]);
|
|
77
|
+
prs = [...openPrs, ...closedPrs].sort((a, b) => b.lastModifiedDate.getTime() - a.lastModifiedDate.getTime());
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
prs = yield* filterPRs(aws.getPullRequests(account, { status }));
|
|
81
|
+
}
|
|
82
|
+
if (prs.length === 0) {
|
|
83
|
+
yield* Console.log(`No ${statusLabel} PRs found.`);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (json) {
|
|
87
|
+
yield* Console.log(JSON.stringify(prs, null, 2));
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
yield* Console.log(`\nFound ${prs.length} ${statusLabel} PR(s):\n`);
|
|
91
|
+
for (const pr of prs) {
|
|
92
|
+
const prStatus = all ? `[${pr.status}] ` : "";
|
|
93
|
+
const flags = [
|
|
94
|
+
pr.isApproved ? "approved" : "",
|
|
95
|
+
pr.isMergeable ? "mergeable" : "conflicts"
|
|
96
|
+
].filter(Boolean).join(" ");
|
|
97
|
+
yield* Console.log(`${pr.id} ${prStatus}${pr.repositoryName}`);
|
|
98
|
+
yield* Console.log(` ${pr.title}`);
|
|
99
|
+
yield* Console.log(` ${pr.sourceBranch} -> ${pr.destinationBranch}`);
|
|
100
|
+
yield* Console.log(` by ${pr.author} ${flags}`);
|
|
101
|
+
yield* Console.log("");
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}).pipe(Effect.provide(Layer.merge(AwsClient.AwsClientLive, NodeHttpClient.layer)))).pipe(Command.withDescription("List open pull requests"));
|
|
105
|
+
// Helper to render comment threads as markdown
|
|
106
|
+
const renderThread = (thread, indent = 0) => {
|
|
107
|
+
const prefix = " ".repeat(indent);
|
|
108
|
+
const c = thread.root;
|
|
109
|
+
const header = c.deleted
|
|
110
|
+
? `${prefix}- ~~[deleted]~~ _${c.author}_ (${c.creationDate.toISOString()})`
|
|
111
|
+
: `${prefix}- **${c.author}** (${c.creationDate.toISOString()})`;
|
|
112
|
+
const content = c.deleted ? "" : `\n${prefix} ${c.content.replace(/\n/g, `\n${prefix} `)}`;
|
|
113
|
+
const replies = thread.replies.map((r) => renderThread(r, indent + 1)).join("\n");
|
|
114
|
+
return `${header}${content}${replies ? `\n${replies}` : ""}`;
|
|
115
|
+
};
|
|
116
|
+
const renderLocation = (loc) => {
|
|
117
|
+
const header = loc.filePath ? `### ${loc.filePath}\n` : "### General comments\n";
|
|
118
|
+
const threads = loc.comments.map((t) => renderThread(t)).join("\n\n");
|
|
119
|
+
return `${header}\n${threads}`;
|
|
120
|
+
};
|
|
121
|
+
// PR Export Command
|
|
122
|
+
const prExport = Command.make("export", {
|
|
123
|
+
prId: Args.text({ name: "pr-id" }).pipe(Args.withDescription("Pull request ID")),
|
|
124
|
+
repo: Args.text({ name: "repository" }).pipe(Args.withDescription("Repository name")),
|
|
125
|
+
output: Options.file("output").pipe(Options.withAlias("o"), Options.withDescription("Output file path"), Options.optional),
|
|
126
|
+
profile: Options.text("profile").pipe(Options.withAlias("p"), Options.withDescription("AWS profile"), Options.withDefault("default")),
|
|
127
|
+
region: Options.text("region").pipe(Options.withAlias("r"), Options.withDescription("AWS region"), Options.withDefault("us-east-1"))
|
|
128
|
+
}, ({ output, prId, profile, region, repo }) => Effect.gen(function* () {
|
|
129
|
+
const aws = yield* AwsClient.AwsClient;
|
|
130
|
+
const fs = yield* FileSystem.FileSystem;
|
|
131
|
+
const account = { profile: profile, region: region };
|
|
132
|
+
yield* Console.log(`Fetching PR ${prId}...`);
|
|
133
|
+
const pr = yield* aws.getPullRequest({ account, pullRequestId: prId });
|
|
134
|
+
yield* Console.log(`Fetching comments...`);
|
|
135
|
+
const locations = yield* aws.getCommentsForPullRequest({
|
|
136
|
+
account,
|
|
137
|
+
pullRequestId: prId,
|
|
138
|
+
repositoryName: repo
|
|
139
|
+
});
|
|
140
|
+
const totalComments = locations.reduce((sum, loc) => {
|
|
141
|
+
const countThreads = (threads) => threads.reduce((s, t) => s + 1 + countThreads(t.replies), 0);
|
|
142
|
+
return sum + countThreads(loc.comments);
|
|
143
|
+
}, 0);
|
|
144
|
+
yield* Console.log(`Found ${totalComments} comment(s) in ${locations.length} location(s)`);
|
|
145
|
+
const link = `https://${region}.console.aws.amazon.com/codesuite/codecommit/repositories/${repo}/pull-requests/${prId}?region=${region}`;
|
|
146
|
+
const markdown = [
|
|
147
|
+
`# ${pr.title}`,
|
|
148
|
+
"",
|
|
149
|
+
`**Repository:** ${repo}`,
|
|
150
|
+
`**Branch:** ${pr.sourceBranch} -> ${pr.destinationBranch}`,
|
|
151
|
+
`**Author:** ${pr.author}`,
|
|
152
|
+
`**Status:** ${pr.status}`,
|
|
153
|
+
`**AWS Account:** ${profile}`,
|
|
154
|
+
`**Link:** ${link}`,
|
|
155
|
+
"",
|
|
156
|
+
...(pr.description ? ["## Description", "", pr.description, ""] : []),
|
|
157
|
+
"## Comments",
|
|
158
|
+
"",
|
|
159
|
+
...(locations.length > 0 ? locations.map(renderLocation) : ["_No comments_"])
|
|
160
|
+
].join("\n");
|
|
161
|
+
if (output._tag === "Some") {
|
|
162
|
+
yield* fs.writeFileString(output.value, markdown);
|
|
163
|
+
yield* Console.log(`Saved to ${output.value}`);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
yield* Console.log("");
|
|
167
|
+
yield* Console.log(markdown);
|
|
168
|
+
}
|
|
169
|
+
}).pipe(Effect.provide(Layer.merge(AwsClient.AwsClientLive, NodeHttpClient.layer)))).pipe(Command.withDescription("Export PR comments as markdown"));
|
|
170
|
+
// PR Update Command
|
|
171
|
+
const prUpdate = Command.make("update", {
|
|
172
|
+
prId: Args.text({ name: "pr-id" }).pipe(Args.withDescription("Pull request ID")),
|
|
173
|
+
title: Options.text("title").pipe(Options.withAlias("t"), Options.withDescription("New PR title"), Options.optional),
|
|
174
|
+
description: Options.text("description").pipe(Options.withAlias("d"), Options.withDescription("New PR description"), Options.optional),
|
|
175
|
+
profile: Options.text("profile").pipe(Options.withAlias("p"), Options.withDescription("AWS profile"), Options.withDefault("default")),
|
|
176
|
+
region: Options.text("region").pipe(Options.withAlias("r"), Options.withDescription("AWS region"), Options.withDefault("us-east-1"))
|
|
177
|
+
}, ({ description, prId, profile, region, title }) => Effect.gen(function* () {
|
|
178
|
+
const aws = yield* AwsClient.AwsClient;
|
|
179
|
+
const account = { profile: profile, region: region };
|
|
180
|
+
if (title._tag === "None" && description._tag === "None") {
|
|
181
|
+
yield* Console.log("Error: At least one of --title or --description must be provided");
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (title._tag === "Some") {
|
|
185
|
+
yield* Console.log(`Updating title...`);
|
|
186
|
+
yield* aws.updatePullRequestTitle({ account, pullRequestId: prId, title: title.value });
|
|
187
|
+
}
|
|
188
|
+
if (description._tag === "Some") {
|
|
189
|
+
yield* Console.log(`Updating description...`);
|
|
190
|
+
yield* aws.updatePullRequestDescription({ account, pullRequestId: prId, description: description.value });
|
|
191
|
+
}
|
|
192
|
+
yield* Console.log(`Updated PR ${prId}`);
|
|
193
|
+
}).pipe(Effect.provide(Layer.merge(AwsClient.AwsClientLive, NodeHttpClient.layer)))).pipe(Command.withDescription("Update PR title or description"));
|
|
194
|
+
// PR Command (parent)
|
|
195
|
+
const pr = Command.make("pr", {}, () => Console.log("Usage: codecommit pr <command>")).pipe(Command.withSubcommands([prList, prCreate, prExport, prUpdate]), Command.withDescription("Pull request commands"));
|
|
196
|
+
const command = Command.make("codecommit", {}, () =>
|
|
197
|
+
// Default to TUI if no subcommand
|
|
198
|
+
Effect.promise(() => import("./main.js"))).pipe(Command.withSubcommands([tui, web, pr]));
|
|
199
|
+
const cli = Command.run(command, {
|
|
200
|
+
name: pkg.name,
|
|
201
|
+
version: pkg.version
|
|
202
|
+
});
|
|
203
|
+
Effect.suspend(() => cli(process.argv)).pipe(Effect.provide(Layer.mergeAll(BunContext.layer, NodeHttpClient.layer, AwsClientConfig.Default)), BunRuntime.runMain);
|
|
204
|
+
//# sourceMappingURL=bin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.tsx"],"names":[],"mappings":""}
|
package/dist/src/main.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx } from "@opentui/react/jsx-runtime";
|
|
2
|
+
import { createCliRenderer } from "@opentui/core";
|
|
3
|
+
import { createRoot } from "@opentui/react";
|
|
4
|
+
import { Deferred, Effect } from "effect";
|
|
5
|
+
import { App } from "./tui/App.js";
|
|
6
|
+
import { cleanup } from "./tui/atoms/app.js";
|
|
7
|
+
const program = Effect.gen(function* () {
|
|
8
|
+
const exitSignal = yield* Deferred.make();
|
|
9
|
+
// Create renderer with automatic cleanup
|
|
10
|
+
const renderer = yield* Effect.acquireRelease(Effect.promise(() => createCliRenderer({
|
|
11
|
+
exitOnCtrlC: false // We handle this ourselves
|
|
12
|
+
})), (renderer) => Effect.sync(() => renderer.destroy()));
|
|
13
|
+
const onQuit = () => {
|
|
14
|
+
// Abort pending HTTP requests
|
|
15
|
+
Effect.runFork(cleanup);
|
|
16
|
+
Effect.runSync(Deferred.succeed(exitSignal, void 0));
|
|
17
|
+
};
|
|
18
|
+
// Mount React app
|
|
19
|
+
const root = createRoot(renderer);
|
|
20
|
+
root.render(_jsx(App, { onQuit: onQuit }));
|
|
21
|
+
// Keep the process alive until quit
|
|
22
|
+
yield* Deferred.await(exitSignal);
|
|
23
|
+
}).pipe(Effect.scoped);
|
|
24
|
+
Effect.runFork(program);
|
|
25
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAE5C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAQ,CAAA;IAE/C,yCAAyC;IACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAC3C,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAClB,iBAAiB,CAAC;QAChB,WAAW,EAAE,KAAK,CAAC,2BAA2B;KAC/C,CAAC,CACH,EACD,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CACpD,CAAA;IAED,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,8BAA8B;QAC9B,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACvB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;IACtD,CAAC,CAAA;IAED,kBAAkB;IAClB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;IACjC,IAAI,CAAC,MAAM,CAAC,KAAC,GAAG,IAAC,MAAM,EAAE,MAAM,GAAI,CAAC,CAAA;IAEpC,oCAAoC;IACpC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;AACnC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;AAEtB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../src/tui/App.tsx"],"names":[],"mappings":"AAWA,UAAU,QAAQ;IAChB,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAA;CAC5B;AAmDD,wBAAgB,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,6BAQvC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
|
|
2
|
+
import { Result, useAtomSet, useAtomValue } from "@effect-atom/atom-react";
|
|
3
|
+
import { useEffect } from "react";
|
|
4
|
+
import { createPrAtom, openPrAtom } from "./atoms/actions.js";
|
|
5
|
+
import { refreshAtom } from "./atoms/app.js";
|
|
6
|
+
import { creatingPrAtom, viewAtom } from "./atoms/ui.js";
|
|
7
|
+
import { DetailsView, Footer, Header, MainList, QuickFilters } from "./components/index.js";
|
|
8
|
+
import { DialogProvider } from "./context/dialog.js";
|
|
9
|
+
import { ThemeProvider } from "./context/theme.js";
|
|
10
|
+
import { useKeyboardNav } from "./hooks/useKeyboardNav.js";
|
|
11
|
+
import { DialogRenderer } from "./ui/Dialog.js";
|
|
12
|
+
function AppContent({ onQuit }) {
|
|
13
|
+
const openPr = useAtomSet(openPrAtom);
|
|
14
|
+
const refresh = useAtomSet(refreshAtom);
|
|
15
|
+
const view = useAtomValue(viewAtom);
|
|
16
|
+
const createPrResult = useAtomValue(createPrAtom);
|
|
17
|
+
const setCreatingPr = useAtomSet(creatingPrAtom);
|
|
18
|
+
// Trigger initial refresh
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
refresh();
|
|
21
|
+
}, [refresh]);
|
|
22
|
+
// Clear creating PR state when result comes in
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (!Result.isInitial(createPrResult)) {
|
|
25
|
+
setCreatingPr(null);
|
|
26
|
+
}
|
|
27
|
+
}, [createPrResult, setCreatingPr]);
|
|
28
|
+
// Initialize keyboard navigation and global shortcuts
|
|
29
|
+
useKeyboardNav({
|
|
30
|
+
onQuit,
|
|
31
|
+
onOpenInBrowser: (pr) => {
|
|
32
|
+
openPr(pr);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
return (_jsxs("box", { style: { flexDirection: "column", height: "100%", width: "100%" }, children: [_jsx(Header, {}), _jsxs("box", { style: { flexGrow: 1, width: "100%" }, children: [_jsx(MainList, {}), view === "details" && (_jsx("box", { style: { position: "absolute", top: 0, left: 0, width: "100%", height: "100%" }, children: _jsx(DetailsView, {}) }))] }), view === "prs" && _jsx(QuickFilters, {}), _jsx(Footer, {}), _jsx(DialogRenderer, {})] }));
|
|
36
|
+
}
|
|
37
|
+
export function App({ onQuit }) {
|
|
38
|
+
return (_jsx(ThemeProvider, { children: _jsx(DialogProvider, { children: _jsx(AppContent, { onQuit: onQuit }) }) }));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=App.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../../../src/tui/App.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAM/C,SAAS,UAAU,CAAC,EAAE,MAAM,EAAY;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAA;IACrC,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;IACvC,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IACnC,MAAM,cAAc,GAAG,YAAY,CAAC,YAAY,CAAC,CAAA;IACjD,MAAM,aAAa,GAAG,UAAU,CAAC,cAAc,CAAC,CAAA;IAEhD,0BAA0B;IAC1B,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,EAAE,CAAA;IACX,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAEb,+CAA+C;IAC/C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC;YACtC,aAAa,CAAC,IAAI,CAAC,CAAA;QACrB,CAAC;IACH,CAAC,EAAE,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,CAAA;IAEnC,sDAAsD;IACtD,cAAc,CAAC;QACb,MAAM;QACN,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE;YACtB,MAAM,CAAC,EAAE,CAAC,CAAA;QACZ,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,CACL,eAAK,KAAK,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aACpE,KAAC,MAAM,KAAG,EAEV,eAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,aACxC,KAAC,QAAQ,KAAG,EACX,IAAI,KAAK,SAAS,IAAI,CACrB,cAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAClF,KAAC,WAAW,KAAG,GACX,CACP,IACG,EAEL,IAAI,KAAK,KAAK,IAAI,KAAC,YAAY,KAAG,EACnC,KAAC,MAAM,KAAG,EAGV,KAAC,cAAc,KAAG,IACd,CACP,CAAA;AACH,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,EAAE,MAAM,EAAY;IACtC,OAAO,CACL,KAAC,aAAa,cACZ,KAAC,cAAc,cACb,KAAC,UAAU,IAAC,MAAM,EAAE,MAAM,GAAI,GACf,GACH,CACjB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const SPINNER_FRAMES: string[];
|
|
2
|
+
export declare const VIEW_TITLES: Record<string, string>;
|
|
3
|
+
export declare const HINTS: Record<string, string>;
|
|
4
|
+
export declare const COMMON_HELP: string;
|
|
5
|
+
export declare const HELP_CONTENT: {
|
|
6
|
+
prs: string;
|
|
7
|
+
settings: string;
|
|
8
|
+
notifications: string;
|
|
9
|
+
};
|
|
10
|
+
export declare const SETTINGS_LEGEND: string;
|
|
11
|
+
//# sourceMappingURL=Constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Constants.d.ts","sourceRoot":"","sources":["../../../src/tui/Constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,UAAqD,CAAA;AAEhF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAK9C,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMxC,CAAA;AAED,eAAO,MAAM,WAAW,QAIiB,CAAA;AAEzC,eAAO,MAAM,YAAY;;;;CAexB,CAAA;AAED,eAAO,MAAM,eAAe,QAIJ,CAAA"}
|