@llm-dev-ops/agentics-cli 1.4.14 → 1.4.15
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/adapters/base-adapter.d.ts.map +1 -1
- package/dist/adapters/base-adapter.js +66 -18
- package/dist/adapters/base-adapter.js.map +1 -1
- package/dist/agents/cli-ux-agent.d.ts +9 -3
- package/dist/agents/cli-ux-agent.d.ts.map +1 -1
- package/dist/agents/cli-ux-agent.js +13 -67
- package/dist/agents/cli-ux-agent.js.map +1 -1
- package/dist/agents/decision-event.d.ts +1 -1
- package/dist/agents/decision-event.d.ts.map +1 -1
- package/dist/agents/decision-event.js +12 -7
- package/dist/agents/decision-event.js.map +1 -1
- package/dist/auth/internal-allowlist.d.ts +19 -17
- package/dist/auth/internal-allowlist.d.ts.map +1 -1
- package/dist/auth/internal-allowlist.js +20 -90
- package/dist/auth/internal-allowlist.js.map +1 -1
- package/dist/auth/role-permissions.d.ts +23 -6
- package/dist/auth/role-permissions.d.ts.map +1 -1
- package/dist/auth/role-permissions.js +25 -37
- package/dist/auth/role-permissions.js.map +1 -1
- package/dist/cli/index.js +270 -24
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/demo.d.ts +30 -0
- package/dist/commands/demo.d.ts.map +1 -0
- package/dist/commands/demo.js +393 -0
- package/dist/commands/demo.js.map +1 -0
- package/dist/commands/diligence.d.ts.map +1 -1
- package/dist/commands/diligence.js +10 -15
- package/dist/commands/diligence.js.map +1 -1
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +5 -7
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/inspect.d.ts +17 -4
- package/dist/commands/inspect.d.ts.map +1 -1
- package/dist/commands/inspect.js +189 -77
- package/dist/commands/inspect.js.map +1 -1
- package/dist/commands/quantify.d.ts.map +1 -1
- package/dist/commands/quantify.js +12 -0
- package/dist/commands/quantify.js.map +1 -1
- package/dist/commands/readiness.d.ts +47 -0
- package/dist/commands/readiness.d.ts.map +1 -0
- package/dist/commands/readiness.js +270 -0
- package/dist/commands/readiness.js.map +1 -0
- package/dist/commands/simulate.d.ts +6 -0
- package/dist/commands/simulate.d.ts.map +1 -1
- package/dist/commands/simulate.js +167 -123
- package/dist/commands/simulate.js.map +1 -1
- package/dist/commands/whoami.js +3 -3
- package/dist/commands/whoami.js.map +1 -1
- package/dist/config/endpoints.js +2 -2
- package/dist/config/endpoints.js.map +1 -1
- package/dist/contracts/adr-command-semantics.js +3 -3
- package/dist/contracts/adr-command-semantics.js.map +1 -1
- package/dist/contracts/canonical.d.ts +207 -0
- package/dist/contracts/canonical.d.ts.map +1 -0
- package/dist/contracts/canonical.js +191 -0
- package/dist/contracts/canonical.js.map +1 -0
- package/dist/contracts/index.d.ts +3 -1
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +2 -0
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/schemas/index.d.ts +194 -5
- package/dist/contracts/schemas/index.d.ts.map +1 -1
- package/dist/contracts/schemas/index.js +106 -0
- package/dist/contracts/schemas/index.js.map +1 -1
- package/dist/contracts/validator.d.ts +1 -1
- package/dist/contracts/validator.d.ts.map +1 -1
- package/dist/contracts/validator.js +17 -5
- package/dist/contracts/validator.js.map +1 -1
- package/dist/gates/argument-guard.js +1 -1
- package/dist/gates/argument-guard.js.map +1 -1
- package/dist/gates/execution-gate.d.ts +24 -54
- package/dist/gates/execution-gate.d.ts.map +1 -1
- package/dist/gates/execution-gate.js +79 -166
- package/dist/gates/execution-gate.js.map +1 -1
- package/dist/gates/index.d.ts +6 -0
- package/dist/gates/index.d.ts.map +1 -1
- package/dist/gates/index.js +8 -0
- package/dist/gates/index.js.map +1 -1
- package/dist/gates/meta-simulation-detector.d.ts +48 -0
- package/dist/gates/meta-simulation-detector.d.ts.map +1 -0
- package/dist/gates/meta-simulation-detector.js +45 -0
- package/dist/gates/meta-simulation-detector.js.map +1 -0
- package/dist/gates/readiness-gate.d.ts +108 -0
- package/dist/gates/readiness-gate.d.ts.map +1 -0
- package/dist/gates/readiness-gate.js +194 -0
- package/dist/gates/readiness-gate.js.map +1 -0
- package/dist/gates/ruvector-acceptance-gate.d.ts +78 -0
- package/dist/gates/ruvector-acceptance-gate.d.ts.map +1 -0
- package/dist/gates/ruvector-acceptance-gate.js +191 -0
- package/dist/gates/ruvector-acceptance-gate.js.map +1 -0
- package/dist/modules/artifact-handoff.d.ts.map +1 -1
- package/dist/modules/artifact-handoff.js +26 -0
- package/dist/modules/artifact-handoff.js.map +1 -1
- package/dist/modules/command-parser.d.ts +1 -1
- package/dist/modules/command-parser.d.ts.map +1 -1
- package/dist/modules/command-parser.js +3 -1
- package/dist/modules/command-parser.js.map +1 -1
- package/dist/modules/output-renderer.d.ts +13 -1
- package/dist/modules/output-renderer.d.ts.map +1 -1
- package/dist/modules/output-renderer.js +68 -0
- package/dist/modules/output-renderer.js.map +1 -1
- package/dist/runtime/claude-code-runner.d.ts.map +1 -1
- package/dist/runtime/claude-code-runner.js +165 -0
- package/dist/runtime/claude-code-runner.js.map +1 -1
- package/dist/synthesis/dynamic-router.d.ts +80 -0
- package/dist/synthesis/dynamic-router.d.ts.map +1 -0
- package/dist/synthesis/dynamic-router.js +63 -0
- package/dist/synthesis/dynamic-router.js.map +1 -0
- package/dist/synthesis/prompts/index.d.ts.map +1 -1
- package/dist/synthesis/prompts/index.js +100 -23
- package/dist/synthesis/prompts/index.js.map +1 -1
- package/dist/types/index.d.ts +59 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -72,6 +72,23 @@ import { executeDiligenceCommand } from '../commands/diligence.js';
|
|
|
72
72
|
import { executeUsageCommand, executeUsageHistoryCommand, executeUsageLimitsCommand, executeUsageResetCommand, formatUsageForDisplay, formatHistoryForDisplay, formatLimitsForDisplay, } from '../commands/usage.js';
|
|
73
73
|
import { executePolicyListCommand, executePolicyInspectCommand, executePolicyCreateCommand, executePolicyEditCommand, executePolicyDeleteCommand, executePolicyEnableCommand, executePolicyDisableCommand, executePolicyDryRunCommand, executePolicyScopeCommand, formatPolicyForDisplay, formatPoliciesListForDisplay, formatDryRunForDisplay, formatScopeForDisplay, } from '../commands/policy.js';
|
|
74
74
|
import { executeErpListCommand, executeErpInspectCommand, executeErpSurfaceCommand, executeErpMapCommand, executeErpExportCommand, formatErpListForDisplay, formatErpInspectForDisplay, formatErpSurfaceForDisplay, formatErpMapForDisplay, formatErpExportForDisplay, } from '../commands/erp.js';
|
|
75
|
+
import { executeReadinessShowCommand, executeReadinessExplainCommand, formatReadinessForDisplay, formatReadinessExplainForDisplay, } from '../commands/readiness.js';
|
|
76
|
+
import { executeDemoStartCommand, } from '../commands/demo.js';
|
|
77
|
+
// ============================================================================
|
|
78
|
+
// Utility Helpers
|
|
79
|
+
// ============================================================================
|
|
80
|
+
/**
|
|
81
|
+
* Slugify a description string into a short kebab-case policy name.
|
|
82
|
+
* Takes the first ~40 characters, lowercases, replaces non-alphanum with hyphens,
|
|
83
|
+
* collapses runs, and trims leading/trailing hyphens.
|
|
84
|
+
*/
|
|
85
|
+
function slugifyPolicyName(description) {
|
|
86
|
+
return description
|
|
87
|
+
.slice(0, 40)
|
|
88
|
+
.toLowerCase()
|
|
89
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
90
|
+
.replace(/^-+|-+$/g, '');
|
|
91
|
+
}
|
|
75
92
|
// ============================================================================
|
|
76
93
|
// CONTROL PLANE HARDENING GATES
|
|
77
94
|
// ============================================================================
|
|
@@ -95,12 +112,16 @@ import { enforceOutputFormatGate, requiresStructuredOutput, getDefaultFormat } f
|
|
|
95
112
|
import { enforceArgumentGuard, requiresArgumentValidation } from '../gates/argument-guard.js';
|
|
96
113
|
// Lineage Gate - Enforces simulation traceability per ADR-004
|
|
97
114
|
import { enforceLineageGate, requiresLineageValidation } from '../gates/lineage-gate.js';
|
|
115
|
+
// Readiness Gate - Enforces execution safety when execution-gated
|
|
116
|
+
import { enforceReadinessGate, requiresReadinessValidation } from '../gates/readiness-gate.js';
|
|
98
117
|
// Help Renderer - Schema-driven help from COMMAND_REGISTRY (ADR-002 Decision 1)
|
|
99
118
|
import { renderHelp } from '../modules/help-renderer.js';
|
|
100
119
|
// Synthesis Router - ADR-006/007/008 Claude Code integration
|
|
101
120
|
import { routeSynthesis, isDecisionGrade } from '../synthesis/router.js';
|
|
102
121
|
import { createArtifactWriter } from '../synthesis/artifact-writer.js';
|
|
103
122
|
import { lookupCommand } from '../contracts/adr-command-semantics.js';
|
|
123
|
+
// Dynamic routing — resolves downstream repos/agents based on request content
|
|
124
|
+
// dynamic-router import removed — routing is now platform-side
|
|
104
125
|
// ============================================================================
|
|
105
126
|
// Synthesis Artifact Persistence (ADR-008)
|
|
106
127
|
// ============================================================================
|
|
@@ -202,7 +223,7 @@ async function main() {
|
|
|
202
223
|
// execution is explicitly enabled. Only identity/help commands are allowed
|
|
203
224
|
// when execution is disabled. This gate does NOT check entitlements, usage,
|
|
204
225
|
// or billing - it is a binary on/off switch.
|
|
205
|
-
enforceExecutionGate(parsed.command);
|
|
226
|
+
await enforceExecutionGate(parsed.command);
|
|
206
227
|
// ============================================================================
|
|
207
228
|
// GATE 2: AUTHENTICATION SESSION GATE - Requires valid credentials
|
|
208
229
|
// ============================================================================
|
|
@@ -254,6 +275,17 @@ async function main() {
|
|
|
254
275
|
if (requiresLineageValidation(parsed.command, parsed.subcommand)) {
|
|
255
276
|
enforceLineageGate(parsed);
|
|
256
277
|
}
|
|
278
|
+
// ============================================================================
|
|
279
|
+
// GATE 7: READINESS GATE - Enforces execution safety
|
|
280
|
+
// ============================================================================
|
|
281
|
+
// Write-path commands (deploy run, deploy rollback) are blocked when the
|
|
282
|
+
// platform readiness state is not EXECUTION_READY. This gate reads from
|
|
283
|
+
// ~/.agentics/exports/decision-readiness/readiness-state.json and prevents
|
|
284
|
+
// production writes until all prerequisites are met.
|
|
285
|
+
// CRITICAL: No ERP writes or production deployments without readiness.
|
|
286
|
+
if (requiresReadinessValidation(parsed.command, parsed.subcommand)) {
|
|
287
|
+
enforceReadinessGate(parsed);
|
|
288
|
+
}
|
|
257
289
|
// Dispatch to command handlers
|
|
258
290
|
try {
|
|
259
291
|
let result = null;
|
|
@@ -462,16 +494,28 @@ async function main() {
|
|
|
462
494
|
},
|
|
463
495
|
});
|
|
464
496
|
if (synthesisResult) {
|
|
465
|
-
//
|
|
497
|
+
// Extract actual synthesis content (scenario, steps, etc.)
|
|
498
|
+
const synthData = synthesisResult.data;
|
|
499
|
+
const scenario = synthData?.['scenario'];
|
|
500
|
+
const synthDescription = (scenario?.['description'] ??
|
|
501
|
+
synthData?.['description'] ??
|
|
502
|
+
parsed.options['description'] ??
|
|
503
|
+
simName);
|
|
504
|
+
const synthName = (scenario?.['name'] ??
|
|
505
|
+
synthData?.['name'] ??
|
|
506
|
+
simName);
|
|
507
|
+
// Create the simulation record with synthesis-derived content
|
|
466
508
|
const simCreateResult = await executeSimulateCreateCommand({
|
|
467
|
-
name: simName,
|
|
468
|
-
description:
|
|
509
|
+
name: synthName || simName,
|
|
510
|
+
description: synthDescription,
|
|
469
511
|
plan_id: parsed.options['plan-id'],
|
|
470
512
|
iterations: parsed.options['iterations'] ? parseInt(parsed.options['iterations'], 10) : undefined,
|
|
471
513
|
metadata: {
|
|
472
514
|
...(parsed.options['metadata'] ? JSON.parse(parsed.options['metadata']) : {}),
|
|
473
515
|
synthesis_run_id: synthesisResult.runId,
|
|
474
516
|
synthesis_model: synthesisResult.model,
|
|
517
|
+
// Store the full synthesis content in metadata
|
|
518
|
+
synthesis_data: synthData,
|
|
475
519
|
},
|
|
476
520
|
}, options);
|
|
477
521
|
// Persist synthesis artifacts (ADR-008)
|
|
@@ -488,9 +532,12 @@ async function main() {
|
|
|
488
532
|
orgId: 'cli-org',
|
|
489
533
|
traceId: options.trace_id ?? '',
|
|
490
534
|
});
|
|
535
|
+
// Routing profile is now platform-side — not resolved locally.
|
|
491
536
|
if (options.format === 'json') {
|
|
537
|
+
// Output the FULL synthesis content — not just the CRUD record
|
|
492
538
|
console.log(JSON.stringify({
|
|
493
539
|
simulation: simCreateResult.simulation,
|
|
540
|
+
data: synthData,
|
|
494
541
|
synthesis: {
|
|
495
542
|
run_id: synthesisResult.runId,
|
|
496
543
|
model: synthesisResult.model,
|
|
@@ -820,7 +867,7 @@ async function main() {
|
|
|
820
867
|
process.exit(EXIT_CODES.SUCCESS);
|
|
821
868
|
}
|
|
822
869
|
// Default quantify behavior (execute via orchestration)
|
|
823
|
-
const quantifyInput = parsed.positionalArgs[0] ?? '';
|
|
870
|
+
const quantifyInput = parsed.positionalArgs[0] ?? parsed.subcommand ?? '';
|
|
824
871
|
const quantifyFlexibleInput = parseFlexibleInput(quantifyInput);
|
|
825
872
|
result = await executeQuantifyCommand({
|
|
826
873
|
simRef: isNaturalLanguage(quantifyFlexibleInput)
|
|
@@ -934,7 +981,7 @@ async function main() {
|
|
|
934
981
|
process.exit(EXIT_CODES.SUCCESS);
|
|
935
982
|
}
|
|
936
983
|
// Default deploy behavior (execute via orchestration)
|
|
937
|
-
const deployInput = parsed.positionalArgs[0] ?? '';
|
|
984
|
+
const deployInput = parsed.positionalArgs[0] ?? parsed.subcommand ?? '';
|
|
938
985
|
const deployFlexibleInput = parseFlexibleInput(deployInput);
|
|
939
986
|
result = await executeDeployCommand({
|
|
940
987
|
simRef: isNaturalLanguage(deployFlexibleInput)
|
|
@@ -1023,7 +1070,9 @@ async function main() {
|
|
|
1023
1070
|
process.exit(EXIT_CODES.SUCCESS);
|
|
1024
1071
|
}
|
|
1025
1072
|
// Default export behavior (execute via orchestration)
|
|
1026
|
-
|
|
1073
|
+
// Note: parser consumes first arg as subcommand for commands with subcommands,
|
|
1074
|
+
// so use subcommand as input if it wasn't a known subcommand and no positional args
|
|
1075
|
+
const exportInput = parsed.positionalArgs[0] ?? parsed.subcommand ?? '';
|
|
1027
1076
|
const exportFlexibleInput = parseFlexibleInput(exportInput);
|
|
1028
1077
|
result = await executeExportCommand({
|
|
1029
1078
|
intentRef: isNaturalLanguage(exportFlexibleInput)
|
|
@@ -1158,6 +1207,78 @@ async function main() {
|
|
|
1158
1207
|
console.error('Supported subcommands: list, inspect, surface, map, export');
|
|
1159
1208
|
process.exit(EXIT_CODES.USAGE_ERROR);
|
|
1160
1209
|
}
|
|
1210
|
+
case 'readiness': {
|
|
1211
|
+
// Handle readiness subcommands: show, explain
|
|
1212
|
+
if (parsed.subcommand === 'show' || !parsed.subcommand) {
|
|
1213
|
+
const scenario = parsed.positionalArgs[0] ?? '';
|
|
1214
|
+
const readinessResult = await executeReadinessShowCommand({ scenario }, options);
|
|
1215
|
+
if (options.format === 'json') {
|
|
1216
|
+
console.log(JSON.stringify({
|
|
1217
|
+
state: readinessResult.state,
|
|
1218
|
+
found: readinessResult.found,
|
|
1219
|
+
scenario: readinessResult.scenario,
|
|
1220
|
+
timing: readinessResult.timing,
|
|
1221
|
+
}, null, parsed.flags['pretty'] ? 2 : 0));
|
|
1222
|
+
}
|
|
1223
|
+
else {
|
|
1224
|
+
console.log(formatReadinessForDisplay(readinessResult));
|
|
1225
|
+
}
|
|
1226
|
+
if (options.verbose) {
|
|
1227
|
+
console.error(`Query completed in ${readinessResult.timing}ms`);
|
|
1228
|
+
}
|
|
1229
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
1230
|
+
}
|
|
1231
|
+
if (parsed.subcommand === 'explain') {
|
|
1232
|
+
const scenario = parsed.positionalArgs[0] ?? '';
|
|
1233
|
+
const explainResult = await executeReadinessExplainCommand({ scenario }, options);
|
|
1234
|
+
// explain is always human-readable — no JSON mode
|
|
1235
|
+
console.log(formatReadinessExplainForDisplay(explainResult));
|
|
1236
|
+
if (options.verbose) {
|
|
1237
|
+
console.error(`Query completed in ${explainResult.timing}ms`);
|
|
1238
|
+
}
|
|
1239
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
1240
|
+
}
|
|
1241
|
+
// Unknown readiness subcommand
|
|
1242
|
+
console.error(`Unknown readiness subcommand: ${parsed.subcommand}`);
|
|
1243
|
+
console.error('Supported subcommands: show, explain');
|
|
1244
|
+
process.exit(EXIT_CODES.USAGE_ERROR);
|
|
1245
|
+
}
|
|
1246
|
+
case 'demo': {
|
|
1247
|
+
// Demo mode: read-only, gate-exempt, human-readable only
|
|
1248
|
+
const executionKeywords = ['execute', 'run', 'deploy', 'rollback', 'unlock', 'force', 'override'];
|
|
1249
|
+
if (parsed.subcommand && executionKeywords.includes(parsed.subcommand.toLowerCase())) {
|
|
1250
|
+
console.error(`Demo mode does not support "${parsed.subcommand}".`);
|
|
1251
|
+
console.error('');
|
|
1252
|
+
console.error('Demo mode is a read-only walkthrough of the platform. It cannot:');
|
|
1253
|
+
console.error(' - Execute deployments');
|
|
1254
|
+
console.error(' - Unlock the execution gate');
|
|
1255
|
+
console.error(' - Write to any system');
|
|
1256
|
+
console.error(' - Modify the readiness state');
|
|
1257
|
+
console.error('');
|
|
1258
|
+
console.error('Usage: agentics demo start [scenario]');
|
|
1259
|
+
process.exit(EXIT_CODES.USAGE_ERROR);
|
|
1260
|
+
}
|
|
1261
|
+
if (parsed.subcommand !== 'start' && parsed.subcommand) {
|
|
1262
|
+
console.error(`Unknown demo subcommand: ${parsed.subcommand}`);
|
|
1263
|
+
console.error('Usage: agentics demo start [scenario]');
|
|
1264
|
+
console.error('');
|
|
1265
|
+
console.error('Demo mode is read-only. The only valid subcommand is "start".');
|
|
1266
|
+
process.exit(EXIT_CODES.USAGE_ERROR);
|
|
1267
|
+
}
|
|
1268
|
+
const demoScenario = parsed.positionalArgs[0] ?? '';
|
|
1269
|
+
const demoResult = await executeDemoStartCommand({
|
|
1270
|
+
scenario: demoScenario,
|
|
1271
|
+
extraArgs: parsed.subcommand ? parsed.positionalArgs : [],
|
|
1272
|
+
});
|
|
1273
|
+
// Demo is always human-readable — never JSON
|
|
1274
|
+
console.log(demoResult.output);
|
|
1275
|
+
if (options.verbose) {
|
|
1276
|
+
console.error(`Demo completed in ${demoResult.timing}ms`);
|
|
1277
|
+
}
|
|
1278
|
+
console.log('');
|
|
1279
|
+
console.log('This demo is read-only. No systems were contacted. No data was written.');
|
|
1280
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
1281
|
+
}
|
|
1161
1282
|
case 'diligence': {
|
|
1162
1283
|
const diligenceInput = parsed.positionalArgs[0] ?? '';
|
|
1163
1284
|
const diligenceFlexibleInput = parseFlexibleInput(diligenceInput);
|
|
@@ -1298,10 +1419,16 @@ async function main() {
|
|
|
1298
1419
|
process.exit(EXIT_CODES.SUCCESS);
|
|
1299
1420
|
}
|
|
1300
1421
|
if (parsed.subcommand === 'create') {
|
|
1301
|
-
const
|
|
1422
|
+
const positionalDesc = parsed.positionalArgs[0];
|
|
1423
|
+
const explicitName = parsed.options['name'];
|
|
1424
|
+
const explicitDesc = parsed.options['description'];
|
|
1425
|
+
// Derive description: --description flag > positional arg > fallback to name
|
|
1426
|
+
const description = explicitDesc ?? positionalDesc ?? explicitName ?? '';
|
|
1427
|
+
// Derive name: --name flag > slugified description
|
|
1428
|
+
const policyName = explicitName ?? slugifyPolicyName(description);
|
|
1302
1429
|
const policyCreateResult = await executePolicyCreateCommand({
|
|
1303
1430
|
name: policyName,
|
|
1304
|
-
description
|
|
1431
|
+
description,
|
|
1305
1432
|
type: parsed.options['type'],
|
|
1306
1433
|
rules: parsed.options['rules'] ? JSON.parse(parsed.options['rules']) : undefined,
|
|
1307
1434
|
metadata: parsed.options['metadata'] ? JSON.parse(parsed.options['metadata']) : undefined,
|
|
@@ -1503,7 +1630,16 @@ function gatherStatusState() {
|
|
|
1503
1630
|
simulations: 0,
|
|
1504
1631
|
deployments: 0,
|
|
1505
1632
|
policies: 0,
|
|
1633
|
+
erp: 0,
|
|
1634
|
+
artifacts: 0,
|
|
1635
|
+
inspections: 0,
|
|
1636
|
+
totalRuns: 0,
|
|
1506
1637
|
tools: 48,
|
|
1638
|
+
agentsRunning: 0,
|
|
1639
|
+
agentsAvailable: 100,
|
|
1640
|
+
activeAgentTypes: [],
|
|
1641
|
+
activeCalls: 0,
|
|
1642
|
+
activeCallServices: [],
|
|
1507
1643
|
};
|
|
1508
1644
|
// Auth & identity
|
|
1509
1645
|
try {
|
|
@@ -1519,6 +1655,15 @@ function gatherStatusState() {
|
|
|
1519
1655
|
}
|
|
1520
1656
|
}
|
|
1521
1657
|
catch { /* not logged in */ }
|
|
1658
|
+
// Identity file (display name, org, role)
|
|
1659
|
+
try {
|
|
1660
|
+
const idRaw = fs.readFileSync(path.join(agenticsDir, 'identity.json'), 'utf-8');
|
|
1661
|
+
const id = JSON.parse(idRaw);
|
|
1662
|
+
state.displayName = id.user?.display_name;
|
|
1663
|
+
state.orgName = id.org?.org_name;
|
|
1664
|
+
state.role = id.role;
|
|
1665
|
+
}
|
|
1666
|
+
catch { /* no identity */ }
|
|
1522
1667
|
// Check internal allowlist for tier override
|
|
1523
1668
|
if (state.authenticated && state.email) {
|
|
1524
1669
|
try {
|
|
@@ -1532,14 +1677,16 @@ function gatherStatusState() {
|
|
|
1532
1677
|
}
|
|
1533
1678
|
catch { /* no allowlist */ }
|
|
1534
1679
|
}
|
|
1535
|
-
// Count runs
|
|
1680
|
+
// Count runs by category + artifacts
|
|
1536
1681
|
try {
|
|
1537
1682
|
const runsDir = path.join(agenticsDir, 'runs');
|
|
1538
1683
|
if (fs.existsSync(runsDir)) {
|
|
1539
1684
|
const entries = fs.readdirSync(runsDir);
|
|
1685
|
+
state.totalRuns = entries.length;
|
|
1540
1686
|
for (const entry of entries) {
|
|
1541
1687
|
try {
|
|
1542
|
-
const
|
|
1688
|
+
const entryDir = path.join(runsDir, entry);
|
|
1689
|
+
const metaPath = path.join(entryDir, 'meta.json');
|
|
1543
1690
|
if (fs.existsSync(metaPath)) {
|
|
1544
1691
|
const meta = JSON.parse(fs.readFileSync(metaPath, 'utf-8'));
|
|
1545
1692
|
const cmd = meta.command ?? meta.type ?? '';
|
|
@@ -1549,7 +1696,14 @@ function gatherStatusState() {
|
|
|
1549
1696
|
state.simulations++;
|
|
1550
1697
|
else if (cmd.includes('deploy'))
|
|
1551
1698
|
state.deployments++;
|
|
1552
|
-
|
|
1699
|
+
else if (cmd.includes('erp'))
|
|
1700
|
+
state.erp++;
|
|
1701
|
+
else if (cmd.includes('inspect') || cmd.includes('query'))
|
|
1702
|
+
state.inspections++;
|
|
1703
|
+
}
|
|
1704
|
+
// Count artifact files (everything except meta.json)
|
|
1705
|
+
const files = fs.readdirSync(entryDir);
|
|
1706
|
+
state.artifacts += files.filter(f => f !== 'meta.json').length;
|
|
1553
1707
|
}
|
|
1554
1708
|
catch { /* skip bad entry */ }
|
|
1555
1709
|
}
|
|
@@ -1564,6 +1718,53 @@ function gatherStatusState() {
|
|
|
1564
1718
|
}
|
|
1565
1719
|
}
|
|
1566
1720
|
catch { /* no policies */ }
|
|
1721
|
+
// Running agents (tracked via per-agent JSON files in ~/.agentics/agents/)
|
|
1722
|
+
try {
|
|
1723
|
+
const agentsTrackDir = path.join(agenticsDir, 'agents');
|
|
1724
|
+
if (fs.existsSync(agentsTrackDir)) {
|
|
1725
|
+
const agentFiles = fs.readdirSync(agentsTrackDir).filter(f => f.endsWith('.json'));
|
|
1726
|
+
state.agentsRunning = agentFiles.length;
|
|
1727
|
+
const types = new Set();
|
|
1728
|
+
for (const file of agentFiles) {
|
|
1729
|
+
try {
|
|
1730
|
+
const raw = fs.readFileSync(path.join(agentsTrackDir, file), 'utf-8');
|
|
1731
|
+
const data = JSON.parse(raw);
|
|
1732
|
+
if (data.type)
|
|
1733
|
+
types.add(data.type);
|
|
1734
|
+
}
|
|
1735
|
+
catch { /* skip bad file */ }
|
|
1736
|
+
}
|
|
1737
|
+
state.activeAgentTypes = Array.from(types);
|
|
1738
|
+
}
|
|
1739
|
+
}
|
|
1740
|
+
catch { /* no agents dir */ }
|
|
1741
|
+
// Active downstream calls (tracked via per-call JSON files in ~/.agentics/calls/)
|
|
1742
|
+
try {
|
|
1743
|
+
const callsDir = path.join(agenticsDir, 'calls');
|
|
1744
|
+
if (fs.existsSync(callsDir)) {
|
|
1745
|
+
const callFiles = fs.readdirSync(callsDir).filter(f => f.endsWith('.json'));
|
|
1746
|
+
state.activeCalls = callFiles.length;
|
|
1747
|
+
const services = new Set();
|
|
1748
|
+
for (const file of callFiles) {
|
|
1749
|
+
try {
|
|
1750
|
+
const raw = fs.readFileSync(path.join(callsDir, file), 'utf-8');
|
|
1751
|
+
const data = JSON.parse(raw);
|
|
1752
|
+
if (data.service) {
|
|
1753
|
+
const short = data.service
|
|
1754
|
+
.replace(/^agentics-simulation-/, '')
|
|
1755
|
+
.replace(/^agentics-deployment-/, '')
|
|
1756
|
+
.replace(/^agentics-org-/, '')
|
|
1757
|
+
.replace(/^agentics-/, '')
|
|
1758
|
+
.replace(/^enterprise-/, '');
|
|
1759
|
+
services.add(short);
|
|
1760
|
+
}
|
|
1761
|
+
}
|
|
1762
|
+
catch { /* skip bad file */ }
|
|
1763
|
+
}
|
|
1764
|
+
state.activeCallServices = Array.from(services);
|
|
1765
|
+
}
|
|
1766
|
+
}
|
|
1767
|
+
catch { /* no calls dir */ }
|
|
1567
1768
|
return state;
|
|
1568
1769
|
}
|
|
1569
1770
|
function printStatusLine(jsonMode) {
|
|
@@ -1572,25 +1773,70 @@ function printStatusLine(jsonMode) {
|
|
|
1572
1773
|
console.log(JSON.stringify({ name: 'agentics-cli', version: VERSION, ...s }));
|
|
1573
1774
|
return;
|
|
1574
1775
|
}
|
|
1776
|
+
// ANSI colors (matching claude-flow CLI style)
|
|
1777
|
+
const R = '\x1b[0m';
|
|
1778
|
+
const D = '\x1b[2m';
|
|
1779
|
+
const PP = '\x1b[1;35m'; // bright purple
|
|
1780
|
+
const CC = '\x1b[1;36m'; // bright cyan
|
|
1781
|
+
const BB = '\x1b[1;34m'; // bright blue
|
|
1782
|
+
const GG = '\x1b[1;32m'; // bright green
|
|
1783
|
+
const YY = '\x1b[1;33m'; // bright yellow
|
|
1784
|
+
const WW = '\x1b[1;37m'; // bright white
|
|
1785
|
+
const cn = '\x1b[0;36m'; // cyan (labels)
|
|
1786
|
+
const sep = `${D}\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500${R}`;
|
|
1787
|
+
const pipe = ` ${D}\u2502${R} `;
|
|
1575
1788
|
if (!s.authenticated) {
|
|
1576
|
-
|
|
1789
|
+
const lines = [
|
|
1790
|
+
`${PP}\u258A Agentics.dev v${VERSION}${R} ${D}\u25C7 not authenticated${R}`,
|
|
1791
|
+
sep,
|
|
1792
|
+
`${cn}Run ${WW}agentics login${R}${cn} to get started${R}`,
|
|
1793
|
+
sep,
|
|
1794
|
+
];
|
|
1795
|
+
console.log(lines.join('\n'));
|
|
1577
1796
|
return;
|
|
1578
1797
|
}
|
|
1579
|
-
const user = s.
|
|
1798
|
+
const user = s.displayName
|
|
1799
|
+
?? (s.email ? s.email.split('@')[0] ?? 'user' : 'user');
|
|
1580
1800
|
const tierBadge = s.tier === 'internal' ? 'INT'
|
|
1581
1801
|
: s.tier === 'paid' ? 'PRO'
|
|
1582
1802
|
: s.tier === 'free' ? 'FREE'
|
|
1583
1803
|
: 'ACT';
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
]
|
|
1593
|
-
|
|
1804
|
+
// Header: ▊ Agentics v1.4.5 ● user │ PRO │ owner
|
|
1805
|
+
let header = `${PP}\u258A Agentics.dev v${VERSION}${R}`;
|
|
1806
|
+
header += ` ${CC}\u25CF ${user}${R}`;
|
|
1807
|
+
header += pipe + `${BB}${tierBadge}${R}`;
|
|
1808
|
+
if (s.role)
|
|
1809
|
+
header += pipe + `${D}${s.role}${R}`;
|
|
1810
|
+
if (s.orgName)
|
|
1811
|
+
header += pipe + `${D}${s.orgName}${R}`;
|
|
1812
|
+
// Line 1: 🤖 Agents ● [2] coder,tester │ ⇅ Calls [1] planner │ 📋 Plans 0 🧪 Simulate 0 🚀 Deploy 0
|
|
1813
|
+
const agentOn = s.agentsRunning > 0;
|
|
1814
|
+
const agentDot = agentOn ? `${GG}\u25C9${R}` : `${D}\u25CB${R}`;
|
|
1815
|
+
const agentClr = agentOn ? GG : D;
|
|
1816
|
+
let line1 = `${YY}\uD83E\uDD16 Agents${R} ${agentDot} [${agentClr}${s.agentsRunning}${R}]`;
|
|
1817
|
+
if (s.activeAgentTypes.length > 0) {
|
|
1818
|
+
line1 += ` ${D}${s.activeAgentTypes.join(',')}${R}`;
|
|
1819
|
+
}
|
|
1820
|
+
if (s.activeCalls > 0) {
|
|
1821
|
+
line1 += pipe + `${CC}\u21C5 Calls${R} [${CC}${s.activeCalls}${R}]`;
|
|
1822
|
+
if (s.activeCallServices.length > 0) {
|
|
1823
|
+
line1 += ` ${D}${s.activeCallServices.join(',')}${R}`;
|
|
1824
|
+
}
|
|
1825
|
+
}
|
|
1826
|
+
line1 += pipe;
|
|
1827
|
+
line1 += `${cn}\uD83D\uDCCB Plans${R} ${WW}${s.plans}${R}`;
|
|
1828
|
+
line1 += ` ${cn}\uD83E\uDDEA Simulate${R} ${WW}${s.simulations}${R}`;
|
|
1829
|
+
line1 += ` ${cn}\uD83D\uDE80 Deploy${R} ${WW}${s.deployments}${R}`;
|
|
1830
|
+
// Line 2: 📜 Policy 0 🏭 ERP 0 │ 📦 Artifacts 0 🔍 Inspect 0 📊 Usage 0
|
|
1831
|
+
let line2 = `${cn}\uD83D\uDCDC Policy${R} ${WW}${s.policies}${R}`;
|
|
1832
|
+
line2 += ` ${cn}\uD83C\uDFED ERP${R} ${WW}${s.erp}${R}`;
|
|
1833
|
+
line2 += pipe;
|
|
1834
|
+
line2 += `${cn}\uD83D\uDCE6 Artifacts${R} ${WW}${s.artifacts}${R}`;
|
|
1835
|
+
line2 += ` ${cn}\uD83D\uDD0D Inspect${R} ${WW}${s.inspections}${R}`;
|
|
1836
|
+
line2 += ` ${cn}\uD83D\uDCCA Usage${R} ${WW}${s.totalRuns}${R}`;
|
|
1837
|
+
line2 += pipe;
|
|
1838
|
+
line2 += `${D}\uD83D\uDEE0\uFE0F ${s.tools} tools${R}`;
|
|
1839
|
+
console.log([header, sep, line1, line2, sep].join('\n'));
|
|
1594
1840
|
}
|
|
1595
1841
|
// ============================================================================
|
|
1596
1842
|
// Help Output
|