@orbitpanel/cli 1.5.0 → 1.6.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.
@@ -8,17 +8,33 @@
8
8
  * DESIGN:
9
9
  * - Centralizzata: una sola funzione, chiamata dal router
10
10
  * - Fail-closed: se non puoi chiedere, non eseguire
11
- * - Estensibile: SENSITIVE_COMMANDS è una lista espandibile
11
+ * - Policy esplicita: ogni comando sensibile ha risk level e reason
12
+ * - Audit: --force su critical viene loggato in ~/.orbit/force.log
12
13
  * - Override esplicito: --force bypassa la guard
13
14
  */
14
- import type { ContextHealth } from '../types.js';
15
+ import type { ContextHealth, ContextHealthLevel } from '../types.js';
16
+ export interface SensitiveCommandPolicy {
17
+ /** Primary command name (e.g. '/report') */
18
+ name: string;
19
+ /** Aliases (e.g. ['/r']) */
20
+ aliases: string[];
21
+ /** Risk level — determines guard behavior */
22
+ risk: 'low' | 'medium' | 'high';
23
+ /** Human-readable reason why this command is sensitive */
24
+ reason: string;
25
+ }
26
+ /**
27
+ * Centralized policy registry for sensitive commands.
28
+ * Single source of truth — add new commands here.
29
+ */
30
+ export declare const COMMAND_POLICIES: readonly SensitiveCommandPolicy[];
15
31
  /**
16
- * Commands that require guard when context is critical.
17
- * Each entry is a prefix — e.g. '/link' matches '/link site_123'.
32
+ * Find the policy for a given command. Returns null for non-sensitive commands.
18
33
  */
19
- export declare const SENSITIVE_COMMANDS: readonly string[];
34
+ export declare function getCommandPolicy(cmd: string): SensitiveCommandPolicy | null;
20
35
  /**
21
36
  * Check if a command is sensitive (requires guard on critical context).
37
+ * Backward-compatible wrapper around getCommandPolicy.
22
38
  */
23
39
  export declare function isSensitiveCommand(cmd: string): boolean;
24
40
  /**
@@ -29,18 +45,52 @@ export declare function parseForceFlag(input: string): {
29
45
  force: boolean;
30
46
  cleanInput: string;
31
47
  };
48
+ /** Guard levels: none (execute), soft (confirm but don't block), hard (confirm or block) */
49
+ export type GuardLevel = 'none' | 'soft' | 'hard';
50
+ /**
51
+ * Determine the guard level for a command given the current health.
52
+ *
53
+ * | health | risk | guard |
54
+ * |----------|----------|-------|
55
+ * | critical | any sens.| hard |
56
+ * | warning | high | soft |
57
+ * | warning | med/low | none |
58
+ * | ok/info | * | none |
59
+ * | * | non-sens | none |
60
+ */
61
+ export declare function getGuardLevel(cmd: string, health: ContextHealth): GuardLevel;
32
62
  /**
33
- * Should the guard activate? True only when command is sensitive AND health is critical.
63
+ * Should the guard activate? Backward-compatible boolean wrapper.
64
+ * Returns true for both soft and hard guards.
34
65
  */
35
66
  export declare function shouldGuard(cmd: string, health: ContextHealth): boolean;
36
67
  /**
37
68
  * Format the warning message shown in TTY before asking confirmation.
38
69
  */
39
70
  export declare function formatGuardMessage(health: ContextHealth): string;
71
+ /**
72
+ * Format the soft warning message for high-risk commands on warning health.
73
+ * Less alarming than the critical guard message.
74
+ */
75
+ export declare function formatSoftGuardMessage(policy: SensitiveCommandPolicy): string;
40
76
  /**
41
77
  * Format the blocked message shown in non-TTY when command is blocked.
42
78
  */
43
79
  export declare function formatBlockedMessage(health: ContextHealth): string;
80
+ /** I/O interface for audit — overridable for testing. */
81
+ export interface AuditIO {
82
+ append(path: string, data: string): Promise<void>;
83
+ }
84
+ /**
85
+ * Log a --force bypass to ~/.orbit/force.log.
86
+ * Fire-and-forget — never blocks or throws.
87
+ */
88
+ export declare function auditForceBypass(opts: {
89
+ cmd: string;
90
+ healthLevel: ContextHealthLevel;
91
+ cwd: string;
92
+ io?: AuditIO;
93
+ }): Promise<void>;
44
94
  export interface GuardOptions {
45
95
  cmd: string;
46
96
  health: ContextHealth;
@@ -48,6 +98,7 @@ export interface GuardOptions {
48
98
  promptConfirm?: (message: string) => Promise<boolean>;
49
99
  force: boolean;
50
100
  execute: () => void | Promise<void>;
101
+ cwd?: string;
51
102
  }
52
103
  /**
53
104
  * Run a command with context guard.
@@ -56,7 +107,7 @@ export interface GuardOptions {
56
107
  * | Guard needed | Force | TTY | Action |
57
108
  * |-------------|-------|------------|---------------------|
58
109
  * | No | * | * | Execute |
59
- * | Yes | Yes | * | Execute (bypass) |
110
+ * | Yes | Yes | * | Audit + notice + execute |
60
111
  * | Yes | No | Yes (TTY) | Ask → execute/abort |
61
112
  * | Yes | No | No (pipe) | BLOCK |
62
113
  */
@@ -8,27 +8,59 @@
8
8
  * DESIGN:
9
9
  * - Centralizzata: una sola funzione, chiamata dal router
10
10
  * - Fail-closed: se non puoi chiedere, non eseguire
11
- * - Estensibile: SENSITIVE_COMMANDS è una lista espandibile
11
+ * - Policy esplicita: ogni comando sensibile ha risk level e reason
12
+ * - Audit: --force su critical viene loggato in ~/.orbit/force.log
12
13
  * - Override esplicito: --force bypassa la guard
13
14
  */
14
- // ─── Sensitive Command Registry ───────────────────────────────────
15
+ import { join } from 'node:path';
16
+ import { appendFile, mkdir } from 'node:fs/promises';
15
17
  /**
16
- * Commands that require guard when context is critical.
17
- * Each entry is a prefix e.g. '/link' matches '/link site_123'.
18
+ * Centralized policy registry for sensitive commands.
19
+ * Single source of truthadd new commands here.
18
20
  */
19
- export const SENSITIVE_COMMANDS = [
20
- '/report',
21
- '/r',
22
- '/session start',
23
- '/ss',
24
- '/link',
21
+ export const COMMAND_POLICIES = [
22
+ {
23
+ name: '/report',
24
+ aliases: ['/r'],
25
+ risk: 'high',
26
+ reason: 'Invia dati al backend Orbit',
27
+ },
28
+ {
29
+ name: '/session start',
30
+ aliases: ['/ss'],
31
+ risk: 'medium',
32
+ reason: 'Crea sessione su sito potenzialmente sbagliato',
33
+ },
34
+ {
35
+ name: '/link',
36
+ aliases: [],
37
+ risk: 'high',
38
+ reason: 'Modifica il collegamento progetto-sito',
39
+ },
25
40
  ];
41
+ /**
42
+ * Find the policy for a given command. Returns null for non-sensitive commands.
43
+ */
44
+ export function getCommandPolicy(cmd) {
45
+ const lower = cmd.toLowerCase().trim();
46
+ for (const policy of COMMAND_POLICIES) {
47
+ if (lower === policy.name || lower.startsWith(policy.name + ' ')) {
48
+ return policy;
49
+ }
50
+ for (const alias of policy.aliases) {
51
+ if (lower === alias || lower.startsWith(alias + ' ')) {
52
+ return policy;
53
+ }
54
+ }
55
+ }
56
+ return null;
57
+ }
26
58
  /**
27
59
  * Check if a command is sensitive (requires guard on critical context).
60
+ * Backward-compatible wrapper around getCommandPolicy.
28
61
  */
29
62
  export function isSensitiveCommand(cmd) {
30
- const lower = cmd.toLowerCase().trim();
31
- return SENSITIVE_COMMANDS.some(sc => lower === sc || lower.startsWith(sc + ' '));
63
+ return getCommandPolicy(cmd) !== null;
32
64
  }
33
65
  // ─── Force Flag Parsing ───────────────────────────────────────────
34
66
  /**
@@ -36,7 +68,6 @@ export function isSensitiveCommand(cmd) {
36
68
  * Returns the clean input (without --force) and whether the flag was present.
37
69
  */
38
70
  export function parseForceFlag(input) {
39
- // Match --force as a standalone word (not --forced, --forceful, etc.)
40
71
  const forceRegex = /\s--force(?:\s|$)/;
41
72
  if (forceRegex.test(` ${input} `)) {
42
73
  const cleanInput = input.replace(/\s*--force\s*/, ' ').trim();
@@ -44,12 +75,33 @@ export function parseForceFlag(input) {
44
75
  }
45
76
  return { force: false, cleanInput: input };
46
77
  }
47
- // ─── Guard Logic ──────────────────────────────────────────────────
48
78
  /**
49
- * Should the guard activate? True only when command is sensitive AND health is critical.
79
+ * Determine the guard level for a command given the current health.
80
+ *
81
+ * | health | risk | guard |
82
+ * |----------|----------|-------|
83
+ * | critical | any sens.| hard |
84
+ * | warning | high | soft |
85
+ * | warning | med/low | none |
86
+ * | ok/info | * | none |
87
+ * | * | non-sens | none |
88
+ */
89
+ export function getGuardLevel(cmd, health) {
90
+ const policy = getCommandPolicy(cmd);
91
+ if (!policy)
92
+ return 'none';
93
+ if (health.level === 'critical')
94
+ return 'hard';
95
+ if (health.level === 'warning' && policy.risk === 'high')
96
+ return 'soft';
97
+ return 'none';
98
+ }
99
+ /**
100
+ * Should the guard activate? Backward-compatible boolean wrapper.
101
+ * Returns true for both soft and hard guards.
50
102
  */
51
103
  export function shouldGuard(cmd, health) {
52
- return isSensitiveCommand(cmd) && health.level === 'critical';
104
+ return getGuardLevel(cmd, health) !== 'none';
53
105
  }
54
106
  /**
55
107
  * Format the warning message shown in TTY before asking confirmation.
@@ -70,6 +122,18 @@ export function formatGuardMessage(health) {
70
122
  lines.push('');
71
123
  return lines.join('\n');
72
124
  }
125
+ /**
126
+ * Format the soft warning message for high-risk commands on warning health.
127
+ * Less alarming than the critical guard message.
128
+ */
129
+ export function formatSoftGuardMessage(policy) {
130
+ const lines = [];
131
+ lines.push('');
132
+ lines.push(' ⚠️ Operazione con rischio elevato');
133
+ lines.push(` → ${policy.reason}`);
134
+ lines.push('');
135
+ return lines.join('\n');
136
+ }
73
137
  /**
74
138
  * Format the blocked message shown in non-TTY when command is blocked.
75
139
  */
@@ -88,6 +152,30 @@ export function formatBlockedMessage(health) {
88
152
  lines.push('');
89
153
  return lines.join('\n');
90
154
  }
155
+ // ─── Audit ────────────────────────────────────────────────────────
156
+ const ORBIT_DIR = join(process.env.HOME ?? '~', '.orbit');
157
+ const FORCE_LOG_PATH = join(ORBIT_DIR, 'force.log');
158
+ const defaultAuditIO = {
159
+ append: async (path, data) => {
160
+ await mkdir(ORBIT_DIR, { recursive: true });
161
+ await appendFile(path, data, 'utf-8');
162
+ },
163
+ };
164
+ /**
165
+ * Log a --force bypass to ~/.orbit/force.log.
166
+ * Fire-and-forget — never blocks or throws.
167
+ */
168
+ export async function auditForceBypass(opts) {
169
+ try {
170
+ const io = opts.io ?? defaultAuditIO;
171
+ const timestamp = new Date().toISOString();
172
+ const line = `${timestamp} | ${opts.cmd} | bypass ${opts.healthLevel} | ${opts.cwd}\n`;
173
+ await io.append(FORCE_LOG_PATH, line);
174
+ }
175
+ catch {
176
+ // Audit failure must never block execution
177
+ }
178
+ }
91
179
  /**
92
180
  * Run a command with context guard.
93
181
  *
@@ -95,26 +183,49 @@ export function formatBlockedMessage(health) {
95
183
  * | Guard needed | Force | TTY | Action |
96
184
  * |-------------|-------|------------|---------------------|
97
185
  * | No | * | * | Execute |
98
- * | Yes | Yes | * | Execute (bypass) |
186
+ * | Yes | Yes | * | Audit + notice + execute |
99
187
  * | Yes | No | Yes (TTY) | Ask → execute/abort |
100
188
  * | Yes | No | No (pipe) | BLOCK |
101
189
  */
102
190
  export async function runWithContextGuard(opts) {
103
- const { cmd, health, output, promptConfirm, force, execute } = opts;
191
+ const { cmd, health, output, promptConfirm, force, execute, cwd } = opts;
192
+ const level = getGuardLevel(cmd, health);
104
193
  // No guard needed → execute directly
105
- if (!shouldGuard(cmd, health)) {
194
+ if (level === 'none') {
106
195
  await execute();
107
196
  return;
108
197
  }
109
- // Force bypass guard
110
- if (force) {
111
- await execute();
198
+ // ── HARD guard (critical) ──
199
+ if (level === 'hard') {
200
+ // Force → audit + notice + bypass
201
+ if (force) {
202
+ output(' ⚠️ Esecuzione forzata su contesto CRITICAL (--force)');
203
+ auditForceBypass({ cmd, healthLevel: health.level, cwd: cwd ?? process.cwd() });
204
+ await execute();
205
+ return;
206
+ }
207
+ // TTY → ask hard confirmation
208
+ if (promptConfirm) {
209
+ output(formatGuardMessage(health));
210
+ const confirmed = await promptConfirm('Vuoi procedere comunque?');
211
+ if (confirmed) {
212
+ await execute();
213
+ }
214
+ else {
215
+ output(' Annullato.');
216
+ }
217
+ return;
218
+ }
219
+ // Non-TTY, no force → BLOCK (fail-closed)
220
+ output(formatBlockedMessage(health));
112
221
  return;
113
222
  }
114
- // TTY ask confirmation
115
- if (promptConfirm) {
116
- output(formatGuardMessage(health));
117
- const confirmed = await promptConfirm('Vuoi procedere comunque?');
223
+ // ── SOFT guard (warning + high risk) ──
224
+ const policy = getCommandPolicy(cmd);
225
+ // TTY → ask soft confirmation
226
+ if (promptConfirm && policy) {
227
+ output(formatSoftGuardMessage(policy));
228
+ const confirmed = await promptConfirm('Vuoi procedere?');
118
229
  if (confirmed) {
119
230
  await execute();
120
231
  }
@@ -123,7 +234,10 @@ export async function runWithContextGuard(opts) {
123
234
  }
124
235
  return;
125
236
  }
126
- // Non-TTY, no force BLOCK (fail-closed)
127
- output(formatBlockedMessage(health));
237
+ // Non-TTY show warning but execute (soft = non-blocking)
238
+ if (policy) {
239
+ output(formatSoftGuardMessage(policy));
240
+ }
241
+ await execute();
128
242
  }
129
243
  //# sourceMappingURL=context-guard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context-guard.js","sourceRoot":"","sources":["../../src/lib/context-guard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-guard.js","sourceRoot":"","sources":["../../src/lib/context-guard.ts"],"names":[],"mappings":"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"}
@@ -819,5 +819,5 @@
819
819
  ]
820
820
  }
821
821
  },
822
- "version": "1.5.0"
822
+ "version": "1.6.0"
823
823
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orbitpanel/cli",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "Orbit CLI — strumento locale per sviluppatori OrbitPanel",
5
5
  "type": "module",
6
6
  "bin": {