@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
@@ -0,0 +1,77 @@
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 { saveSiteLink, detectPlatform, loadSiteLink } from '../lib/site.js';
6
+ export default class Link extends Command {
7
+ static summary = 'Collega la directory corrente a un sito Orbit';
8
+ static description = 'Crea un file .orbit.json nella directory corrente che mappa il progetto\n' +
9
+ 'al sito su Orbit. Questo file puo essere committato nel repository.';
10
+ static examples = [
11
+ '<%= config.bin %> link --site site_123',
12
+ '<%= config.bin %> link --site site_123 --platform wordpress --url https://www.example.com',
13
+ ];
14
+ static flags = {
15
+ site: Flags.string({
16
+ char: 's',
17
+ description: 'Site ID di Orbit (UUID)',
18
+ required: true,
19
+ }),
20
+ platform: Flags.string({
21
+ char: 'p',
22
+ description: 'Piattaforma (auto-detect se omesso)',
23
+ options: ['wordpress', 'prestashop', 'custom'],
24
+ }),
25
+ url: Flags.string({
26
+ char: 'u',
27
+ description: 'URL finale del sito',
28
+ }),
29
+ force: Flags.boolean({
30
+ char: 'f',
31
+ description: 'Sovrascrive un link esistente senza conferma',
32
+ default: false,
33
+ }),
34
+ };
35
+ async run() {
36
+ const { flags } = await this.parse(Link);
37
+ const cwd = process.cwd();
38
+ // Check if already linked
39
+ const existing = await loadSiteLink(cwd);
40
+ if (existing && !flags.force) {
41
+ this.error(`Questa directory e gia collegata al sito ${existing.orbit_site_id}.\n` +
42
+ 'Usa --force per sovrascrivere.');
43
+ }
44
+ // Validate site_id against Orbit API (if token available)
45
+ const config = await loadConfig();
46
+ const defaultSite = config.default_site;
47
+ const tokenEntry = defaultSite ? config.tokens[defaultSite] : undefined;
48
+ if (tokenEntry) {
49
+ this.log(chalk.dim('Verifica sito su Orbit...'));
50
+ const client = new OrbitClient(tokenEntry.token, config.api_url);
51
+ const validation = await client.validateToken();
52
+ if (validation.valid) {
53
+ this.log(chalk.dim('Connessione OK'));
54
+ }
55
+ }
56
+ // Auto-detect platform
57
+ const platform = (flags.platform ?? await detectPlatform(cwd));
58
+ // Save .orbit.json
59
+ await saveSiteLink(cwd, {
60
+ orbit_site_id: flags.site,
61
+ platform,
62
+ final_url: flags.url,
63
+ });
64
+ this.log('');
65
+ this.log(chalk.green('Sito collegato'));
66
+ this.log('');
67
+ this.log(` Site ID: ${flags.site}`);
68
+ this.log(` Piattaforma: ${platform}`);
69
+ if (flags.url) {
70
+ this.log(` URL: ${flags.url}`);
71
+ }
72
+ this.log(` File: ${cwd}/.orbit.json`);
73
+ this.log('');
74
+ this.log(chalk.dim('Il file .orbit.json puo essere committato nel repository.'));
75
+ }
76
+ }
77
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Login extends Command {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static flags: {
7
+ token: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
8
+ 'api-url': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
9
+ 'site-id': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
+ };
11
+ run(): Promise<void>;
12
+ }
@@ -0,0 +1,61 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import { OrbitClient } from '../lib/client.js';
4
+ import { setToken, DEFAULT_API_URL } from '../lib/config.js';
5
+ export default class Login extends Command {
6
+ static summary = 'Autentica la CLI con un token MCP di Orbit';
7
+ static description = 'Salva il token MCP per autenticarsi con il backend Orbit.\n' +
8
+ 'Il token si genera dalla UI di Orbit → Sito → Token MCP → Crea Token.';
9
+ static examples = [
10
+ '<%= config.bin %> login --token orbit_mcp_xxx',
11
+ '<%= config.bin %> login --token orbit_mcp_xxx --api-url https://api.custom.com',
12
+ ];
13
+ static flags = {
14
+ token: Flags.string({
15
+ char: 't',
16
+ description: 'Token MCP generato dalla UI di Orbit (o usa ORBIT_TOKEN env var)',
17
+ env: 'ORBIT_TOKEN',
18
+ required: true,
19
+ }),
20
+ 'api-url': Flags.string({
21
+ description: 'URL API Orbit',
22
+ default: DEFAULT_API_URL,
23
+ }),
24
+ 'site-id': Flags.string({
25
+ char: 's',
26
+ description: 'Site ID associato al token',
27
+ default: 'default',
28
+ }),
29
+ };
30
+ async run() {
31
+ const { flags } = await this.parse(Login);
32
+ // Validate token prefix
33
+ if (!flags.token.startsWith('orbit_mcp_')) {
34
+ this.error('Il token deve iniziare con "orbit_mcp_". ' +
35
+ 'Genera un token dalla UI di Orbit.');
36
+ }
37
+ // Validate token against API
38
+ this.log(chalk.dim('Validazione token in corso...'));
39
+ const client = new OrbitClient(flags.token, flags['api-url']);
40
+ const validation = await client.validateToken();
41
+ if (!validation.valid) {
42
+ this.error(`Token non valido: ${validation.error}\n` +
43
+ 'Verifica il token e riprova. Genera un nuovo token dalla UI di Orbit se necessario.');
44
+ }
45
+ // Save token
46
+ await setToken(flags['site-id'], {
47
+ token: flags.token,
48
+ label: flags['site-id'],
49
+ site_id: flags['site-id'],
50
+ created_at: new Date().toISOString(),
51
+ });
52
+ this.log('');
53
+ this.log(chalk.green('Autenticazione riuscita'));
54
+ this.log('');
55
+ this.log(` API: ${flags['api-url']}`);
56
+ this.log(` Token: ${flags.token.slice(0, 15)}...${flags.token.slice(-4)}`);
57
+ this.log('');
58
+ this.log(chalk.dim(`Token salvato in ~/.orbit/config.json`));
59
+ }
60
+ }
61
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAE7D,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,MAAM,CAAC,OAAO,GAAG,4CAA4C,CAAC;IAE9D,MAAM,CAAC,WAAW,GAChB,6DAA6D;QAC7D,uEAAuE,CAAC;IAE1E,MAAM,CAAC,QAAQ,GAAG;QAChB,+CAA+C;QAC/C,gFAAgF;KACjF,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG;QACb,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;YAClB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,kEAAkE;YAC/E,GAAG,EAAE,aAAa;YAClB,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC;YACtB,WAAW,EAAE,eAAe;YAC5B,OAAO,EAAE,eAAe;SACzB,CAAC;QACF,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC;YACtB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,4BAA4B;YACzC,OAAO,EAAE,SAAS;SACnB,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAE1C,wBAAwB;QACxB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK,CACR,2CAA2C;gBACzC,oCAAoC,CACvC,CAAC;QACJ,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAErD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;QAEhD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,CACR,qBAAqB,UAAU,CAAC,KAAK,IAAI;gBACvC,qFAAqF,CACxF,CAAC;QACJ,CAAC;QAED,aAAa;QACb,MAAM,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;YAC/B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;YACvB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;YACzB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;IAC/D,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Logout extends Command {
3
+ static summary: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ site: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
7
+ };
8
+ run(): Promise<void>;
9
+ }
@@ -0,0 +1,23 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import { removeToken } from '../lib/config.js';
4
+ export default class Logout extends Command {
5
+ static summary = 'Rimuove il token locale';
6
+ static examples = [
7
+ '<%= config.bin %> logout',
8
+ '<%= config.bin %> logout --site site_123',
9
+ ];
10
+ static flags = {
11
+ site: Flags.string({
12
+ char: 's',
13
+ description: 'Rimuove solo il token di un sito specifico',
14
+ default: 'default',
15
+ }),
16
+ };
17
+ async run() {
18
+ const { flags } = await this.parse(Logout);
19
+ await removeToken(flags.site);
20
+ this.log(chalk.green(`Token rimosso per ${flags.site}`));
21
+ }
22
+ }
23
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,MAAM,CAAC,OAAO,GAAG,yBAAyB,CAAC;IAE3C,MAAM,CAAC,QAAQ,GAAG;QAChB,0BAA0B;QAC1B,0CAA0C;KAC3C,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG;QACb,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,4CAA4C;YACzD,OAAO,EAAE,SAAS;SACnB,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAE3C,MAAM,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE9B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class NoteAdd extends Command {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static args: {
7
+ text: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
8
+ };
9
+ static flags: {
10
+ priority: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
+ };
12
+ run(): Promise<void>;
13
+ }
@@ -0,0 +1,53 @@
1
+ import { Args, Command, Flags } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import { loadSiteLink } from '../../lib/site.js';
4
+ import { loadActiveSession, addNote } from '../../lib/session.js';
5
+ export default class NoteAdd extends Command {
6
+ static summary = 'Aggiunge una nota alla sessione corrente';
7
+ static description = 'Registra un appunto o un\'azione nella sessione attiva.';
8
+ static examples = [
9
+ '<%= config.bin %> note add "Fixato layout mobile"',
10
+ '<%= config.bin %> note add "Aggiornato plugin sicurezza" --priority critical',
11
+ ];
12
+ static args = {
13
+ text: Args.string({
14
+ description: 'Testo della nota',
15
+ required: true,
16
+ }),
17
+ };
18
+ static flags = {
19
+ priority: Flags.string({
20
+ char: 'p',
21
+ description: 'Priorita della nota',
22
+ options: ['low', 'medium', 'high', 'critical'],
23
+ default: 'medium',
24
+ }),
25
+ };
26
+ async run() {
27
+ const { args, flags } = await this.parse(NoteAdd);
28
+ const cwd = process.cwd();
29
+ // Verify site link
30
+ const siteLink = await loadSiteLink(cwd);
31
+ if (!siteLink) {
32
+ this.error('Nessun .orbit.json trovato. Esegui: orbit link --site <site_id>');
33
+ }
34
+ // Find active session
35
+ const session = await loadActiveSession(siteLink.orbit_site_id);
36
+ if (!session) {
37
+ this.error('Nessuna sessione attiva.\n' +
38
+ 'Avvia una sessione con: orbit session start');
39
+ }
40
+ // Add note
41
+ const priority = flags.priority;
42
+ const updated = await addNote(session.id, args.text, priority);
43
+ const priorityColors = {
44
+ low: chalk.dim,
45
+ medium: chalk.white,
46
+ high: chalk.yellow,
47
+ critical: chalk.red,
48
+ };
49
+ const colorFn = priorityColors[priority] ?? chalk.white;
50
+ this.log(colorFn(`Nota aggiunta (${updated.notes.length} totali): ${args.text}`));
51
+ }
52
+ }
53
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/commands/note/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAElE,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,MAAM,CAAC,OAAO,GAAG,0CAA0C,CAAC;IAE5D,MAAM,CAAC,WAAW,GAAG,yDAAyD,CAAC;IAE/E,MAAM,CAAC,QAAQ,GAAG;QAChB,mDAAmD;QACnD,8EAA8E;KAC/E,CAAC;IAEF,MAAM,CAAC,IAAI,GAAG;QACZ,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;YAChB,WAAW,EAAE,kBAAkB;YAC/B,QAAQ,EAAE,IAAI;SACf,CAAC;KACH,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG;QACb,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;YACrB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,qBAAqB;YAClC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC;YAC9C,OAAO,EAAE,QAAQ;SAClB,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAE1B,mBAAmB;QACnB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QAChF,CAAC;QAED,sBAAsB;QACtB,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CACR,4BAA4B;gBAC1B,6CAA6C,CAChD,CAAC;QACJ,CAAC;QAED,WAAW;QACX,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAkD,CAAC;QAC1E,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAE/D,MAAM,cAAc,GAA0C;YAC5D,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,MAAM,EAAE,KAAK,CAAC,KAAK;YACnB,IAAI,EAAE,KAAK,CAAC,MAAM;YAClB,QAAQ,EAAE,KAAK,CAAC,GAAG;SACpB,CAAC;QACF,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC;QAExD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,OAAO,CAAC,KAAK,CAAC,MAAM,aAAa,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACpF,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class ReportSend extends Command {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static flags: {
7
+ title: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ priority: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ tag: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ auto: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
+ 'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ };
14
+ run(): Promise<void>;
15
+ }
@@ -0,0 +1,124 @@
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
+ import { loadActiveSession, endSession } from '../../lib/session.js';
7
+ import { getGitCommitHead, getGitDiffStat } from '../../lib/git.js';
8
+ import { buildReportPayload } from '../../lib/report-builder.js';
9
+ export default class ReportSend extends Command {
10
+ static summary = 'Genera e invia un report/intervento a Orbit';
11
+ static description = 'Raccoglie i dati dalla sessione corrente e dal repository git,\n' +
12
+ 'costruisce un intervento e lo invia a Orbit.';
13
+ static examples = [
14
+ '<%= config.bin %> report send',
15
+ '<%= config.bin %> report send --title "Fix homepage" --priority HIGH --tag fix',
16
+ '<%= config.bin %> report send --auto',
17
+ '<%= config.bin %> report send --dry-run',
18
+ ];
19
+ static flags = {
20
+ title: Flags.string({
21
+ char: 't',
22
+ description: 'Titolo intervento (auto-generato se omesso)',
23
+ }),
24
+ priority: Flags.string({
25
+ char: 'p',
26
+ description: 'Priorita',
27
+ options: ['LOW', 'MEDIUM', 'HIGH', 'URGENT'],
28
+ }),
29
+ tag: Flags.string({
30
+ description: 'Tipo intervento',
31
+ options: ['update', 'fix', 'security', 'feature', 'optimization', 'backup'],
32
+ }),
33
+ description: Flags.string({
34
+ char: 'd',
35
+ description: 'Descrizione markdown',
36
+ }),
37
+ auto: Flags.boolean({
38
+ description: 'Mode automatico senza conferma',
39
+ default: false,
40
+ }),
41
+ 'dry-run': Flags.boolean({
42
+ description: 'Mostra anteprima senza inviare',
43
+ default: false,
44
+ }),
45
+ };
46
+ async run() {
47
+ const { flags } = await this.parse(ReportSend);
48
+ const cwd = process.cwd();
49
+ // Verify site link
50
+ const siteLink = await loadSiteLink(cwd);
51
+ if (!siteLink) {
52
+ this.error('Nessun .orbit.json trovato. Esegui: orbit link --site <site_id>');
53
+ }
54
+ // Get token
55
+ const config = await loadConfig();
56
+ const defaultSite = config.default_site;
57
+ const tokenEntry = defaultSite ? config.tokens[defaultSite] : undefined;
58
+ if (!tokenEntry) {
59
+ this.error('Nessun token configurato. Esegui: orbit login --token <token>');
60
+ }
61
+ // Load session (optional — report can work without)
62
+ let session = await loadActiveSession(siteLink.orbit_site_id);
63
+ // Capture git state
64
+ const commitEnd = await getGitCommitHead();
65
+ let filesChanged = 0;
66
+ if (session?.git_commit_start && commitEnd) {
67
+ const diff = await getGitDiffStat(session.git_commit_start, commitEnd);
68
+ filesChanged = diff.files_changed;
69
+ }
70
+ // If session active, close it
71
+ if (session && session.status === 'active') {
72
+ session = await endSession(session.id, {
73
+ git_commit_end: commitEnd ?? undefined,
74
+ });
75
+ }
76
+ // Build payload
77
+ const payload = buildReportPayload({
78
+ session: session ?? {
79
+ id: 'no-session',
80
+ site_id: siteLink.orbit_site_id,
81
+ started_at: new Date().toISOString(),
82
+ notes: [],
83
+ status: 'completed',
84
+ },
85
+ title: flags.title,
86
+ description: flags.description,
87
+ priority: flags.priority,
88
+ type_tag: flags.tag,
89
+ git_commit_end: commitEnd ?? undefined,
90
+ files_changed: filesChanged,
91
+ });
92
+ // Ensure site_id matches the linked site
93
+ payload.site_id = siteLink.orbit_site_id;
94
+ // Dry run
95
+ if (flags['dry-run']) {
96
+ this.log('');
97
+ this.log(chalk.yellow('Anteprima (dry-run — non inviato):'));
98
+ this.log('');
99
+ this.log(JSON.stringify(payload, null, 2));
100
+ return;
101
+ }
102
+ // Send
103
+ this.log(chalk.dim('Invio report a Orbit...'));
104
+ const client = new OrbitClient(tokenEntry.token, config.api_url);
105
+ try {
106
+ const result = await client.createIntervention(payload);
107
+ this.log('');
108
+ this.log(chalk.green('Report inviato con successo'));
109
+ this.log('');
110
+ this.log(` ID: ${result.id}`);
111
+ this.log(` Titolo: ${payload.title}`);
112
+ this.log(` Priorita: ${payload.priority}`);
113
+ if (payload.type_tag)
114
+ this.log(` Tipo: ${payload.type_tag}`);
115
+ this.log(` Stato: ${payload.status}`);
116
+ this.log('');
117
+ }
118
+ catch (err) {
119
+ const msg = err instanceof Error ? err.message : String(err);
120
+ this.error(`Invio fallito: ${msg}`);
121
+ }
122
+ }
123
+ }
124
+ //# sourceMappingURL=send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.js","sourceRoot":"","sources":["../../../src/commands/report/send.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;AACjD,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IAC7C,MAAM,CAAC,OAAO,GAAG,6CAA6C,CAAC;IAE/D,MAAM,CAAC,WAAW,GAChB,kEAAkE;QAClE,8CAA8C,CAAC;IAEjD,MAAM,CAAC,QAAQ,GAAG;QAChB,+BAA+B;QAC/B,gFAAgF;QAChF,sCAAsC;QACtC,yCAAyC;KAC1C,CAAC;IAEF,MAAM,CAAC,KAAK,GAAG;QACb,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;YAClB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,6CAA6C;SAC3D,CAAC;QACF,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;YACrB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,UAAU;YACvB,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SAC7C,CAAC;QACF,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC;YAChB,WAAW,EAAE,iBAAiB;YAC9B,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,CAAC;SAC5E,CAAC;QACF,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC;YACxB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,sBAAsB;SACpC,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC;YAClB,WAAW,EAAE,gCAAgC;YAC7C,OAAO,EAAE,KAAK;SACf,CAAC;QACF,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;YACvB,WAAW,EAAE,gCAAgC;YAC7C,OAAO,EAAE,KAAK;SACf,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAE1B,mBAAmB;QACnB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QAChF,CAAC;QAED,YAAY;QACZ,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;QACxE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAC9E,CAAC;QAED,oDAAoD;QACpD,IAAI,OAAO,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAE9D,oBAAoB;QACpB,MAAM,SAAS,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAC3C,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,OAAO,EAAE,gBAAgB,IAAI,SAAS,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;YACvE,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC;QACpC,CAAC;QAED,8BAA8B;QAC9B,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC3C,OAAO,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE;gBACrC,cAAc,EAAE,SAAS,IAAI,SAAS;aACvC,CAAC,CAAC;QACL,CAAC;QAED,gBAAgB;QAChB,MAAM,OAAO,GAAG,kBAAkB,CAAC;YACjC,OAAO,EAAE,OAAO,IAAI;gBAClB,EAAE,EAAE,YAAY;gBAChB,OAAO,EAAE,QAAQ,CAAC,aAAa;gBAC/B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,WAAW;aACpB;YACD,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,KAAK,CAAC,GAAG;YACnB,cAAc,EAAE,SAAS,IAAI,SAAS;YACtC,aAAa,EAAE,YAAY;SAC5B,CAAC,CAAC;QAEH,yCAAyC;QACzC,OAAO,CAAC,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC;QAEzC,UAAU;QACV,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,OAAO;QACP,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAEjE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACrD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7C,IAAI,OAAO,CAAC,QAAQ;gBAAE,IAAI,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YACnE,IAAI,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACf,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,kBAAkB,GAAG,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Serve extends Command {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ run(): Promise<void>;
7
+ }
@@ -0,0 +1,24 @@
1
+ import { Command } from '@oclif/core';
2
+ import { startMcpServer } from '../mcp/server.js';
3
+ export default class Serve extends Command {
4
+ static summary = 'Avvia il MCP server per LLM (Claude Code, Cursor, etc.)';
5
+ static description = 'Avvia un MCP server su stdio con 9 tool per l\'integrazione LLM.\n' +
6
+ 'Configurazione nell\'editor:\n\n' +
7
+ ' {\n' +
8
+ ' "mcpServers": {\n' +
9
+ ' "orbit-local": {\n' +
10
+ ' "command": "orbit",\n' +
11
+ ' "args": ["serve"],\n' +
12
+ ' "env": { "MCP_TOKEN": "orbit_mcp_xxx" }\n' +
13
+ ' }\n' +
14
+ ' }\n' +
15
+ ' }';
16
+ static examples = [
17
+ '<%= config.bin %> serve',
18
+ 'MCP_TOKEN=orbit_mcp_xxx <%= config.bin %> serve',
19
+ ];
20
+ async run() {
21
+ await startMcpServer();
22
+ }
23
+ }
24
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,MAAM,CAAC,OAAO,GAAG,yDAAyD,CAAC;IAE3E,MAAM,CAAC,WAAW,GAChB,oEAAoE;QACpE,kCAAkC;QAClC,OAAO;QACP,uBAAuB;QACvB,0BAA0B;QAC1B,+BAA+B;QAC/B,8BAA8B;QAC9B,mDAAmD;QACnD,WAAW;QACX,SAAS;QACT,KAAK,CAAC;IAER,MAAM,CAAC,QAAQ,GAAG;QAChB,yBAAyB;QACzB,iDAAiD;KAClD,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,cAAc,EAAE,CAAC;IACzB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class SessionEnd extends Command {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static flags: {
7
+ summary: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ };
9
+ run(): Promise<void>;
10
+ }
@@ -0,0 +1,61 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import { loadSiteLink } from '../../lib/site.js';
4
+ import { loadActiveSession, endSession } from '../../lib/session.js';
5
+ import { getGitCommitHead } from '../../lib/git.js';
6
+ export default class SessionEnd extends Command {
7
+ static summary = 'Chiude la sessione di lavoro corrente';
8
+ static description = 'Chiude la sessione attiva, cattura il commit finale\n' +
9
+ 'e mostra un riepilogo del lavoro svolto.';
10
+ static examples = [
11
+ '<%= config.bin %> session end',
12
+ '<%= config.bin %> session end --summary "Completato refactor homepage"',
13
+ ];
14
+ static flags = {
15
+ summary: Flags.string({
16
+ char: 's',
17
+ description: 'Summary finale del lavoro svolto',
18
+ }),
19
+ };
20
+ async run() {
21
+ const { flags } = await this.parse(SessionEnd);
22
+ const cwd = process.cwd();
23
+ // Verify site link
24
+ const siteLink = await loadSiteLink(cwd);
25
+ if (!siteLink) {
26
+ this.error('Nessun .orbit.json trovato nella directory corrente.');
27
+ }
28
+ // Find active session
29
+ const session = await loadActiveSession(siteLink.orbit_site_id);
30
+ if (!session) {
31
+ this.error('Nessuna sessione attiva.\n' +
32
+ 'Avvia una sessione con: orbit session start');
33
+ }
34
+ // Capture final git state
35
+ const commitEnd = await getGitCommitHead();
36
+ // End session
37
+ const ended = await endSession(session.id, {
38
+ git_commit_end: commitEnd ?? undefined,
39
+ summary: flags.summary,
40
+ });
41
+ // Calculate duration
42
+ const startTime = new Date(ended.started_at).getTime();
43
+ const endTime = Date.now();
44
+ const durationMin = Math.round((endTime - startTime) / 60_000);
45
+ this.log('');
46
+ this.log(chalk.green('Sessione conclusa'));
47
+ this.log('');
48
+ this.log(` ID: ${ended.id}`);
49
+ this.log(` Durata: ${durationMin} minuti`);
50
+ this.log(` Note: ${ended.notes.length}`);
51
+ if (ended.git_branch)
52
+ this.log(` Branch: ${ended.git_branch}`);
53
+ if (ended.git_commit_start)
54
+ this.log(` Commit: ${ended.git_commit_start} → ${commitEnd ?? '?'}`);
55
+ if (flags.summary)
56
+ this.log(` Summary: ${flags.summary}`);
57
+ this.log('');
58
+ this.log(chalk.dim('Invia il report con: orbit report send'));
59
+ }
60
+ }
61
+ //# sourceMappingURL=end.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"end.js","sourceRoot":"","sources":["../../../src/commands/session/end.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class SessionStart extends Command {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static flags: {
7
+ note: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ };
9
+ run(): Promise<void>;
10
+ }
@@ -0,0 +1,61 @@
1
+ import { Command, Flags } from '@oclif/core';
2
+ import chalk from 'chalk';
3
+ import { loadSiteLink } from '../../lib/site.js';
4
+ import { createSession, loadActiveSession } from '../../lib/session.js';
5
+ import { getGitBranch, getGitCommitHead } from '../../lib/git.js';
6
+ export default class SessionStart extends Command {
7
+ static summary = 'Inizia una sessione di lavoro locale';
8
+ static description = 'Avvia una sessione di lavoro collegata al sito Orbit.\n' +
9
+ 'Cattura automaticamente branch git e commit corrente.';
10
+ static examples = [
11
+ '<%= config.bin %> session start',
12
+ '<%= config.bin %> session start --note "Refactor homepage"',
13
+ ];
14
+ static flags = {
15
+ note: Flags.string({
16
+ char: 'n',
17
+ description: 'Nota iniziale sulla sessione',
18
+ }),
19
+ };
20
+ async run() {
21
+ const { flags } = await this.parse(SessionStart);
22
+ const cwd = process.cwd();
23
+ // Verify site link
24
+ const siteLink = await loadSiteLink(cwd);
25
+ if (!siteLink) {
26
+ this.error('Nessun .orbit.json trovato nella directory corrente.\n' +
27
+ 'Esegui: orbit link --site <site_id>');
28
+ }
29
+ // Check for existing active session
30
+ const existing = await loadActiveSession(siteLink.orbit_site_id);
31
+ if (existing) {
32
+ this.error(`Sessione gia attiva (${existing.id}) — avviata il ${existing.started_at}.\n` +
33
+ 'Chiudi la sessione corrente con: orbit session end');
34
+ }
35
+ // Capture git state
36
+ const branch = await getGitBranch();
37
+ const commit = await getGitCommitHead();
38
+ // Create session
39
+ const session = await createSession(siteLink.orbit_site_id, {
40
+ git_branch: branch ?? undefined,
41
+ git_commit: commit ?? undefined,
42
+ note: flags.note,
43
+ });
44
+ this.log('');
45
+ this.log(chalk.green('Sessione avviata'));
46
+ this.log('');
47
+ this.log(` ID: ${session.id}`);
48
+ this.log(` Sito: ${siteLink.orbit_site_id}`);
49
+ if (branch)
50
+ this.log(` Branch: ${branch}`);
51
+ if (commit)
52
+ this.log(` Commit: ${commit}`);
53
+ this.log(` Inizio: ${session.started_at}`);
54
+ if (flags.note)
55
+ this.log(` Nota: ${flags.note}`);
56
+ this.log('');
57
+ this.log(chalk.dim('Usa "orbit note add" per aggiungere note.'));
58
+ this.log(chalk.dim('Usa "orbit session end" per chiudere.'));
59
+ }
60
+ }
61
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/commands/session/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Status extends Command {
3
+ static summary: string;
4
+ static examples: string[];
5
+ run(): Promise<void>;
6
+ }