0xray 3.5.5 → 4.0.1
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/.mcp.json +18 -14
- package/.opencode/skills/api-design/SKILL.md +1 -1
- package/.opencode/skills/architect-tools/SKILL.md +1 -1
- package/.opencode/skills/architecture-patterns/SKILL.md +1 -1
- package/.opencode/skills/auto-format/SKILL.md +1 -1
- package/.opencode/skills/boot-orchestrator/SKILL.md +2 -6
- package/.opencode/skills/bug-triage/SKILL.md +1 -1
- package/.opencode/skills/code-analyzer/SKILL.md +1 -1
- package/.opencode/skills/code-review/SKILL.md +1 -1
- package/.opencode/skills/enforcer/SKILL.md +1 -1
- package/.opencode/skills/framework-compliance-audit/SKILL.md +1 -1
- package/.opencode/skills/git-workflow/SKILL.md +1 -1
- package/.opencode/skills/hermes-agent/SKILL.md +36 -36
- package/.opencode/skills/inference-improve/SKILL.md +1 -1
- package/.opencode/skills/lint/SKILL.md +1 -1
- package/.opencode/skills/log-monitor/SKILL.md +1 -1
- package/.opencode/skills/model-health-check/SKILL.md +1 -1
- package/.opencode/skills/multimodal-looker/SKILL.md +1 -1
- package/.opencode/skills/orchestrator/SKILL.md +38 -14
- package/.opencode/skills/performance-analysis/SKILL.md +1 -1
- package/.opencode/skills/performance-optimization/SKILL.md +1 -1
- package/.opencode/skills/processor-pipeline/SKILL.md +1 -1
- package/.opencode/skills/project-analysis/SKILL.md +1 -1
- package/.opencode/skills/refactoring-strategies/SKILL.md +1 -1
- package/.opencode/skills/registry.json +65 -0
- package/.opencode/skills/researcher/SKILL.md +18 -5
- package/.opencode/skills/security-audit/SKILL.md +1 -1
- package/.opencode/skills/security-scan/SKILL.md +1 -1
- package/.opencode/skills/session-management/SKILL.md +1 -1
- package/.opencode/skills/state-manager/SKILL.md +1 -1
- package/.opencode/skills/storyteller/SKILL.md +1 -1
- package/.opencode/skills/strategist/SKILL.md +12 -0
- package/.opencode/skills/testing-best-practices/SKILL.md +37 -0
- package/.opencode/skills/testing-strategy/SKILL.md +14 -3
- package/.opencode/skills/ui-ux-design/SKILL.md +1 -1
- package/.opencode/skills/xray-orchestrator/index.ts +267 -0
- package/.xray/codex.json +12 -3
- package/.xray/features.json +28 -6
- package/.xray/features.schema.json +31 -0
- package/AGENTS-consumer.md +17 -7
- package/AGENTS.md +18 -10
- package/README.md +30 -27
- package/SKILLS.md +2 -2
- package/dist/AGENTS.md +18 -10
- package/dist/CHANGELOG.md +81 -11
- package/dist/README.md +30 -27
- package/dist/SKILLS.md +2 -2
- package/dist/cli/commands/hermes-install.js +3 -0
- package/dist/cli/commands/openclaw-install.js +14 -0
- package/dist/cli/index.js +10 -1
- package/dist/core/features-config.d.ts +15 -2
- package/dist/infrastructure/schemas/cloud-schemas.d.ts +1 -1
- package/dist/integrations/grok/grok-cli.d.ts +3 -0
- package/dist/integrations/grok/grok-cli.js +92 -4
- package/dist/integrations/grok/hooks/grok-hook-utils.js +53 -7
- package/dist/integrations/grok/hooks/post-tool-use.js +68 -46
- package/dist/integrations/grok/hooks/pre-tool-use.js +14 -31
- package/dist/integrations/grok/hooks/session-start.js +86 -4
- package/dist/integrations/grok/plugin/0xray/hooks/hooks.json +31 -24
- package/dist/integrations/hermes-agent/bridge.mjs +26 -1
- package/dist/integrations/hooks/delegation-gate-runtime.mjs +32 -3
- package/dist/integrations/hooks/pipeline-hook-runtime.mjs +1 -1
- package/dist/integrations/hooks/station-hook-runtime.cjs +421 -0
- package/dist/integrations/hooks/station-hook-runtime.mjs +24 -0
- package/dist/integrations/hooks/station-memory-ingest.mjs +45 -0
- package/dist/integrations/hooks/station-memory-match.mjs +47 -0
- package/dist/integrations/openclaw/client.d.ts +5 -1
- package/dist/integrations/openclaw/client.js +17 -9
- package/dist/integrations/openclaw/config.js +0 -1
- package/dist/integrations/openclaw/hooks/pre-tool-gate-runtime.mjs +102 -0
- package/dist/integrations/openclaw/index.js +17 -0
- package/dist/integrations/openclaw/plugin/xray-pre-tool/index.js +75 -0
- package/dist/integrations/openclaw/plugin/xray-pre-tool/openclaw.plugin.json +10 -0
- package/dist/integrations/openclaw/plugin/xray-pre-tool/package.json +12 -0
- package/dist/integrations/openclaw/pre-tool-gate.d.ts +19 -0
- package/dist/integrations/openclaw/pre-tool-gate.js +39 -0
- package/dist/mcps/orchestrator/handlers/complexity-handler.js +2 -2
- package/dist/memory-routing/index.d.ts +1 -1
- package/dist/memory-routing/index.js +1 -1
- package/dist/memory-routing/provider-loader.d.ts +4 -0
- package/dist/memory-routing/provider-loader.js +44 -2
- package/dist/memory-routing/provider-registry.js +3 -2
- package/dist/nucleus/autonomy-kernel.d.ts +2 -2
- package/dist/nucleus/autonomy-kernel.js +17 -6
- package/dist/nucleus/confer.js +17 -3
- package/dist/nucleus/delegation-gate.d.ts +14 -8
- package/dist/nucleus/delegation-gate.js +151 -16
- package/dist/nucleus/suit-temperament.d.ts +40 -0
- package/dist/nucleus/suit-temperament.js +157 -0
- package/dist/nucleus/user-aside.js +1 -1
- package/dist/plugin/xray-codex-injection.js +14 -3
- package/dist/postprocessor/triggers/GitHookTrigger.js +11 -5
- package/opencode.json +80 -0
- package/package.json +15 -5
- package/scripts/hooks/install-hooks.cjs +18 -3
- package/scripts/hooks/run-hook.js +67 -3
- package/scripts/mjs/run-repertoire-mcp.mjs +39 -0
- package/scripts/mjs/verify-confer-core.mjs +1 -1
- package/scripts/mjs/verify-delegation-gate-core.mjs +29 -2
- package/scripts/mjs/verify-four-floor-compact.mjs +524 -0
- package/scripts/mjs/verify-pipeline-facets.mjs +215 -0
- package/scripts/mjs/verify-temperament-live.mjs +261 -0
- package/scripts/node/bridge-mcp-wiring.cjs +277 -29
- package/scripts/node/consumer-install-smoke.mjs +55 -2
- package/scripts/node/install-bridges.cjs +195 -33
- package/scripts/node/postinstall.cjs +50 -27
- package/scripts/node/reconcile-version.mjs +0 -4
- package/scripts/node/release-gate.mjs +1 -1
- package/scripts/node/release.mjs +2 -2
- package/scripts/node/universal-version-manager.js +1 -1
- package/scripts/node/validate-release-docs.mjs +20 -33
- package/scripts/node/version-manager.mjs +63 -18
- package/src/integrations/grok/plugin/0xray/hooks/hooks.json +31 -24
- package/src/integrations/openclaw/README.md +134 -0
- package/src/integrations/openclaw/plugin/xray-pre-tool/index.js +75 -0
- package/src/integrations/openclaw/plugin/xray-pre-tool/openclaw.plugin.json +10 -0
- package/src/integrations/openclaw/plugin/xray-pre-tool/package.json +12 -0
- package/src/mcps/orchestrator/handlers/complexity-handler.ts +2 -1
- package/vendor/@0xray/repertoire/AGENTS.md +163 -0
- package/vendor/@0xray/repertoire/LICENSE +21 -0
- package/vendor/@0xray/repertoire/README.md +120 -0
- package/vendor/@0xray/repertoire/data/curated_signals.json +208 -0
- package/vendor/@0xray/repertoire/dist/RepertoireService.d.ts +78 -0
- package/vendor/@0xray/repertoire/dist/RepertoireService.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/RepertoireService.js +153 -0
- package/vendor/@0xray/repertoire/dist/RepertoireService.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/governance/ontological-trap-enforcer.d.ts +39 -0
- package/vendor/@0xray/repertoire/dist/governance/ontological-trap-enforcer.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/governance/ontological-trap-enforcer.js +60 -0
- package/vendor/@0xray/repertoire/dist/governance/ontological-trap-enforcer.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/index.d.ts +14 -0
- package/vendor/@0xray/repertoire/dist/index.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/index.js +14 -0
- package/vendor/@0xray/repertoire/dist/index.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/ingestion/groover-log-ingester.d.ts +26 -0
- package/vendor/@0xray/repertoire/dist/ingestion/groover-log-ingester.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/ingestion/groover-log-ingester.js +109 -0
- package/vendor/@0xray/repertoire/dist/ingestion/groover-log-ingester.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/ingestion/groover-log-parser.d.ts +18 -0
- package/vendor/@0xray/repertoire/dist/ingestion/groover-log-parser.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/ingestion/groover-log-parser.js +94 -0
- package/vendor/@0xray/repertoire/dist/ingestion/groover-log-parser.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/ingestion/orchestrator-feedback-ingester.d.ts +7 -0
- package/vendor/@0xray/repertoire/dist/ingestion/orchestrator-feedback-ingester.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/ingestion/orchestrator-feedback-ingester.js +18 -0
- package/vendor/@0xray/repertoire/dist/ingestion/orchestrator-feedback-ingester.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/ingestion/xray-session-ingester.d.ts +31 -0
- package/vendor/@0xray/repertoire/dist/ingestion/xray-session-ingester.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/ingestion/xray-session-ingester.js +83 -0
- package/vendor/@0xray/repertoire/dist/ingestion/xray-session-ingester.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/mcp/server.d.ts +6 -0
- package/vendor/@0xray/repertoire/dist/mcp/server.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/mcp/server.js +173 -0
- package/vendor/@0xray/repertoire/dist/mcp/server.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/RepertoireOrchestratorBridge.d.ts +27 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/RepertoireOrchestratorBridge.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/RepertoireOrchestratorBridge.js +107 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/RepertoireOrchestratorBridge.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/capability-enhancer.d.ts +11 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/capability-enhancer.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/capability-enhancer.js +32 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/capability-enhancer.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/confidence-gate.d.ts +9 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/confidence-gate.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/confidence-gate.js +72 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/confidence-gate.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-agent-affinity.d.ts +5 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-agent-affinity.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-agent-affinity.js +18 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-agent-affinity.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-injector.d.ts +31 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-injector.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-injector.js +218 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-injector.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/paths.d.ts +24 -0
- package/vendor/@0xray/repertoire/dist/paths.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/paths.js +74 -0
- package/vendor/@0xray/repertoire/dist/paths.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/provider/memory-routing-provider.d.ts +141 -0
- package/vendor/@0xray/repertoire/dist/provider/memory-routing-provider.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/provider/memory-routing-provider.js +210 -0
- package/vendor/@0xray/repertoire/dist/provider/memory-routing-provider.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/registry/CuratedSignalsManager.d.ts +48 -0
- package/vendor/@0xray/repertoire/dist/registry/CuratedSignalsManager.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/registry/CuratedSignalsManager.js +221 -0
- package/vendor/@0xray/repertoire/dist/registry/CuratedSignalsManager.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/registry/InferenceStateManager.d.ts +11 -0
- package/vendor/@0xray/repertoire/dist/registry/InferenceStateManager.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/registry/InferenceStateManager.js +43 -0
- package/vendor/@0xray/repertoire/dist/registry/InferenceStateManager.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/registry/signal-prune.d.ts +15 -0
- package/vendor/@0xray/repertoire/dist/registry/signal-prune.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/registry/signal-prune.js +35 -0
- package/vendor/@0xray/repertoire/dist/registry/signal-prune.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/synthesis/concrete-sections.d.ts +3 -0
- package/vendor/@0xray/repertoire/dist/synthesis/concrete-sections.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/synthesis/concrete-sections.js +24 -0
- package/vendor/@0xray/repertoire/dist/synthesis/concrete-sections.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/synthesis/meta-inference-engine.d.ts +24 -0
- package/vendor/@0xray/repertoire/dist/synthesis/meta-inference-engine.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/synthesis/meta-inference-engine.js +148 -0
- package/vendor/@0xray/repertoire/dist/synthesis/meta-inference-engine.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/synthesis/primitive-confidence-aggregator.d.ts +4 -0
- package/vendor/@0xray/repertoire/dist/synthesis/primitive-confidence-aggregator.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/synthesis/primitive-confidence-aggregator.js +44 -0
- package/vendor/@0xray/repertoire/dist/synthesis/primitive-confidence-aggregator.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/synthesis/synthesis-prompt-builder.d.ts +22 -0
- package/vendor/@0xray/repertoire/dist/synthesis/synthesis-prompt-builder.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/synthesis/synthesis-prompt-builder.js +66 -0
- package/vendor/@0xray/repertoire/dist/synthesis/synthesis-prompt-builder.js.map +1 -0
- package/vendor/@0xray/repertoire/dist/types.d.ts +210 -0
- package/vendor/@0xray/repertoire/dist/types.d.ts.map +1 -0
- package/vendor/@0xray/repertoire/dist/types.js +2 -0
- package/vendor/@0xray/repertoire/dist/types.js.map +1 -0
- package/vendor/@0xray/repertoire/docs/MEMORY-ROUTING-PROVIDER.md +54 -0
- package/vendor/@0xray/repertoire/hermes-mcp.example.json +20 -0
- package/vendor/@0xray/repertoire/mcp-config.example.json +11 -0
- package/vendor/@0xray/repertoire/package.json +124 -0
- package/vendor/@0xray/repertoire/schemas/curated-signal.schema.json +68 -0
- package/vendor/@0xray/repertoire/schemas/inference-log.schema.json +82 -0
- package/vendor/@0xray/repertoire/scripts/confirm-suit-all.mjs +253 -0
- package/vendor/@0xray/repertoire/scripts/confirm-suit-harness.mjs +220 -0
- package/vendor/@0xray/repertoire/scripts/run-live-synthesis-checkpoint.mjs +215 -0
- package/vendor/@0xray/repertoire/scripts/suit-bridge-shared.mjs +139 -0
- package/vendor/@0xray/repertoire/scripts/verify-grok-suit.mjs +304 -0
- package/vendor/@0xray/repertoire/scripts/verify-hermes-suit.mjs +163 -0
- package/vendor/@0xray/repertoire/scripts/verify-openclaw-suit.mjs +125 -0
- package/vendor/@0xray/repertoire/scripts/verify-opencode-suit.mjs +127 -0
- package/vendor/@0xray/repertoire/scripts/verify-synthesis-dogfood.mjs +207 -0
- package/vendor/@0xray/repertoire/skills/repertoire-trap-handling/SKILL.md +206 -0
- package/xray/codex.json +12 -3
- package/xray/features.json +28 -6
- package/xray/features.schema.json +31 -0
|
@@ -7,7 +7,7 @@ import { getOrCreateLogger } from "./plugin-logger.js";
|
|
|
7
7
|
import { resolveStateDir, importSystemPromptGenerator, loadXrayComponents, getProcessorManager, getXrayStateManager, getFeaturesConfigLoader, getDetectTaskType, getSystemPromptGenerator, } from "./plugin-modules.js";
|
|
8
8
|
import { getFrameworkIdentity, classifyTaskType, isWriteEditOperation, isPublishOperation, resolveAgentName, registerAllProcessors, registerAfterPostProcessors, logPreProcessorResults, logPostProcessorResults, logTestAutoCreationResult, spawnPromise, } from "./plugin-helpers.js";
|
|
9
9
|
import { runEnforcerQualityGate } from "./plugin-quality-gate.js";
|
|
10
|
-
import { evaluatePostToolSpawn, evaluatePreToolGate, isSubagentTool, loadDelegationGateFeatures, } from "../nucleus/delegation-gate.js";
|
|
10
|
+
import { evaluatePostToolSpawn, evaluatePreToolGate, isSubagentTool, loadDelegationGateFeatures, writeSuitSessionBoot, } from "../nucleus/delegation-gate.js";
|
|
11
11
|
import { readFileSync } from "fs";
|
|
12
12
|
import { join } from "path";
|
|
13
13
|
// Re-export all public API for test compatibility
|
|
@@ -23,6 +23,15 @@ let _lastTuneToolCallCount = 0;
|
|
|
23
23
|
export default async function xrayCodexPlugin(input) {
|
|
24
24
|
const { directory: inputDirectory } = input;
|
|
25
25
|
const directory = inputDirectory || process.cwd();
|
|
26
|
+
try {
|
|
27
|
+
writeSuitSessionBoot(directory, "opencode", {
|
|
28
|
+
source: "0xray/opencode-plugin",
|
|
29
|
+
hookEvent: process.env.XRAY_HOOK_EVENT || "session_start",
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
/* session-boot is best-effort */
|
|
34
|
+
}
|
|
26
35
|
return {
|
|
27
36
|
"experimental.chat.system.transform": async (_input, output) => {
|
|
28
37
|
try {
|
|
@@ -40,7 +49,9 @@ export default async function xrayCodexPlugin(input) {
|
|
|
40
49
|
});
|
|
41
50
|
}
|
|
42
51
|
if (output.system && Array.isArray(output.system)) {
|
|
43
|
-
|
|
52
|
+
const cardPath = path.join(directory, ".xray", "state", "STATION.md");
|
|
53
|
+
const card = fs.existsSync(cardPath) ? fs.readFileSync(cardPath, "utf8").trim() : "";
|
|
54
|
+
output.system = card ? [leanPrompt, card] : [leanPrompt];
|
|
44
55
|
}
|
|
45
56
|
}
|
|
46
57
|
catch (error) {
|
|
@@ -84,7 +95,7 @@ export default async function xrayCodexPlugin(input) {
|
|
|
84
95
|
throw new Error(`ENFORCER BLOCKED: ${qualityGateResult.violations.join("; ")}`);
|
|
85
96
|
}
|
|
86
97
|
logger.log(`✅ Quality gate passed for ${tool}`);
|
|
87
|
-
const features = loadDelegationGateFeatures(directory);
|
|
98
|
+
const features = loadDelegationGateFeatures(directory, "opencode");
|
|
88
99
|
let sessionId = process.env.GROK_SESSION_ID ?? null;
|
|
89
100
|
try {
|
|
90
101
|
const boot = JSON.parse(readFileSync(join(directory, ".xray", "state", "session-boot.json"), "utf8"));
|
|
@@ -397,10 +397,16 @@ fi
|
|
|
397
397
|
(async () => {
|
|
398
398
|
try {
|
|
399
399
|
// Use dynamic import that works in both dev and consumer
|
|
400
|
-
const
|
|
401
|
-
const
|
|
402
|
-
|
|
403
|
-
const
|
|
400
|
+
const { pathToFileURL } = await import('url');
|
|
401
|
+
const { existsSync } = await import('fs');
|
|
402
|
+
const { join } = await import('path');
|
|
403
|
+
const candidates = [
|
|
404
|
+
join(process.cwd(), 'node_modules/0xray/dist/postprocessor/triggers/GitHookTrigger.js'),
|
|
405
|
+
join(process.cwd(), 'dist/postprocessor/triggers/GitHookTrigger.js'),
|
|
406
|
+
];
|
|
407
|
+
const triggerPath = candidates.find((p) => existsSync(p));
|
|
408
|
+
if (!triggerPath) return;
|
|
409
|
+
const { archiveLogFiles } = await import(pathToFileURL(triggerPath).href);
|
|
404
410
|
const archiveResult = await archiveLogFiles({
|
|
405
411
|
archiveDirectory: 'logs/framework',
|
|
406
412
|
maxFileSizeMB: 10, // Archive if > 10MB
|
|
@@ -415,7 +421,7 @@ fi
|
|
|
415
421
|
}
|
|
416
422
|
|
|
417
423
|
// Then cleanup old files
|
|
418
|
-
const { cleanupLogFiles } = await import(
|
|
424
|
+
const { cleanupLogFiles } = await import(pathToFileURL(triggerPath).href);
|
|
419
425
|
const result = await cleanupLogFiles({
|
|
420
426
|
maxAgeHours: 24,
|
|
421
427
|
excludePatterns: [
|
package/opencode.json
CHANGED
|
@@ -16,6 +16,86 @@
|
|
|
16
16
|
},
|
|
17
17
|
"global-git": {
|
|
18
18
|
"enabled": false
|
|
19
|
+
},
|
|
20
|
+
"xray-governance": {
|
|
21
|
+
"type": "local",
|
|
22
|
+
"command": [
|
|
23
|
+
"npx",
|
|
24
|
+
"-y",
|
|
25
|
+
"0xray",
|
|
26
|
+
"mcp",
|
|
27
|
+
"governance"
|
|
28
|
+
],
|
|
29
|
+
"enabled": true,
|
|
30
|
+
"environment": {
|
|
31
|
+
"XRAY_FORCE_MCP_GOVERNANCE": "true"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"xray-skills": {
|
|
35
|
+
"type": "local",
|
|
36
|
+
"command": [
|
|
37
|
+
"npx",
|
|
38
|
+
"-y",
|
|
39
|
+
"0xray",
|
|
40
|
+
"mcp",
|
|
41
|
+
"skills"
|
|
42
|
+
],
|
|
43
|
+
"enabled": true
|
|
44
|
+
},
|
|
45
|
+
"xray-orchestrator": {
|
|
46
|
+
"type": "local",
|
|
47
|
+
"command": [
|
|
48
|
+
"npx",
|
|
49
|
+
"-y",
|
|
50
|
+
"0xray",
|
|
51
|
+
"mcp",
|
|
52
|
+
"orchestrator"
|
|
53
|
+
],
|
|
54
|
+
"enabled": true
|
|
55
|
+
},
|
|
56
|
+
"xray-enforcer": {
|
|
57
|
+
"type": "local",
|
|
58
|
+
"command": [
|
|
59
|
+
"npx",
|
|
60
|
+
"-y",
|
|
61
|
+
"0xray",
|
|
62
|
+
"mcp",
|
|
63
|
+
"enforcer"
|
|
64
|
+
],
|
|
65
|
+
"enabled": true
|
|
66
|
+
},
|
|
67
|
+
"xray-researcher": {
|
|
68
|
+
"type": "local",
|
|
69
|
+
"command": [
|
|
70
|
+
"npx",
|
|
71
|
+
"-y",
|
|
72
|
+
"0xray",
|
|
73
|
+
"mcp",
|
|
74
|
+
"researcher"
|
|
75
|
+
],
|
|
76
|
+
"enabled": true
|
|
77
|
+
},
|
|
78
|
+
"xray-code-review": {
|
|
79
|
+
"type": "local",
|
|
80
|
+
"command": [
|
|
81
|
+
"npx",
|
|
82
|
+
"-y",
|
|
83
|
+
"0xray",
|
|
84
|
+
"mcp",
|
|
85
|
+
"code-review"
|
|
86
|
+
],
|
|
87
|
+
"enabled": true
|
|
88
|
+
},
|
|
89
|
+
"xray-architect-tools": {
|
|
90
|
+
"type": "local",
|
|
91
|
+
"command": [
|
|
92
|
+
"npx",
|
|
93
|
+
"-y",
|
|
94
|
+
"0xray",
|
|
95
|
+
"mcp",
|
|
96
|
+
"architect-tools"
|
|
97
|
+
],
|
|
98
|
+
"enabled": true
|
|
19
99
|
}
|
|
20
100
|
},
|
|
21
101
|
"agent": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "0xray",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.1",
|
|
4
4
|
"description": "Multi-agent orchestration and Codex governance for OpenCode, Hermes, Grok Build, and OpenClaw",
|
|
5
5
|
"readme": "README.md",
|
|
6
6
|
"license": "MIT",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"version:bump": "node scripts/node/version-manager.mjs",
|
|
65
65
|
"version": "node scripts/node/version-manager.mjs",
|
|
66
66
|
"prebuild": "rm -rf dist tsconfig.tsbuildinfo tsconfig.*.tsbuildinfo",
|
|
67
|
-
"build": "tsc && chmod +x dist/cli/index.js && mkdir -p dist/public dist/scripts && cp -r public/* dist/public/ && cp scripts/hooks/pre-command dist/scripts/ && cp scripts/hooks/pre-command.mjs dist/scripts/ && cp README.md AGENTS.md SKILLS.md CHANGELOG.md LICENSE .gitignore.default dist/ && find src -name '*.mjs' ! -path '*/__tests__/*' | while read f; do tgt=\"dist/${f#src/}\"; mkdir -p \"$(dirname $tgt)\"; cp \"$f\" \"$tgt\"; done && for dir in skills integrations mcps; do find src/$dir -type f ! -name '*.ts' ! -path '*/.pytest_cache/*' | while read f; do tgt=\"dist/${f#src/}\"; mkdir -p \"$(dirname $tgt)\"; cp \"$f\" \"$tgt\"; done; done && mkdir -p dist/plugin && (find dist/plugin -name '*codex-injection*.js' -exec cp {} dist/plugin/xray-codex-injection.js \\; 2>/dev/null || true) && cp -r src/opencode/ .opencode/ && mkdir -p .xray && for f in codex.json features.json features.schema.json config.json; do cp xray/$f .xray/$f 2>/dev/null || true; done",
|
|
67
|
+
"build": "tsc && chmod +x dist/cli/index.js && mkdir -p dist/public dist/scripts && cp -r public/* dist/public/ && cp scripts/hooks/pre-command dist/scripts/ && cp scripts/hooks/pre-command.mjs dist/scripts/ && cp README.md AGENTS.md SKILLS.md CHANGELOG.md LICENSE .gitignore.default dist/ && find src -name '*.mjs' ! -path '*/__tests__/*' | while read f; do tgt=\"dist/${f#src/}\"; mkdir -p \"$(dirname $tgt)\"; cp \"$f\" \"$tgt\"; done && for dir in skills integrations mcps; do find src/$dir -type f ! -name '*.ts' ! -path '*/.pytest_cache/*' | while read f; do tgt=\"dist/${f#src/}\"; mkdir -p \"$(dirname $tgt)\"; cp \"$f\" \"$tgt\"; done; done && mkdir -p dist/plugin && (find dist/plugin -name '*codex-injection*.js' -exec cp {} dist/plugin/xray-codex-injection.js \\; 2>/dev/null || true) && cp -r src/opencode/ .opencode/ && mkdir -p .opencode/skills && cp -R src/skills/. .opencode/skills/ && mkdir -p .xray && for f in codex.json features.json features.schema.json config.json; do cp xray/$f .xray/$f 2>/dev/null || true; done",
|
|
68
68
|
"build:all": "npm run build",
|
|
69
69
|
"ci-install": "npm ci",
|
|
70
70
|
"clean": "rm -rf dist tsconfig.tsbuildinfo tsconfig.*.tsbuildinfo",
|
|
@@ -124,7 +124,7 @@
|
|
|
124
124
|
"release:docs-check": "node scripts/node/validate-release-docs.mjs",
|
|
125
125
|
"pre-publish-guard": "node scripts/node/pre-publish-guard.js",
|
|
126
126
|
"safe-publish": "npm run prepare-consumer && npm run build",
|
|
127
|
-
"
|
|
127
|
+
"release:npm": "npm run release:gate && npm run safe-publish && npm publish --access public",
|
|
128
128
|
"release:patch": "node scripts/node/release.mjs patch",
|
|
129
129
|
"verify:orchestrator-behavior": "npm run build && node scripts/mjs/verify-orchestrator-behavior.mjs",
|
|
130
130
|
"verify:grok-delegation-gate": "npm run build && node scripts/mjs/verify-grok-delegation-gate.mjs && node scripts/mjs/verify-grok-synthesis-gate.mjs",
|
|
@@ -138,7 +138,10 @@
|
|
|
138
138
|
"verify:find-project-root": "node scripts/mjs/verify-find-project-root-core.mjs",
|
|
139
139
|
"verify:consumer-gitignore": "node scripts/mjs/verify-consumer-gitignore-core.mjs",
|
|
140
140
|
"verify:pre-commit-diff": "node scripts/mjs/verify-pre-commit-diff-core.mjs",
|
|
141
|
-
"verify:pre-push-diff": "node scripts/mjs/verify-pre-push-diff-core.mjs"
|
|
141
|
+
"verify:pre-push-diff": "node scripts/mjs/verify-pre-push-diff-core.mjs",
|
|
142
|
+
"verify:temperament-live": "node scripts/mjs/verify-temperament-live.mjs",
|
|
143
|
+
"verify:four-floor-compact": "node scripts/mjs/verify-four-floor-compact.mjs",
|
|
144
|
+
"verify:four-floor-compact:live": "XRAY_LIVE_SUCCESSOR=1 node scripts/mjs/verify-four-floor-compact.mjs"
|
|
142
145
|
},
|
|
143
146
|
"files": [
|
|
144
147
|
"dist/",
|
|
@@ -158,6 +161,10 @@
|
|
|
158
161
|
"scripts/mjs/verify-pre-push-diff-core.mjs",
|
|
159
162
|
"scripts/mjs/verify-confer-core.mjs",
|
|
160
163
|
"scripts/mjs/verify-user-aside-core.mjs",
|
|
164
|
+
"scripts/mjs/verify-pipeline-facets.mjs",
|
|
165
|
+
"scripts/mjs/verify-temperament-live.mjs",
|
|
166
|
+
"scripts/mjs/verify-four-floor-compact.mjs",
|
|
167
|
+
"scripts/mjs/run-repertoire-mcp.mjs",
|
|
161
168
|
"scripts/mjs/verify-delegation-gate-core.mjs",
|
|
162
169
|
"scripts/mjs/delegation-gate-fixture.mjs",
|
|
163
170
|
"src/opencode/",
|
|
@@ -167,6 +174,7 @@
|
|
|
167
174
|
"src/opencode/openclaw/",
|
|
168
175
|
"src/opencode/workflows/",
|
|
169
176
|
"src/integrations/grok/plugin/0xray/",
|
|
177
|
+
"src/integrations/openclaw/plugin/",
|
|
170
178
|
"src/skills/",
|
|
171
179
|
"src/mcps/",
|
|
172
180
|
".plugin/",
|
|
@@ -194,9 +202,11 @@
|
|
|
194
202
|
".xray/features.schema.json",
|
|
195
203
|
".xray/config.json",
|
|
196
204
|
".gitignore.default",
|
|
197
|
-
"LICENSE"
|
|
205
|
+
"LICENSE",
|
|
206
|
+
"vendor/@0xray/repertoire/"
|
|
198
207
|
],
|
|
199
208
|
"dependencies": {
|
|
209
|
+
"@0xray/repertoire": "file:./vendor/@0xray/repertoire",
|
|
200
210
|
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
201
211
|
"commander": "^11.1.0",
|
|
202
212
|
"express": "^5.2.1",
|
|
@@ -30,19 +30,34 @@ if (!fs.existsSync(gitHooksDir)) {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
const isConsumer = packageRoot.includes("node_modules");
|
|
33
|
+
|
|
34
|
+
function firstExistingRelative(root, rels) {
|
|
35
|
+
return rels.find((rel) => fs.existsSync(path.join(root, rel))) || rels[0];
|
|
36
|
+
}
|
|
37
|
+
|
|
33
38
|
const runHookRelativePath = isConsumer
|
|
34
|
-
?
|
|
39
|
+
? firstExistingRelative(targetDir, [
|
|
40
|
+
"node_modules/0xray/scripts/hooks/run-hook.js",
|
|
41
|
+
"node_modules/0xray/dist/scripts/hooks/run-hook.js",
|
|
42
|
+
])
|
|
35
43
|
: "scripts/hooks/run-hook.js";
|
|
36
44
|
const loadReflectionRelativePath = isConsumer
|
|
37
|
-
?
|
|
45
|
+
? firstExistingRelative(targetDir, [
|
|
46
|
+
"node_modules/0xray/scripts/node/load-reflection-config.mjs",
|
|
47
|
+
"node_modules/0xray/dist/scripts/node/load-reflection-config.mjs",
|
|
48
|
+
])
|
|
38
49
|
: "scripts/node/load-reflection-config.mjs";
|
|
39
50
|
const autoReflectionRelativePath = isConsumer
|
|
40
|
-
?
|
|
51
|
+
? firstExistingRelative(targetDir, [
|
|
52
|
+
"node_modules/0xray/scripts/node/auto-reflection-generator.mjs",
|
|
53
|
+
"node_modules/0xray/dist/scripts/node/auto-reflection-generator.mjs",
|
|
54
|
+
])
|
|
41
55
|
: "scripts/node/auto-reflection-generator.mjs";
|
|
42
56
|
|
|
43
57
|
function hookRunnerExists(projectRoot) {
|
|
44
58
|
return (
|
|
45
59
|
fs.existsSync(path.join(projectRoot, "node_modules/0xray/scripts/hooks/run-hook.js")) ||
|
|
60
|
+
fs.existsSync(path.join(projectRoot, "node_modules/0xray/dist/scripts/hooks/run-hook.js")) ||
|
|
46
61
|
fs.existsSync(path.join(projectRoot, "scripts/hooks/run-hook.js"))
|
|
47
62
|
);
|
|
48
63
|
}
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
import { existsSync, readFileSync, writeFileSync, mkdirSync, appendFileSync } from "fs";
|
|
23
23
|
import { join, dirname, resolve } from "path";
|
|
24
24
|
import { execSync, exec, execFileSync } from "child_process";
|
|
25
|
-
import { fileURLToPath } from "url";
|
|
25
|
+
import { fileURLToPath, pathToFileURL } from "url";
|
|
26
26
|
|
|
27
27
|
// ── Parse arguments ──────────────────────────────────────────
|
|
28
28
|
|
|
@@ -372,9 +372,9 @@ async function runLogMaintenance() {
|
|
|
372
372
|
|
|
373
373
|
try {
|
|
374
374
|
const distDirs = [
|
|
375
|
-
join(projectRoot, "dist"),
|
|
376
375
|
join(projectRoot, "node_modules", "0xray", "dist"),
|
|
377
376
|
join(projectRoot, "node_modules", "xray", "dist"),
|
|
377
|
+
join(projectRoot, "dist"),
|
|
378
378
|
];
|
|
379
379
|
|
|
380
380
|
for (const distDir of distDirs) {
|
|
@@ -382,7 +382,9 @@ async function runLogMaintenance() {
|
|
|
382
382
|
if (!existsSync(triggerPath)) continue;
|
|
383
383
|
|
|
384
384
|
try {
|
|
385
|
-
const { archiveLogFiles, cleanupLogFiles } = await import(
|
|
385
|
+
const { archiveLogFiles, cleanupLogFiles } = await import(
|
|
386
|
+
pathToFileURL(triggerPath).href
|
|
387
|
+
);
|
|
386
388
|
|
|
387
389
|
// Archive logs
|
|
388
390
|
try {
|
|
@@ -541,6 +543,67 @@ async function handlePreCommit() {
|
|
|
541
543
|
process.exit(0);
|
|
542
544
|
}
|
|
543
545
|
|
|
546
|
+
function loadFeaturesJson() {
|
|
547
|
+
const featuresPath = join(projectRoot, ".xray", "features.json");
|
|
548
|
+
if (!existsSync(featuresPath)) return {};
|
|
549
|
+
try {
|
|
550
|
+
return JSON.parse(readFileSync(featuresPath, "utf-8"));
|
|
551
|
+
} catch {
|
|
552
|
+
return {};
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
function resolveXrayDistModule(relPath) {
|
|
557
|
+
const candidates = [
|
|
558
|
+
join(projectRoot, "node_modules", "0xray", "dist", relPath),
|
|
559
|
+
join(projectRoot, "node_modules", "xray", "dist", relPath),
|
|
560
|
+
join(projectRoot, "dist", relPath),
|
|
561
|
+
];
|
|
562
|
+
return candidates.find((p) => existsSync(p)) || null;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
async function runSessionInferenceCapture() {
|
|
566
|
+
const features = loadFeaturesJson();
|
|
567
|
+
const cfg = features.inference_session_capture ?? {};
|
|
568
|
+
if (cfg.enabled !== true) {
|
|
569
|
+
log("Session inference capture disabled");
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
const modulePath = resolveXrayDistModule("inference/session-capture.js");
|
|
574
|
+
if (!modulePath) {
|
|
575
|
+
log("Session capture module missing (node_modules/0xray/dist or dist)");
|
|
576
|
+
return;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
const minCommits = typeof cfg.min_commits === "number" && cfg.min_commits > 0
|
|
580
|
+
? cfg.min_commits
|
|
581
|
+
: 3;
|
|
582
|
+
const lookback = typeof cfg.lookback_commits === "number" && cfg.lookback_commits > 0
|
|
583
|
+
? cfg.lookback_commits
|
|
584
|
+
: 20;
|
|
585
|
+
|
|
586
|
+
try {
|
|
587
|
+
const mod = await import(pathToFileURL(modulePath).href);
|
|
588
|
+
const inference = mod.captureSessionInference(`HEAD~${lookback}`, "HEAD");
|
|
589
|
+
if (!inference) {
|
|
590
|
+
log("Session capture: no commits in span");
|
|
591
|
+
return;
|
|
592
|
+
}
|
|
593
|
+
if ((inference.metrics?.commits ?? 0) < minCommits) {
|
|
594
|
+
log(
|
|
595
|
+
`Session capture: ${inference.metrics?.commits ?? 0} commits < min ${minCommits}`,
|
|
596
|
+
);
|
|
597
|
+
return;
|
|
598
|
+
}
|
|
599
|
+
const outDir = join(projectRoot, "docs", "inference");
|
|
600
|
+
const saved = mod.saveSessionInference(inference, outDir);
|
|
601
|
+
log(`Session capture saved ${saved}`);
|
|
602
|
+
} catch (err) {
|
|
603
|
+
logError(`Session capture failed: ${err.message}`);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
|
|
544
607
|
async function handlePostCommit() {
|
|
545
608
|
const commitSha = process.env.COMMIT_SHA || "unknown";
|
|
546
609
|
const branch = process.env.BRANCH || "unknown";
|
|
@@ -549,6 +612,7 @@ async function handlePostCommit() {
|
|
|
549
612
|
|
|
550
613
|
// Run log maintenance
|
|
551
614
|
await runLogMaintenance();
|
|
615
|
+
await runSessionInferenceCapture();
|
|
552
616
|
|
|
553
617
|
// Record metrics
|
|
554
618
|
recordMetrics(0, 0);
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CWD-proof Repertoire MCP launcher for the 0xray framework checkout.
|
|
4
|
+
* Grok/OpenCode spawn this in-repo path so they never have to resolve `../repertoire`.
|
|
5
|
+
*/
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
import { existsSync } from 'node:fs';
|
|
8
|
+
import { dirname, join } from 'node:path';
|
|
9
|
+
import { fileURLToPath } from 'node:url';
|
|
10
|
+
|
|
11
|
+
const xrayRoot = join(dirname(fileURLToPath(import.meta.url)), '../..');
|
|
12
|
+
const candidates = [
|
|
13
|
+
join(xrayRoot, 'node_modules', '@0xray', 'repertoire', 'dist', 'mcp', 'server.js'),
|
|
14
|
+
join(xrayRoot, 'vendor', '@0xray', 'repertoire', 'dist', 'mcp', 'server.js'),
|
|
15
|
+
join(xrayRoot, '..', 'repertoire', 'dist', 'mcp', 'server.js'),
|
|
16
|
+
];
|
|
17
|
+
const server = candidates.find((p) => existsSync(p));
|
|
18
|
+
if (!server) {
|
|
19
|
+
process.stderr.write(
|
|
20
|
+
'repertoire MCP missing — build ../repertoire or install @0xray/repertoire\n',
|
|
21
|
+
);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const child = spawn(process.execPath, [server], {
|
|
26
|
+
stdio: 'inherit',
|
|
27
|
+
env: process.env,
|
|
28
|
+
});
|
|
29
|
+
child.on('error', (err) => {
|
|
30
|
+
process.stderr.write(`repertoire MCP spawn failed: ${err.message}\n`);
|
|
31
|
+
process.exit(1);
|
|
32
|
+
});
|
|
33
|
+
child.on('exit', (code, signal) => {
|
|
34
|
+
if (signal) {
|
|
35
|
+
process.kill(process.pid, signal);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
process.exit(code ?? 1);
|
|
39
|
+
});
|
|
@@ -48,7 +48,7 @@ try {
|
|
|
48
48
|
if (!isSynthesisCheckpointDue(tmp, sessionId)) fail('step 1: synthesis due');
|
|
49
49
|
else pass('step 1: synthesis checkpoint due');
|
|
50
50
|
|
|
51
|
-
const plan = buildSynthesisCheckpointPlan('gate threshold (1/1)');
|
|
51
|
+
const plan = buildSynthesisCheckpointPlan('gate threshold (1/1)', tmp);
|
|
52
52
|
if (!plan) fail('step 2: synthesis plan');
|
|
53
53
|
else {
|
|
54
54
|
savePersistedLeadDevPlan(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Shared
|
|
3
|
+
* Shared 6/6 delegation gate fixture against nucleus SSOT (any host adapter).
|
|
4
4
|
* Usage: node scripts/mjs/verify-delegation-gate-core.mjs [--host=grok|hermes|opencode]
|
|
5
5
|
*/
|
|
6
6
|
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
@@ -22,6 +22,9 @@ const host = hostArg?.split('=')[1] || 'generic';
|
|
|
22
22
|
const { evaluatePreToolGate, loadDelegationGateFeatures } = await import(
|
|
23
23
|
join(packageRoot, 'dist/integrations/hooks/delegation-gate-runtime.mjs')
|
|
24
24
|
);
|
|
25
|
+
const { archiveStaleLeadDevPlan } = await import(
|
|
26
|
+
join(packageRoot, 'dist/nucleus/lead-dev-plan-persistence.js')
|
|
27
|
+
);
|
|
25
28
|
|
|
26
29
|
const WRITE_TOOL =
|
|
27
30
|
host === 'hermes' ? 'write_file' : host === 'opencode' ? 'write' : 'search_replace';
|
|
@@ -130,6 +133,30 @@ try {
|
|
|
130
133
|
} else {
|
|
131
134
|
fail('spawn plan stale', JSON.stringify(denyStale));
|
|
132
135
|
}
|
|
136
|
+
|
|
137
|
+
const archived = archiveStaleLeadDevPlan(staleTmp);
|
|
138
|
+
const denyAfterArchive = evaluatePreToolGate(
|
|
139
|
+
SPAWN_TOOL,
|
|
140
|
+
{ prompt: 'plan todo 1.1 consult', subagent_type: 'researcher' },
|
|
141
|
+
{
|
|
142
|
+
projectRoot: staleTmp,
|
|
143
|
+
sessionId: FIXTURE_SESSION_ID,
|
|
144
|
+
features: loadDelegationGateFeatures(staleTmp),
|
|
145
|
+
host,
|
|
146
|
+
},
|
|
147
|
+
);
|
|
148
|
+
if (
|
|
149
|
+
archived.archived &&
|
|
150
|
+
!denyAfterArchive.allow &&
|
|
151
|
+
denyAfterArchive.gate === 'spawn-plan-stale'
|
|
152
|
+
) {
|
|
153
|
+
pass('denies spawn after stale plan archival (marker)');
|
|
154
|
+
} else {
|
|
155
|
+
fail(
|
|
156
|
+
'spawn plan stale after archive',
|
|
157
|
+
JSON.stringify({ archived, denyAfterArchive }),
|
|
158
|
+
);
|
|
159
|
+
}
|
|
133
160
|
rmSync(staleTmp, { recursive: true, force: true });
|
|
134
161
|
} finally {
|
|
135
162
|
rmSync(tmp, { recursive: true, force: true });
|
|
@@ -139,7 +166,7 @@ const label = host === 'generic' ? 'core' : host;
|
|
|
139
166
|
console.log(
|
|
140
167
|
'\n' +
|
|
141
168
|
(failed === 0
|
|
142
|
-
? `🎉 Delegation gate verify passed (
|
|
169
|
+
? `🎉 Delegation gate verify passed (6/6) [${label}].`
|
|
143
170
|
: `⚠️ ${failed} gate check(s) failed [${label}].`),
|
|
144
171
|
);
|
|
145
172
|
process.exit(failed === 0 ? 0 : 1);
|