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 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.2**, a pre-1.0 release. A long-term stability policy is a
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 **1670 unit tests across 210 suites**. Doc-sync compares
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.2",
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" },
@@ -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 lines = text.split("\n");
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
 
@@ -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 hasHighEntropyToken = rawPrompt
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
- rawPrompt.length <= 120 && !isPathOrUrlToken(rawPrompt.trim()) && shannonEntropy(rawPrompt) > 4.5;
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
  }