chainlesschain 0.81.0 → 0.132.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/bin/chainlesschain.js +0 -0
- package/package.json +1 -1
- package/src/commands/agent-network.js +254 -1
- package/src/commands/audit.js +302 -0
- package/src/commands/automation.js +271 -1
- package/src/commands/codegen.js +224 -0
- package/src/commands/collab.js +341 -0
- package/src/commands/compliance.js +1035 -0
- package/src/commands/cowork.js +221 -0
- package/src/commands/dbevo.js +284 -0
- package/src/commands/dev.js +252 -0
- package/src/commands/did.js +358 -0
- package/src/commands/encrypt.js +341 -0
- package/src/commands/export.js +256 -1
- package/src/commands/fusion.js +258 -0
- package/src/commands/governance.js +325 -0
- package/src/commands/hardening.js +411 -0
- package/src/commands/hook.js +148 -0
- package/src/commands/import.js +252 -0
- package/src/commands/incentive.js +322 -0
- package/src/commands/infra.js +244 -0
- package/src/commands/instinct.js +260 -0
- package/src/commands/ipfs.js +318 -0
- package/src/commands/kg.js +387 -0
- package/src/commands/llm.js +263 -0
- package/src/commands/mcp.js +221 -0
- package/src/commands/memory.js +248 -0
- package/src/commands/multimodal.js +296 -0
- package/src/commands/nlprog.js +356 -0
- package/src/commands/note.js +244 -0
- package/src/commands/ops.js +354 -0
- package/src/commands/orchestrate.js +166 -0
- package/src/commands/org.js +277 -0
- package/src/commands/p2p.js +390 -0
- package/src/commands/perception.js +290 -0
- package/src/commands/permmem.js +251 -0
- package/src/commands/plugin-ecosystem.js +273 -0
- package/src/commands/pqc.js +393 -0
- package/src/commands/quantization.js +351 -0
- package/src/commands/rcache.js +271 -0
- package/src/commands/recommend.js +340 -0
- package/src/commands/runtime.js +307 -0
- package/src/commands/scim.js +262 -0
- package/src/commands/session.js +258 -0
- package/src/commands/skill.js +267 -1
- package/src/commands/social.js +256 -0
- package/src/commands/sso.js +186 -1
- package/src/commands/sync.js +256 -0
- package/src/commands/tech.js +338 -0
- package/src/commands/tenant.js +351 -0
- package/src/commands/tokens.js +269 -0
- package/src/commands/trust.js +249 -0
- package/src/commands/wallet.js +277 -0
- package/src/commands/workflow.js +171 -0
- package/src/index.js +4 -0
- package/src/lib/agent-coordinator.js +325 -0
- package/src/lib/agent-network.js +387 -0
- package/src/lib/agent-router.js +395 -0
- package/src/lib/aiops.js +478 -0
- package/src/lib/audit-logger.js +379 -0
- package/src/lib/automation-engine.js +330 -0
- package/src/lib/autonomous-developer.js +350 -0
- package/src/lib/code-agent.js +323 -0
- package/src/lib/collaboration-governance.js +364 -0
- package/src/lib/community-governance.js +436 -0
- package/src/lib/compliance-manager.js +434 -0
- package/src/lib/content-recommendation.js +469 -0
- package/src/lib/crypto-manager.js +350 -0
- package/src/lib/dbevo.js +338 -0
- package/src/lib/decentral-infra.js +340 -0
- package/src/lib/did-manager.js +367 -0
- package/src/lib/hardening-manager.js +348 -0
- package/src/lib/hook-manager.js +380 -0
- package/src/lib/instinct-manager.js +332 -0
- package/src/lib/ipfs-storage.js +334 -0
- package/src/lib/knowledge-exporter.js +381 -0
- package/src/lib/knowledge-graph.js +432 -0
- package/src/lib/knowledge-importer.js +379 -0
- package/src/lib/llm-providers.js +391 -0
- package/src/lib/mcp-registry.js +333 -0
- package/src/lib/memory-manager.js +330 -0
- package/src/lib/multimodal.js +346 -0
- package/src/lib/nl-programming.js +343 -0
- package/src/lib/note-versioning.js +327 -0
- package/src/lib/org-manager.js +323 -0
- package/src/lib/p2p-manager.js +387 -0
- package/src/lib/perception.js +346 -0
- package/src/lib/perf-tuning.js +4 -1
- package/src/lib/permanent-memory.js +320 -0
- package/src/lib/plugin-ecosystem.js +377 -0
- package/src/lib/pqc-manager.js +368 -0
- package/src/lib/protocol-fusion.js +417 -0
- package/src/lib/quantization.js +325 -0
- package/src/lib/response-cache.js +327 -0
- package/src/lib/scim-manager.js +329 -0
- package/src/lib/session-manager.js +329 -0
- package/src/lib/skill-loader.js +377 -0
- package/src/lib/social-manager.js +326 -0
- package/src/lib/sso-manager.js +332 -0
- package/src/lib/sync-manager.js +326 -0
- package/src/lib/tech-learning-engine.js +369 -0
- package/src/lib/tenant-saas.js +460 -0
- package/src/lib/threat-intel.js +335 -0
- package/src/lib/token-incentive.js +293 -0
- package/src/lib/token-tracker.js +329 -0
- package/src/lib/trust-security.js +390 -0
- package/src/lib/ueba.js +389 -0
- package/src/lib/universal-runtime.js +325 -0
- package/src/lib/wallet-manager.js +326 -0
- package/src/lib/workflow-engine.js +322 -0
|
@@ -16,6 +16,32 @@ import {
|
|
|
16
16
|
getAuditReport,
|
|
17
17
|
runConfigAudit,
|
|
18
18
|
deployCheck,
|
|
19
|
+
// V2 (Phase 29)
|
|
20
|
+
AUDIT_STATUS_V2,
|
|
21
|
+
BASELINE_STATUS_V2,
|
|
22
|
+
SEVERITY_V2,
|
|
23
|
+
HARDENING_DEFAULT_MAX_CONCURRENT_AUDITS,
|
|
24
|
+
HARDENING_DEFAULT_BASELINE_RETENTION_MS,
|
|
25
|
+
HARDENING_DEFAULT_AUDIT_TIMEOUT_MS,
|
|
26
|
+
setMaxConcurrentAudits,
|
|
27
|
+
getMaxConcurrentAudits,
|
|
28
|
+
setBaselineRetentionMs,
|
|
29
|
+
getBaselineRetentionMs,
|
|
30
|
+
setAuditTimeoutMs,
|
|
31
|
+
getAuditTimeoutMs,
|
|
32
|
+
getRunningAuditCount,
|
|
33
|
+
registerAuditV2,
|
|
34
|
+
startAudit,
|
|
35
|
+
completeAudit,
|
|
36
|
+
setAuditStatusV2,
|
|
37
|
+
getAuditStatusV2,
|
|
38
|
+
autoTimeoutAudits,
|
|
39
|
+
createBaselineV2,
|
|
40
|
+
getBaselineStatusV2,
|
|
41
|
+
setBaselineStatusV2,
|
|
42
|
+
activateBaseline,
|
|
43
|
+
autoArchiveStaleBaselines,
|
|
44
|
+
getHardeningStatsV2,
|
|
19
45
|
} from "../lib/hardening-manager.js";
|
|
20
46
|
|
|
21
47
|
export function registerHardeningCommand(program) {
|
|
@@ -337,4 +363,389 @@ export function registerHardeningCommand(program) {
|
|
|
337
363
|
process.exit(1);
|
|
338
364
|
}
|
|
339
365
|
});
|
|
366
|
+
|
|
367
|
+
/* ── V2 (Phase 29) ──────────────────────────────── */
|
|
368
|
+
|
|
369
|
+
hardening
|
|
370
|
+
.command("audit-statuses-v2")
|
|
371
|
+
.description("List V2 audit lifecycle statuses")
|
|
372
|
+
.option("--json", "JSON output")
|
|
373
|
+
.action((opts) => {
|
|
374
|
+
const out = Object.values(AUDIT_STATUS_V2);
|
|
375
|
+
if (opts.json) return console.log(JSON.stringify(out, null, 2));
|
|
376
|
+
for (const s of out) console.log(` ${s}`);
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
hardening
|
|
380
|
+
.command("baseline-statuses-v2")
|
|
381
|
+
.description("List V2 baseline lifecycle statuses")
|
|
382
|
+
.option("--json", "JSON output")
|
|
383
|
+
.action((opts) => {
|
|
384
|
+
const out = Object.values(BASELINE_STATUS_V2);
|
|
385
|
+
if (opts.json) return console.log(JSON.stringify(out, null, 2));
|
|
386
|
+
for (const s of out) console.log(` ${s}`);
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
hardening
|
|
390
|
+
.command("severities-v2")
|
|
391
|
+
.description("List V2 severity buckets")
|
|
392
|
+
.option("--json", "JSON output")
|
|
393
|
+
.action((opts) => {
|
|
394
|
+
const out = Object.values(SEVERITY_V2);
|
|
395
|
+
if (opts.json) return console.log(JSON.stringify(out, null, 2));
|
|
396
|
+
for (const s of out) console.log(` ${s}`);
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
hardening
|
|
400
|
+
.command("default-max-concurrent-audits")
|
|
401
|
+
.description("Default concurrent audit cap")
|
|
402
|
+
.option("--json", "JSON output")
|
|
403
|
+
.action((opts) => {
|
|
404
|
+
if (opts.json)
|
|
405
|
+
return console.log(
|
|
406
|
+
JSON.stringify(HARDENING_DEFAULT_MAX_CONCURRENT_AUDITS),
|
|
407
|
+
);
|
|
408
|
+
console.log(HARDENING_DEFAULT_MAX_CONCURRENT_AUDITS);
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
hardening
|
|
412
|
+
.command("max-concurrent-audits")
|
|
413
|
+
.description("Current concurrent audit cap")
|
|
414
|
+
.option("--json", "JSON output")
|
|
415
|
+
.action((opts) => {
|
|
416
|
+
const n = getMaxConcurrentAudits();
|
|
417
|
+
if (opts.json) return console.log(JSON.stringify(n));
|
|
418
|
+
console.log(n);
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
hardening
|
|
422
|
+
.command("set-max-concurrent-audits <n>")
|
|
423
|
+
.description("Set concurrent audit cap")
|
|
424
|
+
.option("--json", "JSON output")
|
|
425
|
+
.action((n, opts) => {
|
|
426
|
+
setMaxConcurrentAudits(Number(n));
|
|
427
|
+
const out = { maxConcurrentAudits: getMaxConcurrentAudits() };
|
|
428
|
+
if (opts.json) return console.log(JSON.stringify(out, null, 2));
|
|
429
|
+
console.log(`maxConcurrentAudits = ${out.maxConcurrentAudits}`);
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
hardening
|
|
433
|
+
.command("default-baseline-retention-ms")
|
|
434
|
+
.description("Default baseline retention in ms")
|
|
435
|
+
.option("--json", "JSON output")
|
|
436
|
+
.action((opts) => {
|
|
437
|
+
if (opts.json)
|
|
438
|
+
return console.log(
|
|
439
|
+
JSON.stringify(HARDENING_DEFAULT_BASELINE_RETENTION_MS),
|
|
440
|
+
);
|
|
441
|
+
console.log(HARDENING_DEFAULT_BASELINE_RETENTION_MS);
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
hardening
|
|
445
|
+
.command("baseline-retention-ms")
|
|
446
|
+
.description("Current baseline retention in ms")
|
|
447
|
+
.option("--json", "JSON output")
|
|
448
|
+
.action((opts) => {
|
|
449
|
+
const n = getBaselineRetentionMs();
|
|
450
|
+
if (opts.json) return console.log(JSON.stringify(n));
|
|
451
|
+
console.log(n);
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
hardening
|
|
455
|
+
.command("set-baseline-retention-ms <ms>")
|
|
456
|
+
.description("Set baseline retention in ms")
|
|
457
|
+
.option("--json", "JSON output")
|
|
458
|
+
.action((ms, opts) => {
|
|
459
|
+
setBaselineRetentionMs(Number(ms));
|
|
460
|
+
const out = { baselineRetentionMs: getBaselineRetentionMs() };
|
|
461
|
+
if (opts.json) return console.log(JSON.stringify(out, null, 2));
|
|
462
|
+
console.log(`baselineRetentionMs = ${out.baselineRetentionMs}`);
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
hardening
|
|
466
|
+
.command("default-audit-timeout-ms")
|
|
467
|
+
.description("Default audit timeout in ms")
|
|
468
|
+
.option("--json", "JSON output")
|
|
469
|
+
.action((opts) => {
|
|
470
|
+
if (opts.json)
|
|
471
|
+
return console.log(JSON.stringify(HARDENING_DEFAULT_AUDIT_TIMEOUT_MS));
|
|
472
|
+
console.log(HARDENING_DEFAULT_AUDIT_TIMEOUT_MS);
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
hardening
|
|
476
|
+
.command("audit-timeout-ms")
|
|
477
|
+
.description("Current audit timeout in ms")
|
|
478
|
+
.option("--json", "JSON output")
|
|
479
|
+
.action((opts) => {
|
|
480
|
+
const n = getAuditTimeoutMs();
|
|
481
|
+
if (opts.json) return console.log(JSON.stringify(n));
|
|
482
|
+
console.log(n);
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
hardening
|
|
486
|
+
.command("set-audit-timeout-ms <ms>")
|
|
487
|
+
.description("Set audit timeout in ms")
|
|
488
|
+
.option("--json", "JSON output")
|
|
489
|
+
.action((ms, opts) => {
|
|
490
|
+
setAuditTimeoutMs(Number(ms));
|
|
491
|
+
const out = { auditTimeoutMs: getAuditTimeoutMs() };
|
|
492
|
+
if (opts.json) return console.log(JSON.stringify(out, null, 2));
|
|
493
|
+
console.log(`auditTimeoutMs = ${out.auditTimeoutMs}`);
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
hardening
|
|
497
|
+
.command("running-audit-count")
|
|
498
|
+
.description("Number of currently RUNNING audits")
|
|
499
|
+
.option("--json", "JSON output")
|
|
500
|
+
.action((opts) => {
|
|
501
|
+
const n = getRunningAuditCount();
|
|
502
|
+
if (opts.json) return console.log(JSON.stringify(n));
|
|
503
|
+
console.log(n);
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
hardening
|
|
507
|
+
.command("register-audit-v2 <name>")
|
|
508
|
+
.description("Register a V2 audit entry (PENDING)")
|
|
509
|
+
.option("-t, --type <type>", "Audit type", "generic")
|
|
510
|
+
.option(
|
|
511
|
+
"-s, --severity <severity>",
|
|
512
|
+
"critical|high|medium|low|info",
|
|
513
|
+
"medium",
|
|
514
|
+
)
|
|
515
|
+
.option("-m, --metadata <json>", "Metadata JSON")
|
|
516
|
+
.option("--json", "JSON output")
|
|
517
|
+
.action(async (name, opts) => {
|
|
518
|
+
try {
|
|
519
|
+
const { db } = await bootstrap();
|
|
520
|
+
ensureHardeningTables(db);
|
|
521
|
+
const metadata = opts.metadata ? JSON.parse(opts.metadata) : undefined;
|
|
522
|
+
const r = registerAuditV2(db, {
|
|
523
|
+
name,
|
|
524
|
+
type: opts.type,
|
|
525
|
+
severity: opts.severity,
|
|
526
|
+
metadata,
|
|
527
|
+
});
|
|
528
|
+
if (opts.json) console.log(JSON.stringify(r, null, 2));
|
|
529
|
+
else console.log(`Registered audit ${r.audit_id} (${r.status})`);
|
|
530
|
+
await shutdown();
|
|
531
|
+
} catch (err) {
|
|
532
|
+
logger.error(`Failed: ${err.message}`);
|
|
533
|
+
process.exit(1);
|
|
534
|
+
}
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
hardening
|
|
538
|
+
.command("start-audit <audit-id>")
|
|
539
|
+
.description("Start a PENDING audit (enforces concurrency cap)")
|
|
540
|
+
.option("--json", "JSON output")
|
|
541
|
+
.action(async (auditId, opts) => {
|
|
542
|
+
try {
|
|
543
|
+
const { db } = await bootstrap();
|
|
544
|
+
ensureHardeningTables(db);
|
|
545
|
+
const r = startAudit(db, auditId);
|
|
546
|
+
if (opts.json) console.log(JSON.stringify(r, null, 2));
|
|
547
|
+
else console.log(`${auditId} → ${r.status}`);
|
|
548
|
+
await shutdown();
|
|
549
|
+
} catch (err) {
|
|
550
|
+
logger.error(`Failed: ${err.message}`);
|
|
551
|
+
process.exit(1);
|
|
552
|
+
}
|
|
553
|
+
});
|
|
554
|
+
|
|
555
|
+
hardening
|
|
556
|
+
.command("complete-audit <audit-id>")
|
|
557
|
+
.description("Complete a RUNNING audit")
|
|
558
|
+
.option("-p, --passed <n>", "Passed check count", parseInt)
|
|
559
|
+
.option("-f, --failed <n>", "Failed check count", parseInt)
|
|
560
|
+
.option("-w, --warning-threshold <n>", "Score threshold for WARNING (0–1)")
|
|
561
|
+
.option("--json", "JSON output")
|
|
562
|
+
.action(async (auditId, opts) => {
|
|
563
|
+
try {
|
|
564
|
+
const { db } = await bootstrap();
|
|
565
|
+
ensureHardeningTables(db);
|
|
566
|
+
const warningThreshold = opts.warningThreshold
|
|
567
|
+
? Number(opts.warningThreshold)
|
|
568
|
+
: undefined;
|
|
569
|
+
const r = completeAudit(db, auditId, {
|
|
570
|
+
passed: opts.passed ?? 0,
|
|
571
|
+
failed: opts.failed ?? 0,
|
|
572
|
+
warningThreshold,
|
|
573
|
+
});
|
|
574
|
+
if (opts.json) console.log(JSON.stringify(r, null, 2));
|
|
575
|
+
else console.log(`${auditId} → ${r.status} (score: ${r.score})`);
|
|
576
|
+
await shutdown();
|
|
577
|
+
} catch (err) {
|
|
578
|
+
logger.error(`Failed: ${err.message}`);
|
|
579
|
+
process.exit(1);
|
|
580
|
+
}
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
hardening
|
|
584
|
+
.command("set-audit-status-v2 <audit-id> <status>")
|
|
585
|
+
.description("Transition audit to a new status")
|
|
586
|
+
.option("-e, --error-message <msg>")
|
|
587
|
+
.option("-m, --metadata <json>")
|
|
588
|
+
.option("--json", "JSON output")
|
|
589
|
+
.action(async (auditId, status, opts) => {
|
|
590
|
+
try {
|
|
591
|
+
const { db } = await bootstrap();
|
|
592
|
+
ensureHardeningTables(db);
|
|
593
|
+
const patch = {};
|
|
594
|
+
if (opts.errorMessage !== undefined)
|
|
595
|
+
patch.errorMessage = opts.errorMessage;
|
|
596
|
+
if (opts.metadata !== undefined)
|
|
597
|
+
patch.metadata = JSON.parse(opts.metadata);
|
|
598
|
+
const r = setAuditStatusV2(db, auditId, status, patch);
|
|
599
|
+
if (opts.json) console.log(JSON.stringify(r, null, 2));
|
|
600
|
+
else console.log(`${auditId} → ${r.status}`);
|
|
601
|
+
await shutdown();
|
|
602
|
+
} catch (err) {
|
|
603
|
+
logger.error(`Failed: ${err.message}`);
|
|
604
|
+
process.exit(1);
|
|
605
|
+
}
|
|
606
|
+
});
|
|
607
|
+
|
|
608
|
+
hardening
|
|
609
|
+
.command("audit-status-v2 <audit-id>")
|
|
610
|
+
.description("Get V2 audit status")
|
|
611
|
+
.option("--json", "JSON output")
|
|
612
|
+
.action((auditId, opts) => {
|
|
613
|
+
const r = getAuditStatusV2(auditId);
|
|
614
|
+
if (opts.json) return console.log(JSON.stringify(r, null, 2));
|
|
615
|
+
if (!r) return console.log("(not found)");
|
|
616
|
+
console.log(`${auditId}: ${r.status}`);
|
|
617
|
+
});
|
|
618
|
+
|
|
619
|
+
hardening
|
|
620
|
+
.command("auto-timeout-audits")
|
|
621
|
+
.description("Bulk-fail RUNNING audits past auditTimeoutMs")
|
|
622
|
+
.option("--json", "JSON output")
|
|
623
|
+
.action(async (opts) => {
|
|
624
|
+
try {
|
|
625
|
+
const { db } = await bootstrap();
|
|
626
|
+
ensureHardeningTables(db);
|
|
627
|
+
const r = autoTimeoutAudits(db);
|
|
628
|
+
if (opts.json) console.log(JSON.stringify(r, null, 2));
|
|
629
|
+
else console.log(`Timed out ${r.length} audit(s)`);
|
|
630
|
+
await shutdown();
|
|
631
|
+
} catch (err) {
|
|
632
|
+
logger.error(`Failed: ${err.message}`);
|
|
633
|
+
process.exit(1);
|
|
634
|
+
}
|
|
635
|
+
});
|
|
636
|
+
|
|
637
|
+
hardening
|
|
638
|
+
.command("create-baseline-v2 <name>")
|
|
639
|
+
.description("Create a V2 baseline (DRAFT)")
|
|
640
|
+
.option("-v, --version <ver>", "Version", "1.0.0")
|
|
641
|
+
.option("-m, --metadata <json>", "Metadata JSON")
|
|
642
|
+
.option("--json", "JSON output")
|
|
643
|
+
.action(async (name, opts) => {
|
|
644
|
+
try {
|
|
645
|
+
const { db } = await bootstrap();
|
|
646
|
+
ensureHardeningTables(db);
|
|
647
|
+
const metadata = opts.metadata ? JSON.parse(opts.metadata) : undefined;
|
|
648
|
+
const r = createBaselineV2(db, {
|
|
649
|
+
name,
|
|
650
|
+
version: opts.version,
|
|
651
|
+
metadata,
|
|
652
|
+
});
|
|
653
|
+
if (opts.json) console.log(JSON.stringify(r, null, 2));
|
|
654
|
+
else console.log(`Baseline ${r.baseline_id} (${r.status})`);
|
|
655
|
+
await shutdown();
|
|
656
|
+
} catch (err) {
|
|
657
|
+
logger.error(`Failed: ${err.message}`);
|
|
658
|
+
process.exit(1);
|
|
659
|
+
}
|
|
660
|
+
});
|
|
661
|
+
|
|
662
|
+
hardening
|
|
663
|
+
.command("activate-baseline <baseline-id>")
|
|
664
|
+
.description("Activate a DRAFT baseline (supersedes previous ACTIVE)")
|
|
665
|
+
.option("--json", "JSON output")
|
|
666
|
+
.action(async (baselineId, opts) => {
|
|
667
|
+
try {
|
|
668
|
+
const { db } = await bootstrap();
|
|
669
|
+
ensureHardeningTables(db);
|
|
670
|
+
const r = activateBaseline(db, baselineId);
|
|
671
|
+
if (opts.json) console.log(JSON.stringify(r, null, 2));
|
|
672
|
+
else console.log(`${baselineId} → ${r.status}`);
|
|
673
|
+
await shutdown();
|
|
674
|
+
} catch (err) {
|
|
675
|
+
logger.error(`Failed: ${err.message}`);
|
|
676
|
+
process.exit(1);
|
|
677
|
+
}
|
|
678
|
+
});
|
|
679
|
+
|
|
680
|
+
hardening
|
|
681
|
+
.command("set-baseline-status-v2 <baseline-id> <status>")
|
|
682
|
+
.description("Transition baseline to a new status")
|
|
683
|
+
.option("-r, --reason <reason>")
|
|
684
|
+
.option("-m, --metadata <json>")
|
|
685
|
+
.option("--json", "JSON output")
|
|
686
|
+
.action(async (baselineId, status, opts) => {
|
|
687
|
+
try {
|
|
688
|
+
const { db } = await bootstrap();
|
|
689
|
+
ensureHardeningTables(db);
|
|
690
|
+
const patch = {};
|
|
691
|
+
if (opts.reason !== undefined) patch.reason = opts.reason;
|
|
692
|
+
if (opts.metadata !== undefined)
|
|
693
|
+
patch.metadata = JSON.parse(opts.metadata);
|
|
694
|
+
const r = setBaselineStatusV2(db, baselineId, status, patch);
|
|
695
|
+
if (opts.json) console.log(JSON.stringify(r, null, 2));
|
|
696
|
+
else console.log(`${baselineId} → ${r.status}`);
|
|
697
|
+
await shutdown();
|
|
698
|
+
} catch (err) {
|
|
699
|
+
logger.error(`Failed: ${err.message}`);
|
|
700
|
+
process.exit(1);
|
|
701
|
+
}
|
|
702
|
+
});
|
|
703
|
+
|
|
704
|
+
hardening
|
|
705
|
+
.command("baseline-status-v2 <baseline-id>")
|
|
706
|
+
.description("Get V2 baseline status")
|
|
707
|
+
.option("--json", "JSON output")
|
|
708
|
+
.action((baselineId, opts) => {
|
|
709
|
+
const r = getBaselineStatusV2(baselineId);
|
|
710
|
+
if (opts.json) return console.log(JSON.stringify(r, null, 2));
|
|
711
|
+
if (!r) return console.log("(not found)");
|
|
712
|
+
console.log(`${baselineId}: ${r.status}`);
|
|
713
|
+
});
|
|
714
|
+
|
|
715
|
+
hardening
|
|
716
|
+
.command("auto-archive-stale-baselines")
|
|
717
|
+
.description("Bulk-archive SUPERSEDED baselines past retention")
|
|
718
|
+
.option("--json", "JSON output")
|
|
719
|
+
.action(async (opts) => {
|
|
720
|
+
try {
|
|
721
|
+
const { db } = await bootstrap();
|
|
722
|
+
ensureHardeningTables(db);
|
|
723
|
+
const r = autoArchiveStaleBaselines(db);
|
|
724
|
+
if (opts.json) console.log(JSON.stringify(r, null, 2));
|
|
725
|
+
else console.log(`Archived ${r.length} baseline(s)`);
|
|
726
|
+
await shutdown();
|
|
727
|
+
} catch (err) {
|
|
728
|
+
logger.error(`Failed: ${err.message}`);
|
|
729
|
+
process.exit(1);
|
|
730
|
+
}
|
|
731
|
+
});
|
|
732
|
+
|
|
733
|
+
hardening
|
|
734
|
+
.command("stats-v2")
|
|
735
|
+
.description("V2 hardening statistics")
|
|
736
|
+
.option("--json", "JSON output")
|
|
737
|
+
.action((opts) => {
|
|
738
|
+
const s = getHardeningStatsV2();
|
|
739
|
+
if (opts.json) return console.log(JSON.stringify(s, null, 2));
|
|
740
|
+
console.log(`Audits: ${s.totalAudits} (running=${s.runningAudits})`);
|
|
741
|
+
for (const [st, n] of Object.entries(s.auditsByStatus)) {
|
|
742
|
+
if (n > 0) console.log(` ${st.padEnd(10)} ${n}`);
|
|
743
|
+
}
|
|
744
|
+
console.log(
|
|
745
|
+
`Baselines: ${s.totalBaselines} (active=${s.activeBaselines})`,
|
|
746
|
+
);
|
|
747
|
+
console.log(
|
|
748
|
+
`config: maxConcurrentAudits=${s.maxConcurrentAudits} baselineRetentionMs=${s.baselineRetentionMs} auditTimeoutMs=${s.auditTimeoutMs}`,
|
|
749
|
+
);
|
|
750
|
+
});
|
|
340
751
|
}
|
package/src/commands/hook.js
CHANGED
|
@@ -334,4 +334,152 @@ export function registerHookCommand(program) {
|
|
|
334
334
|
logger.log(` ${chalk.cyan(ev)}`);
|
|
335
335
|
}
|
|
336
336
|
});
|
|
337
|
+
|
|
338
|
+
// ===== V2 governance subcommands (hook-manager V2) =====
|
|
339
|
+
hook
|
|
340
|
+
.command("maturities-v2")
|
|
341
|
+
.description("List hook profile maturity states (V2)")
|
|
342
|
+
.action(async () => {
|
|
343
|
+
const m = await import("../lib/hook-manager.js");
|
|
344
|
+
console.log(JSON.stringify(m.HOOK_PROFILE_MATURITY_V2, null, 2));
|
|
345
|
+
});
|
|
346
|
+
hook
|
|
347
|
+
.command("exec-lifecycle-v2")
|
|
348
|
+
.description("List hook exec lifecycle states (V2)")
|
|
349
|
+
.action(async () => {
|
|
350
|
+
const m = await import("../lib/hook-manager.js");
|
|
351
|
+
console.log(JSON.stringify(m.HOOK_EXEC_LIFECYCLE_V2, null, 2));
|
|
352
|
+
});
|
|
353
|
+
hook
|
|
354
|
+
.command("stats-v2")
|
|
355
|
+
.description("Show hook-manager V2 stats")
|
|
356
|
+
.action(async () => {
|
|
357
|
+
const m = await import("../lib/hook-manager.js");
|
|
358
|
+
console.log(JSON.stringify(m.getHookManagerStatsV2(), null, 2));
|
|
359
|
+
});
|
|
360
|
+
hook
|
|
361
|
+
.command("config-v2")
|
|
362
|
+
.description("Show hook-manager V2 config")
|
|
363
|
+
.action(async () => {
|
|
364
|
+
const m = await import("../lib/hook-manager.js");
|
|
365
|
+
console.log(
|
|
366
|
+
JSON.stringify(
|
|
367
|
+
{
|
|
368
|
+
maxActiveHooksPerOwner: m.getMaxActiveHooksPerOwnerV2(),
|
|
369
|
+
maxPendingExecsPerHook: m.getMaxPendingExecsPerHookV2(),
|
|
370
|
+
hookIdleMs: m.getHookIdleMsV2(),
|
|
371
|
+
hookExecStuckMs: m.getHookExecStuckMsV2(),
|
|
372
|
+
},
|
|
373
|
+
null,
|
|
374
|
+
2,
|
|
375
|
+
),
|
|
376
|
+
);
|
|
377
|
+
});
|
|
378
|
+
hook
|
|
379
|
+
.command("register-profile-v2 <id> <owner> [event]")
|
|
380
|
+
.action(async (id, owner, event) => {
|
|
381
|
+
const m = await import("../lib/hook-manager.js");
|
|
382
|
+
console.log(
|
|
383
|
+
JSON.stringify(m.registerHookProfileV2({ id, owner, event }), null, 2),
|
|
384
|
+
);
|
|
385
|
+
});
|
|
386
|
+
hook.command("activate-profile-v2 <id>").action(async (id) => {
|
|
387
|
+
const m = await import("../lib/hook-manager.js");
|
|
388
|
+
console.log(JSON.stringify(m.activateHookProfileV2(id), null, 2));
|
|
389
|
+
});
|
|
390
|
+
hook.command("disable-profile-v2 <id>").action(async (id) => {
|
|
391
|
+
const m = await import("../lib/hook-manager.js");
|
|
392
|
+
console.log(JSON.stringify(m.disableHookProfileV2(id), null, 2));
|
|
393
|
+
});
|
|
394
|
+
hook.command("retire-profile-v2 <id>").action(async (id) => {
|
|
395
|
+
const m = await import("../lib/hook-manager.js");
|
|
396
|
+
console.log(JSON.stringify(m.retireHookProfileV2(id), null, 2));
|
|
397
|
+
});
|
|
398
|
+
hook.command("touch-profile-v2 <id>").action(async (id) => {
|
|
399
|
+
const m = await import("../lib/hook-manager.js");
|
|
400
|
+
console.log(JSON.stringify(m.touchHookProfileV2(id), null, 2));
|
|
401
|
+
});
|
|
402
|
+
hook.command("get-profile-v2 <id>").action(async (id) => {
|
|
403
|
+
const m = await import("../lib/hook-manager.js");
|
|
404
|
+
console.log(JSON.stringify(m.getHookProfileV2(id), null, 2));
|
|
405
|
+
});
|
|
406
|
+
hook.command("list-profiles-v2").action(async () => {
|
|
407
|
+
const m = await import("../lib/hook-manager.js");
|
|
408
|
+
console.log(JSON.stringify(m.listHookProfilesV2(), null, 2));
|
|
409
|
+
});
|
|
410
|
+
hook.command("create-exec-v2 <id> <hookId>").action(async (id, hookId) => {
|
|
411
|
+
const m = await import("../lib/hook-manager.js");
|
|
412
|
+
console.log(JSON.stringify(m.createHookExecV2({ id, hookId }), null, 2));
|
|
413
|
+
});
|
|
414
|
+
hook.command("start-exec-v2 <id>").action(async (id) => {
|
|
415
|
+
const m = await import("../lib/hook-manager.js");
|
|
416
|
+
console.log(JSON.stringify(m.startHookExecV2(id), null, 2));
|
|
417
|
+
});
|
|
418
|
+
hook.command("complete-exec-v2 <id>").action(async (id) => {
|
|
419
|
+
const m = await import("../lib/hook-manager.js");
|
|
420
|
+
console.log(JSON.stringify(m.completeHookExecV2(id), null, 2));
|
|
421
|
+
});
|
|
422
|
+
hook.command("fail-exec-v2 <id> [reason]").action(async (id, reason) => {
|
|
423
|
+
const m = await import("../lib/hook-manager.js");
|
|
424
|
+
console.log(JSON.stringify(m.failHookExecV2(id, reason), null, 2));
|
|
425
|
+
});
|
|
426
|
+
hook.command("cancel-exec-v2 <id> [reason]").action(async (id, reason) => {
|
|
427
|
+
const m = await import("../lib/hook-manager.js");
|
|
428
|
+
console.log(JSON.stringify(m.cancelHookExecV2(id, reason), null, 2));
|
|
429
|
+
});
|
|
430
|
+
hook.command("get-exec-v2 <id>").action(async (id) => {
|
|
431
|
+
const m = await import("../lib/hook-manager.js");
|
|
432
|
+
console.log(JSON.stringify(m.getHookExecV2(id), null, 2));
|
|
433
|
+
});
|
|
434
|
+
hook.command("list-execs-v2").action(async () => {
|
|
435
|
+
const m = await import("../lib/hook-manager.js");
|
|
436
|
+
console.log(JSON.stringify(m.listHookExecsV2(), null, 2));
|
|
437
|
+
});
|
|
438
|
+
hook.command("auto-disable-idle-v2").action(async () => {
|
|
439
|
+
const m = await import("../lib/hook-manager.js");
|
|
440
|
+
console.log(JSON.stringify(m.autoDisableIdleHooksV2(), null, 2));
|
|
441
|
+
});
|
|
442
|
+
hook.command("auto-fail-stuck-v2").action(async () => {
|
|
443
|
+
const m = await import("../lib/hook-manager.js");
|
|
444
|
+
console.log(JSON.stringify(m.autoFailStuckHookExecsV2(), null, 2));
|
|
445
|
+
});
|
|
446
|
+
hook.command("set-max-active-hooks-v2 <n>").action(async (n) => {
|
|
447
|
+
const m = await import("../lib/hook-manager.js");
|
|
448
|
+
m.setMaxActiveHooksPerOwnerV2(parseInt(n, 10));
|
|
449
|
+
console.log(
|
|
450
|
+
JSON.stringify(
|
|
451
|
+
{ maxActiveHooksPerOwner: m.getMaxActiveHooksPerOwnerV2() },
|
|
452
|
+
null,
|
|
453
|
+
2,
|
|
454
|
+
),
|
|
455
|
+
);
|
|
456
|
+
});
|
|
457
|
+
hook.command("set-max-pending-execs-v2 <n>").action(async (n) => {
|
|
458
|
+
const m = await import("../lib/hook-manager.js");
|
|
459
|
+
m.setMaxPendingExecsPerHookV2(parseInt(n, 10));
|
|
460
|
+
console.log(
|
|
461
|
+
JSON.stringify(
|
|
462
|
+
{ maxPendingExecsPerHook: m.getMaxPendingExecsPerHookV2() },
|
|
463
|
+
null,
|
|
464
|
+
2,
|
|
465
|
+
),
|
|
466
|
+
);
|
|
467
|
+
});
|
|
468
|
+
hook.command("set-hook-idle-ms-v2 <n>").action(async (n) => {
|
|
469
|
+
const m = await import("../lib/hook-manager.js");
|
|
470
|
+
m.setHookIdleMsV2(parseInt(n, 10));
|
|
471
|
+
console.log(JSON.stringify({ hookIdleMs: m.getHookIdleMsV2() }, null, 2));
|
|
472
|
+
});
|
|
473
|
+
hook.command("set-hook-exec-stuck-ms-v2 <n>").action(async (n) => {
|
|
474
|
+
const m = await import("../lib/hook-manager.js");
|
|
475
|
+
m.setHookExecStuckMsV2(parseInt(n, 10));
|
|
476
|
+
console.log(
|
|
477
|
+
JSON.stringify({ hookExecStuckMs: m.getHookExecStuckMsV2() }, null, 2),
|
|
478
|
+
);
|
|
479
|
+
});
|
|
480
|
+
hook.command("reset-state-v2").action(async () => {
|
|
481
|
+
const m = await import("../lib/hook-manager.js");
|
|
482
|
+
m._resetStateHookManagerV2();
|
|
483
|
+
console.log(JSON.stringify({ ok: true }, null, 2));
|
|
484
|
+
});
|
|
337
485
|
}
|