@aiassesstech/grillo 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/CHANGELOG.md +56 -0
- package/LICENSE +21 -0
- package/README.md +512 -0
- package/SKILL.md +87 -0
- package/dist/api/server.d.ts +68 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +596 -0
- package/dist/api/server.js.map +1 -0
- package/dist/audit/audit-log.d.ts +88 -0
- package/dist/audit/audit-log.d.ts.map +1 -0
- package/dist/audit/audit-log.js +195 -0
- package/dist/audit/audit-log.js.map +1 -0
- package/dist/certification/certificate.d.ts +80 -0
- package/dist/certification/certificate.d.ts.map +1 -0
- package/dist/certification/certificate.js +176 -0
- package/dist/certification/certificate.js.map +1 -0
- package/dist/cli/bin.d.ts +8 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +12 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/config-loader.d.ts +66 -0
- package/dist/cli/config-loader.d.ts.map +1 -0
- package/dist/cli/config-loader.js +243 -0
- package/dist/cli/config-loader.js.map +1 -0
- package/dist/cli/runner.d.ts +27 -0
- package/dist/cli/runner.d.ts.map +1 -0
- package/dist/cli/runner.js +388 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/commands/grillo-commands.d.ts +50 -0
- package/dist/commands/grillo-commands.d.ts.map +1 -0
- package/dist/commands/grillo-commands.js +752 -0
- package/dist/commands/grillo-commands.js.map +1 -0
- package/dist/commands/inline-commands.d.ts +16 -0
- package/dist/commands/inline-commands.d.ts.map +1 -0
- package/dist/commands/inline-commands.js +277 -0
- package/dist/commands/inline-commands.js.map +1 -0
- package/dist/commands/router.d.ts +56 -0
- package/dist/commands/router.d.ts.map +1 -0
- package/dist/commands/router.js +154 -0
- package/dist/commands/router.js.map +1 -0
- package/dist/config/defaults.d.ts +9 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +78 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/schema.d.ts +573 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +142 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/dashboard/metrics.d.ts +100 -0
- package/dist/dashboard/metrics.d.ts.map +1 -0
- package/dist/dashboard/metrics.js +282 -0
- package/dist/dashboard/metrics.js.map +1 -0
- package/dist/dashboard/ui.d.ts +19 -0
- package/dist/dashboard/ui.d.ts.map +1 -0
- package/dist/dashboard/ui.js +951 -0
- package/dist/dashboard/ui.js.map +1 -0
- package/dist/discovery/discovery-adapter.d.ts +94 -0
- package/dist/discovery/discovery-adapter.d.ts.map +1 -0
- package/dist/discovery/discovery-adapter.js +114 -0
- package/dist/discovery/discovery-adapter.js.map +1 -0
- package/dist/discovery/discovery-service.d.ts +77 -0
- package/dist/discovery/discovery-service.d.ts.map +1 -0
- package/dist/discovery/discovery-service.js +240 -0
- package/dist/discovery/discovery-service.js.map +1 -0
- package/dist/drift/detector.d.ts +51 -0
- package/dist/drift/detector.d.ts.map +1 -0
- package/dist/drift/detector.js +148 -0
- package/dist/drift/detector.js.map +1 -0
- package/dist/drift/fleet-anomaly.d.ts +28 -0
- package/dist/drift/fleet-anomaly.d.ts.map +1 -0
- package/dist/drift/fleet-anomaly.js +186 -0
- package/dist/drift/fleet-anomaly.js.map +1 -0
- package/dist/events/event-bus.d.ts +209 -0
- package/dist/events/event-bus.d.ts.map +1 -0
- package/dist/events/event-bus.js +184 -0
- package/dist/events/event-bus.js.map +1 -0
- package/dist/frameworks/framework-registry.d.ts +116 -0
- package/dist/frameworks/framework-registry.d.ts.map +1 -0
- package/dist/frameworks/framework-registry.js +241 -0
- package/dist/frameworks/framework-registry.js.map +1 -0
- package/dist/index.d.ts +94 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +254 -0
- package/dist/index.js.map +1 -0
- package/dist/monitoring/continuous-monitor.d.ts +61 -0
- package/dist/monitoring/continuous-monitor.d.ts.map +1 -0
- package/dist/monitoring/continuous-monitor.js +191 -0
- package/dist/monitoring/continuous-monitor.js.map +1 -0
- package/dist/notifications/notifier.d.ts +21 -0
- package/dist/notifications/notifier.d.ts.map +1 -0
- package/dist/notifications/notifier.js +119 -0
- package/dist/notifications/notifier.js.map +1 -0
- package/dist/notifications/templates.d.ts +14 -0
- package/dist/notifications/templates.d.ts.map +1 -0
- package/dist/notifications/templates.js +105 -0
- package/dist/notifications/templates.js.map +1 -0
- package/dist/orchestration/orchestrator.d.ts +99 -0
- package/dist/orchestration/orchestrator.d.ts.map +1 -0
- package/dist/orchestration/orchestrator.js +426 -0
- package/dist/orchestration/orchestrator.js.map +1 -0
- package/dist/orchestration/queue.d.ts +17 -0
- package/dist/orchestration/queue.d.ts.map +1 -0
- package/dist/orchestration/queue.js +121 -0
- package/dist/orchestration/queue.js.map +1 -0
- package/dist/orchestration/scheduler.d.ts +26 -0
- package/dist/orchestration/scheduler.d.ts.map +1 -0
- package/dist/orchestration/scheduler.js +110 -0
- package/dist/orchestration/scheduler.js.map +1 -0
- package/dist/registry/agent-registry.d.ts +106 -0
- package/dist/registry/agent-registry.d.ts.map +1 -0
- package/dist/registry/agent-registry.js +349 -0
- package/dist/registry/agent-registry.js.map +1 -0
- package/dist/registry/types.d.ts +158 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +44 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/reports/compliance-report.d.ts +66 -0
- package/dist/reports/compliance-report.d.ts.map +1 -0
- package/dist/reports/compliance-report.js +208 -0
- package/dist/reports/compliance-report.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grillo Cricket — Configuration Loader
|
|
3
|
+
*
|
|
4
|
+
* Three-layer config resolution:
|
|
5
|
+
* 1. Defaults (built-in)
|
|
6
|
+
* 2. Config file (grillo.config.json)
|
|
7
|
+
* 3. Environment variables (GRILLO_*)
|
|
8
|
+
* 4. CLI flags (highest priority)
|
|
9
|
+
*
|
|
10
|
+
* Environment variable mapping follows a convention:
|
|
11
|
+
* GRILLO_COMPSI_HEALTH_CHECK_KEY -> config.compsi.healthCheckKey
|
|
12
|
+
* GRILLO_COMPSI_BASE_URL -> config.compsi.baseUrl
|
|
13
|
+
* GRILLO_API_PORT -> config.api.port
|
|
14
|
+
* etc.
|
|
15
|
+
*/
|
|
16
|
+
import type { GrilloConfig } from "../config/schema.js";
|
|
17
|
+
/**
|
|
18
|
+
* Search for a config file starting from the given directory,
|
|
19
|
+
* walking up to the filesystem root.
|
|
20
|
+
*/
|
|
21
|
+
export declare function findConfigFile(startDir?: string): string | null;
|
|
22
|
+
/**
|
|
23
|
+
* Load and parse a JSON config file.
|
|
24
|
+
*/
|
|
25
|
+
export declare function loadConfigFile(filePath: string): Partial<GrilloConfig>;
|
|
26
|
+
/**
|
|
27
|
+
* Save config to a JSON file (for `grillo -config --set` mutation).
|
|
28
|
+
* Creates a timestamped backup of the existing file before overwriting.
|
|
29
|
+
*/
|
|
30
|
+
export declare function saveConfigFile(filePath: string, config: Partial<GrilloConfig>): void;
|
|
31
|
+
/**
|
|
32
|
+
* Set a dot-notated key in a config object.
|
|
33
|
+
* e.g. setConfigValue(config, "drift.tdiWarningThreshold", 0.2)
|
|
34
|
+
*/
|
|
35
|
+
export declare function setConfigValue(config: Record<string, unknown>, dotPath: string, value: string): {
|
|
36
|
+
parsedValue: unknown;
|
|
37
|
+
success: boolean;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Build a partial config from environment variables.
|
|
41
|
+
*/
|
|
42
|
+
export declare function loadEnvConfig(): Partial<GrilloConfig>;
|
|
43
|
+
export interface CLIFlags {
|
|
44
|
+
config?: string;
|
|
45
|
+
port?: number;
|
|
46
|
+
host?: string;
|
|
47
|
+
persistPath?: string;
|
|
48
|
+
logLevel?: "debug" | "info" | "warn" | "error";
|
|
49
|
+
dryRun?: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Parse CLI arguments into flags.
|
|
53
|
+
* Supports: --flag value, --flag=value, --boolean-flag
|
|
54
|
+
*/
|
|
55
|
+
export declare function parseCLIFlags(args: string[]): CLIFlags;
|
|
56
|
+
/**
|
|
57
|
+
* Resolve final config from all layers.
|
|
58
|
+
* Priority: CLI flags > env vars > config file > defaults
|
|
59
|
+
*/
|
|
60
|
+
export declare function resolveConfig(params: {
|
|
61
|
+
defaults: GrilloConfig;
|
|
62
|
+
fileConfig?: Partial<GrilloConfig>;
|
|
63
|
+
envConfig?: Partial<GrilloConfig>;
|
|
64
|
+
cliOverrides?: Partial<GrilloConfig>;
|
|
65
|
+
}): GrilloConfig;
|
|
66
|
+
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/cli/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAYxD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAiB9E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAStE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAC5B,IAAI,CASN;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ;IAAE,WAAW,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAsB5C;AAsCD;;GAEG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAAC,YAAY,CAAC,CAyBrD;AAMD,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,CAgCtD;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACpC,QAAQ,EAAE,YAAY,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;CACtC,GAAG,YAAY,CAcf"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grillo Cricket — Configuration Loader
|
|
3
|
+
*
|
|
4
|
+
* Three-layer config resolution:
|
|
5
|
+
* 1. Defaults (built-in)
|
|
6
|
+
* 2. Config file (grillo.config.json)
|
|
7
|
+
* 3. Environment variables (GRILLO_*)
|
|
8
|
+
* 4. CLI flags (highest priority)
|
|
9
|
+
*
|
|
10
|
+
* Environment variable mapping follows a convention:
|
|
11
|
+
* GRILLO_COMPSI_HEALTH_CHECK_KEY -> config.compsi.healthCheckKey
|
|
12
|
+
* GRILLO_COMPSI_BASE_URL -> config.compsi.baseUrl
|
|
13
|
+
* GRILLO_API_PORT -> config.api.port
|
|
14
|
+
* etc.
|
|
15
|
+
*/
|
|
16
|
+
import * as fs from "node:fs";
|
|
17
|
+
import * as path from "node:path";
|
|
18
|
+
// ================================================================
|
|
19
|
+
// Config File Discovery
|
|
20
|
+
// ================================================================
|
|
21
|
+
const CONFIG_FILE_NAMES = [
|
|
22
|
+
"grillo.config.json",
|
|
23
|
+
".grillo.json",
|
|
24
|
+
".grillorc.json",
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* Search for a config file starting from the given directory,
|
|
28
|
+
* walking up to the filesystem root.
|
|
29
|
+
*/
|
|
30
|
+
export function findConfigFile(startDir = process.cwd()) {
|
|
31
|
+
let dir = path.resolve(startDir);
|
|
32
|
+
while (true) {
|
|
33
|
+
for (const name of CONFIG_FILE_NAMES) {
|
|
34
|
+
const candidate = path.join(dir, name);
|
|
35
|
+
if (fs.existsSync(candidate)) {
|
|
36
|
+
return candidate;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const parent = path.dirname(dir);
|
|
40
|
+
if (parent === dir)
|
|
41
|
+
break; // Hit filesystem root
|
|
42
|
+
dir = parent;
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Load and parse a JSON config file.
|
|
48
|
+
*/
|
|
49
|
+
export function loadConfigFile(filePath) {
|
|
50
|
+
try {
|
|
51
|
+
const raw = fs.readFileSync(filePath, "utf-8");
|
|
52
|
+
return JSON.parse(raw);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
throw new Error(`Failed to load config file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Save config to a JSON file (for `grillo -config --set` mutation).
|
|
60
|
+
* Creates a timestamped backup of the existing file before overwriting.
|
|
61
|
+
*/
|
|
62
|
+
export function saveConfigFile(filePath, config) {
|
|
63
|
+
// Backup existing file if it exists
|
|
64
|
+
if (fs.existsSync(filePath)) {
|
|
65
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
66
|
+
const backupPath = `${filePath}.backup.${timestamp}`;
|
|
67
|
+
fs.copyFileSync(filePath, backupPath);
|
|
68
|
+
}
|
|
69
|
+
fs.writeFileSync(filePath, JSON.stringify(config, null, 2), "utf-8");
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Set a dot-notated key in a config object.
|
|
73
|
+
* e.g. setConfigValue(config, "drift.tdiWarningThreshold", 0.2)
|
|
74
|
+
*/
|
|
75
|
+
export function setConfigValue(config, dotPath, value) {
|
|
76
|
+
const parts = dotPath.split(".");
|
|
77
|
+
// Auto-parse value: number, boolean, or string
|
|
78
|
+
let parsedValue = value;
|
|
79
|
+
if (value === "true")
|
|
80
|
+
parsedValue = true;
|
|
81
|
+
else if (value === "false")
|
|
82
|
+
parsedValue = false;
|
|
83
|
+
else if (!isNaN(Number(value)) && value !== "")
|
|
84
|
+
parsedValue = Number(value);
|
|
85
|
+
// Navigate to parent
|
|
86
|
+
let current = config;
|
|
87
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
88
|
+
if (!current[parts[i]] || typeof current[parts[i]] !== "object") {
|
|
89
|
+
current[parts[i]] = {};
|
|
90
|
+
}
|
|
91
|
+
current = current[parts[i]];
|
|
92
|
+
}
|
|
93
|
+
const finalKey = parts[parts.length - 1];
|
|
94
|
+
current[finalKey] = parsedValue;
|
|
95
|
+
return { parsedValue, success: true };
|
|
96
|
+
}
|
|
97
|
+
const ENV_MAPPINGS = [
|
|
98
|
+
// CompSi connection
|
|
99
|
+
{ env: "GRILLO_COMPSI_HEALTH_CHECK_KEY", path: ["compsi", "healthCheckKey"], type: "string" },
|
|
100
|
+
{ env: "GRILLO_COMPSI_BASE_URL", path: ["compsi", "baseUrl"], type: "string" },
|
|
101
|
+
{ env: "GRILLO_COMPSI_PER_QUESTION_TIMEOUT_MS", path: ["compsi", "perQuestionTimeoutMs"], type: "number" },
|
|
102
|
+
{ env: "GRILLO_COMPSI_OVERALL_TIMEOUT_MS", path: ["compsi", "overallTimeoutMs"], type: "number" },
|
|
103
|
+
// Assessment policy
|
|
104
|
+
{ env: "GRILLO_ASSESSMENT_FREQUENCY", path: ["assessment", "frequency"], type: "string" },
|
|
105
|
+
{ env: "GRILLO_ASSESSMENT_DEFAULT_FRAMEWORK", path: ["assessment", "defaultFramework"], type: "string" },
|
|
106
|
+
{ env: "GRILLO_ASSESSMENT_HIERARCHICAL_MODE", path: ["assessment", "hierarchicalMode"], type: "boolean" },
|
|
107
|
+
{ env: "GRILLO_ASSESSMENT_PARALLEL", path: ["assessment", "parallelAssessments"], type: "number" },
|
|
108
|
+
{ env: "GRILLO_ASSESSMENT_WINDOW_START", path: ["assessment", "window", "start"], type: "string" },
|
|
109
|
+
{ env: "GRILLO_ASSESSMENT_WINDOW_END", path: ["assessment", "window", "end"], type: "string" },
|
|
110
|
+
{ env: "GRILLO_ASSESSMENT_WINDOW_TZ", path: ["assessment", "window", "timezone"], type: "string" },
|
|
111
|
+
// Notifications
|
|
112
|
+
{ env: "GRILLO_NOTIFICATIONS_CONSOLE", path: ["notifications", "console"], type: "boolean" },
|
|
113
|
+
{ env: "GRILLO_NOTIFICATIONS_WEBHOOK_URL", path: ["notifications", "webhookUrl"], type: "string" },
|
|
114
|
+
// Drift
|
|
115
|
+
{ env: "GRILLO_DRIFT_WARNING_THRESHOLD", path: ["drift", "warningThreshold"], type: "number" },
|
|
116
|
+
{ env: "GRILLO_DRIFT_CRITICAL_THRESHOLD", path: ["drift", "criticalThreshold"], type: "number" },
|
|
117
|
+
{ env: "GRILLO_DRIFT_EMA_ALPHA", path: ["drift", "emaAlpha"], type: "number" },
|
|
118
|
+
];
|
|
119
|
+
/**
|
|
120
|
+
* Build a partial config from environment variables.
|
|
121
|
+
*/
|
|
122
|
+
export function loadEnvConfig() {
|
|
123
|
+
const config = {};
|
|
124
|
+
for (const mapping of ENV_MAPPINGS) {
|
|
125
|
+
const value = process.env[mapping.env];
|
|
126
|
+
if (value === undefined)
|
|
127
|
+
continue;
|
|
128
|
+
let parsed;
|
|
129
|
+
switch (mapping.type) {
|
|
130
|
+
case "number":
|
|
131
|
+
parsed = Number(value);
|
|
132
|
+
if (isNaN(parsed))
|
|
133
|
+
continue;
|
|
134
|
+
break;
|
|
135
|
+
case "boolean":
|
|
136
|
+
parsed = value === "true" || value === "1";
|
|
137
|
+
break;
|
|
138
|
+
default:
|
|
139
|
+
parsed = value;
|
|
140
|
+
}
|
|
141
|
+
// Set nested path
|
|
142
|
+
setNestedValue(config, mapping.path, parsed);
|
|
143
|
+
}
|
|
144
|
+
return config;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Parse CLI arguments into flags.
|
|
148
|
+
* Supports: --flag value, --flag=value, --boolean-flag
|
|
149
|
+
*/
|
|
150
|
+
export function parseCLIFlags(args) {
|
|
151
|
+
const flags = {};
|
|
152
|
+
for (let i = 0; i < args.length; i++) {
|
|
153
|
+
const arg = args[i];
|
|
154
|
+
if (arg === "--config" || arg === "-c") {
|
|
155
|
+
flags.config = args[++i];
|
|
156
|
+
}
|
|
157
|
+
else if (arg.startsWith("--config=")) {
|
|
158
|
+
flags.config = arg.split("=")[1];
|
|
159
|
+
}
|
|
160
|
+
else if (arg === "--port" || arg === "-p") {
|
|
161
|
+
flags.port = Number(args[++i]);
|
|
162
|
+
}
|
|
163
|
+
else if (arg.startsWith("--port=")) {
|
|
164
|
+
flags.port = Number(arg.split("=")[1]);
|
|
165
|
+
}
|
|
166
|
+
else if (arg === "--host") {
|
|
167
|
+
flags.host = args[++i];
|
|
168
|
+
}
|
|
169
|
+
else if (arg.startsWith("--host=")) {
|
|
170
|
+
flags.host = arg.split("=")[1];
|
|
171
|
+
}
|
|
172
|
+
else if (arg === "--persist-path") {
|
|
173
|
+
flags.persistPath = args[++i];
|
|
174
|
+
}
|
|
175
|
+
else if (arg.startsWith("--persist-path=")) {
|
|
176
|
+
flags.persistPath = arg.split("=")[1];
|
|
177
|
+
}
|
|
178
|
+
else if (arg === "--log-level") {
|
|
179
|
+
flags.logLevel = args[++i];
|
|
180
|
+
}
|
|
181
|
+
else if (arg.startsWith("--log-level=")) {
|
|
182
|
+
flags.logLevel = arg.split("=")[1];
|
|
183
|
+
}
|
|
184
|
+
else if (arg === "--dry-run") {
|
|
185
|
+
flags.dryRun = true;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return flags;
|
|
189
|
+
}
|
|
190
|
+
// ================================================================
|
|
191
|
+
// Merge Strategy
|
|
192
|
+
// ================================================================
|
|
193
|
+
/**
|
|
194
|
+
* Resolve final config from all layers.
|
|
195
|
+
* Priority: CLI flags > env vars > config file > defaults
|
|
196
|
+
*/
|
|
197
|
+
export function resolveConfig(params) {
|
|
198
|
+
let merged = deepClone(params.defaults);
|
|
199
|
+
if (params.fileConfig) {
|
|
200
|
+
merged = deepMerge(merged, params.fileConfig);
|
|
201
|
+
}
|
|
202
|
+
if (params.envConfig) {
|
|
203
|
+
merged = deepMerge(merged, params.envConfig);
|
|
204
|
+
}
|
|
205
|
+
if (params.cliOverrides) {
|
|
206
|
+
merged = deepMerge(merged, params.cliOverrides);
|
|
207
|
+
}
|
|
208
|
+
return merged;
|
|
209
|
+
}
|
|
210
|
+
// ================================================================
|
|
211
|
+
// Helpers
|
|
212
|
+
// ================================================================
|
|
213
|
+
function setNestedValue(obj, path, value) {
|
|
214
|
+
let current = obj;
|
|
215
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
216
|
+
if (!current[path[i]] || typeof current[path[i]] !== "object") {
|
|
217
|
+
current[path[i]] = {};
|
|
218
|
+
}
|
|
219
|
+
current = current[path[i]];
|
|
220
|
+
}
|
|
221
|
+
current[path[path.length - 1]] = value;
|
|
222
|
+
}
|
|
223
|
+
function deepClone(obj) {
|
|
224
|
+
return JSON.parse(JSON.stringify(obj));
|
|
225
|
+
}
|
|
226
|
+
function deepMerge(target, source) {
|
|
227
|
+
const output = { ...target };
|
|
228
|
+
for (const key of Object.keys(source)) {
|
|
229
|
+
if (source[key] &&
|
|
230
|
+
typeof source[key] === "object" &&
|
|
231
|
+
!Array.isArray(source[key]) &&
|
|
232
|
+
target[key] &&
|
|
233
|
+
typeof target[key] === "object" &&
|
|
234
|
+
!Array.isArray(target[key])) {
|
|
235
|
+
output[key] = deepMerge(target[key], source[key]);
|
|
236
|
+
}
|
|
237
|
+
else if (source[key] !== undefined) {
|
|
238
|
+
output[key] = source[key];
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return output;
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=config-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/cli/config-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grillo Cricket — CLI Runner
|
|
3
|
+
*
|
|
4
|
+
* The main entry point for running Grillo as a standalone process.
|
|
5
|
+
* Handles startup, configuration, signal trapping, and clean shutdown.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* npx grillo start [--port 18800] [--config grillo.config.json]
|
|
9
|
+
* npx grillo assess <agentId> [--level next] [--dry-run]
|
|
10
|
+
* npx grillo status [<agentId>]
|
|
11
|
+
* npx grillo discover
|
|
12
|
+
* npx grillo report [--format md|json|csv] [--period 30d]
|
|
13
|
+
* npx grillo dashboard
|
|
14
|
+
* npx grillo help
|
|
15
|
+
*/
|
|
16
|
+
export type ModelInvokerFactory = () => (model: string, question: string) => Promise<string>;
|
|
17
|
+
export interface RunnerOptions {
|
|
18
|
+
/** Factory that creates a model invoker. Required for `start` and `assess`. */
|
|
19
|
+
createModelInvoker?: ModelInvokerFactory;
|
|
20
|
+
/** Raw CLI arguments (defaults to process.argv.slice(2)) */
|
|
21
|
+
argv?: string[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Main CLI entry point. Parse args, resolve config, dispatch subcommand.
|
|
25
|
+
*/
|
|
26
|
+
export declare function run(options?: RunnerOptions): Promise<void>;
|
|
27
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/cli/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA2FH,MAAM,MAAM,mBAAmB,GAAG,MAAM,CACtC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,MAAM,WAAW,aAAa;IAC5B,+EAA+E;IAC/E,kBAAkB,CAAC,EAAE,mBAAmB,CAAC;IACzC,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,GAAG,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DpE"}
|