jules-orchestrator-kit 0.75.2 → 0.75.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/README.md +2 -2
- package/bin/agentctl.mjs +16 -10
- package/package.json +1 -1
- package/src/ops/command-registry.mjs +5 -0
- package/src/secret-scanner.mjs +5 -2
- package/src/wizard-task.mjs +5 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.75.3] - 2026-10-09
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **`--oracle` Verification Alias (`bin/agentctl.mjs`, `src/ops/command-registry.mjs`)**: Added `--oracle` alias for `--verify` / `--verify-cmd` across `agentctl task create`, `task new`, `task template`, and `dispatch`, aligning CLI flags with prompt template terminology.
|
|
14
|
+
- **Explicit Lane Flag on Task Creation (`bin/agentctl.mjs`, `src/ops/command-registry.mjs`)**: Added `--lane` and `--risk-lane` flags to `agentctl task create` and `task new` to specify risk level directly (`green|amber|orange|red`) without manual frontmatter edits.
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
- **Queue Fallback Isolation (`bin/agentctl.mjs`)**: Prevented automatic pending queue file selection during `task create` / `task new`, ensuring queue auto-selection is restricted to `dispatch` and `run`.
|
|
18
|
+
- **Envelope Comment Stripping in Entropy Scanner (`src/wizard-task.mjs`, `src/secret-scanner.mjs`)**: Stripped `<!-- JULES_TASK_ENVELOPE: ... -->` comments and YAML frontmatter prior to Shannon entropy calculation to prevent false-positive secret leak blocks on tasks carrying envelope metadata.
|
|
19
|
+
- **Word Boundaries on Credential Keywords (`src/secret-scanner.mjs`)**: Added word boundary assertions around credential keywords in `LOW_CONFIDENCE_PATTERNS` so identifiers like `hasHighEntropyToken` are not flagged as secret leaks.
|
|
20
|
+
|
|
10
21
|
## [0.75.2] - 2026-10-09
|
|
11
22
|
|
|
12
23
|
### Fixed
|
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ You can also run local checks without connecting an agent provider.
|
|
|
17
17
|
`agentctl repair` explicitly for repair workflows. Provider output and passing
|
|
18
18
|
checks still need review before merging.
|
|
19
19
|
|
|
20
|
-
The current release is **v0.75.
|
|
20
|
+
The current release is **v0.75.3**, a pre-1.0 release. A long-term stability policy is a
|
|
21
21
|
[v1.0 goal](https://github.com/FullThrottle83/jules-orchestrator-kit/blob/main/ROADMAP_V1.md).
|
|
22
22
|
|
|
23
23
|
## Quickstart
|
|
@@ -176,7 +176,7 @@ npm run package-integrity
|
|
|
176
176
|
npm run guard-reach
|
|
177
177
|
```
|
|
178
178
|
|
|
179
|
-
The recorded baseline is **
|
|
179
|
+
The recorded baseline is **1672 unit tests across 210 suites**. Doc-sync compares
|
|
180
180
|
that count with an actual run. Counts do not establish correctness for every
|
|
181
181
|
provider or project. See
|
|
182
182
|
[contributing](https://github.com/FullThrottle83/jules-orchestrator-kit/blob/main/CONTRIBUTING.md)
|
package/bin/agentctl.mjs
CHANGED
|
@@ -127,7 +127,7 @@ export function printHelp() {
|
|
|
127
127
|
* @param {string} [root] Repository root.
|
|
128
128
|
* @returns {{ content: string, sourceFile: string | null }}
|
|
129
129
|
*/
|
|
130
|
-
function resolvePromptDetails(values, positionals = [], root = process.cwd()) {
|
|
130
|
+
function resolvePromptDetails(values, positionals = [], root = process.cwd(), { allowQueueFallback = true } = {}) {
|
|
131
131
|
const file = values["prompt-file"] || values.file;
|
|
132
132
|
if (file) {
|
|
133
133
|
if (!existsSync(file)) {
|
|
@@ -157,7 +157,7 @@ function resolvePromptDetails(values, positionals = [], root = process.cwd()) {
|
|
|
157
157
|
}
|
|
158
158
|
}
|
|
159
159
|
|
|
160
|
-
if (positionals.length === 0) {
|
|
160
|
+
if (allowQueueFallback && positionals.length === 0) {
|
|
161
161
|
const queueDir = getQueueDir(root);
|
|
162
162
|
if (existsSync(queueDir)) {
|
|
163
163
|
const candidates = readdirSync(queueDir)
|
|
@@ -176,8 +176,8 @@ function resolvePromptDetails(values, positionals = [], root = process.cwd()) {
|
|
|
176
176
|
return { content: positionals.join(" ").trim(), sourceFile: null };
|
|
177
177
|
}
|
|
178
178
|
|
|
179
|
-
function resolvePromptInput(values, positionals = [], root = process.cwd()) {
|
|
180
|
-
return resolvePromptDetails(values, positionals, root).content;
|
|
179
|
+
function resolvePromptInput(values, positionals = [], root = process.cwd(), options = {}) {
|
|
180
|
+
return resolvePromptDetails(values, positionals, root, options).content;
|
|
181
181
|
}
|
|
182
182
|
|
|
183
183
|
/**
|
|
@@ -350,6 +350,7 @@ async function main() {
|
|
|
350
350
|
author: { type: "string" },
|
|
351
351
|
"verify-cmd": { type: "string", short: "v" },
|
|
352
352
|
verify: { type: "string" },
|
|
353
|
+
oracle: { type: "string" },
|
|
353
354
|
"dry-run": { type: "boolean", short: "d" },
|
|
354
355
|
json: { type: "boolean", short: "j" },
|
|
355
356
|
},
|
|
@@ -368,7 +369,7 @@ async function main() {
|
|
|
368
369
|
values.title = values.title || envelopeMeta.title;
|
|
369
370
|
values.role = values.role || envelopeMeta.role;
|
|
370
371
|
values.tier = values.tier || envelopeMeta.tier;
|
|
371
|
-
values["verify-cmd"] = values["verify-cmd"] || values.verify || envelopeMeta.verifyCmd;
|
|
372
|
+
values["verify-cmd"] = values.oracle || values["verify-cmd"] || values.verify || envelopeMeta.verifyCmd;
|
|
372
373
|
if (values["auto-pr"] === undefined && envelopeMeta.flags?.autoPr !== undefined) {
|
|
373
374
|
values["auto-pr"] = envelopeMeta.flags.autoPr;
|
|
374
375
|
}
|
|
@@ -413,7 +414,7 @@ async function main() {
|
|
|
413
414
|
checkPremise: values["check-premise"] || values.idempotent,
|
|
414
415
|
goalCheck: values["goal-check"],
|
|
415
416
|
author: values.author,
|
|
416
|
-
verifyCmd: values["verify-cmd"] || values.verify,
|
|
417
|
+
verifyCmd: values.oracle || values["verify-cmd"] || values.verify,
|
|
417
418
|
};
|
|
418
419
|
|
|
419
420
|
try {
|
|
@@ -2217,6 +2218,9 @@ async function main() {
|
|
|
2217
2218
|
"depends-on": { type: "string" },
|
|
2218
2219
|
verify: { type: "string" },
|
|
2219
2220
|
"verify-cmd": { type: "string", short: "v" },
|
|
2221
|
+
oracle: { type: "string" },
|
|
2222
|
+
lane: { type: "string" },
|
|
2223
|
+
"risk-lane": { type: "string" },
|
|
2220
2224
|
"auto-pr": { type: "boolean" },
|
|
2221
2225
|
"require-plan-approval": { type: "boolean" },
|
|
2222
2226
|
repoless: { type: "boolean" },
|
|
@@ -2240,18 +2244,19 @@ async function main() {
|
|
|
2240
2244
|
isTTY: Boolean(process.stdin.isTTY),
|
|
2241
2245
|
// A title and a prompt together state the whole task; there is
|
|
2242
2246
|
// nothing left for the wizard to ask.
|
|
2243
|
-
fullySpecified: Boolean(values.title && resolvePromptInput(values, positionals)),
|
|
2247
|
+
fullySpecified: Boolean(values.title && resolvePromptInput(values, positionals, root, { allowQueueFallback: false })),
|
|
2244
2248
|
});
|
|
2245
2249
|
|
|
2246
2250
|
const { runTaskCreateWizard } = await import("../src/wizard-task.mjs");
|
|
2247
2251
|
const res = await runTaskCreateWizard(root, {
|
|
2248
2252
|
title: values.title,
|
|
2249
|
-
prompt: resolvePromptInput(values, positionals),
|
|
2253
|
+
prompt: resolvePromptInput(values, positionals, root, { allowQueueFallback: false }),
|
|
2250
2254
|
role: values.role,
|
|
2251
2255
|
tier: values.tier,
|
|
2252
2256
|
template: values.template,
|
|
2257
|
+
lane: values.lane || values["risk-lane"],
|
|
2253
2258
|
dependsOn: values["depends-on"] || values.depends,
|
|
2254
|
-
verifyCmd: values["verify-cmd"] || values.verify,
|
|
2259
|
+
verifyCmd: values.oracle || values["verify-cmd"] || values.verify,
|
|
2255
2260
|
autoPr: values["auto-pr"],
|
|
2256
2261
|
requirePlanApproval: values["require-plan-approval"],
|
|
2257
2262
|
repoless: values.repoless,
|
|
@@ -2284,6 +2289,7 @@ async function main() {
|
|
|
2284
2289
|
json: { type: "boolean", short: "j" },
|
|
2285
2290
|
verify: { type: "string" },
|
|
2286
2291
|
"verify-cmd": { type: "string", short: "v" },
|
|
2292
|
+
oracle: { type: "string" },
|
|
2287
2293
|
"dry-run": { type: "boolean", short: "d" },
|
|
2288
2294
|
},
|
|
2289
2295
|
allowPositionals: true,
|
|
@@ -2316,7 +2322,7 @@ async function main() {
|
|
|
2316
2322
|
process.exit(1);
|
|
2317
2323
|
}
|
|
2318
2324
|
|
|
2319
|
-
const envelope = synthesizeWebEnvelope(templateName, {}, { verifyCmd: values["verify-cmd"] || values.verify });
|
|
2325
|
+
const envelope = synthesizeWebEnvelope(templateName, {}, { verifyCmd: values.oracle || values["verify-cmd"] || values.verify });
|
|
2320
2326
|
if (values.json) {
|
|
2321
2327
|
console.log(JSON.stringify({ ok: true, ...envelope }, null, 2));
|
|
2322
2328
|
} else {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jules-orchestrator-kit",
|
|
3
|
-
"version": "0.75.
|
|
3
|
+
"version": "0.75.3",
|
|
4
4
|
"description": "Zero-dependency safety gatekeeper, test oracle generator, and multi-agent coordination protocol for autonomous coding agents — Google Jules, Claude Code, Codex and Gemini CLI.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -185,6 +185,9 @@ export const COMMAND_REGISTRY = [
|
|
|
185
185
|
{ name: "depends", type: "string", description: "Alias for --depends-on" },
|
|
186
186
|
{ name: "verify-cmd", type: "string", description: "Verification command override (-v)" },
|
|
187
187
|
{ name: "verify", type: "string", description: "Alias for --verify-cmd" },
|
|
188
|
+
{ name: "oracle", type: "string", description: "Alias for --verify-cmd" },
|
|
189
|
+
{ name: "lane", type: "string", description: "Risk lane assignment (green | amber | orange | red)" },
|
|
190
|
+
{ name: "risk-lane", type: "string", description: "Alias for --lane" },
|
|
188
191
|
{ name: "auto-pr", type: "boolean", description: "Automatically create GitHub PR upon completion" },
|
|
189
192
|
{ name: "require-plan-approval", type: "boolean", description: "Require approval of agent plan before execution" },
|
|
190
193
|
{ name: "repoless", type: "boolean", description: "Execute in repoless sandbox mode" },
|
|
@@ -216,6 +219,7 @@ export const COMMAND_REGISTRY = [
|
|
|
216
219
|
{ name: "list", type: "boolean", description: "List available task templates (-l)" },
|
|
217
220
|
{ name: "verify-cmd", type: "string", description: "Verification command override (-v)" },
|
|
218
221
|
{ name: "verify", type: "string", description: "Alias for --verify-cmd" },
|
|
222
|
+
{ name: "oracle", type: "string", description: "Alias for --verify-cmd" },
|
|
219
223
|
{ name: "dry-run", type: "boolean", description: "Simulate envelope synthesis (-d)" },
|
|
220
224
|
{ name: "json", type: "boolean", description: "Output structured JSON envelope (-j)" },
|
|
221
225
|
],
|
|
@@ -821,6 +825,7 @@ export const COMMAND_REGISTRY = [
|
|
|
821
825
|
{ name: "author", type: "string", description: "Attribution author for the dispatch" },
|
|
822
826
|
{ name: "verify-cmd", type: "string", description: "Verification command override (-v)" },
|
|
823
827
|
{ name: "verify", type: "string", description: "Alias for --verify-cmd" },
|
|
828
|
+
{ name: "oracle", type: "string", description: "Alias for --verify-cmd" },
|
|
824
829
|
{ name: "source", type: "string", description: "Jules repository source identifier (-s)" },
|
|
825
830
|
{ name: "branch", type: "string", description: "Starting branch for task execution (-b)" },
|
|
826
831
|
{ name: "repoless", type: "boolean", description: "Dispatch task in repoless execution mode" },
|
package/src/secret-scanner.mjs
CHANGED
|
@@ -49,7 +49,7 @@ export const LOW_CONFIDENCE_PATTERNS = [
|
|
|
49
49
|
/Bearer\s+[A-Za-z0-9._~+/-]{10,255}/gi,
|
|
50
50
|
/Authorization:\s*Bearer\s+[A-Za-z0-9._~+/-]{10,255}/gi,
|
|
51
51
|
/\bsk_test_[0-9a-zA-Z]{24,99}\b/g,
|
|
52
|
-
/(?:api[_-]?key|secret|password|passwd|token|auth[_-]?token)\s*[:=]\s*(?:['"`]([^'"`\n]{8,128})['"`]|([A-Za-z0-9._~+/-]{16,128}))/gi,
|
|
52
|
+
/(?:["'`]|\b)(?:api[_-]?key|secret|password|passwd|token|auth[_-]?token)(?:["'`]|\b)\s*[:=]\s*(?:['"`]([^'"`\n]{8,128})['"`]|([A-Za-z0-9._~+/-]{16,128}))/gi,
|
|
53
53
|
];
|
|
54
54
|
|
|
55
55
|
export function shannonEntropy(str) {
|
|
@@ -499,7 +499,10 @@ export function hasHighEntropyToken(text = "", file = null) {
|
|
|
499
499
|
return false;
|
|
500
500
|
}
|
|
501
501
|
|
|
502
|
-
const
|
|
502
|
+
const sanitizedText = text
|
|
503
|
+
.replace(/<!--\s*JULES_TASK_ENVELOPE:[\s\S]*?-->/gi, " ")
|
|
504
|
+
.replace(/^---\s*[\s\S]*?---\s*/m, " ");
|
|
505
|
+
const lines = sanitizedText.split("\n");
|
|
503
506
|
for (const rawLine of lines) {
|
|
504
507
|
const line = stripEntropyNoise(rawLine);
|
|
505
508
|
|
package/src/wizard-task.mjs
CHANGED
|
@@ -186,11 +186,14 @@ export function planTaskCreate(root = process.cwd(), inputObj = {}) {
|
|
|
186
186
|
if (/[/\\][a-zA-Z0-9_.-]+\.[a-zA-Z0-9]+(:\d+(:\d+)?)?$/.test(clean)) return true;
|
|
187
187
|
return false;
|
|
188
188
|
};
|
|
189
|
-
const
|
|
189
|
+
const promptForEntropy = rawPrompt
|
|
190
|
+
.replace(/<!--\s*JULES_TASK_ENVELOPE:[\s\S]*?-->/gi, " ")
|
|
191
|
+
.replace(/^---\s*[\s\S]*?---\s*/m, " ");
|
|
192
|
+
const hasHighEntropyToken = promptForEntropy
|
|
190
193
|
.split(/\s+/)
|
|
191
194
|
.some((token) => !isPathOrUrlToken(token) && token.length >= 20 && shannonEntropy(token) > 4.3);
|
|
192
195
|
const isShortHighEntropy =
|
|
193
|
-
|
|
196
|
+
promptForEntropy.length <= 120 && !isPathOrUrlToken(promptForEntropy.trim()) && shannonEntropy(promptForEntropy) > 4.5;
|
|
194
197
|
if ((hasHighEntropyToken || isShortHighEntropy) && !inputObj.allowHighEntropy) {
|
|
195
198
|
secretFindings.push({ id: "HIGH_ENTROPY_PROMPT", line: 1 });
|
|
196
199
|
}
|