@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.
Files changed (126) hide show
  1. package/README.md +263 -0
  2. package/dist/bin/teurtask-prod.d.ts +3 -0
  3. package/dist/bin/teurtask-prod.d.ts.map +1 -0
  4. package/dist/bin/teurtask-prod.js +6 -0
  5. package/dist/bin/teurtask-prod.js.map +1 -0
  6. package/dist/bin/teurtask.d.ts +3 -0
  7. package/dist/bin/teurtask.d.ts.map +1 -0
  8. package/dist/bin/teurtask.js +5 -0
  9. package/dist/bin/teurtask.js.map +1 -0
  10. package/dist/src/auth/index.d.ts +13 -0
  11. package/dist/src/auth/index.d.ts.map +1 -0
  12. package/dist/src/auth/index.js +44 -0
  13. package/dist/src/auth/index.js.map +1 -0
  14. package/dist/src/auth/login-server.d.ts +14 -0
  15. package/dist/src/auth/login-server.d.ts.map +1 -0
  16. package/dist/src/auth/login-server.js +84 -0
  17. package/dist/src/auth/login-server.js.map +1 -0
  18. package/dist/src/commands/auth.d.ts +3 -0
  19. package/dist/src/commands/auth.d.ts.map +1 -0
  20. package/dist/src/commands/auth.js +83 -0
  21. package/dist/src/commands/auth.js.map +1 -0
  22. package/dist/src/commands/comments.d.ts +3 -0
  23. package/dist/src/commands/comments.d.ts.map +1 -0
  24. package/dist/src/commands/comments.js +81 -0
  25. package/dist/src/commands/comments.js.map +1 -0
  26. package/dist/src/commands/documents.d.ts +3 -0
  27. package/dist/src/commands/documents.d.ts.map +1 -0
  28. package/dist/src/commands/documents.js +26 -0
  29. package/dist/src/commands/documents.js.map +1 -0
  30. package/dist/src/commands/env.d.ts +3 -0
  31. package/dist/src/commands/env.d.ts.map +1 -0
  32. package/dist/src/commands/env.js +71 -0
  33. package/dist/src/commands/env.js.map +1 -0
  34. package/dist/src/commands/goals.d.ts +3 -0
  35. package/dist/src/commands/goals.d.ts.map +1 -0
  36. package/dist/src/commands/goals.js +109 -0
  37. package/dist/src/commands/goals.js.map +1 -0
  38. package/dist/src/commands/notifications.d.ts +3 -0
  39. package/dist/src/commands/notifications.d.ts.map +1 -0
  40. package/dist/src/commands/notifications.js +77 -0
  41. package/dist/src/commands/notifications.js.map +1 -0
  42. package/dist/src/commands/phases.d.ts +3 -0
  43. package/dist/src/commands/phases.d.ts.map +1 -0
  44. package/dist/src/commands/phases.js +207 -0
  45. package/dist/src/commands/phases.js.map +1 -0
  46. package/dist/src/commands/projects.d.ts +3 -0
  47. package/dist/src/commands/projects.d.ts.map +1 -0
  48. package/dist/src/commands/projects.js +192 -0
  49. package/dist/src/commands/projects.js.map +1 -0
  50. package/dist/src/commands/schedules.d.ts +3 -0
  51. package/dist/src/commands/schedules.d.ts.map +1 -0
  52. package/dist/src/commands/schedules.js +155 -0
  53. package/dist/src/commands/schedules.js.map +1 -0
  54. package/dist/src/commands/scores.d.ts +3 -0
  55. package/dist/src/commands/scores.d.ts.map +1 -0
  56. package/dist/src/commands/scores.js +136 -0
  57. package/dist/src/commands/scores.js.map +1 -0
  58. package/dist/src/commands/sprints.d.ts +3 -0
  59. package/dist/src/commands/sprints.d.ts.map +1 -0
  60. package/dist/src/commands/sprints.js +218 -0
  61. package/dist/src/commands/sprints.js.map +1 -0
  62. package/dist/src/commands/tags.d.ts +3 -0
  63. package/dist/src/commands/tags.d.ts.map +1 -0
  64. package/dist/src/commands/tags.js +99 -0
  65. package/dist/src/commands/tags.js.map +1 -0
  66. package/dist/src/commands/tasks.d.ts +3 -0
  67. package/dist/src/commands/tasks.d.ts.map +1 -0
  68. package/dist/src/commands/tasks.js +355 -0
  69. package/dist/src/commands/tasks.js.map +1 -0
  70. package/dist/src/commands/users.d.ts +3 -0
  71. package/dist/src/commands/users.d.ts.map +1 -0
  72. package/dist/src/commands/users.js +172 -0
  73. package/dist/src/commands/users.js.map +1 -0
  74. package/dist/src/config/environments.d.ts +3 -0
  75. package/dist/src/config/environments.d.ts.map +1 -0
  76. package/dist/src/config/environments.js +18 -0
  77. package/dist/src/config/environments.js.map +1 -0
  78. package/dist/src/config/index.d.ts +7 -0
  79. package/dist/src/config/index.d.ts.map +1 -0
  80. package/dist/src/config/index.js +67 -0
  81. package/dist/src/config/index.js.map +1 -0
  82. package/dist/src/config/paths.d.ts +6 -0
  83. package/dist/src/config/paths.d.ts.map +1 -0
  84. package/dist/src/config/paths.js +9 -0
  85. package/dist/src/config/paths.js.map +1 -0
  86. package/dist/src/http/client.d.ts +8 -0
  87. package/dist/src/http/client.d.ts.map +1 -0
  88. package/dist/src/http/client.js +68 -0
  89. package/dist/src/http/client.js.map +1 -0
  90. package/dist/src/http/errors.d.ts +7 -0
  91. package/dist/src/http/errors.d.ts.map +1 -0
  92. package/dist/src/http/errors.js +34 -0
  93. package/dist/src/http/errors.js.map +1 -0
  94. package/dist/src/index.d.ts +3 -0
  95. package/dist/src/index.d.ts.map +1 -0
  96. package/dist/src/index.js +76 -0
  97. package/dist/src/index.js.map +1 -0
  98. package/dist/src/output/formatter.d.ts +10 -0
  99. package/dist/src/output/formatter.d.ts.map +1 -0
  100. package/dist/src/output/formatter.js +57 -0
  101. package/dist/src/output/formatter.js.map +1 -0
  102. package/dist/src/output/json.d.ts +6 -0
  103. package/dist/src/output/json.d.ts.map +1 -0
  104. package/dist/src/output/json.js +16 -0
  105. package/dist/src/output/json.js.map +1 -0
  106. package/dist/src/output/table.d.ts +9 -0
  107. package/dist/src/output/table.d.ts.map +1 -0
  108. package/dist/src/output/table.js +32 -0
  109. package/dist/src/output/table.js.map +1 -0
  110. package/dist/src/types/api.d.ts +172 -0
  111. package/dist/src/types/api.d.ts.map +1 -0
  112. package/dist/src/types/api.js +2 -0
  113. package/dist/src/types/api.js.map +1 -0
  114. package/dist/src/types/common.d.ts +18 -0
  115. package/dist/src/types/common.d.ts.map +1 -0
  116. package/dist/src/types/common.js +2 -0
  117. package/dist/src/types/common.js.map +1 -0
  118. package/dist/src/types/config.d.ts +22 -0
  119. package/dist/src/types/config.d.ts.map +1 -0
  120. package/dist/src/types/config.js +2 -0
  121. package/dist/src/types/config.js.map +1 -0
  122. package/dist/src/utils/spinner.d.ts +6 -0
  123. package/dist/src/utils/spinner.d.ts.map +1 -0
  124. package/dist/src/utils/spinner.js +35 -0
  125. package/dist/src/utils/spinner.js.map +1 -0
  126. 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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=teurtask-prod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teurtask-prod.d.ts","sourceRoot":"","sources":["../../bin/teurtask-prod.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import { createProgram } from '../src/index.js';
3
+ process.env.TEURTASK_LOCKED_ENV = 'prod';
4
+ const program = createProgram();
5
+ program.parseAsync(process.argv);
6
+ //# sourceMappingURL=teurtask-prod.js.map
@@ -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,3 @@
1
+ #!/usr/bin/env tsx
2
+ export {};
3
+ //# sourceMappingURL=teurtask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teurtask.d.ts","sourceRoot":"","sources":["../../bin/teurtask.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env tsx
2
+ import { createProgram } from '../src/index.js';
3
+ const program = createProgram();
4
+ program.parseAsync(process.argv);
5
+ //# sourceMappingURL=teurtask.js.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAuthCommands(program: Command): void;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerCommentCommands(program: Command): void;
3
+ //# sourceMappingURL=comments.d.ts.map
@@ -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"}