sentinelayer-cli 0.1.2 → 0.4.4
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 +998 -996
- package/bin/create-sentinelayer.js +5 -5
- package/bin/sentinelayer-cli.js +4 -4
- package/bin/sl.js +5 -5
- package/package.json +63 -54
- package/src/agents/jules/config/definition.js +209 -209
- package/src/agents/jules/config/system-prompt.js +175 -175
- package/src/agents/jules/error-intake.js +51 -51
- package/src/agents/jules/fix-cycle.js +377 -377
- package/src/agents/jules/loop.js +367 -367
- package/src/agents/jules/pulse.js +327 -319
- 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 +308 -308
- package/src/agents/jules/tools/auth-audit.js +557 -222
- package/src/agents/jules/tools/dispatch.js +327 -327
- package/src/agents/jules/tools/file-edit.js +180 -180
- package/src/agents/jules/tools/file-read.js +100 -100
- package/src/agents/jules/tools/frontend-analyze.js +570 -570
- package/src/agents/jules/tools/glob.js +168 -168
- package/src/agents/jules/tools/grep.js +228 -228
- package/src/agents/jules/tools/index.js +29 -29
- package/src/agents/jules/tools/path-guards.js +161 -161
- package/src/agents/jules/tools/runtime-audit.js +503 -493
- package/src/agents/jules/tools/shell.js +383 -383
- package/src/agents/jules/tools/url-policy.js +100 -0
- package/src/ai/aidenid.js +972 -945
- package/src/ai/client.js +508 -508
- package/src/ai/domain-target-store.js +268 -268
- package/src/ai/identity-store.js +270 -270
- 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 +45 -11
- package/src/auth/http.js +270 -113
- package/src/auth/service.js +891 -848
- package/src/auth/session-store.js +359 -345
- package/src/cli.js +252 -252
- package/src/commands/ai/identity-lifecycle.js +1338 -1337
- package/src/commands/ai/provision-governance.js +1272 -1246
- 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 +375 -366
- 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 -404
- package/src/commands/omargate.js +15 -15
- 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 +866 -788
- 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 +510 -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/hybrid-mapper.js +929 -929
- package/src/daemon/jira-lifecycle.js +632 -632
- package/src/daemon/operator-control.js +657 -657
- 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/legacy-cli.js +2592 -2435
- 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 -106
- package/src/review/ai-review.js +669 -669
- package/src/review/local-review.js +1295 -1284
- package/src/review/replay.js +235 -235
- package/src/review/report.js +664 -664
- package/src/review/spec-binding.js +487 -487
- package/src/scaffold/generator.js +67 -0
- package/src/scaffold/templates.js +150 -0
- package/src/scan/generator.js +418 -351
- package/src/scan/gh-secrets.js +107 -0
- 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/sync.js +107 -61
- package/src/ui/markdown.js +220 -220
package/src/commands/policy.js
CHANGED
|
@@ -1,132 +1,132 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import process from "node:process";
|
|
3
|
-
|
|
4
|
-
import pc from "picocolors";
|
|
5
|
-
|
|
6
|
-
import { setConfigValue } from "../config/service.js";
|
|
7
|
-
import {
|
|
8
|
-
DEFAULT_POLICY_PACK_ID,
|
|
9
|
-
resolveActivePolicyPack,
|
|
10
|
-
resolvePolicyPackById,
|
|
11
|
-
} from "../policy/packs.js";
|
|
12
|
-
|
|
13
|
-
function shouldEmitJson(options, command) {
|
|
14
|
-
const local = Boolean(options && options.json);
|
|
15
|
-
const globalFromCommand =
|
|
16
|
-
command && command.optsWithGlobals ? Boolean(command.optsWithGlobals().json) : false;
|
|
17
|
-
return local || globalFromCommand;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function normalizeScope(rawValue) {
|
|
21
|
-
const normalized = String(rawValue || "project").trim().toLowerCase();
|
|
22
|
-
if (normalized !== "project" && normalized !== "global") {
|
|
23
|
-
throw new Error("scope must be project or global.");
|
|
24
|
-
}
|
|
25
|
-
return normalized;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export function registerPolicyCommand(program) {
|
|
29
|
-
const policy = program.command("policy").description("Manage Sentinelayer policy packs");
|
|
30
|
-
|
|
31
|
-
policy
|
|
32
|
-
.command("list")
|
|
33
|
-
.description("List built-in and plugin-provided policy packs")
|
|
34
|
-
.option("--path <path>", "Workspace path for config/plugin resolution", ".")
|
|
35
|
-
.option("--output-dir <path>", "Optional artifact output root override")
|
|
36
|
-
.option("--json", "Emit machine-readable output")
|
|
37
|
-
.action(async (options, command) => {
|
|
38
|
-
const targetPath = path.resolve(process.cwd(), String(options.path || "."));
|
|
39
|
-
const active = await resolveActivePolicyPack({
|
|
40
|
-
cwd: targetPath,
|
|
41
|
-
outputDir: options.outputDir,
|
|
42
|
-
env: process.env,
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
const payload = {
|
|
46
|
-
command: "policy list",
|
|
47
|
-
defaultPolicyPack: DEFAULT_POLICY_PACK_ID,
|
|
48
|
-
configuredPolicyPack: active.configuredId,
|
|
49
|
-
activePolicyPack: active.selected ? active.selected.id : null,
|
|
50
|
-
invalidManifestCount: active.listing.invalidManifestCount,
|
|
51
|
-
pluginRoot: active.listing.pluginsRoot,
|
|
52
|
-
packs: active.listing.packs.map((pack) => ({
|
|
53
|
-
id: pack.id,
|
|
54
|
-
name: pack.name,
|
|
55
|
-
source: pack.source,
|
|
56
|
-
description: pack.description,
|
|
57
|
-
scanProfile: pack.scanProfile,
|
|
58
|
-
plugin: pack.plugin || null,
|
|
59
|
-
})),
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
if (shouldEmitJson(options, command)) {
|
|
63
|
-
console.log(JSON.stringify(payload, null, 2));
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
console.log(pc.bold("Policy packs"));
|
|
68
|
-
console.log(pc.gray(`Active: ${payload.activePolicyPack || "(none)"}`));
|
|
69
|
-
for (const pack of payload.packs) {
|
|
70
|
-
const marker = pack.id === payload.activePolicyPack ? "*" : " ";
|
|
71
|
-
const source = pack.source === "plugin" ? "plugin" : "builtin";
|
|
72
|
-
console.log(`${marker} ${pack.id} (${source}) - ${pack.description}`);
|
|
73
|
-
}
|
|
74
|
-
if (payload.invalidManifestCount > 0) {
|
|
75
|
-
console.log(
|
|
76
|
-
pc.yellow(
|
|
77
|
-
`Detected ${payload.invalidManifestCount} invalid plugin manifest(s); run 'plugin list --json' for details.`
|
|
78
|
-
)
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
policy
|
|
84
|
-
.command("use <packId>")
|
|
85
|
-
.description("Set active policy pack in config (project/global scope)")
|
|
86
|
-
.option("--path <path>", "Workspace path for config/plugin resolution", ".")
|
|
87
|
-
.option("--output-dir <path>", "Optional artifact output root override")
|
|
88
|
-
.option("--scope <scope>", "Write scope (project|global)", "project")
|
|
89
|
-
.option("--json", "Emit machine-readable output")
|
|
90
|
-
.action(async (packId, options, command) => {
|
|
91
|
-
const targetPath = path.resolve(process.cwd(), String(options.path || "."));
|
|
92
|
-
const scope = normalizeScope(options.scope);
|
|
93
|
-
const resolution = await resolvePolicyPackById({
|
|
94
|
-
packId,
|
|
95
|
-
cwd: targetPath,
|
|
96
|
-
outputDir: options.outputDir,
|
|
97
|
-
env: process.env,
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
if (!resolution.selected) {
|
|
101
|
-
const available = resolution.packs.map((pack) => pack.id).sort((left, right) => left.localeCompare(right));
|
|
102
|
-
throw new Error(
|
|
103
|
-
`Unknown policy pack '${resolution.packId}'. Available: ${available.join(", ") || "(none)"}`
|
|
104
|
-
);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const writeResult = await setConfigValue({
|
|
108
|
-
key: "defaultPolicyPack",
|
|
109
|
-
value: resolution.selected.id,
|
|
110
|
-
scope,
|
|
111
|
-
cwd: targetPath,
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
const payload = {
|
|
115
|
-
command: "policy use",
|
|
116
|
-
selected: resolution.selected.id,
|
|
117
|
-
source: resolution.selected.source,
|
|
118
|
-
scope: writeResult.scope,
|
|
119
|
-
configPath: writeResult.path,
|
|
120
|
-
scanProfile: resolution.selected.scanProfile,
|
|
121
|
-
};
|
|
122
|
-
|
|
123
|
-
if (shouldEmitJson(options, command)) {
|
|
124
|
-
console.log(JSON.stringify(payload, null, 2));
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
console.log(pc.green(`Policy pack set to '${resolution.selected.id}' (${resolution.selected.source}).`));
|
|
129
|
-
console.log(pc.gray(`Scope: ${writeResult.scope}`));
|
|
130
|
-
console.log(pc.gray(`Config: ${writeResult.path}`));
|
|
131
|
-
});
|
|
132
|
-
}
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import process from "node:process";
|
|
3
|
+
|
|
4
|
+
import pc from "picocolors";
|
|
5
|
+
|
|
6
|
+
import { setConfigValue } from "../config/service.js";
|
|
7
|
+
import {
|
|
8
|
+
DEFAULT_POLICY_PACK_ID,
|
|
9
|
+
resolveActivePolicyPack,
|
|
10
|
+
resolvePolicyPackById,
|
|
11
|
+
} from "../policy/packs.js";
|
|
12
|
+
|
|
13
|
+
function shouldEmitJson(options, command) {
|
|
14
|
+
const local = Boolean(options && options.json);
|
|
15
|
+
const globalFromCommand =
|
|
16
|
+
command && command.optsWithGlobals ? Boolean(command.optsWithGlobals().json) : false;
|
|
17
|
+
return local || globalFromCommand;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function normalizeScope(rawValue) {
|
|
21
|
+
const normalized = String(rawValue || "project").trim().toLowerCase();
|
|
22
|
+
if (normalized !== "project" && normalized !== "global") {
|
|
23
|
+
throw new Error("scope must be project or global.");
|
|
24
|
+
}
|
|
25
|
+
return normalized;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function registerPolicyCommand(program) {
|
|
29
|
+
const policy = program.command("policy").description("Manage Sentinelayer policy packs");
|
|
30
|
+
|
|
31
|
+
policy
|
|
32
|
+
.command("list")
|
|
33
|
+
.description("List built-in and plugin-provided policy packs")
|
|
34
|
+
.option("--path <path>", "Workspace path for config/plugin resolution", ".")
|
|
35
|
+
.option("--output-dir <path>", "Optional artifact output root override")
|
|
36
|
+
.option("--json", "Emit machine-readable output")
|
|
37
|
+
.action(async (options, command) => {
|
|
38
|
+
const targetPath = path.resolve(process.cwd(), String(options.path || "."));
|
|
39
|
+
const active = await resolveActivePolicyPack({
|
|
40
|
+
cwd: targetPath,
|
|
41
|
+
outputDir: options.outputDir,
|
|
42
|
+
env: process.env,
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const payload = {
|
|
46
|
+
command: "policy list",
|
|
47
|
+
defaultPolicyPack: DEFAULT_POLICY_PACK_ID,
|
|
48
|
+
configuredPolicyPack: active.configuredId,
|
|
49
|
+
activePolicyPack: active.selected ? active.selected.id : null,
|
|
50
|
+
invalidManifestCount: active.listing.invalidManifestCount,
|
|
51
|
+
pluginRoot: active.listing.pluginsRoot,
|
|
52
|
+
packs: active.listing.packs.map((pack) => ({
|
|
53
|
+
id: pack.id,
|
|
54
|
+
name: pack.name,
|
|
55
|
+
source: pack.source,
|
|
56
|
+
description: pack.description,
|
|
57
|
+
scanProfile: pack.scanProfile,
|
|
58
|
+
plugin: pack.plugin || null,
|
|
59
|
+
})),
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
if (shouldEmitJson(options, command)) {
|
|
63
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
console.log(pc.bold("Policy packs"));
|
|
68
|
+
console.log(pc.gray(`Active: ${payload.activePolicyPack || "(none)"}`));
|
|
69
|
+
for (const pack of payload.packs) {
|
|
70
|
+
const marker = pack.id === payload.activePolicyPack ? "*" : " ";
|
|
71
|
+
const source = pack.source === "plugin" ? "plugin" : "builtin";
|
|
72
|
+
console.log(`${marker} ${pack.id} (${source}) - ${pack.description}`);
|
|
73
|
+
}
|
|
74
|
+
if (payload.invalidManifestCount > 0) {
|
|
75
|
+
console.log(
|
|
76
|
+
pc.yellow(
|
|
77
|
+
`Detected ${payload.invalidManifestCount} invalid plugin manifest(s); run 'plugin list --json' for details.`
|
|
78
|
+
)
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
policy
|
|
84
|
+
.command("use <packId>")
|
|
85
|
+
.description("Set active policy pack in config (project/global scope)")
|
|
86
|
+
.option("--path <path>", "Workspace path for config/plugin resolution", ".")
|
|
87
|
+
.option("--output-dir <path>", "Optional artifact output root override")
|
|
88
|
+
.option("--scope <scope>", "Write scope (project|global)", "project")
|
|
89
|
+
.option("--json", "Emit machine-readable output")
|
|
90
|
+
.action(async (packId, options, command) => {
|
|
91
|
+
const targetPath = path.resolve(process.cwd(), String(options.path || "."));
|
|
92
|
+
const scope = normalizeScope(options.scope);
|
|
93
|
+
const resolution = await resolvePolicyPackById({
|
|
94
|
+
packId,
|
|
95
|
+
cwd: targetPath,
|
|
96
|
+
outputDir: options.outputDir,
|
|
97
|
+
env: process.env,
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
if (!resolution.selected) {
|
|
101
|
+
const available = resolution.packs.map((pack) => pack.id).sort((left, right) => left.localeCompare(right));
|
|
102
|
+
throw new Error(
|
|
103
|
+
`Unknown policy pack '${resolution.packId}'. Available: ${available.join(", ") || "(none)"}`
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const writeResult = await setConfigValue({
|
|
108
|
+
key: "defaultPolicyPack",
|
|
109
|
+
value: resolution.selected.id,
|
|
110
|
+
scope,
|
|
111
|
+
cwd: targetPath,
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
const payload = {
|
|
115
|
+
command: "policy use",
|
|
116
|
+
selected: resolution.selected.id,
|
|
117
|
+
source: resolution.selected.source,
|
|
118
|
+
scope: writeResult.scope,
|
|
119
|
+
configPath: writeResult.path,
|
|
120
|
+
scanProfile: resolution.selected.scanProfile,
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
if (shouldEmitJson(options, command)) {
|
|
124
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
console.log(pc.green(`Policy pack set to '${resolution.selected.id}' (${resolution.selected.source}).`));
|
|
129
|
+
console.log(pc.gray(`Scope: ${writeResult.scope}`));
|
|
130
|
+
console.log(pc.gray(`Config: ${writeResult.path}`));
|
|
131
|
+
});
|
|
132
|
+
}
|