sentinelayer-cli 0.4.4 → 0.6.2
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/README.md +996 -998
- package/bin/create-sentinelayer.js +5 -5
- package/bin/sentinelayer-cli.js +4 -4
- package/bin/sl.js +5 -5
- package/package.json +63 -63
- package/src/agents/jules/config/definition.js +160 -209
- package/src/agents/jules/config/system-prompt.js +182 -175
- package/src/agents/jules/error-intake.js +51 -51
- package/src/agents/jules/fix-cycle.js +17 -377
- package/src/agents/jules/loop.js +450 -367
- package/src/agents/jules/pulse.js +10 -327
- package/src/agents/jules/stream.js +186 -186
- package/src/agents/jules/swarm/file-scanner.js +74 -74
- package/src/agents/jules/swarm/index.js +11 -11
- package/src/agents/jules/swarm/orchestrator.js +362 -362
- package/src/agents/jules/swarm/pattern-hunter.js +123 -123
- package/src/agents/jules/swarm/sub-agent.js +309 -308
- package/src/agents/jules/tools/aidenid-email.js +189 -0
- package/src/agents/jules/tools/auth-audit.js +1691 -557
- package/src/agents/jules/tools/dispatch.js +335 -327
- package/src/agents/jules/tools/file-edit.js +2 -180
- package/src/agents/jules/tools/file-read.js +2 -100
- package/src/agents/jules/tools/frontend-analyze.js +570 -570
- package/src/agents/jules/tools/glob.js +2 -168
- package/src/agents/jules/tools/grep.js +2 -228
- package/src/agents/jules/tools/index.js +29 -29
- package/src/agents/jules/tools/path-guards.js +2 -161
- package/src/agents/jules/tools/runtime-audit.js +507 -503
- package/src/agents/jules/tools/shell.js +2 -383
- package/src/agents/jules/tools/url-policy.js +100 -100
- package/src/agents/persona-visuals.js +61 -0
- package/src/agents/shared-tools/dispatch-core.js +315 -0
- package/src/agents/shared-tools/file-edit.js +180 -0
- package/src/agents/shared-tools/file-read.js +100 -0
- package/src/agents/shared-tools/glob.js +168 -0
- package/src/agents/shared-tools/grep.js +228 -0
- package/src/agents/shared-tools/index.js +46 -0
- package/src/agents/shared-tools/path-guards.js +161 -0
- package/src/agents/shared-tools/shell.js +383 -0
- package/src/ai/aidenid.js +1009 -972
- package/src/ai/client.js +553 -508
- package/src/ai/domain-target-store.js +268 -268
- package/src/ai/identity-store.js +270 -270
- package/src/ai/proxy.js +137 -0
- package/src/ai/site-store.js +145 -145
- package/src/audit/agents/architecture.js +180 -180
- package/src/audit/agents/compliance.js +179 -179
- package/src/audit/agents/documentation.js +165 -165
- package/src/audit/agents/performance.js +145 -145
- package/src/audit/agents/security.js +215 -215
- package/src/audit/agents/testing.js +172 -172
- package/src/audit/orchestrator.js +557 -557
- package/src/audit/package.js +204 -204
- package/src/audit/registry.js +284 -284
- package/src/audit/replay.js +103 -103
- package/src/auth/gate.js +371 -126
- package/src/auth/http.js +611 -270
- package/src/auth/service.js +1106 -891
- package/src/auth/session-store.js +813 -359
- package/src/cli.js +252 -252
- package/src/commands/ai/identity-lifecycle.js +1338 -1338
- package/src/commands/ai/provision-governance.js +1272 -1272
- package/src/commands/ai/shared.js +147 -147
- package/src/commands/ai.js +11 -11
- package/src/commands/apply.js +12 -12
- package/src/commands/audit.js +1166 -1166
- package/src/commands/auth.js +419 -375
- package/src/commands/chat.js +191 -191
- package/src/commands/config.js +184 -184
- package/src/commands/cost.js +311 -311
- package/src/commands/daemon/core.js +850 -850
- package/src/commands/daemon/extended.js +1048 -1048
- package/src/commands/daemon/shared.js +213 -213
- package/src/commands/daemon.js +11 -11
- package/src/commands/guide.js +174 -174
- package/src/commands/ingest.js +58 -58
- package/src/commands/init.js +55 -55
- package/src/commands/legacy-args.js +10 -10
- package/src/commands/mcp.js +461 -461
- package/src/commands/omargate.js +29 -21
- package/src/commands/persona.js +20 -20
- package/src/commands/plugin.js +260 -260
- package/src/commands/policy.js +132 -132
- package/src/commands/prompt.js +238 -238
- package/src/commands/review.js +704 -704
- package/src/commands/scan.js +872 -866
- package/src/commands/spec.js +716 -716
- package/src/commands/swarm.js +651 -651
- package/src/commands/telemetry.js +202 -202
- package/src/commands/watch.js +511 -510
- package/src/config/agent-dictionary.js +182 -182
- package/src/config/io.js +56 -56
- package/src/config/paths.js +18 -18
- package/src/config/schema.js +55 -55
- package/src/config/service.js +184 -184
- package/src/cost/budget.js +235 -235
- package/src/cost/history.js +188 -188
- package/src/cost/tracker.js +171 -171
- package/src/daemon/artifact-lineage.js +534 -534
- package/src/daemon/assignment-ledger.js +770 -770
- package/src/daemon/ast-parser-layer.js +258 -258
- package/src/daemon/budget-governor.js +633 -633
- package/src/daemon/callgraph-overlay.js +646 -646
- package/src/daemon/error-worker.js +626 -626
- package/src/daemon/fix-cycle.js +377 -0
- package/src/daemon/hybrid-mapper.js +929 -929
- package/src/daemon/jira-lifecycle.js +632 -632
- package/src/daemon/operator-control.js +657 -657
- package/src/daemon/pulse.js +327 -0
- package/src/daemon/reliability-lane.js +471 -471
- package/src/daemon/watchdog.js +971 -971
- package/src/guide/generator.js +316 -316
- package/src/ingest/engine.js +918 -918
- package/src/interactive/index.js +97 -95
- package/src/legacy-cli.js +2994 -2592
- package/src/mcp/registry.js +695 -695
- package/src/memory/blackboard.js +301 -301
- package/src/memory/retrieval.js +581 -581
- package/src/plugin/manifest.js +553 -553
- package/src/policy/packs.js +144 -144
- package/src/prompt/generator.js +118 -118
- package/src/review/ai-review.js +679 -669
- package/src/review/local-review.js +1305 -1295
- package/src/review/omargate-interactive.js +68 -0
- package/src/review/omargate-orchestrator.js +300 -0
- package/src/review/persona-prompts.js +296 -0
- package/src/review/replay.js +235 -235
- package/src/review/report.js +664 -664
- package/src/review/scan-modes.js +42 -0
- package/src/review/spec-binding.js +487 -487
- package/src/scaffold/generator.js +67 -67
- package/src/scaffold/templates.js +150 -150
- package/src/scan/generator.js +418 -418
- package/src/scan/gh-secrets.js +107 -107
- package/src/spec/generator.js +519 -519
- package/src/spec/regenerate.js +237 -237
- package/src/spec/templates.js +91 -91
- package/src/swarm/dashboard.js +247 -247
- package/src/swarm/factory.js +363 -363
- package/src/swarm/pentest.js +934 -934
- package/src/swarm/registry.js +419 -419
- package/src/swarm/report.js +158 -158
- package/src/swarm/runtime.js +576 -576
- package/src/swarm/scenario-dsl.js +272 -272
- package/src/telemetry/ledger.js +302 -302
- package/src/telemetry/session-tracker.js +234 -118
- package/src/telemetry/sync.js +203 -199
- package/src/ui/command-hints.js +13 -0
- package/src/ui/markdown.js +220 -220
|
@@ -1,147 +1,147 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
|
-
import fsp from "node:fs/promises";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
|
|
5
|
-
// Shared helper utilities for ai command modules.
|
|
6
|
-
|
|
7
|
-
export function shouldEmitJson(options, command) {
|
|
8
|
-
const local = Boolean(options && options.json);
|
|
9
|
-
const globalFromCommand =
|
|
10
|
-
command && command.optsWithGlobals ? Boolean(command.optsWithGlobals().json) : false;
|
|
11
|
-
return local || globalFromCommand;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export function stableTimestampForFile(date = new Date()) {
|
|
15
|
-
return date.toISOString().replace(/[:.]/g, "-");
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function parsePositiveInteger(rawValue, field, fallbackValue) {
|
|
19
|
-
if (rawValue === undefined || rawValue === null || String(rawValue).trim() === "") {
|
|
20
|
-
return fallbackValue;
|
|
21
|
-
}
|
|
22
|
-
const normalized = Number(rawValue);
|
|
23
|
-
if (!Number.isFinite(normalized) || normalized <= 0) {
|
|
24
|
-
throw new Error(`${field} must be a positive integer.`);
|
|
25
|
-
}
|
|
26
|
-
return Math.round(normalized);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function parseConfidenceThreshold(rawValue, fallbackValue = 0.8) {
|
|
30
|
-
if (rawValue === undefined || rawValue === null || String(rawValue).trim() === "") {
|
|
31
|
-
return fallbackValue;
|
|
32
|
-
}
|
|
33
|
-
const normalized = Number(rawValue);
|
|
34
|
-
if (!Number.isFinite(normalized) || normalized < 0 || normalized > 1) {
|
|
35
|
-
throw new Error("minConfidence must be between 0 and 1.");
|
|
36
|
-
}
|
|
37
|
-
return normalized;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export function parseCsvTokens(rawValue, fallbackValues = []) {
|
|
41
|
-
const normalized = String(rawValue || "").trim();
|
|
42
|
-
if (!normalized) {
|
|
43
|
-
return [...fallbackValues];
|
|
44
|
-
}
|
|
45
|
-
const unique = new Set();
|
|
46
|
-
for (const token of normalized.split(",")) {
|
|
47
|
-
const item = token.trim();
|
|
48
|
-
if (item) {
|
|
49
|
-
unique.add(item);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return unique.size > 0 ? [...unique] : [...fallbackValues];
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export function parseJsonObject(rawValue, field) {
|
|
56
|
-
const normalized = String(rawValue || "").trim();
|
|
57
|
-
if (!normalized) {
|
|
58
|
-
return {};
|
|
59
|
-
}
|
|
60
|
-
let parsed;
|
|
61
|
-
try {
|
|
62
|
-
parsed = JSON.parse(normalized);
|
|
63
|
-
} catch {
|
|
64
|
-
throw new Error(`${field} must be valid JSON.`);
|
|
65
|
-
}
|
|
66
|
-
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
67
|
-
throw new Error(`${field} must be a JSON object.`);
|
|
68
|
-
}
|
|
69
|
-
return parsed;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export function normalizeLegalHoldStatus(rawValue) {
|
|
73
|
-
const normalized = String(rawValue || "").trim().toUpperCase();
|
|
74
|
-
if (!normalized) {
|
|
75
|
-
return "NONE";
|
|
76
|
-
}
|
|
77
|
-
if (normalized === "HOLD" || normalized === "NONE" || normalized === "UNKNOWN") {
|
|
78
|
-
return normalized;
|
|
79
|
-
}
|
|
80
|
-
return normalized;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export function identityIsUnderLegalHold(identityRecord = {}) {
|
|
84
|
-
const directStatus = normalizeLegalHoldStatus(identityRecord.legalHoldStatus);
|
|
85
|
-
const metadataStatus = normalizeLegalHoldStatus(identityRecord?.metadata?.legalHoldStatus);
|
|
86
|
-
const metadataFlag = Boolean(identityRecord?.metadata?.legalHold === true);
|
|
87
|
-
return directStatus === "HOLD" || metadataStatus === "HOLD" || metadataFlag;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export function normalizeIdempotencyKey(rawValue) {
|
|
91
|
-
const normalized = String(rawValue || "").trim();
|
|
92
|
-
return normalized || randomUUID();
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export function hasExtractionSignal(extraction = {}) {
|
|
96
|
-
return Boolean(String(extraction.otp || "").trim() || String(extraction.primaryActionUrl || "").trim());
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export function meetsConfidenceThreshold(extraction = {}, minConfidence = 0.8) {
|
|
100
|
-
const normalizedConfidence = Number(extraction.confidence);
|
|
101
|
-
if (!Number.isFinite(normalizedConfidence)) {
|
|
102
|
-
return minConfidence <= 0;
|
|
103
|
-
}
|
|
104
|
-
return normalizedConfidence >= minConfidence;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
export function delay(ms) {
|
|
108
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export function renderLineageRows(lineage = {}) {
|
|
112
|
-
const nodes = Array.isArray(lineage.nodes) ? lineage.nodes : [];
|
|
113
|
-
return [...nodes]
|
|
114
|
-
.sort((left, right) => {
|
|
115
|
-
const leftDepth = Number(left.depth);
|
|
116
|
-
const rightDepth = Number(right.depth);
|
|
117
|
-
if (leftDepth !== rightDepth) {
|
|
118
|
-
return leftDepth - rightDepth;
|
|
119
|
-
}
|
|
120
|
-
return String(left.identityId || "").localeCompare(String(right.identityId || ""));
|
|
121
|
-
})
|
|
122
|
-
.map((node) => {
|
|
123
|
-
const depth = Number.isFinite(Number(node.depth)) ? Math.max(0, Number(node.depth)) : 0;
|
|
124
|
-
const indent = " ".repeat(depth);
|
|
125
|
-
const status = String(node.status || "UNKNOWN");
|
|
126
|
-
const email = String(node.emailAddress || "unknown-email");
|
|
127
|
-
return `${indent}- ${String(node.identityId || "unknown-id")} | ${status} | ${email}`;
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export async function writeArtifact(filePath, payload) {
|
|
132
|
-
await fsp.mkdir(path.dirname(filePath), { recursive: true });
|
|
133
|
-
await fsp.writeFile(filePath, `${JSON.stringify(payload, null, 2)}\n`, "utf-8");
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export function buildCurlPreview({ apiUrl, idempotencyKey, requestPath }) {
|
|
137
|
-
const escapedPath = String(requestPath || "").replace(/\\/g, "/");
|
|
138
|
-
return [
|
|
139
|
-
`curl -X POST ${apiUrl}/v1/identities \\`,
|
|
140
|
-
` -H \"Authorization: Bearer $AIDENID_API_KEY\" \\`,
|
|
141
|
-
` -H \"X-Org-Id: $AIDENID_ORG_ID\" \\`,
|
|
142
|
-
` -H \"X-Project-Id: $AIDENID_PROJECT_ID\" \\`,
|
|
143
|
-
` -H \"Idempotency-Key: ${idempotencyKey}\" \\`,
|
|
144
|
-
` -H \"Content-Type: application/json\" \\`,
|
|
145
|
-
` --data @${escapedPath}`,
|
|
146
|
-
].join("\n");
|
|
147
|
-
}
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import fsp from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
|
|
5
|
+
// Shared helper utilities for ai command modules.
|
|
6
|
+
|
|
7
|
+
export function shouldEmitJson(options, command) {
|
|
8
|
+
const local = Boolean(options && options.json);
|
|
9
|
+
const globalFromCommand =
|
|
10
|
+
command && command.optsWithGlobals ? Boolean(command.optsWithGlobals().json) : false;
|
|
11
|
+
return local || globalFromCommand;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function stableTimestampForFile(date = new Date()) {
|
|
15
|
+
return date.toISOString().replace(/[:.]/g, "-");
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function parsePositiveInteger(rawValue, field, fallbackValue) {
|
|
19
|
+
if (rawValue === undefined || rawValue === null || String(rawValue).trim() === "") {
|
|
20
|
+
return fallbackValue;
|
|
21
|
+
}
|
|
22
|
+
const normalized = Number(rawValue);
|
|
23
|
+
if (!Number.isFinite(normalized) || normalized <= 0) {
|
|
24
|
+
throw new Error(`${field} must be a positive integer.`);
|
|
25
|
+
}
|
|
26
|
+
return Math.round(normalized);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function parseConfidenceThreshold(rawValue, fallbackValue = 0.8) {
|
|
30
|
+
if (rawValue === undefined || rawValue === null || String(rawValue).trim() === "") {
|
|
31
|
+
return fallbackValue;
|
|
32
|
+
}
|
|
33
|
+
const normalized = Number(rawValue);
|
|
34
|
+
if (!Number.isFinite(normalized) || normalized < 0 || normalized > 1) {
|
|
35
|
+
throw new Error("minConfidence must be between 0 and 1.");
|
|
36
|
+
}
|
|
37
|
+
return normalized;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function parseCsvTokens(rawValue, fallbackValues = []) {
|
|
41
|
+
const normalized = String(rawValue || "").trim();
|
|
42
|
+
if (!normalized) {
|
|
43
|
+
return [...fallbackValues];
|
|
44
|
+
}
|
|
45
|
+
const unique = new Set();
|
|
46
|
+
for (const token of normalized.split(",")) {
|
|
47
|
+
const item = token.trim();
|
|
48
|
+
if (item) {
|
|
49
|
+
unique.add(item);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return unique.size > 0 ? [...unique] : [...fallbackValues];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function parseJsonObject(rawValue, field) {
|
|
56
|
+
const normalized = String(rawValue || "").trim();
|
|
57
|
+
if (!normalized) {
|
|
58
|
+
return {};
|
|
59
|
+
}
|
|
60
|
+
let parsed;
|
|
61
|
+
try {
|
|
62
|
+
parsed = JSON.parse(normalized);
|
|
63
|
+
} catch {
|
|
64
|
+
throw new Error(`${field} must be valid JSON.`);
|
|
65
|
+
}
|
|
66
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
67
|
+
throw new Error(`${field} must be a JSON object.`);
|
|
68
|
+
}
|
|
69
|
+
return parsed;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function normalizeLegalHoldStatus(rawValue) {
|
|
73
|
+
const normalized = String(rawValue || "").trim().toUpperCase();
|
|
74
|
+
if (!normalized) {
|
|
75
|
+
return "NONE";
|
|
76
|
+
}
|
|
77
|
+
if (normalized === "HOLD" || normalized === "NONE" || normalized === "UNKNOWN") {
|
|
78
|
+
return normalized;
|
|
79
|
+
}
|
|
80
|
+
return normalized;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function identityIsUnderLegalHold(identityRecord = {}) {
|
|
84
|
+
const directStatus = normalizeLegalHoldStatus(identityRecord.legalHoldStatus);
|
|
85
|
+
const metadataStatus = normalizeLegalHoldStatus(identityRecord?.metadata?.legalHoldStatus);
|
|
86
|
+
const metadataFlag = Boolean(identityRecord?.metadata?.legalHold === true);
|
|
87
|
+
return directStatus === "HOLD" || metadataStatus === "HOLD" || metadataFlag;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function normalizeIdempotencyKey(rawValue) {
|
|
91
|
+
const normalized = String(rawValue || "").trim();
|
|
92
|
+
return normalized || randomUUID();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function hasExtractionSignal(extraction = {}) {
|
|
96
|
+
return Boolean(String(extraction.otp || "").trim() || String(extraction.primaryActionUrl || "").trim());
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function meetsConfidenceThreshold(extraction = {}, minConfidence = 0.8) {
|
|
100
|
+
const normalizedConfidence = Number(extraction.confidence);
|
|
101
|
+
if (!Number.isFinite(normalizedConfidence)) {
|
|
102
|
+
return minConfidence <= 0;
|
|
103
|
+
}
|
|
104
|
+
return normalizedConfidence >= minConfidence;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function delay(ms) {
|
|
108
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function renderLineageRows(lineage = {}) {
|
|
112
|
+
const nodes = Array.isArray(lineage.nodes) ? lineage.nodes : [];
|
|
113
|
+
return [...nodes]
|
|
114
|
+
.sort((left, right) => {
|
|
115
|
+
const leftDepth = Number(left.depth);
|
|
116
|
+
const rightDepth = Number(right.depth);
|
|
117
|
+
if (leftDepth !== rightDepth) {
|
|
118
|
+
return leftDepth - rightDepth;
|
|
119
|
+
}
|
|
120
|
+
return String(left.identityId || "").localeCompare(String(right.identityId || ""));
|
|
121
|
+
})
|
|
122
|
+
.map((node) => {
|
|
123
|
+
const depth = Number.isFinite(Number(node.depth)) ? Math.max(0, Number(node.depth)) : 0;
|
|
124
|
+
const indent = " ".repeat(depth);
|
|
125
|
+
const status = String(node.status || "UNKNOWN");
|
|
126
|
+
const email = String(node.emailAddress || "unknown-email");
|
|
127
|
+
return `${indent}- ${String(node.identityId || "unknown-id")} | ${status} | ${email}`;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export async function writeArtifact(filePath, payload) {
|
|
132
|
+
await fsp.mkdir(path.dirname(filePath), { recursive: true });
|
|
133
|
+
await fsp.writeFile(filePath, `${JSON.stringify(payload, null, 2)}\n`, "utf-8");
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function buildCurlPreview({ apiUrl, idempotencyKey, requestPath }) {
|
|
137
|
+
const escapedPath = String(requestPath || "").replace(/\\/g, "/");
|
|
138
|
+
return [
|
|
139
|
+
`curl -X POST ${apiUrl}/v1/identities \\`,
|
|
140
|
+
` -H \"Authorization: Bearer $AIDENID_API_KEY\" \\`,
|
|
141
|
+
` -H \"X-Org-Id: $AIDENID_ORG_ID\" \\`,
|
|
142
|
+
` -H \"X-Project-Id: $AIDENID_PROJECT_ID\" \\`,
|
|
143
|
+
` -H \"Idempotency-Key: ${idempotencyKey}\" \\`,
|
|
144
|
+
` -H \"Content-Type: application/json\" \\`,
|
|
145
|
+
` --data @${escapedPath}`,
|
|
146
|
+
].join("\n");
|
|
147
|
+
}
|
package/src/commands/ai.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { registerAiIdentityLifecycleCommands } from "./ai/identity-lifecycle.js";
|
|
2
|
-
import { registerAiProvisionAndGovernanceCommands } from "./ai/provision-governance.js";
|
|
3
|
-
|
|
4
|
-
export function registerAiCommand(program) {
|
|
5
|
-
const ai = program
|
|
6
|
-
.command("ai")
|
|
7
|
-
.description("AIdenID helper commands for ambient agent identity workflows");
|
|
8
|
-
|
|
9
|
-
const { identity, legalHold } = registerAiProvisionAndGovernanceCommands(ai);
|
|
10
|
-
registerAiIdentityLifecycleCommands({ identity, legalHold });
|
|
11
|
-
}
|
|
1
|
+
import { registerAiIdentityLifecycleCommands } from "./ai/identity-lifecycle.js";
|
|
2
|
+
import { registerAiProvisionAndGovernanceCommands } from "./ai/provision-governance.js";
|
|
3
|
+
|
|
4
|
+
export function registerAiCommand(program) {
|
|
5
|
+
const ai = program
|
|
6
|
+
.command("ai")
|
|
7
|
+
.description("AIdenID helper commands for ambient agent identity workflows");
|
|
8
|
+
|
|
9
|
+
const { identity, legalHold } = registerAiProvisionAndGovernanceCommands(ai);
|
|
10
|
+
registerAiIdentityLifecycleCommands({ identity, legalHold });
|
|
11
|
+
}
|
package/src/commands/apply.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { buildLegacyArgs } from "./legacy-args.js";
|
|
2
|
-
|
|
3
|
-
export function registerApplyCommand(program, invokeLegacy) {
|
|
1
|
+
import { buildLegacyArgs } from "./legacy-args.js";
|
|
2
|
+
|
|
3
|
+
export function registerApplyCommand(program, invokeLegacy) {
|
|
4
4
|
program
|
|
5
5
|
.command("apply")
|
|
6
6
|
.description("Parse a todo plan into deterministic execution order")
|
|
@@ -8,12 +8,12 @@ export function registerApplyCommand(program, invokeLegacy) {
|
|
|
8
8
|
.option("--path <path>", "Target repository path")
|
|
9
9
|
.option("--output-dir <path>", "Artifact root for report output")
|
|
10
10
|
.option("--json", "Emit machine-readable output")
|
|
11
|
-
.action(async (options, command) => {
|
|
12
|
-
const planPath = String(options.plan || "").trim();
|
|
13
|
-
const legacyArgs = buildLegacyArgs(["/apply", "--plan", planPath], {
|
|
14
|
-
commandOptions: options,
|
|
15
|
-
command,
|
|
16
|
-
});
|
|
17
|
-
await invokeLegacy(legacyArgs);
|
|
18
|
-
});
|
|
19
|
-
}
|
|
11
|
+
.action(async (options, command) => {
|
|
12
|
+
const planPath = String(options.plan || "").trim();
|
|
13
|
+
const legacyArgs = buildLegacyArgs(["/apply", "--plan", planPath], {
|
|
14
|
+
commandOptions: options,
|
|
15
|
+
command,
|
|
16
|
+
});
|
|
17
|
+
await invokeLegacy(legacyArgs);
|
|
18
|
+
});
|
|
19
|
+
}
|