@orbitpanel/cli 1.2.1 → 1.3.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/dist/commands/init.d.ts +13 -0
- package/dist/commands/init.js +65 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/components/ShellApp.js +15 -3
- package/dist/components/ShellApp.js.map +1 -1
- package/dist/components/StatusBar.d.ts +3 -0
- package/dist/components/StatusBar.js +15 -2
- package/dist/components/StatusBar.js.map +1 -1
- package/dist/lib/command-router.js +61 -0
- package/dist/lib/command-router.js.map +1 -1
- package/dist/lib/context-health.d.ts +37 -0
- package/dist/lib/context-health.js +162 -0
- package/dist/lib/context-health.js.map +1 -0
- package/dist/lib/environment.d.ts +19 -0
- package/dist/lib/environment.js +75 -0
- package/dist/lib/environment.js.map +1 -0
- package/dist/lib/init-logic.d.ts +27 -0
- package/dist/lib/init-logic.js +34 -0
- package/dist/lib/init-logic.js.map +1 -0
- package/dist/lib/instructions.d.ts +18 -0
- package/dist/lib/instructions.js +37 -0
- package/dist/lib/instructions.js.map +1 -0
- package/dist/lib/manifest.d.ts +38 -0
- package/dist/lib/manifest.js +237 -0
- package/dist/lib/manifest.js.map +1 -0
- package/dist/lib/shell-hints.d.ts +16 -0
- package/dist/lib/shell-hints.js +61 -3
- package/dist/lib/shell-hints.js.map +1 -1
- package/dist/lib/shell-ink.js +2 -1
- package/dist/lib/shell-ink.js.map +1 -1
- package/dist/lib/shell-render.js +1 -0
- package/dist/lib/shell-render.js.map +1 -1
- package/dist/lib/shell.js +6 -3
- package/dist/lib/shell.js.map +1 -1
- package/dist/lib/status-bar.d.ts +5 -0
- package/dist/lib/status-bar.js +24 -7
- package/dist/lib/status-bar.js.map +1 -1
- package/dist/state/store.js +46 -3
- package/dist/state/store.js.map +1 -1
- package/dist/state/types.d.ts +16 -2
- package/dist/types.d.ts +76 -0
- package/oclif.manifest.json +71 -1
- package/package.json +1 -1
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment detection and mismatch checking for @orbitpanel/cli.
|
|
3
|
+
*
|
|
4
|
+
* Detects environment from URLs using conservative heuristics.
|
|
5
|
+
* Reports mismatches between manifest-declared and detected environments.
|
|
6
|
+
*
|
|
7
|
+
* PRINCIPLE: Never assume production. If detection is ambiguous, return null.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Detect environment from a URL using conservative heuristics.
|
|
11
|
+
* Returns null if detection is ambiguous (no false positives).
|
|
12
|
+
*/
|
|
13
|
+
export function detectEnvironmentFromUrl(url) {
|
|
14
|
+
if (!url || url.trim() === '')
|
|
15
|
+
return null;
|
|
16
|
+
let hostname;
|
|
17
|
+
try {
|
|
18
|
+
// Handle URLs without protocol
|
|
19
|
+
const normalized = url.includes('://') ? url : `http://${url}`;
|
|
20
|
+
hostname = new URL(normalized).hostname.toLowerCase();
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
// Local indicators
|
|
26
|
+
if (hostname === 'localhost' ||
|
|
27
|
+
hostname === '127.0.0.1' ||
|
|
28
|
+
hostname === '0.0.0.0' ||
|
|
29
|
+
hostname === '::1' ||
|
|
30
|
+
hostname.endsWith('.local') ||
|
|
31
|
+
hostname.endsWith('.test') ||
|
|
32
|
+
hostname.endsWith('.localhost')) {
|
|
33
|
+
return 'local';
|
|
34
|
+
}
|
|
35
|
+
// Staging indicators
|
|
36
|
+
if (hostname.startsWith('staging.') ||
|
|
37
|
+
hostname.startsWith('staging-') ||
|
|
38
|
+
hostname.includes('.staging.')) {
|
|
39
|
+
return 'staging';
|
|
40
|
+
}
|
|
41
|
+
// Dev indicators
|
|
42
|
+
if (hostname.startsWith('dev.') ||
|
|
43
|
+
hostname.startsWith('dev-') ||
|
|
44
|
+
hostname.includes('.dev.')) {
|
|
45
|
+
return 'dev';
|
|
46
|
+
}
|
|
47
|
+
// Ambiguous — do NOT assume production
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check for environment mismatch between manifest and detected environment.
|
|
52
|
+
* Only reports mismatch when detection is confident (non-null).
|
|
53
|
+
*/
|
|
54
|
+
export function checkEnvironmentMismatch(manifest, url) {
|
|
55
|
+
const detectedEnv = detectEnvironmentFromUrl(url);
|
|
56
|
+
// No detection → no mismatch (we can't be sure)
|
|
57
|
+
if (detectedEnv === null) {
|
|
58
|
+
return {
|
|
59
|
+
manifestEnv: manifest.environment,
|
|
60
|
+
detectedEnv: null,
|
|
61
|
+
mismatch: false,
|
|
62
|
+
warning: null,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const mismatch = detectedEnv !== manifest.environment;
|
|
66
|
+
return {
|
|
67
|
+
manifestEnv: manifest.environment,
|
|
68
|
+
detectedEnv,
|
|
69
|
+
mismatch,
|
|
70
|
+
warning: mismatch
|
|
71
|
+
? `Ambiente incoerente: manifest=${manifest.environment}, rilevato=${detectedEnv}`
|
|
72
|
+
: null,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/lib/environment.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAA8B;IACrE,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAE3C,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,+BAA+B;QAC/B,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC;QAC/D,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mBAAmB;IACnB,IACE,QAAQ,KAAK,WAAW;QACxB,QAAQ,KAAK,WAAW;QACxB,QAAQ,KAAK,SAAS;QACtB,QAAQ,KAAK,KAAK;QAClB,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC1B,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC/B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,qBAAqB;IACrB,IACE,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC;QAC/B,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC;QAC/B,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EAC9B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,iBAAiB;IACjB,IACE,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;QAC3B,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC;QAC3B,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAC1B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,uCAAuC;IACvC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,QAAyB,EACzB,GAAY;IAEZ,MAAM,WAAW,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;IAElD,gDAAgD;IAChD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO;YACL,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,KAAK,QAAQ,CAAC,WAAW,CAAC;IAEtD,OAAO;QACL,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,WAAW;QACX,QAAQ;QACR,OAAO,EAAE,QAAQ;YACf,CAAC,CAAC,iCAAiC,QAAQ,CAAC,WAAW,cAAc,WAAW,EAAE;YAClF,CAAC,CAAC,IAAI;KACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Init command logic for @orbitpanel/cli.
|
|
3
|
+
*
|
|
4
|
+
* Separated from the oclif command class for testability.
|
|
5
|
+
* The oclif command handles CLI parsing, this handles the logic.
|
|
6
|
+
*/
|
|
7
|
+
import type { ProjectManifest, PlatformType, EnvironmentType } from '../types.js';
|
|
8
|
+
import { type ManifestIO } from './manifest.js';
|
|
9
|
+
export interface InitOptions {
|
|
10
|
+
cwd: string;
|
|
11
|
+
name: string;
|
|
12
|
+
platform: PlatformType;
|
|
13
|
+
environment: EnvironmentType;
|
|
14
|
+
force?: boolean;
|
|
15
|
+
io?: ManifestIO;
|
|
16
|
+
log: (message: string) => void;
|
|
17
|
+
}
|
|
18
|
+
export interface InitResult {
|
|
19
|
+
created: boolean;
|
|
20
|
+
alreadyExists: boolean;
|
|
21
|
+
manifest: ProjectManifest | null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Core init logic — creates .orbit/project.json.
|
|
25
|
+
* Does NOT auto-link to backend. That's `orbit link`.
|
|
26
|
+
*/
|
|
27
|
+
export declare function runInit(opts: InitOptions): Promise<InitResult>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Init command logic for @orbitpanel/cli.
|
|
3
|
+
*
|
|
4
|
+
* Separated from the oclif command class for testability.
|
|
5
|
+
* The oclif command handles CLI parsing, this handles the logic.
|
|
6
|
+
*/
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { MANIFEST_DIR, MANIFEST_FILENAME, saveManifest } from './manifest.js';
|
|
9
|
+
/**
|
|
10
|
+
* Core init logic — creates .orbit/project.json.
|
|
11
|
+
* Does NOT auto-link to backend. That's `orbit link`.
|
|
12
|
+
*/
|
|
13
|
+
export async function runInit(opts) {
|
|
14
|
+
const { cwd, name, platform, environment, force, log } = opts;
|
|
15
|
+
// Use provided IO or import default
|
|
16
|
+
const io = opts.io ?? (await import('./manifest.js')).defaultManifestIO;
|
|
17
|
+
// Check if already exists
|
|
18
|
+
const manifestPath = join(cwd, MANIFEST_DIR, MANIFEST_FILENAME);
|
|
19
|
+
if (!force && await io.exists(manifestPath)) {
|
|
20
|
+
log(`Progetto gia inizializzato: ${manifestPath}`);
|
|
21
|
+
log('Usa --force per sovrascrivere.');
|
|
22
|
+
return { created: false, alreadyExists: true, manifest: null };
|
|
23
|
+
}
|
|
24
|
+
const manifest = {
|
|
25
|
+
version: 1,
|
|
26
|
+
name,
|
|
27
|
+
platform,
|
|
28
|
+
environment,
|
|
29
|
+
};
|
|
30
|
+
await saveManifest(cwd, manifest, io);
|
|
31
|
+
log(`Progetto inizializzato: ${cwd}/.orbit/project.json`);
|
|
32
|
+
return { created: true, alreadyExists: false, manifest };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=init-logic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-logic.js","sourceRoot":"","sources":["../../src/lib/init-logic.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAmB,MAAM,eAAe,CAAC;AAkB/F;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiB;IAC7C,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAE9D,oCAAoC;IACpC,MAAM,EAAE,GAAe,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAEpF,0BAA0B;IAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,+BAA+B,YAAY,EAAE,CAAC,CAAC;QACnD,GAAG,CAAC,gCAAgC,CAAC,CAAC;QACtC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjE,CAAC;IAED,MAAM,QAAQ,GAAoB;QAChC,OAAO,EAAE,CAAC;QACV,IAAI;QACJ,QAAQ;QACR,WAAW;KACZ,CAAC;IAEF,MAAM,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAEtC,GAAG,CAAC,2BAA2B,GAAG,sBAAsB,CAAC,CAAC;IAE1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project instructions loader for @orbitpanel/cli.
|
|
3
|
+
*
|
|
4
|
+
* Loads optional .orbit/instructions.md files that provide
|
|
5
|
+
* AI/UX context for the project. NOT a source of truth —
|
|
6
|
+
* only supplementary information.
|
|
7
|
+
*/
|
|
8
|
+
export declare const INSTRUCTIONS_FILENAME = "instructions.md";
|
|
9
|
+
/** File I/O interface — overridable for testing. */
|
|
10
|
+
export interface InstructionsIO {
|
|
11
|
+
read(path: string): Promise<string>;
|
|
12
|
+
exists(path: string): Promise<boolean>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Load instructions.md from the .orbit/ directory.
|
|
16
|
+
* Returns the content as a string, or null if not found.
|
|
17
|
+
*/
|
|
18
|
+
export declare function loadInstructions(manifestDir: string, io?: InstructionsIO): Promise<string | null>;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project instructions loader for @orbitpanel/cli.
|
|
3
|
+
*
|
|
4
|
+
* Loads optional .orbit/instructions.md files that provide
|
|
5
|
+
* AI/UX context for the project. NOT a source of truth —
|
|
6
|
+
* only supplementary information.
|
|
7
|
+
*/
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { readFile, access } from 'node:fs/promises';
|
|
10
|
+
import { MANIFEST_DIR } from './manifest.js';
|
|
11
|
+
export const INSTRUCTIONS_FILENAME = 'instructions.md';
|
|
12
|
+
const defaultIO = {
|
|
13
|
+
read: (path) => readFile(path, 'utf-8'),
|
|
14
|
+
exists: async (path) => {
|
|
15
|
+
try {
|
|
16
|
+
await access(path);
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Load instructions.md from the .orbit/ directory.
|
|
26
|
+
* Returns the content as a string, or null if not found.
|
|
27
|
+
*/
|
|
28
|
+
export async function loadInstructions(manifestDir, io = defaultIO) {
|
|
29
|
+
try {
|
|
30
|
+
const path = join(manifestDir, MANIFEST_DIR, INSTRUCTIONS_FILENAME);
|
|
31
|
+
return await io.read(path);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=instructions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/lib/instructions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAQvD,MAAM,SAAS,GAAmB;IAChC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,KAAK,CAAC;QAAC,CAAC;IAClE,CAAC;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAmB,EACnB,KAAqB,SAAS;IAE9B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,qBAAqB,CAAC,CAAC;QACpE,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project manifest management for @orbitpanel/cli.
|
|
3
|
+
*
|
|
4
|
+
* Handles .orbit/project.json discovery, validation, and persistence.
|
|
5
|
+
* Supports backward compatibility with legacy .orbit.json format.
|
|
6
|
+
*
|
|
7
|
+
* SEPARATION OF CONCERNS:
|
|
8
|
+
* - This module handles ONLY project identity (manifest)
|
|
9
|
+
* - Instructions (AI/UX context) are in instructions.ts
|
|
10
|
+
* - Environment detection is in environment.ts
|
|
11
|
+
*/
|
|
12
|
+
import type { ProjectManifest, ManifestValidationResult, SiteLink } from '../types.js';
|
|
13
|
+
export declare const MANIFEST_DIR = ".orbit";
|
|
14
|
+
export declare const MANIFEST_FILENAME = "project.json";
|
|
15
|
+
export declare const MANIFEST_PATH = ".orbit/project.json";
|
|
16
|
+
export declare const LEGACY_FILENAME = ".orbit.json";
|
|
17
|
+
export declare const MAX_TRAVERSAL_DEPTH = 10;
|
|
18
|
+
/** File I/O interface — overridable for testing. */
|
|
19
|
+
export interface ManifestIO {
|
|
20
|
+
read(path: string): Promise<string>;
|
|
21
|
+
write(path: string, data: string): Promise<void>;
|
|
22
|
+
exists(path: string): Promise<boolean>;
|
|
23
|
+
mkdir(path: string): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
export declare const defaultManifestIO: ManifestIO;
|
|
26
|
+
/** Validate a parsed manifest object. Returns validation result. */
|
|
27
|
+
export declare function validateManifest(data: unknown): Omit<ManifestValidationResult, 'manifestDir' | 'legacy'>;
|
|
28
|
+
/**
|
|
29
|
+
* Find a project manifest by walking up the directory tree.
|
|
30
|
+
* Checks for .orbit/project.json first, then .orbit.json (legacy).
|
|
31
|
+
*/
|
|
32
|
+
export declare function findManifest(startDir: string, io?: ManifestIO): Promise<ManifestValidationResult>;
|
|
33
|
+
/** Load manifest from a specific directory (no parent traversal). */
|
|
34
|
+
export declare function loadManifest(dir: string, io?: ManifestIO): Promise<ManifestValidationResult>;
|
|
35
|
+
/** Save manifest to .orbit/project.json. Creates .orbit/ directory if needed. */
|
|
36
|
+
export declare function saveManifest(dir: string, manifest: ProjectManifest, io?: ManifestIO): Promise<void>;
|
|
37
|
+
/** Convert a legacy SiteLink to a ProjectManifest. */
|
|
38
|
+
export declare function migrateFromLegacy(legacy: SiteLink): ProjectManifest;
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project manifest management for @orbitpanel/cli.
|
|
3
|
+
*
|
|
4
|
+
* Handles .orbit/project.json discovery, validation, and persistence.
|
|
5
|
+
* Supports backward compatibility with legacy .orbit.json format.
|
|
6
|
+
*
|
|
7
|
+
* SEPARATION OF CONCERNS:
|
|
8
|
+
* - This module handles ONLY project identity (manifest)
|
|
9
|
+
* - Instructions (AI/UX context) are in instructions.ts
|
|
10
|
+
* - Environment detection is in environment.ts
|
|
11
|
+
*/
|
|
12
|
+
import { join, dirname, resolve } from 'node:path';
|
|
13
|
+
import { readFile, writeFile, mkdir, access } from 'node:fs/promises';
|
|
14
|
+
// ─── Constants ────────────────────────────────────────────────────
|
|
15
|
+
export const MANIFEST_DIR = '.orbit';
|
|
16
|
+
export const MANIFEST_FILENAME = 'project.json';
|
|
17
|
+
export const MANIFEST_PATH = `${MANIFEST_DIR}/${MANIFEST_FILENAME}`;
|
|
18
|
+
export const LEGACY_FILENAME = '.orbit.json';
|
|
19
|
+
export const MAX_TRAVERSAL_DEPTH = 10;
|
|
20
|
+
const VALID_VERSIONS = [1];
|
|
21
|
+
const VALID_PLATFORMS = ['wordpress', 'prestashop', 'custom'];
|
|
22
|
+
const VALID_ENVIRONMENTS = ['local', 'dev', 'staging', 'production'];
|
|
23
|
+
const KNOWN_FIELDS = new Set([
|
|
24
|
+
'version', 'name', 'platform', 'environment', 'linkedSiteId', 'root',
|
|
25
|
+
]);
|
|
26
|
+
export const defaultManifestIO = {
|
|
27
|
+
read: (path) => readFile(path, 'utf-8'),
|
|
28
|
+
write: (path, data) => writeFile(path, data, { encoding: 'utf-8', mode: 0o644 }),
|
|
29
|
+
exists: async (path) => {
|
|
30
|
+
try {
|
|
31
|
+
await access(path);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
mkdir: async (path) => { await mkdir(path, { recursive: true }); },
|
|
39
|
+
};
|
|
40
|
+
// ─── Validation ───────────────────────────────────────────────────
|
|
41
|
+
/** Validate a parsed manifest object. Returns validation result. */
|
|
42
|
+
export function validateManifest(data) {
|
|
43
|
+
const errors = [];
|
|
44
|
+
const warnings = [];
|
|
45
|
+
if (data === null || data === undefined || typeof data !== 'object') {
|
|
46
|
+
return { valid: false, manifest: null, errors: ['Manifest deve essere un oggetto JSON'], warnings };
|
|
47
|
+
}
|
|
48
|
+
const obj = data;
|
|
49
|
+
// version (required, must be supported)
|
|
50
|
+
if (obj.version === undefined || obj.version === null) {
|
|
51
|
+
errors.push('Campo "version" obbligatorio');
|
|
52
|
+
}
|
|
53
|
+
else if (!VALID_VERSIONS.includes(obj.version)) {
|
|
54
|
+
errors.push(`Campo "version" non supportato: ${obj.version}. Valori: ${VALID_VERSIONS.join(', ')}`);
|
|
55
|
+
}
|
|
56
|
+
// name (required, non-empty string)
|
|
57
|
+
if (obj.name === undefined || obj.name === null) {
|
|
58
|
+
errors.push('Campo "name" obbligatorio');
|
|
59
|
+
}
|
|
60
|
+
else if (typeof obj.name !== 'string' || obj.name.trim() === '') {
|
|
61
|
+
errors.push('Campo "name" deve essere una stringa non vuota');
|
|
62
|
+
}
|
|
63
|
+
// platform (required, must be valid)
|
|
64
|
+
if (obj.platform === undefined || obj.platform === null) {
|
|
65
|
+
errors.push('Campo "platform" obbligatorio');
|
|
66
|
+
}
|
|
67
|
+
else if (!VALID_PLATFORMS.includes(obj.platform)) {
|
|
68
|
+
errors.push(`Campo "platform" non valido: ${obj.platform}. Valori: ${VALID_PLATFORMS.join(', ')}`);
|
|
69
|
+
}
|
|
70
|
+
// environment (required, must be valid)
|
|
71
|
+
if (obj.environment === undefined || obj.environment === null) {
|
|
72
|
+
errors.push('Campo "environment" obbligatorio');
|
|
73
|
+
}
|
|
74
|
+
else if (!VALID_ENVIRONMENTS.includes(obj.environment)) {
|
|
75
|
+
errors.push(`Campo "environment" non valido: ${obj.environment}. Valori: ${VALID_ENVIRONMENTS.join(', ')}`);
|
|
76
|
+
}
|
|
77
|
+
// Warn on unknown fields
|
|
78
|
+
for (const key of Object.keys(obj)) {
|
|
79
|
+
if (!KNOWN_FIELDS.has(key)) {
|
|
80
|
+
warnings.push(`Campo sconosciuto "${key}" — verra ignorato`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (errors.length > 0) {
|
|
84
|
+
return { valid: false, manifest: null, errors, warnings };
|
|
85
|
+
}
|
|
86
|
+
const manifest = {
|
|
87
|
+
version: obj.version,
|
|
88
|
+
name: obj.name.trim(),
|
|
89
|
+
platform: obj.platform,
|
|
90
|
+
environment: obj.environment,
|
|
91
|
+
...(obj.linkedSiteId !== undefined && { linkedSiteId: String(obj.linkedSiteId) }),
|
|
92
|
+
...(obj.root !== undefined && { root: String(obj.root) }),
|
|
93
|
+
};
|
|
94
|
+
return { valid: true, manifest, errors: [], warnings };
|
|
95
|
+
}
|
|
96
|
+
// ─── Find Manifest (walk-up) ──────────────────────────────────────
|
|
97
|
+
/**
|
|
98
|
+
* Find a project manifest by walking up the directory tree.
|
|
99
|
+
* Checks for .orbit/project.json first, then .orbit.json (legacy).
|
|
100
|
+
*/
|
|
101
|
+
export async function findManifest(startDir, io = defaultManifestIO) {
|
|
102
|
+
const notFound = {
|
|
103
|
+
valid: false,
|
|
104
|
+
manifest: null,
|
|
105
|
+
errors: [],
|
|
106
|
+
warnings: [],
|
|
107
|
+
manifestDir: null,
|
|
108
|
+
legacy: false,
|
|
109
|
+
};
|
|
110
|
+
let currentDir = resolve(startDir);
|
|
111
|
+
let depth = 0;
|
|
112
|
+
while (depth < MAX_TRAVERSAL_DEPTH) {
|
|
113
|
+
// 1. Check .orbit/project.json (preferred)
|
|
114
|
+
const manifestPath = join(currentDir, MANIFEST_DIR, MANIFEST_FILENAME);
|
|
115
|
+
if (await io.exists(manifestPath)) {
|
|
116
|
+
return readAndValidateManifest(manifestPath, currentDir, false, io);
|
|
117
|
+
}
|
|
118
|
+
// 2. Check .orbit.json (legacy fallback) — only in current dir, not parents
|
|
119
|
+
if (depth === 0) {
|
|
120
|
+
// Also check parents for legacy
|
|
121
|
+
}
|
|
122
|
+
const legacyPath = join(currentDir, LEGACY_FILENAME);
|
|
123
|
+
if (await io.exists(legacyPath)) {
|
|
124
|
+
return readAndValidateLegacy(legacyPath, currentDir, io);
|
|
125
|
+
}
|
|
126
|
+
// Go up one level
|
|
127
|
+
const parentDir = dirname(currentDir);
|
|
128
|
+
if (parentDir === currentDir) {
|
|
129
|
+
// Reached root
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
currentDir = parentDir;
|
|
133
|
+
depth++;
|
|
134
|
+
}
|
|
135
|
+
return notFound;
|
|
136
|
+
}
|
|
137
|
+
/** Read and validate a .orbit/project.json file. */
|
|
138
|
+
async function readAndValidateManifest(filePath, dir, legacy, io) {
|
|
139
|
+
try {
|
|
140
|
+
const raw = await io.read(filePath);
|
|
141
|
+
const parsed = JSON.parse(raw);
|
|
142
|
+
const validation = validateManifest(parsed);
|
|
143
|
+
return {
|
|
144
|
+
...validation,
|
|
145
|
+
manifestDir: dir,
|
|
146
|
+
legacy,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
return {
|
|
151
|
+
valid: false,
|
|
152
|
+
manifest: null,
|
|
153
|
+
errors: [`Errore lettura manifest: ${error instanceof Error ? error.message : String(error)}`],
|
|
154
|
+
warnings: [],
|
|
155
|
+
manifestDir: dir,
|
|
156
|
+
legacy,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/** Read a legacy .orbit.json and convert to manifest format. */
|
|
161
|
+
async function readAndValidateLegacy(filePath, dir, io) {
|
|
162
|
+
try {
|
|
163
|
+
const raw = await io.read(filePath);
|
|
164
|
+
const parsed = JSON.parse(raw);
|
|
165
|
+
const manifest = migrateFromLegacy(parsed);
|
|
166
|
+
const validation = validateManifest(manifest);
|
|
167
|
+
return {
|
|
168
|
+
...validation,
|
|
169
|
+
manifestDir: dir,
|
|
170
|
+
legacy: true,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
return {
|
|
175
|
+
valid: false,
|
|
176
|
+
manifest: null,
|
|
177
|
+
errors: [`Errore lettura .orbit.json legacy: ${error instanceof Error ? error.message : String(error)}`],
|
|
178
|
+
warnings: [],
|
|
179
|
+
manifestDir: dir,
|
|
180
|
+
legacy: true,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// ─── Load Manifest (no walk-up) ───────────────────────────────────
|
|
185
|
+
/** Load manifest from a specific directory (no parent traversal). */
|
|
186
|
+
export async function loadManifest(dir, io = defaultManifestIO) {
|
|
187
|
+
const manifestPath = join(dir, MANIFEST_DIR, MANIFEST_FILENAME);
|
|
188
|
+
if (await io.exists(manifestPath)) {
|
|
189
|
+
return readAndValidateManifest(manifestPath, dir, false, io);
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
valid: false,
|
|
193
|
+
manifest: null,
|
|
194
|
+
errors: [],
|
|
195
|
+
warnings: [],
|
|
196
|
+
manifestDir: null,
|
|
197
|
+
legacy: false,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
// ─── Save Manifest ────────────────────────────────────────────────
|
|
201
|
+
/** Save manifest to .orbit/project.json. Creates .orbit/ directory if needed. */
|
|
202
|
+
export async function saveManifest(dir, manifest, io = defaultManifestIO) {
|
|
203
|
+
const orbitDir = join(dir, MANIFEST_DIR);
|
|
204
|
+
await io.mkdir(orbitDir);
|
|
205
|
+
await io.write(join(orbitDir, MANIFEST_FILENAME), JSON.stringify(manifest, null, 2) + '\n');
|
|
206
|
+
}
|
|
207
|
+
// ─── Legacy Migration ─────────────────────────────────────────────
|
|
208
|
+
/** Map a legacy environment string to a valid EnvironmentType. */
|
|
209
|
+
function mapLegacyEnvironment(env) {
|
|
210
|
+
if (!env)
|
|
211
|
+
return 'local';
|
|
212
|
+
const lower = env.toLowerCase();
|
|
213
|
+
if (lower.includes('local') || lower.includes('dev-local'))
|
|
214
|
+
return 'local';
|
|
215
|
+
if (lower === 'dev' || lower === 'development')
|
|
216
|
+
return 'dev';
|
|
217
|
+
if (lower.includes('staging') || lower.includes('stage'))
|
|
218
|
+
return 'staging';
|
|
219
|
+
if (lower.includes('prod') || lower.includes('live'))
|
|
220
|
+
return 'production';
|
|
221
|
+
// If the string is exactly a valid value, use it
|
|
222
|
+
if (VALID_ENVIRONMENTS.includes(lower))
|
|
223
|
+
return lower;
|
|
224
|
+
return 'local';
|
|
225
|
+
}
|
|
226
|
+
/** Convert a legacy SiteLink to a ProjectManifest. */
|
|
227
|
+
export function migrateFromLegacy(legacy) {
|
|
228
|
+
return {
|
|
229
|
+
version: 1,
|
|
230
|
+
name: legacy.name || legacy.orbit_site_id,
|
|
231
|
+
platform: legacy.platform,
|
|
232
|
+
environment: mapLegacyEnvironment(legacy.environment),
|
|
233
|
+
linkedSiteId: legacy.orbit_site_id,
|
|
234
|
+
...(legacy.final_url !== undefined && { root: '.' }),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/lib/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Contextual UX hints for the Orbit CLI shell.
|
|
3
3
|
* Shows the right hint at the right time — not spam, not silence.
|
|
4
|
+
*
|
|
5
|
+
* The hints adapt to the user's current state:
|
|
6
|
+
* - Not authenticated → explain what Orbit CLI does + how to connect
|
|
7
|
+
* - Authenticated, no site → guide to link a site
|
|
8
|
+
* - Fully configured → show operational commands
|
|
9
|
+
* - Session active → show session commands
|
|
4
10
|
*/
|
|
5
11
|
export interface ShellState {
|
|
6
12
|
hasToken: boolean;
|
|
7
13
|
hasSite: boolean;
|
|
8
14
|
hasSession: boolean;
|
|
15
|
+
hasManifest: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface QuickTip {
|
|
18
|
+
cmd: string;
|
|
19
|
+
text: string;
|
|
9
20
|
}
|
|
10
21
|
/**
|
|
11
22
|
* Get a contextual welcome hint based on current shell state.
|
|
12
23
|
* Returns different messages depending on what's configured.
|
|
13
24
|
*/
|
|
14
25
|
export declare function getWelcomeHint(state: ShellState): string;
|
|
26
|
+
/**
|
|
27
|
+
* Get contextual quick tips for the info box.
|
|
28
|
+
* Returns an array of {cmd, text} tuples adapted to the user's state.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getQuickTips(state: ShellState): QuickTip[];
|
|
15
31
|
/**
|
|
16
32
|
* Get a helpful hint when user types an unknown slash command.
|
|
17
33
|
* Uses prefix matching and basic edit-distance to suggest close matches.
|
package/dist/lib/shell-hints.js
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Contextual UX hints for the Orbit CLI shell.
|
|
3
3
|
* Shows the right hint at the right time — not spam, not silence.
|
|
4
|
+
*
|
|
5
|
+
* The hints adapt to the user's current state:
|
|
6
|
+
* - Not authenticated → explain what Orbit CLI does + how to connect
|
|
7
|
+
* - Authenticated, no site → guide to link a site
|
|
8
|
+
* - Fully configured → show operational commands
|
|
9
|
+
* - Session active → show session commands
|
|
4
10
|
*/
|
|
5
11
|
import { SLASH_COMMANDS } from './shell-render.js';
|
|
6
12
|
/**
|
|
@@ -9,16 +15,68 @@ import { SLASH_COMMANDS } from './shell-render.js';
|
|
|
9
15
|
*/
|
|
10
16
|
export function getWelcomeHint(state) {
|
|
11
17
|
if (!state.hasToken) {
|
|
12
|
-
return '
|
|
18
|
+
return 'Orbit CLI gestisce i tuoi siti da terminale. Esegui /auth per collegare il tuo account Orbit.';
|
|
13
19
|
}
|
|
14
|
-
if (!state.hasSite) {
|
|
15
|
-
return '
|
|
20
|
+
if (!state.hasSite && !state.hasManifest) {
|
|
21
|
+
return 'Autenticato. Collega un sito con /sites oppure inizializza il progetto locale con orbit init.';
|
|
16
22
|
}
|
|
17
23
|
if (state.hasSession) {
|
|
18
24
|
return 'Sessione attiva — usa /note per annotare, o scrivi in linguaggio naturale per parlare con Orbit AI.';
|
|
19
25
|
}
|
|
26
|
+
if (state.hasManifest) {
|
|
27
|
+
return 'Progetto rilevato — /context per i dettagli, /session start per lavorare, o premi Tab per completare.';
|
|
28
|
+
}
|
|
20
29
|
return 'Digita /help per i comandi, /session start per iniziare a lavorare, o premi Tab per completare.';
|
|
21
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Get contextual quick tips for the info box.
|
|
33
|
+
* Returns an array of {cmd, text} tuples adapted to the user's state.
|
|
34
|
+
*/
|
|
35
|
+
export function getQuickTips(state) {
|
|
36
|
+
// State 1: Not authenticated — explain what Orbit CLI does
|
|
37
|
+
if (!state.hasToken) {
|
|
38
|
+
return [
|
|
39
|
+
{ cmd: 'Orbit CLI', text: 'gestisci siti, sessioni e interventi da terminale' },
|
|
40
|
+
{ cmd: '/auth', text: 'collegare il tuo account Orbit (apre il browser)' },
|
|
41
|
+
{ cmd: '/login <token>', text: 'oppure incolla un token MCP direttamente' },
|
|
42
|
+
{ cmd: '/help', text: 'lista completa dei comandi' },
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
// State 2: Authenticated but no site linked
|
|
46
|
+
if (!state.hasSite && !state.hasManifest) {
|
|
47
|
+
return [
|
|
48
|
+
{ cmd: '/sites', text: 'seleziona un sito da gestire' },
|
|
49
|
+
{ cmd: '/link <id>', text: 'collega questa directory a un sito Orbit' },
|
|
50
|
+
{ cmd: 'orbit init', text: 'inizializza un progetto locale (.orbit/project.json)' },
|
|
51
|
+
{ cmd: '/doctor', text: 'verifica connessione e configurazione' },
|
|
52
|
+
];
|
|
53
|
+
}
|
|
54
|
+
// State 3: Session active — show session commands
|
|
55
|
+
if (state.hasSession) {
|
|
56
|
+
return [
|
|
57
|
+
{ cmd: '/note <testo>', text: 'annota cosa stai facendo' },
|
|
58
|
+
{ cmd: '/report', text: 'invia un report a Orbit' },
|
|
59
|
+
{ cmd: '/session end', text: 'chiudi la sessione di lavoro' },
|
|
60
|
+
{ cmd: 'testo libero', text: 'scrivi in linguaggio naturale per parlare con AI' },
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
// State 4: Fully configured, with manifest
|
|
64
|
+
if (state.hasManifest) {
|
|
65
|
+
return [
|
|
66
|
+
{ cmd: '/context', text: 'mostra contesto progetto e ambiente' },
|
|
67
|
+
{ cmd: '/session start', text: 'inizia una sessione di lavoro' },
|
|
68
|
+
{ cmd: '/status', text: 'panoramica completa' },
|
|
69
|
+
{ cmd: 'testo libero', text: 'scrivi in linguaggio naturale per parlare con AI' },
|
|
70
|
+
];
|
|
71
|
+
}
|
|
72
|
+
// State 5: Fully configured, no manifest
|
|
73
|
+
return [
|
|
74
|
+
{ cmd: '/session start', text: 'inizia una sessione di lavoro' },
|
|
75
|
+
{ cmd: '/status', text: 'panoramica completa' },
|
|
76
|
+
{ cmd: '/doctor', text: 'verifica connessione e configurazione' },
|
|
77
|
+
{ cmd: 'testo libero', text: 'scrivi in linguaggio naturale per parlare con AI' },
|
|
78
|
+
];
|
|
79
|
+
}
|
|
22
80
|
/**
|
|
23
81
|
* Get a helpful hint when user types an unknown slash command.
|
|
24
82
|
* Uses prefix matching and basic edit-distance to suggest close matches.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-hints.js","sourceRoot":"","sources":["../../src/lib/shell-hints.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"shell-hints.js","sourceRoot":"","sources":["../../src/lib/shell-hints.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/shell-ink.js
CHANGED
|
@@ -39,12 +39,13 @@ export async function startInkShell(version) {
|
|
|
39
39
|
const cwd = process.cwd();
|
|
40
40
|
const store = new OrbitStore(defaultStoreIO);
|
|
41
41
|
await store.init(cwd);
|
|
42
|
-
const { tokenEntry, siteLink, session } = store.getState();
|
|
42
|
+
const { tokenEntry, siteLink, session, manifest } = store.getState();
|
|
43
43
|
// Welcome hint
|
|
44
44
|
const welcomeHint = getWelcomeHint({
|
|
45
45
|
hasToken: !!tokenEntry,
|
|
46
46
|
hasSite: !!siteLink,
|
|
47
47
|
hasSession: !!session,
|
|
48
|
+
hasManifest: !!manifest,
|
|
48
49
|
});
|
|
49
50
|
console.log(` ${DIM(welcomeHint)}`);
|
|
50
51
|
console.log('');
|