@novateva/teurtask-cli 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 +263 -0
- package/dist/bin/teurtask-prod.d.ts +3 -0
- package/dist/bin/teurtask-prod.d.ts.map +1 -0
- package/dist/bin/teurtask-prod.js +6 -0
- package/dist/bin/teurtask-prod.js.map +1 -0
- package/dist/bin/teurtask.d.ts +3 -0
- package/dist/bin/teurtask.d.ts.map +1 -0
- package/dist/bin/teurtask.js +5 -0
- package/dist/bin/teurtask.js.map +1 -0
- package/dist/src/auth/index.d.ts +13 -0
- package/dist/src/auth/index.d.ts.map +1 -0
- package/dist/src/auth/index.js +44 -0
- package/dist/src/auth/index.js.map +1 -0
- package/dist/src/auth/login-server.d.ts +14 -0
- package/dist/src/auth/login-server.d.ts.map +1 -0
- package/dist/src/auth/login-server.js +84 -0
- package/dist/src/auth/login-server.js.map +1 -0
- package/dist/src/commands/auth.d.ts +3 -0
- package/dist/src/commands/auth.d.ts.map +1 -0
- package/dist/src/commands/auth.js +83 -0
- package/dist/src/commands/auth.js.map +1 -0
- package/dist/src/commands/comments.d.ts +3 -0
- package/dist/src/commands/comments.d.ts.map +1 -0
- package/dist/src/commands/comments.js +81 -0
- package/dist/src/commands/comments.js.map +1 -0
- package/dist/src/commands/documents.d.ts +3 -0
- package/dist/src/commands/documents.d.ts.map +1 -0
- package/dist/src/commands/documents.js +26 -0
- package/dist/src/commands/documents.js.map +1 -0
- package/dist/src/commands/env.d.ts +3 -0
- package/dist/src/commands/env.d.ts.map +1 -0
- package/dist/src/commands/env.js +71 -0
- package/dist/src/commands/env.js.map +1 -0
- package/dist/src/commands/goals.d.ts +3 -0
- package/dist/src/commands/goals.d.ts.map +1 -0
- package/dist/src/commands/goals.js +109 -0
- package/dist/src/commands/goals.js.map +1 -0
- package/dist/src/commands/notifications.d.ts +3 -0
- package/dist/src/commands/notifications.d.ts.map +1 -0
- package/dist/src/commands/notifications.js +77 -0
- package/dist/src/commands/notifications.js.map +1 -0
- package/dist/src/commands/phases.d.ts +3 -0
- package/dist/src/commands/phases.d.ts.map +1 -0
- package/dist/src/commands/phases.js +207 -0
- package/dist/src/commands/phases.js.map +1 -0
- package/dist/src/commands/projects.d.ts +3 -0
- package/dist/src/commands/projects.d.ts.map +1 -0
- package/dist/src/commands/projects.js +192 -0
- package/dist/src/commands/projects.js.map +1 -0
- package/dist/src/commands/schedules.d.ts +3 -0
- package/dist/src/commands/schedules.d.ts.map +1 -0
- package/dist/src/commands/schedules.js +155 -0
- package/dist/src/commands/schedules.js.map +1 -0
- package/dist/src/commands/scores.d.ts +3 -0
- package/dist/src/commands/scores.d.ts.map +1 -0
- package/dist/src/commands/scores.js +136 -0
- package/dist/src/commands/scores.js.map +1 -0
- package/dist/src/commands/sprints.d.ts +3 -0
- package/dist/src/commands/sprints.d.ts.map +1 -0
- package/dist/src/commands/sprints.js +218 -0
- package/dist/src/commands/sprints.js.map +1 -0
- package/dist/src/commands/tags.d.ts +3 -0
- package/dist/src/commands/tags.d.ts.map +1 -0
- package/dist/src/commands/tags.js +99 -0
- package/dist/src/commands/tags.js.map +1 -0
- package/dist/src/commands/tasks.d.ts +3 -0
- package/dist/src/commands/tasks.d.ts.map +1 -0
- package/dist/src/commands/tasks.js +355 -0
- package/dist/src/commands/tasks.js.map +1 -0
- package/dist/src/commands/users.d.ts +3 -0
- package/dist/src/commands/users.d.ts.map +1 -0
- package/dist/src/commands/users.js +172 -0
- package/dist/src/commands/users.js.map +1 -0
- package/dist/src/config/environments.d.ts +3 -0
- package/dist/src/config/environments.d.ts.map +1 -0
- package/dist/src/config/environments.js +18 -0
- package/dist/src/config/environments.js.map +1 -0
- package/dist/src/config/index.d.ts +7 -0
- package/dist/src/config/index.d.ts.map +1 -0
- package/dist/src/config/index.js +67 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/src/config/paths.d.ts +6 -0
- package/dist/src/config/paths.d.ts.map +1 -0
- package/dist/src/config/paths.js +9 -0
- package/dist/src/config/paths.js.map +1 -0
- package/dist/src/http/client.d.ts +8 -0
- package/dist/src/http/client.d.ts.map +1 -0
- package/dist/src/http/client.js +68 -0
- package/dist/src/http/client.js.map +1 -0
- package/dist/src/http/errors.d.ts +7 -0
- package/dist/src/http/errors.d.ts.map +1 -0
- package/dist/src/http/errors.js +34 -0
- package/dist/src/http/errors.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +76 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/output/formatter.d.ts +10 -0
- package/dist/src/output/formatter.d.ts.map +1 -0
- package/dist/src/output/formatter.js +57 -0
- package/dist/src/output/formatter.js.map +1 -0
- package/dist/src/output/json.d.ts +6 -0
- package/dist/src/output/json.d.ts.map +1 -0
- package/dist/src/output/json.js +16 -0
- package/dist/src/output/json.js.map +1 -0
- package/dist/src/output/table.d.ts +9 -0
- package/dist/src/output/table.d.ts.map +1 -0
- package/dist/src/output/table.js +32 -0
- package/dist/src/output/table.js.map +1 -0
- package/dist/src/types/api.d.ts +172 -0
- package/dist/src/types/api.d.ts.map +1 -0
- package/dist/src/types/api.js +2 -0
- package/dist/src/types/api.js.map +1 -0
- package/dist/src/types/common.d.ts +18 -0
- package/dist/src/types/common.d.ts.map +1 -0
- package/dist/src/types/common.js +2 -0
- package/dist/src/types/common.js.map +1 -0
- package/dist/src/types/config.d.ts +22 -0
- package/dist/src/types/config.d.ts.map +1 -0
- package/dist/src/types/config.js +2 -0
- package/dist/src/types/config.js.map +1 -0
- package/dist/src/utils/spinner.d.ts +6 -0
- package/dist/src/utils/spinner.d.ts.map +1 -0
- package/dist/src/utils/spinner.js +35 -0
- package/dist/src/utils/spinner.js.map +1 -0
- package/package.json +32 -0
package/README.md
ADDED
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
# teurtask CLI
|
|
2
|
+
|
|
3
|
+
CLI for Teurtask project management operations. It supports environment management, browser login, and day-to-day CRUD/reporting actions across projects, tasks, sprints, phases, goals, tags, comments, schedules, users, scores, notifications, and documents.
|
|
4
|
+
|
|
5
|
+
## What this CLI is for
|
|
6
|
+
|
|
7
|
+
Use `teurtask` to:
|
|
8
|
+
|
|
9
|
+
- switch between local/dev/prod API environments
|
|
10
|
+
- authenticate from terminal via browser login
|
|
11
|
+
- automate team/project operations from scripts or shell aliases
|
|
12
|
+
- inspect and manage delivery lifecycle (project -> phase -> sprint -> task)
|
|
13
|
+
- manage related entities (goals, tags, comments, schedules, users, scores)
|
|
14
|
+
- handle personal flows (active tasks, personal tasks, notifications)
|
|
15
|
+
|
|
16
|
+
## Install and run
|
|
17
|
+
|
|
18
|
+
Requirements:
|
|
19
|
+
|
|
20
|
+
- Node.js 20+
|
|
21
|
+
- npm
|
|
22
|
+
|
|
23
|
+
Install dependencies:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Run in development mode:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npm run dev -- --help
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Build TypeScript:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npm run build
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Run tests:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npm test
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Use the CLI directly:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
npx tsx bin/teurtask.ts --help
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Global options
|
|
54
|
+
|
|
55
|
+
These options work across commands:
|
|
56
|
+
|
|
57
|
+
- `--json` output machine-readable JSON
|
|
58
|
+
- `--env <name>` override active environment for a command
|
|
59
|
+
- `--verbose` verbose logging/output
|
|
60
|
+
|
|
61
|
+
Example:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
npx tsx bin/teurtask.ts --env dev --json task list --active
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Environments and config
|
|
68
|
+
|
|
69
|
+
The CLI stores state in:
|
|
70
|
+
|
|
71
|
+
- `~/.teurtask/config.json` for environments and active environment
|
|
72
|
+
- `~/.teurtask/auth.json` for tokens and user data per environment
|
|
73
|
+
|
|
74
|
+
Default environments:
|
|
75
|
+
|
|
76
|
+
- `local` -> `http://localhost:8000/api`
|
|
77
|
+
- `dev` -> `https://dev-api.teurtask.com/api`
|
|
78
|
+
- `prod` -> `https://api.teurtask.com/api`
|
|
79
|
+
|
|
80
|
+
Security note:
|
|
81
|
+
|
|
82
|
+
- auth file permissions are set to user-only (`0600`) when tokens are saved
|
|
83
|
+
|
|
84
|
+
Useful commands:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
teurtask env list
|
|
88
|
+
teurtask env show
|
|
89
|
+
teurtask env set dev
|
|
90
|
+
teurtask env add staging --api-url "https://staging-api.example.com/api" --web-url "https://staging.example.com"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Authentication
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
teurtask auth login
|
|
97
|
+
teurtask auth me
|
|
98
|
+
teurtask auth refresh
|
|
99
|
+
teurtask auth logout
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Complete command reference
|
|
103
|
+
|
|
104
|
+
### `env`
|
|
105
|
+
|
|
106
|
+
- `env list`
|
|
107
|
+
- `env set <name>`
|
|
108
|
+
- `env show`
|
|
109
|
+
- `env add <name> --api-url <url> --web-url <url>`
|
|
110
|
+
|
|
111
|
+
### `auth`
|
|
112
|
+
|
|
113
|
+
- `auth login`
|
|
114
|
+
- `auth logout`
|
|
115
|
+
- `auth me`
|
|
116
|
+
- `auth refresh`
|
|
117
|
+
|
|
118
|
+
### `project`
|
|
119
|
+
|
|
120
|
+
- `project list [--archived]`
|
|
121
|
+
- `project get <id> [--with-sprints] [--with-goals]`
|
|
122
|
+
- `project create --name <name> --description <description> [--administrative] [--clients <ids>]`
|
|
123
|
+
- `project update <id> [--name <name>] [--description <description>] [--archived] [--administrative] [--clients <ids>]`
|
|
124
|
+
- `project delete <id>`
|
|
125
|
+
- `project backlog <id> [--start-date <date>] [--end-date <date>] [--tags <ids>] [--goal <id>] [--users <ids>] [--sprint <ids>] [--phase <ids>] [--state <states>] [--task-name <name>] [--per-page <n>] [--with-duration]`
|
|
126
|
+
- `project archive <id>`
|
|
127
|
+
|
|
128
|
+
### `task`
|
|
129
|
+
|
|
130
|
+
- `task list [--project-id <id>] [--sprint-id <id>] [--with-users] [--with-project] [--with-sprint] [--with-tags] [--with-goal] [--active] [--personal]`
|
|
131
|
+
- `task get <id> [--with-users] [--with-comments] [--with-reviewer] [--with-duration]`
|
|
132
|
+
- `task create --title <title> --state <state> [--sprint-id <id>] [--phase-id <id>] [--project-id <id>] [--users <ids>] [--deadline <date>] [--description <text>] [--start-date <date>] [--priority <priority>] [--story-point <n>] [--reviewer-id <id>] [--goal-id <id>] [--is-recurrent <bool>] [--type-tasks <ids>] [--tags <ids>]`
|
|
133
|
+
- `task update <id> [--title <title>] [--state <state>] [--description <text>] [--priority <priority>] [--difficulty <difficulty>] [--story-point <n>] [--deadline <date>] [--start-date <date>] [--finish-date <date>] [--sprint-id <id>] [--users <ids>] [--type-tasks <ids>] [--tags <ids>] [--reviewer-id <id>]`
|
|
134
|
+
- `task delete <id>`
|
|
135
|
+
- `task track <id>`
|
|
136
|
+
- `task state <id> <state>`
|
|
137
|
+
- `task active`
|
|
138
|
+
|
|
139
|
+
### `sprint`
|
|
140
|
+
|
|
141
|
+
- `sprint list [--project-id <id>] [--phase-id <id>] [--archived] [--page <n>] [--page-size <n>] [--with-project] [--with-phase] [--with-users] [--with-tasks] [--with-sprint-metrics]`
|
|
142
|
+
- `sprint get <id>`
|
|
143
|
+
- `sprint create --project-id <id> --start-date <date> --deadline <date> [--phase-id <id>] [--description <text>] [--should-fill-daily] [--user-ids <ids>] [--task-ids <ids>] [--responsible-ids <ids>]`
|
|
144
|
+
- `sprint update <id> [--description <text>] [--start-date <date>] [--deadline <date>] [--user-ids <ids>] [--responsible-ids <ids>]`
|
|
145
|
+
- `sprint delete <id>`
|
|
146
|
+
- `sprint close --sprint-id <id> [--score-client <n>] [--comment-client <text>] [--open-new] [--task-ids <ids>]`
|
|
147
|
+
- `sprint report <id>`
|
|
148
|
+
|
|
149
|
+
### `user`
|
|
150
|
+
|
|
151
|
+
- `user list [--sprint-id <id>]`
|
|
152
|
+
- `user get <id>`
|
|
153
|
+
- `user create --name <name> --last-name <lastName> --email <email> --id-card <idCard> --address <address> --charge <charge> --phone <phone> --role-id <n> --date-of-birth <date> --hour-price <n> [--url-avatar <url>] [--authorized] [--manual-limit <n>]`
|
|
154
|
+
- `user update <id> [--name <name>] [--last-name <lastName>] [--email <email>] [--id-card <idCard>] [--address <address>] [--charge <charge>] [--phone <phone>] [--role-id <n>] [--date-of-birth <date>] [--hour-price <n>] [--url-avatar <url>] [--authorized] [--manual-limit <n>]`
|
|
155
|
+
- `user personal-tasks`
|
|
156
|
+
- `user payments`
|
|
157
|
+
|
|
158
|
+
### `comment`
|
|
159
|
+
|
|
160
|
+
- `comment list <taskId>`
|
|
161
|
+
- `comment create --task-id <id> --description <text> [--data-daily-id <id>]`
|
|
162
|
+
- `comment update <id> [--description <text>]`
|
|
163
|
+
- `comment delete <id>`
|
|
164
|
+
|
|
165
|
+
### `phase`
|
|
166
|
+
|
|
167
|
+
- `phase list [--project-id <id>] [--with-project] [--with-users] [--with-tasks]`
|
|
168
|
+
- `phase get <id>`
|
|
169
|
+
- `phase create --name <name> --start-date <date> --end-date <date> --project-id <id> [--invoice-number <number>] [--amount <n>]`
|
|
170
|
+
- `phase update <id> [--name <name>] [--start-date <date>] [--end-date <date>] [--project-id <id>] [--invoice-number <number>] [--amount <n>]`
|
|
171
|
+
- `phase report <id> [--sprint-id <id>]`
|
|
172
|
+
- `phase close <id> --score-client <n> --comment-client <text> [--create-phase] [--create-sprint]`
|
|
173
|
+
|
|
174
|
+
### `notification`
|
|
175
|
+
|
|
176
|
+
- `notification list`
|
|
177
|
+
- `notification read <id>`
|
|
178
|
+
- `notification read-all`
|
|
179
|
+
- `notification delete <id>`
|
|
180
|
+
- `notification delete-all`
|
|
181
|
+
|
|
182
|
+
### `schedule`
|
|
183
|
+
|
|
184
|
+
- `schedule list --start <timestamp> --end <timestamp> --users-id <ids>`
|
|
185
|
+
- `schedule get <id>`
|
|
186
|
+
- `schedule create --title <title> --body <body> --start <timestamp> --end <timestamp> --category <category> --location <location> --state <state> --user-id <n> --task-id <n> [--type <type>]`
|
|
187
|
+
- `schedule update <id> [--title <title>] [--body <body>] [--start <timestamp>] [--end <timestamp>] [--category <category>] [--location <location>] [--state <state>] [--user-id <n>] [--task-id <n>] [--type <type>]`
|
|
188
|
+
- `schedule delete <id>`
|
|
189
|
+
|
|
190
|
+
### `goal`
|
|
191
|
+
|
|
192
|
+
- `goal list [--project-id <id>] [--name <name>] [--tags <ids>]`
|
|
193
|
+
- `goal get <id>`
|
|
194
|
+
- `goal create --name <name> --project-id <id> [--tags <ids>]`
|
|
195
|
+
- `goal update <id> [--name <name>] [--tags <ids>]`
|
|
196
|
+
- `goal delete <id>`
|
|
197
|
+
|
|
198
|
+
### `tag`
|
|
199
|
+
|
|
200
|
+
- `tag list [--project-id <id>] [--name <name>]`
|
|
201
|
+
- `tag get <id>`
|
|
202
|
+
- `tag create --name <name> --project-id <id>`
|
|
203
|
+
- `tag update <id> [--name <name>]`
|
|
204
|
+
- `tag delete <id>`
|
|
205
|
+
|
|
206
|
+
### `score`
|
|
207
|
+
|
|
208
|
+
- `score list [--task-id <id>] [--with-user]`
|
|
209
|
+
- `score get <id>`
|
|
210
|
+
- `score create --score <n> --state <state> --deadline-task <date> --task-id <n> --dedicated-hours <n> --dificulty <dificulty> [--description <text>]`
|
|
211
|
+
- `score update <id> [--score <n>] [--state <state>] [--deadline-task <date>] [--task-id <n>] [--dedicated-hours <n>] [--dificulty <dificulty>] [--description <text>]`
|
|
212
|
+
- `score delete <id>`
|
|
213
|
+
|
|
214
|
+
### `document`
|
|
215
|
+
|
|
216
|
+
- `document delete <id>`
|
|
217
|
+
|
|
218
|
+
`document` upload/store is not currently implemented in this CLI.
|
|
219
|
+
|
|
220
|
+
## Common workflows
|
|
221
|
+
|
|
222
|
+
### 1) First-time setup
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
teurtask env list
|
|
226
|
+
teurtask env set dev
|
|
227
|
+
teurtask auth login
|
|
228
|
+
teurtask auth me
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### 2) Create delivery structure
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
teurtask project create --name "Platform Revamp" --description "Q2 delivery"
|
|
235
|
+
teurtask phase create --name "Phase 1" --start-date "2026-03-01" --end-date "2026-03-31" --project-id 1
|
|
236
|
+
teurtask sprint create --project-id 1 --start-date "2026-03-01" --deadline "2026-03-14" --description "Sprint 1"
|
|
237
|
+
teurtask task create --title "Implement login" --state "todo" --project-id 1 --sprint-id 1 --priority "high"
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### 3) Daily execution
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
teurtask task active
|
|
244
|
+
teurtask user personal-tasks
|
|
245
|
+
teurtask comment create --task-id 42 --description "Progress update"
|
|
246
|
+
teurtask notification list
|
|
247
|
+
teurtask notification read-all
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### 4) Reporting and closure
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
teurtask sprint report 1
|
|
254
|
+
teurtask phase report 1
|
|
255
|
+
teurtask sprint close --sprint-id 1 --score-client 9 --comment-client "Delivered as expected"
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## Tips
|
|
259
|
+
|
|
260
|
+
- Use `--json` whenever you need integration with scripts.
|
|
261
|
+
- Use command-specific help to inspect argument details quickly:
|
|
262
|
+
- `teurtask <group> --help`
|
|
263
|
+
- `teurtask <group> <command> --help`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teurtask-prod.d.ts","sourceRoot":"","sources":["../../bin/teurtask-prod.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teurtask-prod.js","sourceRoot":"","sources":["../../bin/teurtask-prod.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,MAAM,CAAC;AAEzC,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teurtask.d.ts","sourceRoot":"","sources":["../../bin/teurtask.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teurtask.js","sourceRoot":"","sources":["../../bin/teurtask.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AuthData } from '../types/config.js';
|
|
2
|
+
export declare function getToken(envName?: string): string | null;
|
|
3
|
+
export declare function getStoredUser(envName?: string): {
|
|
4
|
+
id: number;
|
|
5
|
+
name: string;
|
|
6
|
+
last_name: string;
|
|
7
|
+
email: string;
|
|
8
|
+
role_id: number;
|
|
9
|
+
};
|
|
10
|
+
export declare function storeAuth(token: string, user: AuthData[string]['user'], envName?: string): void;
|
|
11
|
+
export declare function clearAuth(envName?: string): void;
|
|
12
|
+
export declare function updateToken(token: string, envName?: string): void;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAanD,wBAAgB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIxD;AAED,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM;;;;;;EAI7C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAK/F;AAED,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAKhD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAOjE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, chmodSync } from 'node:fs';
|
|
2
|
+
import { paths } from '../config/paths.js';
|
|
3
|
+
import { getActiveEnv } from '../config/index.js';
|
|
4
|
+
function loadAuthData() {
|
|
5
|
+
if (!existsSync(paths.auth))
|
|
6
|
+
return {};
|
|
7
|
+
const raw = readFileSync(paths.auth, 'utf-8');
|
|
8
|
+
return JSON.parse(raw);
|
|
9
|
+
}
|
|
10
|
+
function saveAuthData(data) {
|
|
11
|
+
writeFileSync(paths.auth, JSON.stringify(data, null, 2), 'utf-8');
|
|
12
|
+
chmodSync(paths.auth, 0o600);
|
|
13
|
+
}
|
|
14
|
+
export function getToken(envName) {
|
|
15
|
+
const name = envName ?? getActiveEnv().name;
|
|
16
|
+
const data = loadAuthData();
|
|
17
|
+
return data[name]?.token ?? null;
|
|
18
|
+
}
|
|
19
|
+
export function getStoredUser(envName) {
|
|
20
|
+
const name = envName ?? getActiveEnv().name;
|
|
21
|
+
const data = loadAuthData();
|
|
22
|
+
return data[name]?.user ?? null;
|
|
23
|
+
}
|
|
24
|
+
export function storeAuth(token, user, envName) {
|
|
25
|
+
const name = envName ?? getActiveEnv().name;
|
|
26
|
+
const data = loadAuthData();
|
|
27
|
+
data[name] = { token, user };
|
|
28
|
+
saveAuthData(data);
|
|
29
|
+
}
|
|
30
|
+
export function clearAuth(envName) {
|
|
31
|
+
const name = envName ?? getActiveEnv().name;
|
|
32
|
+
const data = loadAuthData();
|
|
33
|
+
delete data[name];
|
|
34
|
+
saveAuthData(data);
|
|
35
|
+
}
|
|
36
|
+
export function updateToken(token, envName) {
|
|
37
|
+
const name = envName ?? getActiveEnv().name;
|
|
38
|
+
const data = loadAuthData();
|
|
39
|
+
if (data[name]) {
|
|
40
|
+
data[name].token = token;
|
|
41
|
+
saveAuthData(data);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,SAAS,YAAY;IACnB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAC;AACrC,CAAC;AAED,SAAS,YAAY,CAAC,IAAc;IAClC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,MAAM,IAAI,GAAG,OAAO,IAAI,YAAY,EAAE,CAAC,IAAI,CAAC;IAC5C,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,IAAI,GAAG,OAAO,IAAI,YAAY,EAAE,CAAC,IAAI,CAAC;IAC5C,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,IAA8B,EAAE,OAAgB;IACvF,MAAM,IAAI,GAAG,OAAO,IAAI,YAAY,EAAE,CAAC,IAAI,CAAC;IAC5C,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC7B,YAAY,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAgB;IACxC,MAAM,IAAI,GAAG,OAAO,IAAI,YAAY,EAAE,CAAC,IAAI,CAAC;IAC5C,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,YAAY,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,OAAgB;IACzD,MAAM,IAAI,GAAG,OAAO,IAAI,YAAY,EAAE,CAAC,IAAI,CAAC;IAC5C,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;QACzB,YAAY,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface LoginResult {
|
|
2
|
+
success: boolean;
|
|
3
|
+
user?: {
|
|
4
|
+
id: number;
|
|
5
|
+
name: string;
|
|
6
|
+
last_name: string;
|
|
7
|
+
email: string;
|
|
8
|
+
role_id: number;
|
|
9
|
+
};
|
|
10
|
+
error?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function startLoginServer(): Promise<LoginResult>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=login-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-server.d.ts","sourceRoot":"","sources":["../../../src/auth/login-server.ts"],"names":[],"mappings":"AAqBA,UAAU,WAAW;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACvF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC,CA2E7D"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { createServer } from 'node:http';
|
|
2
|
+
import { URL } from 'node:url';
|
|
3
|
+
import { storeAuth } from './index.js';
|
|
4
|
+
import { getActiveEnv } from '../config/index.js';
|
|
5
|
+
const TIMEOUT_MS = 5 * 60 * 1000;
|
|
6
|
+
const SUCCESS_HTML = `<!DOCTYPE html>
|
|
7
|
+
<html><head><title>Teurtask CLI</title>
|
|
8
|
+
<style>body{font-family:system-ui;display:flex;justify-content:center;align-items:center;height:100vh;margin:0;background:#f0fdf4}
|
|
9
|
+
.card{text-align:center;padding:2rem;border-radius:12px;background:white;box-shadow:0 2px 8px rgba(0,0,0,0.1)}
|
|
10
|
+
h1{color:#16a34a;margin-bottom:0.5rem}p{color:#666}</style></head>
|
|
11
|
+
<body><div class="card"><h1>Logged in!</h1><p>You can close this tab and return to the terminal.</p></div></body></html>`;
|
|
12
|
+
const ERROR_HTML = (msg) => `<!DOCTYPE html>
|
|
13
|
+
<html><head><title>Teurtask CLI</title>
|
|
14
|
+
<style>body{font-family:system-ui;display:flex;justify-content:center;align-items:center;height:100vh;margin:0;background:#fef2f2}
|
|
15
|
+
.card{text-align:center;padding:2rem;border-radius:12px;background:white;box-shadow:0 2px 8px rgba(0,0,0,0.1)}
|
|
16
|
+
h1{color:#dc2626;margin-bottom:0.5rem}p{color:#666}</style></head>
|
|
17
|
+
<body><div class="card"><h1>Error</h1><p>${msg}</p></div></body></html>`;
|
|
18
|
+
export async function startLoginServer() {
|
|
19
|
+
const env = getActiveEnv();
|
|
20
|
+
return new Promise((resolve) => {
|
|
21
|
+
const server = createServer((req, res) => {
|
|
22
|
+
const url = new URL(req.url ?? '/', `http://127.0.0.1`);
|
|
23
|
+
if (url.pathname !== '/callback') {
|
|
24
|
+
res.writeHead(404);
|
|
25
|
+
res.end('Not found');
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const error = url.searchParams.get('error');
|
|
29
|
+
if (error) {
|
|
30
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
31
|
+
res.end(ERROR_HTML('Authorization denied by user.'));
|
|
32
|
+
server.close();
|
|
33
|
+
resolve({ success: false, error: 'Authorization denied' });
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const token = url.searchParams.get('token');
|
|
37
|
+
const userB64 = url.searchParams.get('user');
|
|
38
|
+
if (!token || !userB64) {
|
|
39
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
40
|
+
res.end(ERROR_HTML('Missing token or user data.'));
|
|
41
|
+
server.close();
|
|
42
|
+
resolve({ success: false, error: 'Missing token or user data' });
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
const user = JSON.parse(Buffer.from(userB64, 'base64').toString('utf-8'));
|
|
47
|
+
storeAuth(token, user);
|
|
48
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
49
|
+
res.end(SUCCESS_HTML);
|
|
50
|
+
server.close();
|
|
51
|
+
resolve({ success: true, user });
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
res.writeHead(400, { 'Content-Type': 'text/html' });
|
|
55
|
+
res.end(ERROR_HTML('Invalid user data.'));
|
|
56
|
+
server.close();
|
|
57
|
+
resolve({ success: false, error: 'Invalid user data' });
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
server.listen(0, '127.0.0.1', async () => {
|
|
61
|
+
const addr = server.address();
|
|
62
|
+
if (!addr || typeof addr === 'string') {
|
|
63
|
+
resolve({ success: false, error: 'Failed to start server' });
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const callbackUrl = `http://127.0.0.1:${addr.port}/callback`;
|
|
67
|
+
const loginUrl = `${env.webBaseUrl}/cli-auth?callback=${encodeURIComponent(callbackUrl)}`;
|
|
68
|
+
console.log(`Opening browser for login...`);
|
|
69
|
+
console.log(`If the browser doesn't open, visit: ${loginUrl}`);
|
|
70
|
+
try {
|
|
71
|
+
const open = (await import('open')).default;
|
|
72
|
+
await open(loginUrl);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Browser open failed, user can use the printed URL
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
setTimeout(() => {
|
|
79
|
+
server.close();
|
|
80
|
+
resolve({ success: false, error: 'Login timed out (5 minutes)' });
|
|
81
|
+
}, TIMEOUT_MS);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=login-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-server.js","sourceRoot":"","sources":["../../../src/auth/login-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0E3D"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { startLoginServer } from '../auth/login-server.js';
|
|
2
|
+
import { clearAuth, getToken } from '../auth/index.js';
|
|
3
|
+
import { apiPost } from '../http/client.js';
|
|
4
|
+
import { getContext, outputDetail, outputSuccess, outputError } from '../output/formatter.js';
|
|
5
|
+
import { withSpinner } from '../utils/spinner.js';
|
|
6
|
+
export function registerAuthCommands(program) {
|
|
7
|
+
const auth = program.command('auth').description('Authentication commands');
|
|
8
|
+
auth
|
|
9
|
+
.command('login')
|
|
10
|
+
.description('Login via browser')
|
|
11
|
+
.action(async (_, cmd) => {
|
|
12
|
+
const ctx = getContext(cmd.optsWithGlobals());
|
|
13
|
+
try {
|
|
14
|
+
const result = await startLoginServer();
|
|
15
|
+
if (result.success && result.user) {
|
|
16
|
+
outputSuccess(ctx, `Logged in as ${result.user.name} ${result.user.last_name} (${result.user.email})`, result.user);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
outputError(ctx, new Error(result.error ?? 'Login failed'));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
outputError(ctx, err);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
auth
|
|
27
|
+
.command('logout')
|
|
28
|
+
.description('Logout and clear stored token')
|
|
29
|
+
.action(async (_, cmd) => {
|
|
30
|
+
const ctx = getContext(cmd.optsWithGlobals());
|
|
31
|
+
try {
|
|
32
|
+
const token = getToken();
|
|
33
|
+
if (token) {
|
|
34
|
+
try {
|
|
35
|
+
await apiPost('auth/logout');
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Ignore API errors during logout
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
clearAuth();
|
|
42
|
+
outputSuccess(ctx, 'Logged out successfully');
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
outputError(ctx, err);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
auth
|
|
49
|
+
.command('me')
|
|
50
|
+
.description('Show current authenticated user')
|
|
51
|
+
.action(async (_, cmd) => {
|
|
52
|
+
const ctx = getContext(cmd.optsWithGlobals());
|
|
53
|
+
try {
|
|
54
|
+
const data = await withSpinner('Fetching user info...', () => apiPost('auth/me'));
|
|
55
|
+
outputDetail(ctx, data, {
|
|
56
|
+
id: 'ID',
|
|
57
|
+
name: 'Name',
|
|
58
|
+
last_name: 'Last Name',
|
|
59
|
+
email: 'Email',
|
|
60
|
+
role_id: 'Role ID',
|
|
61
|
+
charge: 'Position',
|
|
62
|
+
phone: 'Phone',
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
outputError(ctx, err);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
auth
|
|
70
|
+
.command('refresh')
|
|
71
|
+
.description('Refresh the authentication token')
|
|
72
|
+
.action(async (_, cmd) => {
|
|
73
|
+
const ctx = getContext(cmd.optsWithGlobals());
|
|
74
|
+
try {
|
|
75
|
+
const data = await withSpinner('Refreshing token...', () => apiPost('auth/refresh'));
|
|
76
|
+
outputSuccess(ctx, 'Token refreshed successfully', data);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
outputError(ctx, err);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../../src/commands/comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmF9D"}
|