@moreih29/nexus-core 0.12.0 → 0.14.0
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 +76 -57
- package/assets/agents/architect/body.ko.md +177 -0
- package/{agents → assets/agents}/architect/body.md +16 -0
- package/assets/agents/designer/body.ko.md +125 -0
- package/{agents → assets/agents}/designer/body.md +16 -0
- package/assets/agents/engineer/body.ko.md +106 -0
- package/{agents → assets/agents}/engineer/body.md +14 -0
- package/assets/agents/lead/body.ko.md +70 -0
- package/assets/agents/lead/body.md +70 -0
- package/assets/agents/postdoc/body.ko.md +122 -0
- package/{agents → assets/agents}/postdoc/body.md +16 -0
- package/assets/agents/researcher/body.ko.md +137 -0
- package/{agents → assets/agents}/researcher/body.md +15 -0
- package/assets/agents/reviewer/body.ko.md +138 -0
- package/{agents → assets/agents}/reviewer/body.md +15 -0
- package/assets/agents/strategist/body.ko.md +116 -0
- package/{agents → assets/agents}/strategist/body.md +16 -0
- package/assets/agents/tester/body.ko.md +195 -0
- package/{agents → assets/agents}/tester/body.md +15 -0
- package/assets/agents/writer/body.ko.md +122 -0
- package/{agents → assets/agents}/writer/body.md +14 -0
- package/assets/capability-matrix.yml +198 -0
- package/assets/hooks/agent-bootstrap/handler.test.ts +368 -0
- package/assets/hooks/agent-bootstrap/handler.ts +119 -0
- package/assets/hooks/agent-bootstrap/meta.yml +10 -0
- package/assets/hooks/agent-finalize/handler.test.ts +368 -0
- package/assets/hooks/agent-finalize/handler.ts +76 -0
- package/assets/hooks/agent-finalize/meta.yml +10 -0
- package/assets/hooks/capability-matrix.yml +313 -0
- package/assets/hooks/post-tool-telemetry/handler.test.ts +302 -0
- package/assets/hooks/post-tool-telemetry/handler.ts +49 -0
- package/assets/hooks/post-tool-telemetry/meta.yml +11 -0
- package/assets/hooks/prompt-router/handler.test.ts +801 -0
- package/assets/hooks/prompt-router/handler.ts +261 -0
- package/assets/hooks/prompt-router/meta.yml +11 -0
- package/assets/hooks/session-init/handler.test.ts +274 -0
- package/assets/hooks/session-init/handler.ts +30 -0
- package/assets/hooks/session-init/meta.yml +9 -0
- package/assets/lsp-servers.json +55 -0
- package/assets/schema/lsp-servers.schema.json +67 -0
- package/assets/skills/nx-init/body.ko.md +197 -0
- package/{skills → assets/skills}/nx-init/body.md +11 -0
- package/assets/skills/nx-plan/body.ko.md +361 -0
- package/{skills → assets/skills}/nx-plan/body.md +13 -0
- package/assets/skills/nx-run/body.ko.md +161 -0
- package/{skills → assets/skills}/nx-run/body.md +11 -0
- package/assets/skills/nx-sync/body.ko.md +92 -0
- package/{skills → assets/skills}/nx-sync/body.md +10 -0
- package/assets/tools/tool-name-map.yml +353 -0
- package/dist/assets/hooks/agent-bootstrap/handler.d.ts +4 -0
- package/dist/assets/hooks/agent-bootstrap/handler.d.ts.map +1 -0
- package/dist/assets/hooks/agent-bootstrap/handler.js +100 -0
- package/dist/assets/hooks/agent-bootstrap/handler.js.map +1 -0
- package/dist/assets/hooks/agent-finalize/handler.d.ts +4 -0
- package/dist/assets/hooks/agent-finalize/handler.d.ts.map +1 -0
- package/dist/assets/hooks/agent-finalize/handler.js +63 -0
- package/dist/assets/hooks/agent-finalize/handler.js.map +1 -0
- package/dist/assets/hooks/post-tool-telemetry/handler.d.ts +4 -0
- package/dist/assets/hooks/post-tool-telemetry/handler.d.ts.map +1 -0
- package/dist/assets/hooks/post-tool-telemetry/handler.js +40 -0
- package/dist/assets/hooks/post-tool-telemetry/handler.js.map +1 -0
- package/dist/assets/hooks/prompt-router/handler.d.ts +4 -0
- package/dist/assets/hooks/prompt-router/handler.d.ts.map +1 -0
- package/dist/assets/hooks/prompt-router/handler.js +204 -0
- package/dist/assets/hooks/prompt-router/handler.js.map +1 -0
- package/dist/assets/hooks/session-init/handler.d.ts +4 -0
- package/dist/assets/hooks/session-init/handler.d.ts.map +1 -0
- package/dist/assets/hooks/session-init/handler.js +23 -0
- package/dist/assets/hooks/session-init/handler.js.map +1 -0
- package/dist/hooks/agent-bootstrap.js +105 -0
- package/dist/hooks/agent-finalize.js +164 -0
- package/dist/hooks/post-tool-telemetry.js +55 -0
- package/dist/hooks/prompt-router.js +7300 -0
- package/dist/hooks/session-init.js +21 -0
- package/dist/manifests/claude-hooks.json +52 -0
- package/dist/manifests/codex-hooks.json +28 -0
- package/dist/manifests/opencode-manifest.json +44 -0
- package/dist/manifests/portability-report.json +87 -0
- package/dist/scripts/build-agents.d.ts +157 -0
- package/dist/scripts/build-agents.d.ts.map +1 -0
- package/dist/scripts/build-agents.js +737 -0
- package/dist/scripts/build-agents.js.map +1 -0
- package/dist/scripts/build-hooks.d.ts +16 -0
- package/dist/scripts/build-hooks.d.ts.map +1 -0
- package/dist/scripts/build-hooks.js +388 -0
- package/dist/scripts/build-hooks.js.map +1 -0
- package/dist/scripts/cli.d.ts +54 -0
- package/dist/scripts/cli.d.ts.map +1 -0
- package/dist/scripts/cli.js +467 -0
- package/dist/scripts/cli.js.map +1 -0
- package/dist/src/hooks/opencode-mount.d.ts +35 -0
- package/dist/src/hooks/opencode-mount.d.ts.map +1 -0
- package/dist/src/hooks/opencode-mount.js +352 -0
- package/dist/src/hooks/opencode-mount.js.map +1 -0
- package/dist/src/hooks/runtime.d.ts +37 -0
- package/dist/src/hooks/runtime.d.ts.map +1 -0
- package/dist/src/hooks/runtime.js +274 -0
- package/dist/src/hooks/runtime.js.map +1 -0
- package/dist/src/hooks/types.d.ts +196 -0
- package/dist/src/hooks/types.d.ts.map +1 -0
- package/dist/src/hooks/types.js +85 -0
- package/dist/src/hooks/types.js.map +1 -0
- package/dist/src/lsp/cache.d.ts +9 -0
- package/dist/src/lsp/cache.d.ts.map +1 -0
- package/dist/src/lsp/cache.js +216 -0
- package/dist/src/lsp/cache.js.map +1 -0
- package/dist/src/lsp/client.d.ts +24 -0
- package/dist/src/lsp/client.d.ts.map +1 -0
- package/dist/src/lsp/client.js +166 -0
- package/dist/src/lsp/client.js.map +1 -0
- package/dist/src/lsp/detect.d.ts +77 -0
- package/dist/src/lsp/detect.d.ts.map +1 -0
- package/dist/src/lsp/detect.js +116 -0
- package/dist/src/lsp/detect.js.map +1 -0
- package/dist/src/mcp/server.d.ts +5 -0
- package/dist/src/mcp/server.d.ts.map +1 -0
- package/dist/src/mcp/server.js +34 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/tools/artifact.d.ts +4 -0
- package/dist/src/mcp/tools/artifact.d.ts.map +1 -0
- package/dist/src/mcp/tools/artifact.js +36 -0
- package/dist/src/mcp/tools/artifact.js.map +1 -0
- package/dist/src/mcp/tools/history.d.ts +3 -0
- package/dist/src/mcp/tools/history.d.ts.map +1 -0
- package/dist/src/mcp/tools/history.js +29 -0
- package/dist/src/mcp/tools/history.js.map +1 -0
- package/dist/src/mcp/tools/lsp.d.ts +13 -0
- package/dist/src/mcp/tools/lsp.d.ts.map +1 -0
- package/dist/src/mcp/tools/lsp.js +225 -0
- package/dist/src/mcp/tools/lsp.js.map +1 -0
- package/dist/src/mcp/tools/plan.d.ts +3 -0
- package/dist/src/mcp/tools/plan.d.ts.map +1 -0
- package/dist/src/mcp/tools/plan.js +317 -0
- package/dist/src/mcp/tools/plan.js.map +1 -0
- package/dist/src/mcp/tools/task.d.ts +3 -0
- package/dist/src/mcp/tools/task.d.ts.map +1 -0
- package/dist/src/mcp/tools/task.js +252 -0
- package/dist/src/mcp/tools/task.js.map +1 -0
- package/dist/src/shared/invocations.d.ts +74 -0
- package/dist/src/shared/invocations.d.ts.map +1 -0
- package/dist/src/shared/invocations.js +247 -0
- package/dist/src/shared/invocations.js.map +1 -0
- package/dist/src/shared/json-store.d.ts +37 -0
- package/dist/src/shared/json-store.d.ts.map +1 -0
- package/dist/src/shared/json-store.js +163 -0
- package/dist/src/shared/json-store.js.map +1 -0
- package/dist/src/shared/mcp-utils.d.ts +3 -0
- package/dist/src/shared/mcp-utils.d.ts.map +1 -0
- package/dist/src/shared/mcp-utils.js +6 -0
- package/dist/src/shared/mcp-utils.js.map +1 -0
- package/dist/src/shared/paths.d.ts +21 -0
- package/dist/src/shared/paths.d.ts.map +1 -0
- package/dist/src/shared/paths.js +81 -0
- package/dist/src/shared/paths.js.map +1 -0
- package/dist/src/shared/tool-log.d.ts +8 -0
- package/dist/src/shared/tool-log.d.ts.map +1 -0
- package/dist/src/shared/tool-log.js +22 -0
- package/dist/src/shared/tool-log.js.map +1 -0
- package/dist/src/types/state.d.ts +862 -0
- package/dist/src/types/state.d.ts.map +1 -0
- package/dist/src/types/state.js +66 -0
- package/dist/src/types/state.js.map +1 -0
- package/docs/consuming/codex-lead-merge.md +106 -0
- package/docs/plugin-guide.md +396 -0
- package/docs/plugin-template/claude/.github/workflows/build.yml +60 -0
- package/docs/plugin-template/claude/README.md +110 -0
- package/docs/plugin-template/claude/package.json +16 -0
- package/docs/plugin-template/codex/.github/workflows/build.yml +51 -0
- package/docs/plugin-template/codex/README.md +147 -0
- package/docs/plugin-template/codex/package.json +17 -0
- package/docs/plugin-template/opencode/.github/workflows/build.yml +61 -0
- package/docs/plugin-template/opencode/README.md +121 -0
- package/docs/plugin-template/opencode/package.json +25 -0
- package/package.json +36 -28
- package/agents/architect/meta.yml +0 -13
- package/agents/designer/meta.yml +0 -13
- package/agents/engineer/meta.yml +0 -11
- package/agents/postdoc/meta.yml +0 -13
- package/agents/researcher/meta.yml +0 -12
- package/agents/reviewer/meta.yml +0 -12
- package/agents/strategist/meta.yml +0 -13
- package/agents/tester/meta.yml +0 -12
- package/agents/writer/meta.yml +0 -11
- package/conformance/README.md +0 -311
- package/conformance/examples/plan.extension.schema.example.json +0 -25
- package/conformance/lifecycle/README.md +0 -48
- package/conformance/lifecycle/agent-complete.json +0 -44
- package/conformance/lifecycle/agent-resume.json +0 -43
- package/conformance/lifecycle/agent-spawn.json +0 -36
- package/conformance/lifecycle/memory-access-record.json +0 -27
- package/conformance/lifecycle/session-end.json +0 -48
- package/conformance/scenarios/full-plan-cycle.json +0 -147
- package/conformance/scenarios/task-deps-ordering.json +0 -95
- package/conformance/schema/fixture.schema.json +0 -354
- package/conformance/state-schemas/agent-tracker.schema.json +0 -63
- package/conformance/state-schemas/history.schema.json +0 -134
- package/conformance/state-schemas/memory-access.schema.json +0 -36
- package/conformance/state-schemas/plan.schema.json +0 -77
- package/conformance/state-schemas/tasks.schema.json +0 -98
- package/conformance/tools/artifact-write.json +0 -97
- package/conformance/tools/context.json +0 -172
- package/conformance/tools/history-search.json +0 -219
- package/conformance/tools/plan-decide.json +0 -139
- package/conformance/tools/plan-start.json +0 -81
- package/conformance/tools/plan-status.json +0 -127
- package/conformance/tools/plan-update.json +0 -341
- package/conformance/tools/task-add.json +0 -156
- package/conformance/tools/task-close.json +0 -161
- package/conformance/tools/task-list.json +0 -177
- package/conformance/tools/task-update.json +0 -167
- package/docs/behavioral-contracts.md +0 -145
- package/docs/consumer-implementation-guide.md +0 -840
- package/docs/memory-lifecycle-contract.md +0 -119
- package/docs/nexus-layout.md +0 -224
- package/docs/nexus-outputs-contract.md +0 -344
- package/docs/nexus-state-overview.md +0 -170
- package/docs/nexus-tools-contract.md +0 -438
- package/manifest.json +0 -448
- package/schema/README.md +0 -69
- package/schema/agent.schema.json +0 -23
- package/schema/common.schema.json +0 -17
- package/schema/manifest.schema.json +0 -78
- package/schema/memory-policy.schema.json +0 -98
- package/schema/skill.schema.json +0 -54
- package/schema/task-exceptions.schema.json +0 -40
- package/schema/vocabulary.schema.json +0 -167
- package/scripts/.gitkeep +0 -0
- package/scripts/conformance-coverage.ts +0 -466
- package/scripts/import-from-claude-nexus.ts +0 -403
- package/scripts/lib/frontmatter.ts +0 -71
- package/scripts/lib/lint.ts +0 -348
- package/scripts/lib/structure.ts +0 -159
- package/scripts/lib/validate.ts +0 -796
- package/scripts/validate.ts +0 -90
- package/skills/nx-init/meta.yml +0 -8
- package/skills/nx-plan/meta.yml +0 -10
- package/skills/nx-run/meta.yml +0 -8
- package/skills/nx-sync/meta.yml +0 -7
- package/vocabulary/capabilities.yml +0 -65
- package/vocabulary/categories.yml +0 -11
- package/vocabulary/invocations.yml +0 -147
- package/vocabulary/memory_policy.yml +0 -88
- package/vocabulary/resume-tiers.yml +0 -11
- package/vocabulary/tags.yml +0 -60
- package/vocabulary/task-exceptions.yml +0 -29
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode plugin adapter — mounts nexus hooks into OpenCode's plugin API.
|
|
3
|
+
*
|
|
4
|
+
* 결정 참조: plan.json Issue #1 (3-레이어 책임 분담),
|
|
5
|
+
* Issue #3 (OpenCode 2단 처리 — SubagentStart/Stop, agent-tracker),
|
|
6
|
+
* Issue #6 (additional_context 주입 우회 — SubagentStop output.output append)
|
|
7
|
+
*/
|
|
8
|
+
import { spawn } from "node:child_process";
|
|
9
|
+
import { mkdirSync } from "node:fs";
|
|
10
|
+
import { dirname, join } from "node:path";
|
|
11
|
+
import { fileURLToPath } from "node:url";
|
|
12
|
+
import { updateJsonFileLocked } from "../shared/json-store.js";
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// resolveManifestPath — handlerPath absolutizer
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/**
|
|
17
|
+
* Resolve a manifest-relative handlerPath to an absolute filesystem path.
|
|
18
|
+
*
|
|
19
|
+
* The manifest JSON lives at dist/manifests/opencode-manifest.json.
|
|
20
|
+
* This module lives at dist/src/hooks/opencode-mount.js.
|
|
21
|
+
* We construct the manifest's URL relative to this module, then resolve
|
|
22
|
+
* the handlerPath relative to that manifest URL.
|
|
23
|
+
*/
|
|
24
|
+
function resolveManifestPath(relPath) {
|
|
25
|
+
const manifestUrl = new URL("../../manifests/opencode-manifest.json", import.meta.url);
|
|
26
|
+
return fileURLToPath(new URL(relPath, manifestUrl));
|
|
27
|
+
}
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// mountHooks — primary export
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
/**
|
|
32
|
+
* Mount nexus hooks into OpenCode's plugin API.
|
|
33
|
+
*
|
|
34
|
+
* Returns an object whose keys are OpenCode plugin hook names. Each value is
|
|
35
|
+
* the async handler function OpenCode calls when the corresponding event fires.
|
|
36
|
+
*
|
|
37
|
+
* @param pluginCtx OpenCode plugin context (must expose `.directory: string`)
|
|
38
|
+
* @param manifest Hook manifest produced by build-hooks.ts
|
|
39
|
+
*/
|
|
40
|
+
export function mountHooks(pluginCtx, manifest) {
|
|
41
|
+
// Resolve all handlerPaths to absolute paths so spawn() works regardless of CWD.
|
|
42
|
+
const resolvedManifest = {
|
|
43
|
+
hooks: manifest.hooks.map((h) => ({ ...h, handlerPath: resolveManifestPath(h.handlerPath) })),
|
|
44
|
+
};
|
|
45
|
+
// Buffer for additional_context produced by SessionStart / UserPromptSubmit hooks.
|
|
46
|
+
// Flushed into the system prompt on each LLM call via chat.system.transform.
|
|
47
|
+
const systemTransformBuffer = [];
|
|
48
|
+
return {
|
|
49
|
+
// ------------------------------------------------------------------
|
|
50
|
+
// session.created → SessionStart
|
|
51
|
+
// ------------------------------------------------------------------
|
|
52
|
+
"event": async (input) => {
|
|
53
|
+
const ev = input;
|
|
54
|
+
if (ev["event"]?.["type"] !== "session.created") {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const sessionEvent = ev["event"];
|
|
58
|
+
const sessionId = sessionEvent["sessionID"] ?? "";
|
|
59
|
+
await dispatchEvent("SessionStart", resolvedManifest, {
|
|
60
|
+
hook_event_name: "SessionStart",
|
|
61
|
+
session_id: sessionId,
|
|
62
|
+
cwd: pluginCtx.directory,
|
|
63
|
+
source: "startup",
|
|
64
|
+
}, { systemTransformBuffer });
|
|
65
|
+
},
|
|
66
|
+
// ------------------------------------------------------------------
|
|
67
|
+
// chat.message → UserPromptSubmit
|
|
68
|
+
// ------------------------------------------------------------------
|
|
69
|
+
"chat.message": async (input) => {
|
|
70
|
+
const msg = input;
|
|
71
|
+
const sessionId = msg["sessionID"] ?? "";
|
|
72
|
+
const prompt = msg["message"] ?? "";
|
|
73
|
+
await dispatchEvent("UserPromptSubmit", resolvedManifest, {
|
|
74
|
+
hook_event_name: "UserPromptSubmit",
|
|
75
|
+
session_id: sessionId,
|
|
76
|
+
cwd: pluginCtx.directory,
|
|
77
|
+
prompt,
|
|
78
|
+
}, { systemTransformBuffer });
|
|
79
|
+
},
|
|
80
|
+
// ------------------------------------------------------------------
|
|
81
|
+
// tool.execute.before → PreToolUse (or SubagentStart when tool=task)
|
|
82
|
+
// ------------------------------------------------------------------
|
|
83
|
+
"tool.execute.before": async (input, output) => {
|
|
84
|
+
const inp = input;
|
|
85
|
+
const out = output;
|
|
86
|
+
const sessionId = inp["sessionID"] ?? "";
|
|
87
|
+
const toolName = inp["tool"] ?? "";
|
|
88
|
+
const isTask = toolName === "task";
|
|
89
|
+
const args = out["args"] ?? {};
|
|
90
|
+
if (isTask) {
|
|
91
|
+
await dispatchEvent("SubagentStart", resolvedManifest, {
|
|
92
|
+
hook_event_name: "SubagentStart",
|
|
93
|
+
session_id: sessionId,
|
|
94
|
+
cwd: pluginCtx.directory,
|
|
95
|
+
// agent_id is unknown until tool.execute.after resolves the subagent session
|
|
96
|
+
agent_id: "",
|
|
97
|
+
agent_type: args["subagent_type"] ?? "",
|
|
98
|
+
}, { outputArgsRef: args });
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
await dispatchEvent("PreToolUse", resolvedManifest, {
|
|
102
|
+
hook_event_name: "PreToolUse",
|
|
103
|
+
session_id: sessionId,
|
|
104
|
+
cwd: pluginCtx.directory,
|
|
105
|
+
tool_name: normalizeOpenCodeToolName(toolName),
|
|
106
|
+
tool_input: args,
|
|
107
|
+
}, { outputArgsRef: args });
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
// ------------------------------------------------------------------
|
|
111
|
+
// tool.execute.after → PostToolUse (or SubagentStop when tool=task)
|
|
112
|
+
// ------------------------------------------------------------------
|
|
113
|
+
"tool.execute.after": async (input, output) => {
|
|
114
|
+
const inp = input;
|
|
115
|
+
const out = output;
|
|
116
|
+
const sessionId = inp["sessionID"] ?? "";
|
|
117
|
+
const toolName = inp["tool"] ?? "";
|
|
118
|
+
const isTask = toolName === "task";
|
|
119
|
+
const args = out["args"] ?? {};
|
|
120
|
+
const metadata = out["metadata"] ?? {};
|
|
121
|
+
const agentId = metadata["sessionId"] ?? "";
|
|
122
|
+
if (isTask) {
|
|
123
|
+
// Register / update agent-tracker before dispatching SubagentStop
|
|
124
|
+
await upsertAgentTracker(pluginCtx.directory, sessionId, agentId, args["subagent_type"] ?? "");
|
|
125
|
+
await dispatchEvent("SubagentStop", resolvedManifest, {
|
|
126
|
+
hook_event_name: "SubagentStop",
|
|
127
|
+
session_id: sessionId,
|
|
128
|
+
cwd: pluginCtx.directory,
|
|
129
|
+
agent_id: agentId,
|
|
130
|
+
agent_type: args["subagent_type"] ?? "",
|
|
131
|
+
last_assistant_message: out["output"] ?? "",
|
|
132
|
+
},
|
|
133
|
+
// additional_context appended to output.output (bypass #6)
|
|
134
|
+
{ outputOutputRef: out });
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
await dispatchEvent("PostToolUse", resolvedManifest, {
|
|
138
|
+
hook_event_name: "PostToolUse",
|
|
139
|
+
session_id: sessionId,
|
|
140
|
+
cwd: pluginCtx.directory,
|
|
141
|
+
tool_name: normalizeOpenCodeToolName(toolName),
|
|
142
|
+
tool_input: args,
|
|
143
|
+
tool_response: out["output"] ?? "",
|
|
144
|
+
}, {});
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
// ------------------------------------------------------------------
|
|
148
|
+
// experimental.chat.system.transform — flush buffer into system prompt
|
|
149
|
+
// ------------------------------------------------------------------
|
|
150
|
+
"experimental.chat.system.transform": async (_input, output) => {
|
|
151
|
+
const out = output;
|
|
152
|
+
if (!Array.isArray(out.system))
|
|
153
|
+
return;
|
|
154
|
+
while (systemTransformBuffer.length > 0) {
|
|
155
|
+
out.system.push(systemTransformBuffer.shift());
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
// dispatchEvent
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
async function dispatchEvent(nexusEventName, manifest, nexusInput, sideEffects) {
|
|
164
|
+
// Sort hooks by priority (ascending) so lower numbers run first
|
|
165
|
+
const candidates = manifest.hooks
|
|
166
|
+
.filter((h) => h.events.includes(nexusEventName))
|
|
167
|
+
.sort((a, b) => a.priority - b.priority);
|
|
168
|
+
for (const hook of candidates) {
|
|
169
|
+
const toolOrSource = nexusInput["tool_name"] ??
|
|
170
|
+
nexusInput["source"] ??
|
|
171
|
+
"";
|
|
172
|
+
if (!matchesPattern(hook.matcher, toolOrSource))
|
|
173
|
+
continue;
|
|
174
|
+
const timeoutMs = (hook.timeout ?? 30) * 1000;
|
|
175
|
+
const result = await spawnHandler(hook.handlerPath, nexusInput, timeoutMs);
|
|
176
|
+
if (result == null)
|
|
177
|
+
continue;
|
|
178
|
+
applyResult(result, nexusEventName, sideEffects);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
// spawnHandler
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
async function spawnHandler(handlerPath, nexusInput, timeoutMs) {
|
|
185
|
+
return new Promise((resolve) => {
|
|
186
|
+
let child;
|
|
187
|
+
try {
|
|
188
|
+
child = spawn("node", [handlerPath], {
|
|
189
|
+
env: { ...process.env, NEXUS_HARNESS: "opencode" },
|
|
190
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// spawn itself threw (e.g. node not found) — silent
|
|
195
|
+
resolve(null);
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
let stdout = "";
|
|
199
|
+
let timedOut = false;
|
|
200
|
+
const timer = setTimeout(() => {
|
|
201
|
+
timedOut = true;
|
|
202
|
+
try {
|
|
203
|
+
child.kill();
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
// ignore
|
|
207
|
+
}
|
|
208
|
+
resolve(null);
|
|
209
|
+
}, timeoutMs);
|
|
210
|
+
if (!child.stdout || !child.stdin) {
|
|
211
|
+
clearTimeout(timer);
|
|
212
|
+
resolve(null);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
child.stdout.on("data", (chunk) => {
|
|
216
|
+
stdout += chunk.toString();
|
|
217
|
+
});
|
|
218
|
+
child.stdin.write(JSON.stringify(nexusInput));
|
|
219
|
+
child.stdin.end();
|
|
220
|
+
child.on("exit", () => {
|
|
221
|
+
clearTimeout(timer);
|
|
222
|
+
if (timedOut)
|
|
223
|
+
return;
|
|
224
|
+
try {
|
|
225
|
+
resolve(stdout ? JSON.parse(stdout) : null);
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
resolve(null);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
child.on("error", () => {
|
|
232
|
+
clearTimeout(timer);
|
|
233
|
+
resolve(null); // spawn failure — silent, keep OpenCode turn alive
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
// applyResult — convert nexus output to OpenCode API side effects
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
function applyResult(result, nexusEventName, sideEffects) {
|
|
241
|
+
// decision:block → throw (OpenCode sees an error and halts the turn)
|
|
242
|
+
if (result["decision"] === "block") {
|
|
243
|
+
const reason = result["block_reason"] ?? "Blocked by nexus hook";
|
|
244
|
+
throw new Error(reason);
|
|
245
|
+
}
|
|
246
|
+
// continue:false → throw
|
|
247
|
+
if (result["continue"] === false) {
|
|
248
|
+
const msg = result["system_message"] ?? "Hook requested stop";
|
|
249
|
+
throw new Error(msg);
|
|
250
|
+
}
|
|
251
|
+
// additional_context
|
|
252
|
+
const additionalContext = result["additional_context"];
|
|
253
|
+
if (additionalContext) {
|
|
254
|
+
if (nexusEventName === "SessionStart" || nexusEventName === "UserPromptSubmit") {
|
|
255
|
+
// Push to system.transform buffer
|
|
256
|
+
sideEffects.systemTransformBuffer?.push(additionalContext);
|
|
257
|
+
}
|
|
258
|
+
else if (nexusEventName === "SubagentStart") {
|
|
259
|
+
// Prepend to args.prompt so the subagent receives the context
|
|
260
|
+
if (sideEffects.outputArgsRef) {
|
|
261
|
+
const existing = sideEffects.outputArgsRef["prompt"] ?? "";
|
|
262
|
+
sideEffects.outputArgsRef["prompt"] = additionalContext + "\n\n" + existing;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
else if (nexusEventName === "SubagentStop") {
|
|
266
|
+
// Append to output.output (bypass #6)
|
|
267
|
+
if (sideEffects.outputOutputRef) {
|
|
268
|
+
const existing = sideEffects.outputOutputRef["output"] ?? "";
|
|
269
|
+
sideEffects.outputOutputRef["output"] = existing + "\n\n" + additionalContext;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// updated_input → mutate output.args (PreToolUse only)
|
|
274
|
+
const updatedInput = result["updated_input"];
|
|
275
|
+
if (updatedInput && nexusEventName === "PreToolUse" && sideEffects.outputArgsRef) {
|
|
276
|
+
Object.assign(sideEffects.outputArgsRef, updatedInput);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
// ---------------------------------------------------------------------------
|
|
280
|
+
// upsertAgentTracker
|
|
281
|
+
// ---------------------------------------------------------------------------
|
|
282
|
+
async function upsertAgentTracker(cwd, sessionId, agentId, agentType) {
|
|
283
|
+
if (!agentId)
|
|
284
|
+
return; // agent_id not yet resolved — skip silently
|
|
285
|
+
const trackerPath = join(cwd, ".nexus", "state", sessionId, "agent-tracker.json");
|
|
286
|
+
try {
|
|
287
|
+
mkdirSync(dirname(trackerPath), { recursive: true });
|
|
288
|
+
await updateJsonFileLocked(trackerPath, [], (tracker) => {
|
|
289
|
+
const existing = tracker.find((e) => e.agent_id === agentId);
|
|
290
|
+
if (!existing) {
|
|
291
|
+
tracker.push({
|
|
292
|
+
agent_id: agentId,
|
|
293
|
+
agent_type: agentType,
|
|
294
|
+
started_at: new Date().toISOString(),
|
|
295
|
+
resume_count: 0,
|
|
296
|
+
status: "running",
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
existing.resume_count = (existing.resume_count ?? 0) + 1;
|
|
301
|
+
existing.last_resumed_at = new Date().toISOString();
|
|
302
|
+
}
|
|
303
|
+
return tracker;
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
// tracker update failure must never disrupt the OpenCode turn
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Test whether a nexus matcher pattern matches the given value.
|
|
312
|
+
* Pattern "*" matches everything.
|
|
313
|
+
* Otherwise the pattern is treated as a pipe-separated list of literals
|
|
314
|
+
* (e.g. "Read|Write|Edit") or a simple regex.
|
|
315
|
+
*/
|
|
316
|
+
function matchesPattern(pattern, value) {
|
|
317
|
+
if (pattern === "*")
|
|
318
|
+
return true;
|
|
319
|
+
// Try literal pipe-separated list first (most common case)
|
|
320
|
+
const literals = pattern.split("|");
|
|
321
|
+
if (literals.every((l) => /^[A-Za-z0-9_-]+$/.test(l))) {
|
|
322
|
+
return literals.includes(value);
|
|
323
|
+
}
|
|
324
|
+
// Fall back to regex
|
|
325
|
+
try {
|
|
326
|
+
return new RegExp(pattern).test(value);
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Normalize OpenCode lowercase tool names to nexus PascalCase equivalents.
|
|
334
|
+
* OpenCode uses snake_case/lowercase internally; nexus standard is PascalCase.
|
|
335
|
+
*/
|
|
336
|
+
function normalizeOpenCodeToolName(name) {
|
|
337
|
+
const aliasMap = {
|
|
338
|
+
read: "Read",
|
|
339
|
+
edit: "Edit",
|
|
340
|
+
write: "Write",
|
|
341
|
+
bash: "Bash",
|
|
342
|
+
glob: "Glob",
|
|
343
|
+
grep: "Grep",
|
|
344
|
+
ls: "LS",
|
|
345
|
+
task: "Task",
|
|
346
|
+
web_fetch: "WebFetch",
|
|
347
|
+
web_search: "WebSearch",
|
|
348
|
+
patch: "Edit",
|
|
349
|
+
};
|
|
350
|
+
return aliasMap[name] ?? name;
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=opencode-mount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-mount.js","sourceRoot":"","sources":["../../../src/hooks/opencode-mount.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nexus Hook shell wrapper entry — reads stdin, normalizes for harness,
|
|
3
|
+
* dispatches to handler, and serializes stdout per NEXUS_HARNESS.
|
|
4
|
+
*
|
|
5
|
+
* 결정 참조: plan.json Issue #1 (3-레이어 책임 분담),
|
|
6
|
+
* Issue #3 (Bash parse patterns), Issue #4 (Codex tool aliases)
|
|
7
|
+
*/
|
|
8
|
+
import type { NexusHookInput, NexusHookOutput } from "./types.js";
|
|
9
|
+
export interface RunWrapperOptions {
|
|
10
|
+
/** Absolute path to the compiled handler .js file. */
|
|
11
|
+
handlerPath: string;
|
|
12
|
+
/** Optional absolute path to meta.yml; enables condition.state_file_exists check. */
|
|
13
|
+
metaPath?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function runWrapper(options: RunWrapperOptions): Promise<void>;
|
|
16
|
+
export interface ParsedBashCommand {
|
|
17
|
+
tool: string;
|
|
18
|
+
target?: string;
|
|
19
|
+
}
|
|
20
|
+
/** Parse a Bash command string into a nexus standard tool name.
|
|
21
|
+
* Returns null when the command is a compound/piped command or unrecognised. */
|
|
22
|
+
export declare function parseBashCommand(command: string): ParsedBashCommand | null;
|
|
23
|
+
/** Map Codex native tool aliases to nexus PascalCase equivalents. */
|
|
24
|
+
declare function normalizeCodexToolName(name: string): string;
|
|
25
|
+
/** When tool_name is "Bash" and tool_input.command is present, attempt to
|
|
26
|
+
* resolve a more specific nexus standard tool_name via bash_parse_patterns. */
|
|
27
|
+
declare function normalizeBashToolName(input: NexusHookInput, _harness: string): NexusHookInput;
|
|
28
|
+
declare function serializeForClaude(out: NexusHookOutput, eventName: string): Record<string, unknown>;
|
|
29
|
+
declare function serializeForCodex(out: NexusHookOutput, eventName: string): Record<string, unknown>;
|
|
30
|
+
export declare const __test: {
|
|
31
|
+
serializeForClaude: typeof serializeForClaude;
|
|
32
|
+
serializeForCodex: typeof serializeForCodex;
|
|
33
|
+
normalizeBashToolName: typeof normalizeBashToolName;
|
|
34
|
+
normalizeCodexToolName: typeof normalizeCodexToolName;
|
|
35
|
+
};
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/hooks/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAe,MAAM,YAAY,CAAC;AAU/E,MAAM,WAAW,iBAAiB;IAChC,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC1E;AAMD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;iFACiF;AACjF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAiB1E;AAqFD,qEAAqE;AACrE,iBAAS,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAoBpD;AAED;gFACgF;AAChF,iBAAS,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAatF;AA2CD,iBAAS,kBAAkB,CAAC,GAAG,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA2B5F;AAED,iBAAS,iBAAiB,CAAC,GAAG,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyB3F;AAmBD,eAAO,MAAM,MAAM;;;;;CAKlB,CAAC"}
|