@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.
- package/README.md +100 -0
- package/bin/dev.js +3 -0
- package/bin/run.js +3 -0
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.js +86 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/intervention/delete.d.ts +12 -0
- package/dist/commands/intervention/delete.js +70 -0
- package/dist/commands/intervention/delete.js.map +1 -0
- package/dist/commands/intervention/get.d.ts +12 -0
- package/dist/commands/intervention/get.js +64 -0
- package/dist/commands/intervention/get.js.map +1 -0
- package/dist/commands/intervention/list.d.ts +15 -0
- package/dist/commands/intervention/list.js +102 -0
- package/dist/commands/intervention/list.js.map +1 -0
- package/dist/commands/intervention/update.d.ts +16 -0
- package/dist/commands/intervention/update.js +78 -0
- package/dist/commands/intervention/update.js.map +1 -0
- package/dist/commands/link.d.ts +13 -0
- package/dist/commands/link.js +77 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/login.d.ts +12 -0
- package/dist/commands/login.js +61 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +9 -0
- package/dist/commands/logout.js +23 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/note/add.d.ts +13 -0
- package/dist/commands/note/add.js +53 -0
- package/dist/commands/note/add.js.map +1 -0
- package/dist/commands/report/send.d.ts +15 -0
- package/dist/commands/report/send.js +124 -0
- package/dist/commands/report/send.js.map +1 -0
- package/dist/commands/serve.d.ts +7 -0
- package/dist/commands/serve.js +24 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/session/end.d.ts +10 -0
- package/dist/commands/session/end.js +61 -0
- package/dist/commands/session/end.js.map +1 -0
- package/dist/commands/session/start.d.ts +10 -0
- package/dist/commands/session/start.js +61 -0
- package/dist/commands/session/start.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.js +56 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/unlink.d.ts +10 -0
- package/dist/commands/unlink.js +43 -0
- package/dist/commands/unlink.js.map +1 -0
- package/dist/hooks/prerun.d.ts +9 -0
- package/dist/hooks/prerun.js +13 -0
- package/dist/hooks/prerun.js.map +1 -0
- package/dist/lib/client.d.ts +34 -0
- package/dist/lib/client.js +151 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/config.d.ts +19 -0
- package/dist/lib/config.js +67 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/git.d.ts +19 -0
- package/dist/lib/git.js +48 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/report-builder.d.ts +16 -0
- package/dist/lib/report-builder.js +73 -0
- package/dist/lib/report-builder.js.map +1 -0
- package/dist/lib/session.d.ts +28 -0
- package/dist/lib/session.js +106 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/site.d.ts +21 -0
- package/dist/lib/site.js +59 -0
- package/dist/lib/site.js.map +1 -0
- package/dist/mcp/server.d.ts +16 -0
- package/dist/mcp/server.js +319 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/types.d.ts +68 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/oclif.manifest.json +732 -0
- 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
package/bin/run.js
ADDED
|
@@ -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":"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"}
|
|
@@ -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
|
+
}
|