@marcfargas/odoo-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 (81) hide show
  1. package/dist/cli.d.ts +27 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +152 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/accounting.d.ts +16 -0
  6. package/dist/commands/accounting.d.ts.map +1 -0
  7. package/dist/commands/accounting.js +363 -0
  8. package/dist/commands/accounting.js.map +1 -0
  9. package/dist/commands/attendance.d.ts +14 -0
  10. package/dist/commands/attendance.d.ts.map +1 -0
  11. package/dist/commands/attendance.js +339 -0
  12. package/dist/commands/attendance.js.map +1 -0
  13. package/dist/commands/config.d.ts +12 -0
  14. package/dist/commands/config.d.ts.map +1 -0
  15. package/dist/commands/config.js +159 -0
  16. package/dist/commands/config.js.map +1 -0
  17. package/dist/commands/mail.d.ts +12 -0
  18. package/dist/commands/mail.d.ts.map +1 -0
  19. package/dist/commands/mail.js +236 -0
  20. package/dist/commands/mail.js.map +1 -0
  21. package/dist/commands/modules.d.ts +14 -0
  22. package/dist/commands/modules.d.ts.map +1 -0
  23. package/dist/commands/modules.js +351 -0
  24. package/dist/commands/modules.js.map +1 -0
  25. package/dist/commands/records.d.ts +15 -0
  26. package/dist/commands/records.d.ts.map +1 -0
  27. package/dist/commands/records.js +591 -0
  28. package/dist/commands/records.js.map +1 -0
  29. package/dist/commands/schema.d.ts +16 -0
  30. package/dist/commands/schema.d.ts.map +1 -0
  31. package/dist/commands/schema.js +381 -0
  32. package/dist/commands/schema.js.map +1 -0
  33. package/dist/commands/state.d.ts +14 -0
  34. package/dist/commands/state.d.ts.map +1 -0
  35. package/dist/commands/state.js +373 -0
  36. package/dist/commands/state.js.map +1 -0
  37. package/dist/commands/timesheets.d.ts +15 -0
  38. package/dist/commands/timesheets.d.ts.map +1 -0
  39. package/dist/commands/timesheets.js +453 -0
  40. package/dist/commands/timesheets.js.map +1 -0
  41. package/dist/commands/url.d.ts +12 -0
  42. package/dist/commands/url.d.ts.map +1 -0
  43. package/dist/commands/url.js +149 -0
  44. package/dist/commands/url.js.map +1 -0
  45. package/dist/help/extra-help.d.ts +18 -0
  46. package/dist/help/extra-help.d.ts.map +1 -0
  47. package/dist/help/extra-help.js +207 -0
  48. package/dist/help/extra-help.js.map +1 -0
  49. package/dist/middleware/auth.d.ts +29 -0
  50. package/dist/middleware/auth.d.ts.map +1 -0
  51. package/dist/middleware/auth.js +68 -0
  52. package/dist/middleware/auth.js.map +1 -0
  53. package/dist/middleware/common-params.d.ts +90 -0
  54. package/dist/middleware/common-params.d.ts.map +1 -0
  55. package/dist/middleware/common-params.js +169 -0
  56. package/dist/middleware/common-params.js.map +1 -0
  57. package/dist/middleware/safety.d.ts +30 -0
  58. package/dist/middleware/safety.d.ts.map +1 -0
  59. package/dist/middleware/safety.js +64 -0
  60. package/dist/middleware/safety.js.map +1 -0
  61. package/dist/output/errors.d.ts +69 -0
  62. package/dist/output/errors.d.ts.map +1 -0
  63. package/dist/output/errors.js +193 -0
  64. package/dist/output/errors.js.map +1 -0
  65. package/dist/output/formatter.d.ts +80 -0
  66. package/dist/output/formatter.d.ts.map +1 -0
  67. package/dist/output/formatter.js +285 -0
  68. package/dist/output/formatter.js.map +1 -0
  69. package/dist/output/stream-writer.d.ts +33 -0
  70. package/dist/output/stream-writer.d.ts.map +1 -0
  71. package/dist/output/stream-writer.js +74 -0
  72. package/dist/output/stream-writer.js.map +1 -0
  73. package/dist/parsing/domain-parser.d.ts +61 -0
  74. package/dist/parsing/domain-parser.d.ts.map +1 -0
  75. package/dist/parsing/domain-parser.js +427 -0
  76. package/dist/parsing/domain-parser.js.map +1 -0
  77. package/dist/parsing/json-arg.d.ts +48 -0
  78. package/dist/parsing/json-arg.d.ts.map +1 -0
  79. package/dist/parsing/json-arg.js +165 -0
  80. package/dist/parsing/json-arg.js.map +1 -0
  81. package/package.json +53 -0
@@ -0,0 +1,339 @@
1
+ "use strict";
2
+ /**
3
+ * `odoo attendance` command group.
4
+ *
5
+ * Commands:
6
+ * attendance clock-in Record clock-in [WRITE]
7
+ * attendance clock-out Record clock-out [WRITE]
8
+ * attendance status Show current status [READ]
9
+ * attendance list List records by date range [READ]
10
+ *
11
+ * Requires hr_attendance module to be installed.
12
+ */
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.buildAttendanceCommand = buildAttendanceCommand;
18
+ const commander_1 = require("commander");
19
+ const debug_1 = __importDefault(require("debug"));
20
+ const auth_1 = require("../middleware/auth");
21
+ const safety_1 = require("../middleware/safety");
22
+ const common_params_1 = require("../middleware/common-params");
23
+ const formatter_1 = require("../output/formatter");
24
+ const errors_1 = require("../output/errors");
25
+ const stream_writer_1 = require("../output/stream-writer");
26
+ const extra_help_1 = require("../help/extra-help");
27
+ const log = (0, debug_1.default)('odoo-cli:attendance');
28
+ // ── Helper: resolve employee ID from name or numeric option ───────────
29
+ /**
30
+ * Resolve employee ID from --employee-id (number) or --employee (name).
31
+ * Returns undefined if neither is specified (Odoo service falls back to current user).
32
+ * Exits with error if name lookup fails or is ambiguous.
33
+ */
34
+ async function resolveEmployeeId(client, opts) {
35
+ if (opts.employee) {
36
+ const name = opts.employee;
37
+ const matches = await client.searchRead('hr.employee', [['name', '=', name]], {
38
+ fields: ['id', 'name'],
39
+ limit: 5,
40
+ });
41
+ if (matches.length === 0) {
42
+ process.stderr.write(`✗ Error: No employee found with name "${name}"\n`);
43
+ process.exit(errors_1.EXIT_CODES.NOT_FOUND);
44
+ }
45
+ if (matches.length > 1) {
46
+ process.stderr.write(`✗ Error: Multiple employees match "${name}":\n`);
47
+ for (const m of matches) {
48
+ process.stderr.write(` - ${m.name} (id=${m.id})\n`);
49
+ }
50
+ process.exit(errors_1.EXIT_CODES.USAGE_ERROR);
51
+ }
52
+ return matches[0].id;
53
+ }
54
+ if (opts.employeeId) {
55
+ const id = parseInt(opts.employeeId, 10);
56
+ if (isNaN(id) || id <= 0) {
57
+ throw new errors_1.CliUsageError(`--employee-id must be a positive integer, got: ${opts.employeeId}`);
58
+ }
59
+ return id;
60
+ }
61
+ return undefined;
62
+ }
63
+ function buildAttendanceCommand() {
64
+ const att = new commander_1.Command('attendance')
65
+ .description('Employee attendance — clock in/out and presence tracking')
66
+ .addHelpText('after', `
67
+ Requires: hr_attendance Odoo module.
68
+ Group flag: --employee-id N (default: current user's employee)
69
+
70
+ Safety:
71
+ READ status, list — no confirmation required
72
+ WRITE clock-in, clock-out — requires --confirm
73
+
74
+ Examples:
75
+ odoo attendance clock-in --confirm
76
+ odoo attendance clock-out --confirm
77
+ odoo attendance status
78
+ odoo attendance list --from 2024-03-11 --to 2024-03-15
79
+ `);
80
+ // --help-extra
81
+ att.option('--help-extra', 'Show extended skill documentation for attendance');
82
+ att.hook('preAction', async (thisCommand) => {
83
+ const opts = thisCommand.opts();
84
+ if (opts.helpExtra) {
85
+ await (0, extra_help_1.showHelpExtra)('attendance');
86
+ process.exit(0);
87
+ }
88
+ });
89
+ // Group-level employee flag
90
+ att.option('--employee-id <n>', "Employee ID (default: current user's employee)");
91
+ att.option('--employee <name>', 'Employee name (lookup by name)');
92
+ att.addCommand(buildClockInCommand());
93
+ att.addCommand(buildClockOutCommand());
94
+ att.addCommand(buildStatusCommand());
95
+ att.addCommand(buildListCommand());
96
+ return att;
97
+ }
98
+ function buildClockInCommand() {
99
+ const cmd = new commander_1.Command('clock-in')
100
+ .description('Record employee clock-in [WRITE — requires --confirm]')
101
+ .addHelpText('after', `
102
+ Examples:
103
+ odoo attendance clock-in --confirm
104
+ odoo attendance clock-in --employee-id 42 --confirm
105
+ `);
106
+ (0, common_params_1.addAuthOptions)(cmd);
107
+ cmd.addOption((0, common_params_1.confirmOption)());
108
+ cmd.addOption((0, common_params_1.dryRunOption)());
109
+ cmd.action(async () => {
110
+ const opts = cmd.optsWithGlobals();
111
+ log('attendance clock-in');
112
+ try {
113
+ (0, safety_1.requireConfirm)('WRITE', opts, 'attendance clock-in');
114
+ }
115
+ catch (err) {
116
+ process.exit((0, errors_1.handleError)(err));
117
+ }
118
+ if (opts.dryRun) {
119
+ const empRef = opts.employee ?? opts.employeeId ?? '<current user employee>';
120
+ (0, safety_1.printDryRun)('hr.attendance', 'create', [{ employee_id: empRef, check_in: '<now>' }]);
121
+ return;
122
+ }
123
+ let client;
124
+ try {
125
+ client = await (0, auth_1.createAuthClient)(opts);
126
+ }
127
+ catch (err) {
128
+ process.exit((0, errors_1.handleError)(err));
129
+ }
130
+ try {
131
+ const employeeId = await resolveEmployeeId(client, opts);
132
+ const record = await client.attendance.clockIn(employeeId);
133
+ const employeeName = Array.isArray(record.employee_id) ? record.employee_id[1] : 'Employee';
134
+ const checkIn = formatDateTime(record.check_in);
135
+ (0, errors_1.printSuccess)(`Clocked in: ${employeeName} at ${checkIn}`);
136
+ }
137
+ catch (err) {
138
+ // Conflict: already clocked in
139
+ if (err instanceof Error && err.message.toLowerCase().includes('already')) {
140
+ process.stderr.write(`✗ Error: Already clocked in\n → Run: odoo attendance clock-out --confirm\n`);
141
+ process.exit(errors_1.EXIT_CODES.CONFLICT);
142
+ }
143
+ process.exit((0, errors_1.handleError)(err));
144
+ }
145
+ finally {
146
+ client?.logout();
147
+ }
148
+ });
149
+ return cmd;
150
+ }
151
+ function buildClockOutCommand() {
152
+ const cmd = new commander_1.Command('clock-out')
153
+ .description('Record employee clock-out [WRITE — requires --confirm]')
154
+ .addHelpText('after', `
155
+ Examples:
156
+ odoo attendance clock-out --confirm
157
+ `);
158
+ (0, common_params_1.addAuthOptions)(cmd);
159
+ cmd.addOption((0, common_params_1.confirmOption)());
160
+ cmd.addOption((0, common_params_1.dryRunOption)());
161
+ cmd.action(async () => {
162
+ const opts = cmd.optsWithGlobals();
163
+ log('attendance clock-out');
164
+ try {
165
+ (0, safety_1.requireConfirm)('WRITE', opts, 'attendance clock-out');
166
+ }
167
+ catch (err) {
168
+ process.exit((0, errors_1.handleError)(err));
169
+ }
170
+ if (opts.dryRun) {
171
+ (0, safety_1.printDryRun)('hr.attendance', 'write', [['<open attendance id>'], { check_out: '<now>' }]);
172
+ return;
173
+ }
174
+ let client;
175
+ try {
176
+ client = await (0, auth_1.createAuthClient)(opts);
177
+ }
178
+ catch (err) {
179
+ process.exit((0, errors_1.handleError)(err));
180
+ }
181
+ try {
182
+ const employeeId = await resolveEmployeeId(client, opts);
183
+ const record = await client.attendance.clockOut(employeeId);
184
+ const employeeName = Array.isArray(record.employee_id) ? record.employee_id[1] : 'Employee';
185
+ const hoursWorked = formatHours(record.worked_hours);
186
+ (0, errors_1.printSuccess)(`Clocked out: ${employeeName} — worked ${hoursWorked} today`);
187
+ }
188
+ catch (err) {
189
+ if (err instanceof Error && err.message.toLowerCase().includes('not clocked in')) {
190
+ process.stderr.write(`✗ Error: Not currently clocked in\n → Run: odoo attendance clock-in --confirm\n`);
191
+ process.exit(errors_1.EXIT_CODES.CONFLICT);
192
+ }
193
+ process.exit((0, errors_1.handleError)(err));
194
+ }
195
+ finally {
196
+ client?.logout();
197
+ }
198
+ });
199
+ return cmd;
200
+ }
201
+ function buildStatusCommand() {
202
+ const cmd = new commander_1.Command('status')
203
+ .description('Show current attendance status [READ]')
204
+ .addHelpText('after', `
205
+ Examples:
206
+ odoo attendance status
207
+ odoo attendance status --format json
208
+ `);
209
+ (0, common_params_1.addAuthOptions)(cmd);
210
+ (0, common_params_1.addOutputOptions)(cmd);
211
+ cmd.action(async () => {
212
+ const opts = cmd.optsWithGlobals();
213
+ log('attendance status');
214
+ let client;
215
+ try {
216
+ client = await (0, auth_1.createAuthClient)(opts);
217
+ }
218
+ catch (err) {
219
+ process.exit((0, errors_1.handleError)(err));
220
+ }
221
+ try {
222
+ const employeeId = await resolveEmployeeId(client, opts);
223
+ const status = await client.attendance.getStatus(employeeId);
224
+ const format = (0, formatter_1.resolveFormat)(opts.format);
225
+ if (format === 'json' || format === 'ndjson') {
226
+ const out = {
227
+ status: status.checkedIn ? 'in' : 'out',
228
+ employee_id: status.employee[0],
229
+ employee_name: status.employee[1],
230
+ since: status.currentAttendance?.check_in ?? null,
231
+ elapsed_minutes: status.currentAttendance
232
+ ? Math.round((Date.now() - new Date(status.currentAttendance.check_in).getTime()) / 60000)
233
+ : null,
234
+ };
235
+ await (0, stream_writer_1.writeStdout)(JSON.stringify(out, null, format === 'json' ? 2 : 0) + '\n');
236
+ }
237
+ else {
238
+ // Table/text
239
+ if (status.checkedIn && status.currentAttendance) {
240
+ const since = formatDateTime(status.currentAttendance.check_in);
241
+ const elapsed = Math.round((Date.now() - new Date(status.currentAttendance.check_in).getTime()) / 60000);
242
+ const elapsedStr = formatElapsed(elapsed);
243
+ process.stdout.write(`● IN since ${since} (${elapsedStr} elapsed)\n`);
244
+ }
245
+ else {
246
+ process.stdout.write(`○ OUT — ${status.employee[1]} is not clocked in\n`);
247
+ }
248
+ }
249
+ }
250
+ catch (err) {
251
+ process.exit((0, errors_1.handleError)(err));
252
+ }
253
+ finally {
254
+ client?.logout();
255
+ }
256
+ });
257
+ return cmd;
258
+ }
259
+ function buildListCommand() {
260
+ const cmd = new commander_1.Command('list')
261
+ .description('List attendance records by date range [READ]')
262
+ .addHelpText('after', `
263
+ Dates default to the current week (Monday to today).
264
+
265
+ Examples:
266
+ odoo attendance list
267
+ odoo attendance list --from 2024-03-11 --to 2024-03-15
268
+ odoo attendance list --format csv > attendance.csv
269
+ `);
270
+ (0, common_params_1.addAuthOptions)(cmd);
271
+ (0, common_params_1.addOutputOptions)(cmd);
272
+ cmd.option('--from <date>', 'Start date YYYY-MM-DD (default: current week Monday)');
273
+ cmd.option('--to <date>', 'End date YYYY-MM-DD (default: today)');
274
+ cmd.action(async () => {
275
+ const opts = cmd.optsWithGlobals();
276
+ log('attendance list from=%s to=%s', opts.from, opts.to);
277
+ const today = new Date();
278
+ const dateFrom = opts.from ?? getWeekMonday(today);
279
+ const dateTo = opts.to ?? today.toISOString().split('T')[0];
280
+ let client;
281
+ try {
282
+ client = await (0, auth_1.createAuthClient)(opts);
283
+ }
284
+ catch (err) {
285
+ process.exit((0, errors_1.handleError)(err));
286
+ }
287
+ try {
288
+ const employeeId = await resolveEmployeeId(client, opts);
289
+ const records = await client.attendance.list({ dateFrom, dateTo, employeeId });
290
+ const format = (0, formatter_1.resolveFormat)(opts.format);
291
+ const rows = records.map((r) => ({
292
+ date: r.check_in ? r.check_in.split('T')[0] : '',
293
+ check_in: r.check_in ? formatDateTime(r.check_in) : '',
294
+ check_out: r.check_out ? formatDateTime(r.check_out) : '—',
295
+ duration: formatHours(r.worked_hours),
296
+ employee: Array.isArray(r.employee_id) ? r.employee_id[1] : '',
297
+ }));
298
+ await (0, formatter_1.render)(rows, format);
299
+ if (format === 'table' && rows.length > 0) {
300
+ const total = records.reduce((s, r) => s + (r.worked_hours ?? 0), 0);
301
+ process.stderr.write(`Total: ${formatHours(total)}\n`);
302
+ }
303
+ }
304
+ catch (err) {
305
+ process.exit((0, errors_1.handleError)(err));
306
+ }
307
+ finally {
308
+ client?.logout();
309
+ }
310
+ });
311
+ return cmd;
312
+ }
313
+ // ── Helpers ──────────────────────────────────────────────────────────
314
+ function formatDateTime(utcStr) {
315
+ try {
316
+ return new Date(utcStr).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
317
+ }
318
+ catch {
319
+ return utcStr;
320
+ }
321
+ }
322
+ function formatHours(hours) {
323
+ const h = Math.floor(hours);
324
+ const m = Math.round((hours - h) * 60);
325
+ return `${h}h ${m.toString().padStart(2, '0')}m`;
326
+ }
327
+ function formatElapsed(minutes) {
328
+ const h = Math.floor(minutes / 60);
329
+ const m = minutes % 60;
330
+ return h > 0 ? `${h}h ${m}m` : `${m}m`;
331
+ }
332
+ function getWeekMonday(date) {
333
+ const d = new Date(date);
334
+ const day = d.getDay(); // 0=Sun, 1=Mon, ...
335
+ const diff = day === 0 ? -6 : 1 - day;
336
+ d.setDate(d.getDate() + diff);
337
+ return d.toISOString().split('T')[0];
338
+ }
339
+ //# sourceMappingURL=attendance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attendance.js","sourceRoot":"","sources":["../../src/commands/attendance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `odoo config` command group.
3
+ *
4
+ * Commands:
5
+ * config check — verify connection and show current user
6
+ * config show — show resolved config (password always redacted)
7
+ *
8
+ * Safety level: READ (no mutations)
9
+ */
10
+ import { Command } from 'commander';
11
+ export declare function buildConfigCommand(): Command;
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,kBAAkB,IAAI,OAAO,CA6B5C"}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ /**
3
+ * `odoo config` command group.
4
+ *
5
+ * Commands:
6
+ * config check — verify connection and show current user
7
+ * config show — show resolved config (password always redacted)
8
+ *
9
+ * Safety level: READ (no mutations)
10
+ */
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.buildConfigCommand = buildConfigCommand;
16
+ const commander_1 = require("commander");
17
+ const debug_1 = __importDefault(require("debug"));
18
+ const auth_1 = require("../middleware/auth");
19
+ const auth_2 = require("../middleware/auth");
20
+ const common_params_1 = require("../middleware/common-params");
21
+ const formatter_1 = require("../output/formatter");
22
+ const errors_1 = require("../output/errors");
23
+ const extra_help_1 = require("../help/extra-help");
24
+ const log = (0, debug_1.default)('odoo-cli:config');
25
+ function buildConfigCommand() {
26
+ const config = new commander_1.Command('config')
27
+ .description('Manage Odoo connection configuration')
28
+ .addHelpText('after', `
29
+ Safety: READ — no confirmation required.
30
+
31
+ Examples:
32
+ odoo config check
33
+ odoo config show
34
+ odoo config show --format json
35
+ `);
36
+ // --help-extra
37
+ config.option('--help-extra', 'Show extended skill documentation for config');
38
+ config.hook('preAction', async (thisCommand) => {
39
+ const opts = thisCommand.opts();
40
+ if (opts.helpExtra) {
41
+ await (0, extra_help_1.showHelpExtra)('config');
42
+ process.exit(0);
43
+ }
44
+ });
45
+ config.addCommand(buildCheckCommand());
46
+ config.addCommand(buildShowCommand());
47
+ return config;
48
+ }
49
+ function buildCheckCommand() {
50
+ const check = new commander_1.Command('check')
51
+ .description('Verify connection and show current user [READ]')
52
+ .addHelpText('after', `
53
+ Examples:
54
+ odoo config check
55
+ odoo config check --url https://mycompany.odoo.com --db mycompany
56
+ `);
57
+ (0, common_params_1.addAuthOptions)(check);
58
+ check.action(async () => {
59
+ const flags = check.optsWithGlobals();
60
+ log('Running config check with flags: %O', { url: flags.url, db: flags.db, user: flags.user });
61
+ let client;
62
+ try {
63
+ client = await (0, auth_1.createAuthClient)(flags);
64
+ }
65
+ catch (err) {
66
+ process.exit((0, errors_1.handleError)(err));
67
+ }
68
+ try {
69
+ // Get session info
70
+ const session = client.getSession();
71
+ if (!session) {
72
+ process.stderr.write('✗ Error: Authentication succeeded but session is missing\n');
73
+ process.exit(errors_1.EXIT_CODES.AUTH_NETWORK_ERROR);
74
+ }
75
+ // Fetch user display name
76
+ const users = await client
77
+ .read('res.users', [session.uid], ['name', 'login'])
78
+ .catch(() => []);
79
+ const userName = users.length > 0 ? `${users[0].name} (${users[0].login})` : `uid=${session.uid}`;
80
+ // Count installed modules
81
+ const installedCount = await client.searchCount('ir.module.module', [
82
+ ['state', '=', 'installed'],
83
+ ]);
84
+ const cfg = (0, auth_2.buildConfig)(flags);
85
+ (0, errors_1.printSuccess)(`Connected to ${cfg.url} (db: ${cfg.database})`);
86
+ (0, errors_1.printInfo)(`User: ${userName} [id: ${session.uid}]`);
87
+ (0, errors_1.printInfo)(`Installed modules: ${installedCount}`);
88
+ }
89
+ catch (err) {
90
+ process.exit((0, errors_1.handleError)(err));
91
+ }
92
+ finally {
93
+ client?.logout();
94
+ }
95
+ });
96
+ return check;
97
+ }
98
+ function buildShowCommand() {
99
+ const show = new commander_1.Command('show')
100
+ .description('Show resolved configuration (password always redacted) [READ]')
101
+ .addHelpText('after', `
102
+ Examples:
103
+ odoo config show
104
+ odoo config show --format json
105
+ `);
106
+ (0, common_params_1.addAuthOptions)(show);
107
+ show.addOption((0, common_params_1.formatOption)());
108
+ show.action(async () => {
109
+ const flags = show.optsWithGlobals();
110
+ const format = (0, formatter_1.resolveFormat)(flags.format);
111
+ // Build config WITHOUT authenticating (just resolve env + flags)
112
+ const urlVal = flags.url || process.env['ODOO_URL'] || '(not set)';
113
+ const dbVal = flags.db || process.env['ODOO_DB'] || process.env['ODOO_DATABASE'] || '(not set)';
114
+ const userVal = flags.user || process.env['ODOO_USERNAME'] || process.env['ODOO_USER'] || '(not set)';
115
+ const passwordSet = !!(flags.password || process.env['ODOO_PASSWORD']);
116
+ const urlSource = flags.url ? '--url flag' : process.env['ODOO_URL'] ? 'ODOO_URL' : 'not set';
117
+ const dbSource = flags.db
118
+ ? '--db flag'
119
+ : process.env['ODOO_DB']
120
+ ? 'ODOO_DB'
121
+ : process.env['ODOO_DATABASE']
122
+ ? 'ODOO_DATABASE'
123
+ : 'not set';
124
+ const userSource = flags.user
125
+ ? '--user flag'
126
+ : process.env['ODOO_USERNAME']
127
+ ? 'ODOO_USERNAME'
128
+ : process.env['ODOO_USER']
129
+ ? 'ODOO_USER'
130
+ : 'not set';
131
+ const passwordSource = flags.password
132
+ ? '--password flag ⚠'
133
+ : process.env['ODOO_PASSWORD']
134
+ ? 'ODOO_PASSWORD'
135
+ : 'not set';
136
+ if (format === 'json' || format === 'ndjson') {
137
+ // Clean JSON without source info
138
+ await (0, formatter_1.renderKeyValue)({
139
+ url: urlVal,
140
+ db: dbVal,
141
+ username: userVal,
142
+ password: passwordSet ? 'REDACTED' : '(not set)',
143
+ }, format);
144
+ }
145
+ else {
146
+ // Table/CSV with source annotations
147
+ const data = {
148
+ URL: `${urlVal} (from ${urlSource})`,
149
+ Database: `${dbVal} (from ${dbSource})`,
150
+ Username: `${userVal} (from ${userSource})`,
151
+ Password: `${passwordSet ? '****' : '(not set)'} (from ${passwordSource})`,
152
+ Format: `${format} (${process.stdout.isTTY ? 'TTY default' : 'pipe default'})`,
153
+ };
154
+ await (0, formatter_1.renderKeyValue)(data, format);
155
+ }
156
+ });
157
+ return show;
158
+ }
159
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;AAaH,gDA6BC;AAxCD,yCAAoC;AACpC,kDAA0B;AAC1B,6CAAsE;AACtE,6CAAiD;AACjD,+DAA2E;AAC3E,mDAAoE;AACpE,6CAAoF;AACpF,mDAAmD;AAEnD,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,iBAAiB,CAAC,CAAC;AAErC,SAAgB,kBAAkB;IAChC,MAAM,MAAM,GAAG,IAAI,mBAAO,CAAC,QAAQ,CAAC;SACjC,WAAW,CAAC,sCAAsC,CAAC;SACnD,WAAW,CACV,OAAO,EACP;;;;;;;CAOL,CACI,CAAC;IAEJ,eAAe;IACf,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,8CAA8C,CAAC,CAAC;IAC9E,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;QAC7C,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAA,0BAAa,EAAC,QAAQ,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAEtC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,KAAK,GAAG,IAAI,mBAAO,CAAC,OAAO,CAAC;SAC/B,WAAW,CAAC,gDAAgD,CAAC;SAC7D,WAAW,CACV,OAAO,EACP;;;;CAIL,CACI,CAAC;IAEJ,IAAA,8BAAc,EAAC,KAAK,CAAC,CAAC;IAEtB,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACtB,MAAM,KAAK,GAAG,KAAK,CAAC,eAAe,EAAe,CAAC;QACnD,GAAG,CAAC,qCAAqC,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAE/F,IAAI,MAAM,CAAC;QACX,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAA,uBAAgB,EAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,IAAA,oBAAW,EAAC,GAAG,CAAC,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,CAAC;YACH,mBAAmB;YACnB,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YACpC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;gBACnF,OAAO,CAAC,IAAI,CAAC,mBAAU,CAAC,kBAAkB,CAAC,CAAC;YAC9C,CAAC;YAED,0BAA0B;YAC1B,MAAM,KAAK,GAAG,MAAM,MAAM;iBACvB,IAAI,CAAkC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;iBACpF,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACnB,MAAM,QAAQ,GACZ,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;YAEnF,0BAA0B;YAC1B,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,kBAAkB,EAAE;gBAClE,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC;aAC5B,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,IAAA,kBAAW,EAAC,KAAK,CAAC,CAAC;YAE/B,IAAA,qBAAY,EAAC,gBAAgB,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC;YAC9D,IAAA,kBAAS,EAAC,SAAS,QAAQ,SAAS,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;YACpD,IAAA,kBAAS,EAAC,sBAAsB,cAAc,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,IAAA,oBAAW,EAAC,GAAG,CAAC,CAAC,CAAC;QACjC,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,MAAM,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,IAAI,GAAG,IAAI,mBAAO,CAAC,MAAM,CAAC;SAC7B,WAAW,CAAC,+DAA+D,CAAC;SAC5E,WAAW,CACV,OAAO,EACP;;;;CAIL,CACI,CAAC;IAEJ,IAAA,8BAAc,EAAC,IAAI,CAAC,CAAC;IACrB,IAAI,CAAC,SAAS,CAAC,IAAA,4BAAY,GAAE,CAAC,CAAC;IAE/B,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAqC,CAAC;QACxE,MAAM,MAAM,GAAG,IAAA,yBAAa,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAE3C,iEAAiE;QACjE,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,WAAW,CAAC;QACnE,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,WAAW,CAAC;QAChG,MAAM,OAAO,GACX,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC;QACxF,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;QAEvE,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9F,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE;YACvB,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;gBACtB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;oBAC5B,CAAC,CAAC,eAAe;oBACjB,CAAC,CAAC,SAAS,CAAC;QAClB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI;YAC3B,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;gBAC5B,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;oBACxB,CAAC,CAAC,WAAW;oBACb,CAAC,CAAC,SAAS,CAAC;QAClB,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ;YACnC,CAAC,CAAC,mBAAmB;YACrB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;gBAC5B,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,SAAS,CAAC;QAEhB,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7C,iCAAiC;YACjC,MAAM,IAAA,0BAAc,EAClB;gBACE,GAAG,EAAE,MAAM;gBACX,EAAE,EAAE,KAAK;gBACT,QAAQ,EAAE,OAAO;gBACjB,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW;aACjD,EACD,MAAM,CACP,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,oCAAoC;YACpC,MAAM,IAAI,GAA2B;gBACnC,GAAG,EAAE,GAAG,MAAM,WAAW,SAAS,GAAG;gBACrC,QAAQ,EAAE,GAAG,KAAK,WAAW,QAAQ,GAAG;gBACxC,QAAQ,EAAE,GAAG,OAAO,WAAW,UAAU,GAAG;gBAC5C,QAAQ,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,WAAW,cAAc,GAAG;gBAC3E,MAAM,EAAE,GAAG,MAAM,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc,GAAG;aAChF,CAAC;YACF,MAAM,IAAA,0BAAc,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `odoo mail` command group — chatter messages and internal notes.
3
+ *
4
+ * Commands:
5
+ * mail note <model> <id> [message] Post internal note [WRITE]
6
+ * mail post <model> <id> [message] Post public message [WRITE]
7
+ *
8
+ * Both commands require --confirm.
9
+ */
10
+ import { Command } from 'commander';
11
+ export declare function buildMailCommand(): Command;
12
+ //# sourceMappingURL=mail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail.d.ts","sourceRoot":"","sources":["../../src/commands/mail.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,gBAAgB,IAAI,OAAO,CA+B1C"}