@orbitpanel/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 (77) hide show
  1. package/README.md +100 -0
  2. package/bin/dev.js +3 -0
  3. package/bin/run.js +3 -0
  4. package/dist/commands/doctor.d.ts +6 -0
  5. package/dist/commands/doctor.js +86 -0
  6. package/dist/commands/doctor.js.map +1 -0
  7. package/dist/commands/intervention/delete.d.ts +12 -0
  8. package/dist/commands/intervention/delete.js +70 -0
  9. package/dist/commands/intervention/delete.js.map +1 -0
  10. package/dist/commands/intervention/get.d.ts +12 -0
  11. package/dist/commands/intervention/get.js +64 -0
  12. package/dist/commands/intervention/get.js.map +1 -0
  13. package/dist/commands/intervention/list.d.ts +15 -0
  14. package/dist/commands/intervention/list.js +102 -0
  15. package/dist/commands/intervention/list.js.map +1 -0
  16. package/dist/commands/intervention/update.d.ts +16 -0
  17. package/dist/commands/intervention/update.js +78 -0
  18. package/dist/commands/intervention/update.js.map +1 -0
  19. package/dist/commands/link.d.ts +13 -0
  20. package/dist/commands/link.js +77 -0
  21. package/dist/commands/link.js.map +1 -0
  22. package/dist/commands/login.d.ts +12 -0
  23. package/dist/commands/login.js +61 -0
  24. package/dist/commands/login.js.map +1 -0
  25. package/dist/commands/logout.d.ts +9 -0
  26. package/dist/commands/logout.js +23 -0
  27. package/dist/commands/logout.js.map +1 -0
  28. package/dist/commands/note/add.d.ts +13 -0
  29. package/dist/commands/note/add.js +53 -0
  30. package/dist/commands/note/add.js.map +1 -0
  31. package/dist/commands/report/send.d.ts +15 -0
  32. package/dist/commands/report/send.js +124 -0
  33. package/dist/commands/report/send.js.map +1 -0
  34. package/dist/commands/serve.d.ts +7 -0
  35. package/dist/commands/serve.js +24 -0
  36. package/dist/commands/serve.js.map +1 -0
  37. package/dist/commands/session/end.d.ts +10 -0
  38. package/dist/commands/session/end.js +61 -0
  39. package/dist/commands/session/end.js.map +1 -0
  40. package/dist/commands/session/start.d.ts +10 -0
  41. package/dist/commands/session/start.js +61 -0
  42. package/dist/commands/session/start.js.map +1 -0
  43. package/dist/commands/status.d.ts +6 -0
  44. package/dist/commands/status.js +56 -0
  45. package/dist/commands/status.js.map +1 -0
  46. package/dist/commands/unlink.d.ts +10 -0
  47. package/dist/commands/unlink.js +43 -0
  48. package/dist/commands/unlink.js.map +1 -0
  49. package/dist/hooks/prerun.d.ts +9 -0
  50. package/dist/hooks/prerun.js +13 -0
  51. package/dist/hooks/prerun.js.map +1 -0
  52. package/dist/lib/client.d.ts +34 -0
  53. package/dist/lib/client.js +151 -0
  54. package/dist/lib/client.js.map +1 -0
  55. package/dist/lib/config.d.ts +19 -0
  56. package/dist/lib/config.js +67 -0
  57. package/dist/lib/config.js.map +1 -0
  58. package/dist/lib/git.d.ts +19 -0
  59. package/dist/lib/git.js +48 -0
  60. package/dist/lib/git.js.map +1 -0
  61. package/dist/lib/report-builder.d.ts +16 -0
  62. package/dist/lib/report-builder.js +73 -0
  63. package/dist/lib/report-builder.js.map +1 -0
  64. package/dist/lib/session.d.ts +28 -0
  65. package/dist/lib/session.js +106 -0
  66. package/dist/lib/session.js.map +1 -0
  67. package/dist/lib/site.d.ts +21 -0
  68. package/dist/lib/site.js +59 -0
  69. package/dist/lib/site.js.map +1 -0
  70. package/dist/mcp/server.d.ts +16 -0
  71. package/dist/mcp/server.js +319 -0
  72. package/dist/mcp/server.js.map +1 -0
  73. package/dist/types.d.ts +68 -0
  74. package/dist/types.js +5 -0
  75. package/dist/types.js.map +1 -0
  76. package/oclif.manifest.json +732 -0
  77. package/package.json +62 -0
package/README.md ADDED
@@ -0,0 +1,100 @@
1
+ # @orbitpanel/cli
2
+
3
+ Orbit CLI — strumento locale per sviluppatori OrbitPanel.
4
+
5
+ Collega il lavoro di sviluppo locale alla piattaforma Orbit con tracciamento sessioni, report strutturati e integrazione LLM via MCP.
6
+
7
+ ## Installazione
8
+
9
+ ```bash
10
+ npm install -g @orbitpanel/cli
11
+ ```
12
+
13
+ ## Quick Start
14
+
15
+ ```bash
16
+ # 1. Autenticazione
17
+ orbit login --token orbit_mcp_xxx
18
+
19
+ # 2. Collega la directory al sito Orbit
20
+ cd /path/to/progetto
21
+ orbit link --site <site_id>
22
+
23
+ # 3. Inizia una sessione
24
+ orbit session start
25
+
26
+ # 4. Lavora... e aggiungi note
27
+ orbit note add "Fixato layout mobile homepage"
28
+
29
+ # 5. Invia il report
30
+ orbit report send --title "Fix homepage" --tag fix
31
+ ```
32
+
33
+ ## Comandi
34
+
35
+ | Comando | Descrizione |
36
+ |---------|-------------|
37
+ | `orbit login` | Autentica con token MCP |
38
+ | `orbit logout` | Rimuove il token |
39
+ | `orbit link` | Collega directory → sito Orbit |
40
+ | `orbit unlink` | Rimuove collegamento |
41
+ | `orbit status` | Stato corrente |
42
+ | `orbit doctor` | Diagnostica completa |
43
+ | `orbit session start` | Inizia sessione |
44
+ | `orbit session end` | Chiude sessione |
45
+ | `orbit note add` | Aggiunge nota |
46
+ | `orbit report send` | Invia report a Orbit |
47
+ | `orbit intervention list` | Lista interventi |
48
+ | `orbit intervention get` | Dettaglio intervento |
49
+ | `orbit intervention update` | Aggiorna intervento |
50
+ | `orbit intervention delete` | Elimina intervento |
51
+ | `orbit serve` | MCP server per LLM |
52
+
53
+ ## Integrazione LLM (MCP)
54
+
55
+ `orbit serve` avvia un MCP server su stdio con 9 tool. Configurazione:
56
+
57
+ ```json
58
+ {
59
+ "mcpServers": {
60
+ "orbit-local": {
61
+ "command": "orbit",
62
+ "args": ["serve"],
63
+ "env": {
64
+ "MCP_TOKEN": "orbit_mcp_xxx",
65
+ "ORBIT_LOCAL_PATH": "/path/to/progetto"
66
+ }
67
+ }
68
+ }
69
+ }
70
+ ```
71
+
72
+ ### Tool MCP disponibili
73
+
74
+ - `orbit_session_start` / `orbit_session_end`
75
+ - `orbit_report_send`
76
+ - `orbit_note_add`
77
+ - `orbit_status`
78
+ - `orbit_interventions_list`
79
+ - `orbit_intervention_get` / `orbit_intervention_update` / `orbit_intervention_delete`
80
+
81
+ ## Sviluppo
82
+
83
+ ```bash
84
+ cd cli
85
+ npm install
86
+ npm test # 73 test
87
+ npm run build # TypeScript → dist/
88
+ ```
89
+
90
+ ## Architettura
91
+
92
+ - **Framework**: oclif v4 + ESM
93
+ - **MCP SDK**: @modelcontextprotocol/sdk
94
+ - **Persistenza**: JSON files in `~/.orbit/`
95
+ - **Auth**: MCP token (Bearer, HMAC-SHA256)
96
+ - **Retry**: Exponential backoff su 502/503/504/429
97
+
98
+ ## Licenza
99
+
100
+ MIT
package/bin/dev.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env -S tsx
2
+ import {execute} from '@oclif/core'
3
+ await execute({development: true, dir: import.meta.url})
package/bin/run.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import {execute} from '@oclif/core'
3
+ await execute({dir: import.meta.url})
@@ -0,0 +1,6 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Doctor extends Command {
3
+ static summary: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }
@@ -0,0 +1,86 @@
1
+ import { Command } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import { existsSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { loadConfig } from '../lib/config.js';
6
+ import { OrbitClient } from '../lib/client.js';
7
+ function ok(msg) {
8
+ return ` ${chalk.green('[OK]')} ${msg}`;
9
+ }
10
+ function fail(msg) {
11
+ return ` ${chalk.red('[!!]')} ${msg}`;
12
+ }
13
+ function info(msg) {
14
+ return ` ${chalk.blue('[--]')} ${msg}`;
15
+ }
16
+ export default class Doctor extends Command {
17
+ static summary = 'Verifica che tutto funzioni correttamente';
18
+ static examples = ['<%= config.bin %> doctor'];
19
+ async run() {
20
+ this.log('');
21
+ this.log(chalk.bold('Orbit Doctor'));
22
+ this.log('');
23
+ let allOk = true;
24
+ // 1. Token check
25
+ const config = await loadConfig();
26
+ const defaultSite = config.default_site;
27
+ const tokenEntry = defaultSite ? config.tokens[defaultSite] : undefined;
28
+ if (tokenEntry) {
29
+ this.log(ok(`Token configurato (${tokenEntry.token.slice(0, 15)}...)`));
30
+ }
31
+ else {
32
+ this.log(fail('Nessun token configurato'));
33
+ this.log(chalk.dim(' Esegui: orbit login --token <token>'));
34
+ allOk = false;
35
+ }
36
+ // 2. API reachability
37
+ if (tokenEntry) {
38
+ const client = new OrbitClient(tokenEntry.token, config.api_url);
39
+ const start = Date.now();
40
+ const validation = await client.validateToken();
41
+ const elapsed = Date.now() - start;
42
+ if (validation.valid) {
43
+ this.log(ok(`API raggiungibile (${config.api_url} — ${elapsed}ms)`));
44
+ }
45
+ else {
46
+ this.log(fail(`API non raggiungibile: ${validation.error}`));
47
+ allOk = false;
48
+ }
49
+ }
50
+ else {
51
+ this.log(info('API non verificata (nessun token)'));
52
+ }
53
+ // 3. .orbit.json in current directory
54
+ const orbitJsonPath = join(process.cwd(), '.orbit.json');
55
+ if (existsSync(orbitJsonPath)) {
56
+ this.log(ok('.orbit.json presente'));
57
+ }
58
+ else {
59
+ this.log(info('Nessun .orbit.json nella directory corrente'));
60
+ this.log(chalk.dim(' Esegui: orbit link --site <site_id>'));
61
+ }
62
+ // 4. Git repository check
63
+ const gitDir = join(process.cwd(), '.git');
64
+ if (existsSync(gitDir)) {
65
+ this.log(ok('Git repository rilevato'));
66
+ }
67
+ else {
68
+ this.log(info('Nessun repository git'));
69
+ }
70
+ // 5. WordPress check
71
+ const wpConfigPath = join(process.cwd(), 'wp-config.php');
72
+ if (existsSync(wpConfigPath)) {
73
+ this.log(info('WordPress rilevato (wp-config.php trovato)'));
74
+ }
75
+ // Summary
76
+ this.log('');
77
+ if (allOk) {
78
+ this.log(chalk.green('Tutto ok — pronto per lavorare.'));
79
+ }
80
+ else {
81
+ this.log(chalk.yellow('Alcuni problemi rilevati. Segui i suggerimenti sopra.'));
82
+ }
83
+ this.log('');
84
+ }
85
+ }
86
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class InterventionDelete extends Command {
3
+ static summary: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ confirm: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ };
11
+ run(): Promise<void>;
12
+ }
@@ -0,0 +1,70 @@
1
+ import { Args, Command, Flags } from '@oclif/core';
2
+ import { createInterface } from 'node:readline';
3
+ import chalk from 'chalk';
4
+ import { loadConfig } from '../../lib/config.js';
5
+ import { OrbitClient } from '../../lib/client.js';
6
+ const UUID_RE = /^[0-9a-f-]{8,36}$/i;
7
+ export default class InterventionDelete extends Command {
8
+ static summary = 'Elimina un intervento (soft delete)';
9
+ static examples = [
10
+ '<%= config.bin %> intervention delete abc123-uuid',
11
+ '<%= config.bin %> intervention delete abc123-uuid --confirm',
12
+ ];
13
+ static args = {
14
+ id: Args.string({
15
+ description: 'UUID dell\'intervento',
16
+ required: true,
17
+ }),
18
+ };
19
+ static flags = {
20
+ confirm: Flags.boolean({
21
+ char: 'y',
22
+ description: 'Salta la conferma interattiva',
23
+ default: false,
24
+ }),
25
+ };
26
+ async run() {
27
+ const { args, flags } = await this.parse(InterventionDelete);
28
+ if (!UUID_RE.test(args.id)) {
29
+ this.error('ID non valido: deve essere un UUID.');
30
+ }
31
+ const config = await loadConfig();
32
+ const defaultSite = config.default_site;
33
+ const tokenEntry = defaultSite ? config.tokens[defaultSite] : undefined;
34
+ if (!tokenEntry) {
35
+ this.error('Nessun token configurato. Esegui: orbit login --token <token>');
36
+ }
37
+ const client = new OrbitClient(tokenEntry.token, config.api_url);
38
+ // Show intervention info
39
+ let title = args.id;
40
+ try {
41
+ const item = await client.getIntervention(args.id);
42
+ title = String(item.title);
43
+ this.log(`Intervento: ${title} (${item.status})`);
44
+ }
45
+ catch {
46
+ this.log(chalk.dim(`Intervento: ${args.id}`));
47
+ }
48
+ // Confirmation guard
49
+ if (!flags.confirm) {
50
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
51
+ const answer = await new Promise((resolve) => {
52
+ rl.question(chalk.yellow(`Eliminare "${title}"? [y/N] `), resolve);
53
+ });
54
+ rl.close();
55
+ if (answer.toLowerCase() !== 'y') {
56
+ this.log('Annullato.');
57
+ return;
58
+ }
59
+ }
60
+ try {
61
+ await client.deleteIntervention(args.id);
62
+ this.log(chalk.green(`Intervento ${args.id.slice(0, 8)} eliminato.`));
63
+ }
64
+ catch (err) {
65
+ const msg = err instanceof Error ? err.message : String(err);
66
+ this.error(`Eliminazione fallita: ${msg}`);
67
+ }
68
+ }
69
+ }
70
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/intervention/delete.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class InterventionGet extends Command {
3
+ static summary: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
+ };
11
+ run(): Promise<void>;
12
+ }
@@ -0,0 +1,64 @@
1
+ import { Args, Command, Flags } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import { loadConfig } from '../../lib/config.js';
4
+ import { OrbitClient } from '../../lib/client.js';
5
+ const UUID_RE = /^[0-9a-f-]{8,36}$/i;
6
+ export default class InterventionGet extends Command {
7
+ static summary = 'Dettaglio di un singolo intervento';
8
+ static examples = [
9
+ '<%= config.bin %> intervention get abc12345',
10
+ '<%= config.bin %> intervention get abc12345 --json',
11
+ ];
12
+ static args = {
13
+ id: Args.string({
14
+ description: 'UUID dell\'intervento',
15
+ required: true,
16
+ }),
17
+ };
18
+ static flags = {
19
+ json: Flags.boolean({
20
+ description: 'Output in formato JSON',
21
+ default: false,
22
+ }),
23
+ };
24
+ async run() {
25
+ const { args, flags } = await this.parse(InterventionGet);
26
+ const config = await loadConfig();
27
+ const defaultSite = config.default_site;
28
+ const tokenEntry = defaultSite ? config.tokens[defaultSite] : undefined;
29
+ if (!tokenEntry) {
30
+ this.error('Nessun token configurato. Esegui: orbit login --token <token>');
31
+ }
32
+ if (!UUID_RE.test(args.id)) {
33
+ this.error('ID non valido: deve essere un UUID.');
34
+ }
35
+ const client = new OrbitClient(tokenEntry.token, config.api_url);
36
+ try {
37
+ const item = await client.getIntervention(args.id);
38
+ if (flags.json) {
39
+ this.log(JSON.stringify(item, null, 2));
40
+ return;
41
+ }
42
+ this.log('');
43
+ this.log(chalk.bold(String(item.title)));
44
+ this.log('');
45
+ this.log(` ID: ${item.id}`);
46
+ this.log(` Stato: ${item.status}`);
47
+ this.log(` Priorita: ${item.priority}`);
48
+ this.log(` Origin: ${item.origin}`);
49
+ if (item.type_tag)
50
+ this.log(` Tipo: ${item.type_tag}`);
51
+ this.log(` Creato: ${item.created_at}`);
52
+ if (item.description) {
53
+ this.log('');
54
+ this.log(String(item.description));
55
+ }
56
+ this.log('');
57
+ }
58
+ catch (err) {
59
+ const msg = err instanceof Error ? err.message : String(err);
60
+ this.error(`Errore: ${msg}`);
61
+ }
62
+ }
63
+ }
64
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/intervention/get.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class InterventionList extends Command {
3
+ static summary: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ status: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ origin: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ type: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ priority: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ limit: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
11
+ sort: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ };
14
+ run(): Promise<void>;
15
+ }
@@ -0,0 +1,102 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import { loadConfig } from '../../lib/config.js';
4
+ import { OrbitClient } from '../../lib/client.js';
5
+ import { loadSiteLink } from '../../lib/site.js';
6
+ export default class InterventionList extends Command {
7
+ static summary = 'Lista interventi del sito su Orbit';
8
+ static examples = [
9
+ '<%= config.bin %> intervention list',
10
+ '<%= config.bin %> intervention list --status completed --limit 10',
11
+ '<%= config.bin %> intervention list --origin cli',
12
+ ];
13
+ static flags = {
14
+ status: Flags.string({
15
+ description: 'Filtra per stato',
16
+ options: ['scheduled', 'in_progress', 'completed', 'verified'],
17
+ }),
18
+ origin: Flags.string({
19
+ description: 'Filtra per origine',
20
+ options: ['manual', 'ticket', 'protocol', 'agent', 'cli'],
21
+ }),
22
+ type: Flags.string({
23
+ description: 'Filtra per tipo',
24
+ options: ['update', 'fix', 'security', 'feature', 'optimization', 'backup'],
25
+ }),
26
+ priority: Flags.string({
27
+ description: 'Filtra per priorita',
28
+ options: ['LOW', 'MEDIUM', 'HIGH', 'URGENT'],
29
+ }),
30
+ limit: Flags.integer({
31
+ char: 'l',
32
+ description: 'Numero massimo risultati',
33
+ default: 20,
34
+ }),
35
+ sort: Flags.string({
36
+ description: 'Campo di ordinamento (prefix - per DESC)',
37
+ default: '-created_at',
38
+ }),
39
+ json: Flags.boolean({
40
+ description: 'Output in formato JSON',
41
+ default: false,
42
+ }),
43
+ };
44
+ async run() {
45
+ const { flags } = await this.parse(InterventionList);
46
+ const cwd = process.cwd();
47
+ const siteLink = await loadSiteLink(cwd);
48
+ const config = await loadConfig();
49
+ const defaultSite = config.default_site;
50
+ const tokenEntry = defaultSite ? config.tokens[defaultSite] : undefined;
51
+ if (!tokenEntry) {
52
+ this.error('Nessun token configurato. Esegui: orbit login --token <token>');
53
+ }
54
+ const client = new OrbitClient(tokenEntry.token, config.api_url);
55
+ // Build filters
56
+ const filters = {
57
+ limit: flags.limit,
58
+ sort: flags.sort,
59
+ };
60
+ if (siteLink)
61
+ filters.site_id = siteLink.orbit_site_id;
62
+ if (flags.status)
63
+ filters.status = flags.status;
64
+ if (flags.origin)
65
+ filters.origin = flags.origin;
66
+ if (flags.type)
67
+ filters.type_tag = flags.type;
68
+ if (flags.priority)
69
+ filters.priority = flags.priority;
70
+ try {
71
+ const result = await client.listInterventions(filters);
72
+ if (flags.json) {
73
+ this.log(JSON.stringify(result, null, 2));
74
+ return;
75
+ }
76
+ if (result.items.length === 0) {
77
+ this.log(chalk.dim('Nessun intervento trovato.'));
78
+ return;
79
+ }
80
+ this.log('');
81
+ this.log(chalk.bold('Interventi'));
82
+ this.log('');
83
+ for (const item of result.items) {
84
+ const id = String(item.id ?? '').slice(0, 8);
85
+ const title = String(item.title ?? '').slice(0, 50);
86
+ const status = String(item.status ?? '');
87
+ const priority = String(item.priority ?? '');
88
+ const origin = String(item.origin ?? '');
89
+ const date = String(item.created_at ?? '').slice(0, 10);
90
+ const statusColor = status === 'completed' ? chalk.green : status === 'in_progress' ? chalk.yellow : chalk.dim;
91
+ this.log(` ${chalk.dim(id)} ${title.padEnd(50)} ${statusColor(status.padEnd(12))} ${priority.padEnd(8)} ${chalk.dim(origin.padEnd(8))} ${chalk.dim(date)}`);
92
+ }
93
+ this.log('');
94
+ this.log(chalk.dim(`Totale: ${result.total} interventi`));
95
+ }
96
+ catch (err) {
97
+ const msg = err instanceof Error ? err.message : String(err);
98
+ this.error(`Errore: ${msg}`);
99
+ }
100
+ }
101
+ }
102
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/intervention/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,OAAO;IACnD,MAAM,CAAC,OAAO,GAAG,oCAAoC,CAAC;IAEtD,MAAM,CAAC,QAAQ,GAAG;QAChB,qCAAqC;QACrC,mEAAmE;QACnE,kDAAkD;KACnD,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG;QACb,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,kBAAkB;YAC/B,OAAO,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,CAAC;SAC/D,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,oBAAoB;YACjC,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC;SAC1D,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,iBAAiB;YAC9B,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,CAAC;SAC5E,CAAC;QACF,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;YACrB,WAAW,EAAE,qBAAqB;YAClC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SAC7C,CAAC;QACF,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;YACnB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,0BAA0B;YACvC,OAAO,EAAE,EAAE;SACZ,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,0CAA0C;YACvD,OAAO,EAAE,aAAa;SACvB,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;YAClB,WAAW,EAAE,wBAAwB;YACrC,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAE1B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC;QACxC,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAExE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAEjE,gBAAgB;QAChB,MAAM,OAAO,GAAoC;YAC/C,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC;QACF,IAAI,QAAQ;YAAE,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC;QACvD,IAAI,KAAK,CAAC,MAAM;YAAE,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAChD,IAAI,KAAK,CAAC,MAAM;YAAE,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAChD,IAAI,KAAK,CAAC,IAAI;YAAE,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;QAC9C,IAAI,KAAK,CAAC,QAAQ;YAAE,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAEtD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAEvD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC1C,OAAO;YACT,CAAC;YAED,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEb,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAChC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;gBACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;gBAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;gBACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAExD,MAAM,WAAW,GAAG,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;gBAE/G,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpK,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class InterventionUpdate extends Command {
3
+ static summary: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ status: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ priority: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ title: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ 'type-tag': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ };
15
+ run(): Promise<void>;
16
+ }
@@ -0,0 +1,78 @@
1
+ import { Args, Command, Flags } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import { loadConfig } from '../../lib/config.js';
4
+ import { OrbitClient } from '../../lib/client.js';
5
+ const UUID_RE = /^[0-9a-f-]{8,36}$/i;
6
+ export default class InterventionUpdate extends Command {
7
+ static summary = 'Aggiorna un intervento esistente';
8
+ static examples = [
9
+ '<%= config.bin %> intervention update abc123 --status completed',
10
+ '<%= config.bin %> intervention update abc123 --priority HIGH --title "Nuovo titolo"',
11
+ ];
12
+ static args = {
13
+ id: Args.string({
14
+ description: 'UUID dell\'intervento',
15
+ required: true,
16
+ }),
17
+ };
18
+ static flags = {
19
+ status: Flags.string({
20
+ description: 'Nuovo stato',
21
+ options: ['scheduled', 'in_progress', 'completed', 'verified'],
22
+ }),
23
+ priority: Flags.string({
24
+ description: 'Nuova priorita',
25
+ options: ['LOW', 'MEDIUM', 'HIGH', 'URGENT'],
26
+ }),
27
+ title: Flags.string({
28
+ description: 'Nuovo titolo',
29
+ }),
30
+ description: Flags.string({
31
+ description: 'Nuova descrizione',
32
+ }),
33
+ 'type-tag': Flags.string({
34
+ description: 'Nuovo tipo',
35
+ options: ['update', 'fix', 'security', 'feature', 'optimization', 'backup'],
36
+ }),
37
+ };
38
+ async run() {
39
+ const { args, flags } = await this.parse(InterventionUpdate);
40
+ const config = await loadConfig();
41
+ const defaultSite = config.default_site;
42
+ const tokenEntry = defaultSite ? config.tokens[defaultSite] : undefined;
43
+ if (!tokenEntry) {
44
+ this.error('Nessun token configurato. Esegui: orbit login --token <token>');
45
+ }
46
+ if (!UUID_RE.test(args.id)) {
47
+ this.error('ID non valido: deve essere un UUID.');
48
+ }
49
+ // Build update payload from provided flags
50
+ const data = {};
51
+ if (flags.status)
52
+ data.status = flags.status;
53
+ if (flags.priority)
54
+ data.priority = flags.priority;
55
+ if (flags.title)
56
+ data.title = flags.title;
57
+ if (flags.description)
58
+ data.description = flags.description;
59
+ if (flags['type-tag'])
60
+ data.type_tag = flags['type-tag'];
61
+ if (Object.keys(data).length === 0) {
62
+ this.error('Specifica almeno un campo da aggiornare (--status, --priority, --title, etc.)');
63
+ }
64
+ const client = new OrbitClient(tokenEntry.token, config.api_url);
65
+ try {
66
+ const result = await client.updateIntervention(args.id, data);
67
+ this.log(chalk.green(`Intervento ${String(result.id).slice(0, 8)} aggiornato`));
68
+ for (const [key, value] of Object.entries(data)) {
69
+ this.log(` ${key}: ${value}`);
70
+ }
71
+ }
72
+ catch (err) {
73
+ const msg = err instanceof Error ? err.message : String(err);
74
+ this.error(`Aggiornamento fallito: ${msg}`);
75
+ }
76
+ }
77
+ }
78
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/intervention/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Link extends Command {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static flags: {
7
+ site: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
8
+ platform: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ url: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
+ };
12
+ run(): Promise<void>;
13
+ }