@moreih29/nexus-core 0.17.0 → 0.18.2
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 +101 -67
- package/dist/cli/sync.d.ts +3 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +59 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/generate/index.d.ts +3 -0
- package/dist/generate/index.d.ts.map +1 -0
- package/dist/generate/index.js +2 -0
- package/dist/generate/index.js.map +1 -0
- package/dist/generate/load-data.d.ts +8 -0
- package/dist/generate/load-data.d.ts.map +1 -0
- package/dist/generate/load-data.js +45 -0
- package/dist/generate/load-data.js.map +1 -0
- package/dist/generate/load-spec.d.ts +3 -0
- package/dist/generate/load-spec.d.ts.map +1 -0
- package/dist/generate/load-spec.js +48 -0
- package/dist/generate/load-spec.js.map +1 -0
- package/dist/generate/macros/expand.d.ts +3 -0
- package/dist/generate/macros/expand.d.ts.map +1 -0
- package/dist/generate/macros/expand.js +48 -0
- package/dist/generate/macros/expand.js.map +1 -0
- package/dist/generate/macros/parse.d.ts +4 -0
- package/dist/generate/macros/parse.d.ts.map +1 -0
- package/dist/generate/macros/parse.js +142 -0
- package/dist/generate/macros/parse.js.map +1 -0
- package/dist/generate/macros/validate.d.ts +3 -0
- package/dist/generate/macros/validate.d.ts.map +1 -0
- package/dist/generate/macros/validate.js +23 -0
- package/dist/generate/macros/validate.js.map +1 -0
- package/dist/generate/renderers/claude.d.ts +3 -0
- package/dist/generate/renderers/claude.d.ts.map +1 -0
- package/dist/generate/renderers/claude.js +48 -0
- package/dist/generate/renderers/claude.js.map +1 -0
- package/dist/generate/renderers/codex.d.ts +3 -0
- package/dist/generate/renderers/codex.d.ts.map +1 -0
- package/dist/generate/renderers/codex.js +79 -0
- package/dist/generate/renderers/codex.js.map +1 -0
- package/dist/generate/renderers/markdown.d.ts +2 -0
- package/dist/generate/renderers/markdown.d.ts.map +1 -0
- package/dist/generate/renderers/markdown.js +6 -0
- package/dist/generate/renderers/markdown.js.map +1 -0
- package/dist/generate/renderers/opencode.d.ts +3 -0
- package/dist/generate/renderers/opencode.d.ts.map +1 -0
- package/dist/generate/renderers/opencode.js +69 -0
- package/dist/generate/renderers/opencode.js.map +1 -0
- package/dist/generate/sync.d.ts +4 -0
- package/dist/generate/sync.d.ts.map +1 -0
- package/dist/generate/sync.js +60 -0
- package/dist/generate/sync.js.map +1 -0
- package/dist/generate/types.d.ts +74 -0
- package/dist/generate/types.d.ts.map +1 -0
- package/dist/generate/types.js +2 -0
- package/dist/generate/types.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/definitions/artifact.d.ts +20 -0
- package/dist/mcp/definitions/artifact.d.ts.map +1 -0
- package/dist/mcp/definitions/artifact.js +14 -0
- package/dist/mcp/definitions/artifact.js.map +1 -0
- package/dist/mcp/definitions/history.d.ts +20 -0
- package/dist/mcp/definitions/history.d.ts.map +1 -0
- package/dist/mcp/definitions/history.js +18 -0
- package/dist/mcp/definitions/history.js.map +1 -0
- package/dist/mcp/definitions/index.d.ts +276 -0
- package/dist/mcp/definitions/index.d.ts.map +1 -0
- package/dist/mcp/definitions/index.js +16 -0
- package/dist/mcp/definitions/index.js.map +1 -0
- package/dist/mcp/definitions/plan.d.ts +111 -0
- package/dist/mcp/definitions/plan.d.ts.map +1 -0
- package/dist/mcp/definitions/plan.js +89 -0
- package/dist/mcp/definitions/plan.js.map +1 -0
- package/dist/mcp/definitions/task.d.ts +138 -0
- package/dist/mcp/definitions/task.d.ts.map +1 -0
- package/dist/mcp/definitions/task.js +78 -0
- package/dist/mcp/definitions/task.js.map +1 -0
- package/dist/mcp/handlers/artifact.d.ts.map +1 -0
- package/dist/mcp/handlers/artifact.js +42 -0
- package/dist/mcp/handlers/artifact.js.map +1 -0
- package/dist/mcp/handlers/history.d.ts.map +1 -0
- package/dist/mcp/handlers/history.js +35 -0
- package/dist/mcp/handlers/history.js.map +1 -0
- package/dist/mcp/handlers/plan.d.ts.map +1 -0
- package/dist/mcp/handlers/plan.js +324 -0
- package/dist/mcp/handlers/plan.js.map +1 -0
- package/dist/mcp/handlers/task.d.ts.map +1 -0
- package/dist/mcp/handlers/task.js +216 -0
- package/dist/mcp/handlers/task.js.map +1 -0
- package/dist/{src/mcp → mcp}/server.d.ts +1 -1
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +58 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/shared/json-store.d.ts.map +1 -0
- package/dist/{src/shared → shared}/json-store.js +5 -4
- package/dist/shared/json-store.js.map +1 -0
- package/dist/shared/mcp-utils.d.ts.map +1 -0
- package/dist/shared/mcp-utils.js.map +1 -0
- package/dist/{src/shared → shared}/paths.d.ts +0 -6
- package/dist/shared/paths.d.ts.map +1 -0
- package/dist/shared/paths.js +62 -0
- package/dist/shared/paths.js.map +1 -0
- package/dist/shared/register-tool.d.ts +20 -0
- package/dist/shared/register-tool.d.ts.map +1 -0
- package/dist/shared/register-tool.js +15 -0
- package/dist/shared/register-tool.js.map +1 -0
- package/dist/{src/types → types}/state.d.ts +65 -65
- package/dist/types/state.d.ts.map +1 -0
- package/dist/{src/types → types}/state.js +1 -1
- package/dist/types/state.js.map +1 -0
- package/harness/claude/agent-rules.yml +21 -0
- package/harness/claude/invocations.yml +11 -0
- package/harness/claude/layout.yml +3 -0
- package/harness/codex/agent-rules.yml +28 -0
- package/harness/codex/invocations.yml +13 -0
- package/harness/codex/layout.yml +3 -0
- package/harness/opencode/agent-rules.yml +18 -0
- package/harness/opencode/invocations.yml +12 -0
- package/harness/opencode/layout.yml +3 -0
- package/package.json +38 -43
- package/{assets → spec}/agents/architect/body.ko.md +92 -84
- package/spec/agents/architect/body.md +185 -0
- package/spec/agents/designer/body.ko.md +330 -0
- package/spec/agents/designer/body.md +330 -0
- package/spec/agents/engineer/body.ko.md +166 -0
- package/spec/agents/engineer/body.md +166 -0
- package/spec/agents/lead/body.ko.md +276 -0
- package/spec/agents/lead/body.md +276 -0
- package/{assets → spec}/agents/postdoc/body.ko.md +116 -46
- package/spec/agents/postdoc/body.md +192 -0
- package/{assets → spec}/agents/researcher/body.ko.md +131 -45
- package/spec/agents/researcher/body.md +223 -0
- package/spec/agents/reviewer/body.ko.md +219 -0
- package/spec/agents/reviewer/body.md +219 -0
- package/{assets → spec}/agents/strategist/body.ko.md +108 -35
- package/spec/agents/strategist/body.md +187 -0
- package/spec/agents/tester/body.ko.md +272 -0
- package/spec/agents/tester/body.md +272 -0
- package/{assets → spec}/agents/writer/body.ko.md +109 -33
- package/spec/agents/writer/body.md +198 -0
- package/spec/skills/nx-auto-plan/body.ko.md +150 -0
- package/spec/skills/nx-auto-plan/body.md +150 -0
- package/spec/skills/nx-plan/body.ko.md +159 -0
- package/spec/skills/nx-plan/body.md +159 -0
- package/spec/skills/nx-run/body.ko.md +132 -0
- package/spec/skills/nx-run/body.md +132 -0
- package/vocabulary/enums/task-register-state.yml +4 -0
- package/vocabulary/invocations.yml +43 -0
- package/assets/agents/architect/body.md +0 -177
- package/assets/agents/designer/body.ko.md +0 -125
- package/assets/agents/designer/body.md +0 -125
- package/assets/agents/engineer/body.ko.md +0 -106
- package/assets/agents/engineer/body.md +0 -106
- package/assets/agents/lead/body.ko.md +0 -70
- package/assets/agents/lead/body.md +0 -70
- package/assets/agents/postdoc/body.md +0 -122
- package/assets/agents/researcher/body.md +0 -137
- package/assets/agents/reviewer/body.ko.md +0 -138
- package/assets/agents/reviewer/body.md +0 -138
- package/assets/agents/strategist/body.md +0 -116
- package/assets/agents/tester/body.ko.md +0 -195
- package/assets/agents/tester/body.md +0 -195
- package/assets/agents/writer/body.md +0 -122
- package/assets/capability-matrix.yml +0 -200
- package/assets/hooks/agent-bootstrap/handler.test.ts +0 -369
- package/assets/hooks/agent-bootstrap/handler.ts +0 -132
- package/assets/hooks/agent-bootstrap/meta.yml +0 -10
- package/assets/hooks/agent-finalize/handler.test.ts +0 -368
- package/assets/hooks/agent-finalize/handler.ts +0 -76
- package/assets/hooks/agent-finalize/meta.yml +0 -10
- package/assets/hooks/capability-matrix.yml +0 -313
- package/assets/hooks/post-tool-telemetry/handler.test.ts +0 -302
- package/assets/hooks/post-tool-telemetry/handler.ts +0 -49
- package/assets/hooks/post-tool-telemetry/meta.yml +0 -10
- package/assets/hooks/prompt-router/handler.test.ts +0 -801
- package/assets/hooks/prompt-router/handler.ts +0 -272
- package/assets/hooks/prompt-router/meta.yml +0 -11
- package/assets/hooks/session-init/handler.test.ts +0 -274
- package/assets/hooks/session-init/handler.ts +0 -31
- package/assets/hooks/session-init/meta.yml +0 -9
- package/assets/lsp-servers.json +0 -55
- package/assets/schema/lsp-servers.schema.json +0 -67
- package/assets/skills/nx-init/body.ko.md +0 -197
- package/assets/skills/nx-init/body.md +0 -197
- package/assets/skills/nx-plan/body.ko.md +0 -361
- package/assets/skills/nx-plan/body.md +0 -361
- package/assets/skills/nx-run/body.ko.md +0 -161
- package/assets/skills/nx-run/body.md +0 -160
- package/assets/skills/nx-sync/body.ko.md +0 -92
- package/assets/skills/nx-sync/body.md +0 -92
- package/assets/tools/tool-name-map.yml +0 -353
- package/dist/assets/hooks/agent-bootstrap/handler.d.ts +0 -4
- package/dist/assets/hooks/agent-bootstrap/handler.d.ts.map +0 -1
- package/dist/assets/hooks/agent-bootstrap/handler.js +0 -114
- package/dist/assets/hooks/agent-bootstrap/handler.js.map +0 -1
- package/dist/assets/hooks/agent-finalize/handler.d.ts +0 -4
- package/dist/assets/hooks/agent-finalize/handler.d.ts.map +0 -1
- package/dist/assets/hooks/agent-finalize/handler.js +0 -63
- package/dist/assets/hooks/agent-finalize/handler.js.map +0 -1
- package/dist/assets/hooks/post-tool-telemetry/handler.d.ts +0 -4
- package/dist/assets/hooks/post-tool-telemetry/handler.d.ts.map +0 -1
- package/dist/assets/hooks/post-tool-telemetry/handler.js +0 -40
- package/dist/assets/hooks/post-tool-telemetry/handler.js.map +0 -1
- package/dist/assets/hooks/prompt-router/handler.d.ts +0 -4
- package/dist/assets/hooks/prompt-router/handler.d.ts.map +0 -1
- package/dist/assets/hooks/prompt-router/handler.js +0 -214
- package/dist/assets/hooks/prompt-router/handler.js.map +0 -1
- package/dist/assets/hooks/session-init/handler.d.ts +0 -4
- package/dist/assets/hooks/session-init/handler.d.ts.map +0 -1
- package/dist/assets/hooks/session-init/handler.js +0 -22
- package/dist/assets/hooks/session-init/handler.js.map +0 -1
- package/dist/claude/.claude-plugin/marketplace.json +0 -75
- package/dist/claude/.claude-plugin/plugin.json +0 -67
- package/dist/claude/agents/architect.md +0 -172
- package/dist/claude/agents/designer.md +0 -120
- package/dist/claude/agents/engineer.md +0 -98
- package/dist/claude/agents/lead.md +0 -59
- package/dist/claude/agents/postdoc.md +0 -117
- package/dist/claude/agents/researcher.md +0 -132
- package/dist/claude/agents/reviewer.md +0 -133
- package/dist/claude/agents/strategist.md +0 -111
- package/dist/claude/agents/tester.md +0 -190
- package/dist/claude/agents/writer.md +0 -114
- package/dist/claude/dist/hooks/agent-bootstrap.js +0 -238
- package/dist/claude/dist/hooks/agent-finalize.js +0 -180
- package/dist/claude/dist/hooks/post-tool-telemetry.js +0 -71
- package/dist/claude/dist/hooks/prompt-router.js +0 -7336
- package/dist/claude/dist/hooks/session-init.js +0 -50
- package/dist/claude/hooks/hooks.json +0 -64
- package/dist/claude/settings.json +0 -3
- package/dist/claude/skills/nx-init/SKILL.md +0 -189
- package/dist/claude/skills/nx-plan/SKILL.md +0 -353
- package/dist/claude/skills/nx-run/SKILL.md +0 -154
- package/dist/claude/skills/nx-sync/SKILL.md +0 -87
- package/dist/codex/agents/architect.toml +0 -175
- package/dist/codex/agents/designer.toml +0 -123
- package/dist/codex/agents/engineer.toml +0 -105
- package/dist/codex/agents/lead.toml +0 -64
- package/dist/codex/agents/postdoc.toml +0 -120
- package/dist/codex/agents/researcher.toml +0 -136
- package/dist/codex/agents/reviewer.toml +0 -137
- package/dist/codex/agents/strategist.toml +0 -114
- package/dist/codex/agents/tester.toml +0 -194
- package/dist/codex/agents/writer.toml +0 -121
- package/dist/codex/dist/hooks/agent-bootstrap.js +0 -238
- package/dist/codex/dist/hooks/agent-finalize.js +0 -180
- package/dist/codex/dist/hooks/prompt-router.js +0 -7336
- package/dist/codex/dist/hooks/session-init.js +0 -50
- package/dist/codex/hooks/hooks.json +0 -28
- package/dist/codex/install/AGENTS.fragment.md +0 -60
- package/dist/codex/install/config.fragment.toml +0 -5
- package/dist/codex/install/install.sh +0 -60
- package/dist/codex/package.json +0 -20
- package/dist/codex/plugin/.codex-plugin/plugin.json +0 -57
- package/dist/codex/plugin/skills/nx-init/SKILL.md +0 -189
- package/dist/codex/plugin/skills/nx-plan/SKILL.md +0 -353
- package/dist/codex/plugin/skills/nx-run/SKILL.md +0 -154
- package/dist/codex/plugin/skills/nx-sync/SKILL.md +0 -87
- package/dist/codex/prompts/architect.md +0 -166
- package/dist/codex/prompts/designer.md +0 -114
- package/dist/codex/prompts/engineer.md +0 -97
- package/dist/codex/prompts/lead.md +0 -60
- package/dist/codex/prompts/postdoc.md +0 -111
- package/dist/codex/prompts/researcher.md +0 -127
- package/dist/codex/prompts/reviewer.md +0 -128
- package/dist/codex/prompts/strategist.md +0 -105
- package/dist/codex/prompts/tester.md +0 -185
- package/dist/codex/prompts/writer.md +0 -113
- package/dist/hooks/agent-bootstrap.js +0 -238
- package/dist/hooks/agent-finalize.js +0 -180
- package/dist/hooks/post-tool-telemetry.js +0 -71
- package/dist/hooks/prompt-router.js +0 -7336
- package/dist/hooks/session-init.js +0 -50
- package/dist/manifests/claude-hooks.json +0 -64
- package/dist/manifests/codex-hooks.json +0 -28
- package/dist/manifests/opencode-manifest.json +0 -54
- package/dist/manifests/portability-report.json +0 -75
- package/dist/opencode/.opencode/skills/nx-init/SKILL.md +0 -189
- package/dist/opencode/.opencode/skills/nx-plan/SKILL.md +0 -353
- package/dist/opencode/.opencode/skills/nx-run/SKILL.md +0 -154
- package/dist/opencode/.opencode/skills/nx-sync/SKILL.md +0 -87
- package/dist/opencode/package.json +0 -23
- package/dist/opencode/src/agents/architect.ts +0 -176
- package/dist/opencode/src/agents/designer.ts +0 -124
- package/dist/opencode/src/agents/engineer.ts +0 -105
- package/dist/opencode/src/agents/lead.ts +0 -66
- package/dist/opencode/src/agents/postdoc.ts +0 -121
- package/dist/opencode/src/agents/researcher.ts +0 -136
- package/dist/opencode/src/agents/reviewer.ts +0 -137
- package/dist/opencode/src/agents/strategist.ts +0 -115
- package/dist/opencode/src/agents/tester.ts +0 -194
- package/dist/opencode/src/agents/writer.ts +0 -121
- package/dist/opencode/src/index.ts +0 -25
- package/dist/opencode/src/plugin.ts +0 -6
- package/dist/scripts/build-agents.d.ts +0 -170
- package/dist/scripts/build-agents.d.ts.map +0 -1
- package/dist/scripts/build-agents.js +0 -907
- package/dist/scripts/build-agents.js.map +0 -1
- package/dist/scripts/build-hooks.d.ts +0 -57
- package/dist/scripts/build-hooks.d.ts.map +0 -1
- package/dist/scripts/build-hooks.js +0 -562
- package/dist/scripts/build-hooks.js.map +0 -1
- package/dist/scripts/cli.d.ts +0 -54
- package/dist/scripts/cli.d.ts.map +0 -1
- package/dist/scripts/cli.js +0 -504
- package/dist/scripts/cli.js.map +0 -1
- package/dist/scripts/smoke/smoke-claude.d.ts +0 -2
- package/dist/scripts/smoke/smoke-claude.d.ts.map +0 -1
- package/dist/scripts/smoke/smoke-claude.js +0 -58
- package/dist/scripts/smoke/smoke-claude.js.map +0 -1
- package/dist/scripts/smoke/smoke-codex.d.ts +0 -2
- package/dist/scripts/smoke/smoke-codex.d.ts.map +0 -1
- package/dist/scripts/smoke/smoke-codex.js +0 -50
- package/dist/scripts/smoke/smoke-codex.js.map +0 -1
- package/dist/scripts/smoke/smoke-consumer.d.ts +0 -2
- package/dist/scripts/smoke/smoke-consumer.d.ts.map +0 -1
- package/dist/scripts/smoke/smoke-consumer.js +0 -230
- package/dist/scripts/smoke/smoke-consumer.js.map +0 -1
- package/dist/scripts/smoke/smoke-opencode.d.ts +0 -2
- package/dist/scripts/smoke/smoke-opencode.d.ts.map +0 -1
- package/dist/scripts/smoke/smoke-opencode.js +0 -99
- package/dist/scripts/smoke/smoke-opencode.js.map +0 -1
- package/dist/src/hooks/opencode-mount.d.ts +0 -35
- package/dist/src/hooks/opencode-mount.d.ts.map +0 -1
- package/dist/src/hooks/opencode-mount.js +0 -352
- package/dist/src/hooks/opencode-mount.js.map +0 -1
- package/dist/src/hooks/runtime.d.ts +0 -37
- package/dist/src/hooks/runtime.d.ts.map +0 -1
- package/dist/src/hooks/runtime.js +0 -274
- package/dist/src/hooks/runtime.js.map +0 -1
- package/dist/src/hooks/types.d.ts +0 -196
- package/dist/src/hooks/types.d.ts.map +0 -1
- package/dist/src/hooks/types.js +0 -85
- package/dist/src/hooks/types.js.map +0 -1
- package/dist/src/lsp/cache.d.ts +0 -9
- package/dist/src/lsp/cache.d.ts.map +0 -1
- package/dist/src/lsp/cache.js +0 -216
- package/dist/src/lsp/cache.js.map +0 -1
- package/dist/src/lsp/client.d.ts +0 -24
- package/dist/src/lsp/client.d.ts.map +0 -1
- package/dist/src/lsp/client.js +0 -166
- package/dist/src/lsp/client.js.map +0 -1
- package/dist/src/lsp/detect.d.ts +0 -77
- package/dist/src/lsp/detect.d.ts.map +0 -1
- package/dist/src/lsp/detect.js +0 -116
- package/dist/src/lsp/detect.js.map +0 -1
- package/dist/src/mcp/server.d.ts.map +0 -1
- package/dist/src/mcp/server.js +0 -34
- package/dist/src/mcp/server.js.map +0 -1
- package/dist/src/mcp/tools/artifact.d.ts.map +0 -1
- package/dist/src/mcp/tools/artifact.js +0 -36
- package/dist/src/mcp/tools/artifact.js.map +0 -1
- package/dist/src/mcp/tools/history.d.ts.map +0 -1
- package/dist/src/mcp/tools/history.js +0 -29
- package/dist/src/mcp/tools/history.js.map +0 -1
- package/dist/src/mcp/tools/lsp.d.ts +0 -13
- package/dist/src/mcp/tools/lsp.d.ts.map +0 -1
- package/dist/src/mcp/tools/lsp.js +0 -225
- package/dist/src/mcp/tools/lsp.js.map +0 -1
- package/dist/src/mcp/tools/plan.d.ts.map +0 -1
- package/dist/src/mcp/tools/plan.js +0 -317
- package/dist/src/mcp/tools/plan.js.map +0 -1
- package/dist/src/mcp/tools/task.d.ts.map +0 -1
- package/dist/src/mcp/tools/task.js +0 -252
- package/dist/src/mcp/tools/task.js.map +0 -1
- package/dist/src/shared/invocations.d.ts +0 -74
- package/dist/src/shared/invocations.d.ts.map +0 -1
- package/dist/src/shared/invocations.js +0 -247
- package/dist/src/shared/invocations.js.map +0 -1
- package/dist/src/shared/json-store.d.ts.map +0 -1
- package/dist/src/shared/json-store.js.map +0 -1
- package/dist/src/shared/mcp-utils.d.ts.map +0 -1
- package/dist/src/shared/mcp-utils.js.map +0 -1
- package/dist/src/shared/package-root.d.ts +0 -6
- package/dist/src/shared/package-root.d.ts.map +0 -1
- package/dist/src/shared/package-root.js +0 -19
- package/dist/src/shared/package-root.js.map +0 -1
- package/dist/src/shared/paths.d.ts.map +0 -1
- package/dist/src/shared/paths.js +0 -117
- package/dist/src/shared/paths.js.map +0 -1
- package/dist/src/shared/tool-log.d.ts +0 -8
- package/dist/src/shared/tool-log.d.ts.map +0 -1
- package/dist/src/shared/tool-log.js +0 -22
- package/dist/src/shared/tool-log.js.map +0 -1
- package/dist/src/types/agent-config.d.ts +0 -22
- package/dist/src/types/agent-config.d.ts.map +0 -1
- package/dist/src/types/agent-config.js +0 -2
- package/dist/src/types/agent-config.js.map +0 -1
- package/dist/src/types/index.d.ts +0 -2
- package/dist/src/types/index.d.ts.map +0 -1
- package/dist/src/types/index.js +0 -2
- package/dist/src/types/index.js.map +0 -1
- package/dist/src/types/state.d.ts.map +0 -1
- package/dist/src/types/state.js.map +0 -1
- package/docs/consuming/codex-lead-merge.md +0 -106
- package/docs/contract/harness-io.md +0 -333
- package/docs/plugin-guide.md +0 -355
- package/docs/plugin-template/claude/.github/workflows/build.yml +0 -60
- package/docs/plugin-template/claude/README.md +0 -110
- package/docs/plugin-template/claude/package.json +0 -16
- package/docs/plugin-template/codex/.github/workflows/build.yml +0 -51
- package/docs/plugin-template/codex/README.md +0 -147
- package/docs/plugin-template/codex/install/install.sh +0 -60
- package/docs/plugin-template/codex/package.json +0 -17
- package/docs/plugin-template/opencode/.github/workflows/build.yml +0 -61
- package/docs/plugin-template/opencode/README.md +0 -121
- package/docs/plugin-template/opencode/package.json +0 -25
- package/docs/plugin-template/opencode/src/plugin.ts +0 -6
- /package/dist/{src/mcp/tools → mcp/handlers}/artifact.d.ts +0 -0
- /package/dist/{src/mcp/tools → mcp/handlers}/history.d.ts +0 -0
- /package/dist/{src/mcp/tools → mcp/handlers}/plan.d.ts +0 -0
- /package/dist/{src/mcp/tools → mcp/handlers}/task.d.ts +0 -0
- /package/dist/{src/shared → shared}/json-store.d.ts +0 -0
- /package/dist/{src/shared → shared}/mcp-utils.d.ts +0 -0
- /package/dist/{src/shared → shared}/mcp-utils.js +0 -0
package/README.md
CHANGED
|
@@ -1,106 +1,140 @@
|
|
|
1
|
-
# nexus-core
|
|
1
|
+
# @moreih29/nexus-core
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
에이전트 조율 계층, 공통 빌드 도구, MCP 서버, 스킬·훅 자산을 단일 패키지로 제공합니다.
|
|
3
|
+
Claude Code · Codex · OpenCode 하네스 위에서 멀티 에이전트 오케스트레이션을 돌리기 위한 canonical 스펙과 도구.
|
|
5
4
|
|
|
6
|
-
##
|
|
5
|
+
## 무엇인가
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
2. **공통 빌드 도구** — `nexus-core sync` / `init` / `validate` CLI
|
|
10
|
-
3. **MCP 서버** — 14개 도구를 stdio 서버로 제공 (`nexus-mcp`)
|
|
11
|
-
4. **하네스별 자산** — 스킬·훅·에이전트 정의, capability-matrix SSOT
|
|
7
|
+
`nexus-core`는 "Lead가 역할별 서브에이전트를 조합해 plan → run 사이클을 돌리는" 에이전트 오케스트레이션 모델을 세 하네스(Claude Code, Codex, OpenCode)에서 동일하게 구현하도록 뒷받침한다. 핵심은 세 축이다.
|
|
12
8
|
|
|
13
|
-
|
|
9
|
+
1. **Canonical 스펙** — 10개 에이전트와 3개 스킬의 하네스 중립 정의
|
|
10
|
+
2. **Sync 파이프라인** (`nexus-sync`) — 스펙을 각 하네스 네이티브 포맷으로 렌더링
|
|
11
|
+
3. **MCP 서버** (`nexus-mcp`) — 플래닝·태스크·이력·아티팩트 상태 관리 도구 노출
|
|
14
12
|
|
|
15
|
-
|
|
13
|
+
제공하지 않는 것 — 훅 런타임, 메인 세션 와이어링, 플러그인 설치 스크립트, 하네스 부트스트랩. 이들은 컨슈머(각 하네스용 플러그인·저장소)가 `nexus-core` 산출물을 받아 자체 구현한다.
|
|
16
14
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
## Installation
|
|
20
|
-
|
|
21
|
-
**요구사항: Node.js 22 이상** (`import ... with { type: "json" }` 구문이 Node 22에서 stable입니다.)
|
|
15
|
+
## 설치
|
|
22
16
|
|
|
23
17
|
```bash
|
|
24
|
-
|
|
25
|
-
|
|
18
|
+
npm install @moreih29/nexus-core
|
|
19
|
+
# 또는
|
|
20
|
+
bun add @moreih29/nexus-core
|
|
26
21
|
```
|
|
27
22
|
|
|
28
|
-
|
|
23
|
+
패키지는 다음을 번들한다.
|
|
29
24
|
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
|
|
25
|
+
```
|
|
26
|
+
node_modules/@moreih29/nexus-core/
|
|
27
|
+
├── spec/ # canonical 에이전트·스킬 정의
|
|
28
|
+
├── vocabulary/ # 도구 호출식 스키마
|
|
29
|
+
├── harness/ # 하네스별 invocations + layout
|
|
30
|
+
└── dist/ # 빌드 산출물 (MCP 서버, sync CLI)
|
|
33
31
|
```
|
|
34
32
|
|
|
35
|
-
|
|
33
|
+
바이너리: `nexus-sync`, `nexus-mcp`. 프로그램적 API: `@moreih29/nexus-core/generate`, `@moreih29/nexus-core/mcp`.
|
|
36
34
|
|
|
37
|
-
##
|
|
35
|
+
## 하네스 컨슈머가 해야 할 세 가지
|
|
38
36
|
|
|
39
|
-
|
|
37
|
+
### 1. 에이전트·스킬 아티팩트 생성
|
|
40
38
|
|
|
41
39
|
```bash
|
|
42
|
-
|
|
43
|
-
|
|
40
|
+
nexus-sync --harness=claude --target=./out/claude
|
|
41
|
+
nexus-sync --harness=codex --target=./out/codex
|
|
42
|
+
nexus-sync --harness=opencode --target=./out/opencode
|
|
43
|
+
```
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
cd my-claude-plugin && bun install
|
|
47
|
-
bunx @moreih29/nexus-core sync --harness=claude --target=./
|
|
45
|
+
`--target` 아래 하네스 레이아웃대로 파일이 생성된다.
|
|
48
46
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
| 하네스 | 에이전트 출력 | 스킬 출력 |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| `claude` | `agents/{id}.md` | `skills/{id}/SKILL.md` |
|
|
50
|
+
| `codex` | `.codex/agents/{id}.toml` | `.codex/skills/{id}/SKILL.md` |
|
|
51
|
+
| `opencode` | `src/agents/{id}.ts` | `skills/{id}/SKILL.md` |
|
|
53
52
|
|
|
54
|
-
|
|
53
|
+
생성된 lead를 메인 세션에 어떻게 연결할지는 하네스마다 다르며 컨슈머의 몫이다. 상세는 [docs/agent-skill-sync.md](docs/agent-skill-sync.md).
|
|
55
54
|
|
|
56
|
-
|
|
55
|
+
### 2. MCP 서버 등록
|
|
57
56
|
|
|
58
|
-
|
|
57
|
+
하네스의 MCP 설정에 `nexus-mcp` 명령을 등록한다. 전송 방식은 stdio, 서버 이름은 `nexus-core`.
|
|
59
58
|
|
|
60
|
-
|
|
|
59
|
+
| 도구 그룹 | 용도 |
|
|
61
60
|
|---|---|
|
|
62
|
-
|
|
|
63
|
-
|
|
|
64
|
-
|
|
|
65
|
-
|
|
|
61
|
+
| `nx_plan_*` | 플래닝 세션 수명주기 |
|
|
62
|
+
| `nx_task_*` | 태스크 수명주기 |
|
|
63
|
+
| `nx_history_search` | 과거 사이클 조회 |
|
|
64
|
+
| `nx_artifact_write` | 아티팩트 쓰기 |
|
|
66
65
|
|
|
67
|
-
|
|
66
|
+
MCP 서버는 컨슈머 프로젝트 루트 기준 `.nexus/state/`와 `.nexus/history.json`만 읽고 쓴다. 상세는 [docs/mcp-server-tools.md](docs/mcp-server-tools.md).
|
|
68
67
|
|
|
69
|
-
|
|
68
|
+
### 3. 훅 와이어링
|
|
70
69
|
|
|
71
|
-
|
|
70
|
+
Nexus 런타임이 기대하는 세 가지 역할을 각 하네스에서 와이어링한다.
|
|
72
71
|
|
|
73
|
-
|
|
72
|
+
1. 세션 진입 시 `.nexus/` 폴더 구조와 `.gitignore` 화이트리스트 보장
|
|
73
|
+
2. 사용자 프롬프트에서 Nexus 태그(`[plan]`·`[auto-plan]`·`[run]`·`[m]`·`[m:gc]`) 감지해 스킬/지시 활성화
|
|
74
|
+
3. (선택) Nexus 규칙 위반 Bash 명령 차단
|
|
74
75
|
|
|
75
|
-
|
|
76
|
-
|---|---|
|
|
77
|
-
| `@moreih29/nexus-core/hooks/opencode-mount` | `mountHooks` 함수 |
|
|
78
|
-
| `@moreih29/nexus-core/hooks/runtime` | 런타임 유틸리티 |
|
|
79
|
-
| `@moreih29/nexus-core/hooks/opencode-manifest` | OpenCode hook JSON manifest |
|
|
76
|
+
하네스별 권장 훅과 이벤트 매핑은 [docs/harness-hooks.md](docs/harness-hooks.md).
|
|
80
77
|
|
|
81
|
-
|
|
78
|
+
## 에이전트 모델
|
|
82
79
|
|
|
83
|
-
|
|
80
|
+
세 카테고리로 역할이 분리된다.
|
|
84
81
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
82
|
+
| 카테고리 | 역할 | 에이전트 |
|
|
83
|
+
|---|---|---|
|
|
84
|
+
| HOW | 기술 설계·분석·전략 자문 | architect, designer, postdoc, strategist |
|
|
85
|
+
| DO | 실행 | engineer, writer, researcher |
|
|
86
|
+
| CHECK | 검증 | reviewer, tester |
|
|
89
87
|
|
|
90
|
-
|
|
91
|
-
```
|
|
88
|
+
`lead`는 메인 세션에서 사용자와 대화하고, 서브에이전트를 조합하며, plan/task 수명주기를 주도한다. 재개가 필요한 시점에 스폰 때 받은 `agent_id`를 `nx_plan_analysis_add` / `nx_task_update`에 기록해두고, 나중에 `nx_plan_resume` / `nx_task_resume`로 되찾아 `{{subagent_resume}}`로 재개한다.
|
|
92
89
|
|
|
93
|
-
|
|
94
|
-
- `mountHooks(ctx, manifest)`는 manifest에 정의된 훅을 OpenCode context에 등록합니다.
|
|
90
|
+
## 스킬과 태그
|
|
95
91
|
|
|
96
|
-
|
|
92
|
+
| 태그 | 스킬/동작 | 목적 |
|
|
93
|
+
|---|---|---|
|
|
94
|
+
| `[plan]` | nx-plan | 사용자 결정 중심의 구조적 분석 |
|
|
95
|
+
| `[auto-plan]` | nx-auto-plan | Lead 자율 결정 |
|
|
96
|
+
| `[run]` | nx-run | 태스크 실행 오케스트레이션 |
|
|
97
|
+
| `[d]` | 결정 기록 | 활성 plan 세션의 현재 안건에 `nx_plan_decide` |
|
|
98
|
+
| `[m]` | memory 저장 | `.nexus/memory/`에 누적 |
|
|
99
|
+
| `[m:gc]` | memory 정리 | `.nexus/memory/` 병합·제거 |
|
|
97
100
|
|
|
98
|
-
|
|
101
|
+
## 도구 호출식
|
|
99
102
|
|
|
100
|
-
|
|
103
|
+
스펙 본문에서 이중 중괄호 표기로 호출하는 도구. sync 시점에 각 하네스 네이티브 문법으로 확장된다.
|
|
101
104
|
|
|
102
|
-
|
|
|
105
|
+
| 호출식 | 용도 |
|
|
103
106
|
|---|---|
|
|
104
|
-
|
|
|
105
|
-
|
|
|
106
|
-
|
|
|
107
|
+
| `{{subagent_spawn}}` | 서브에이전트 스폰 |
|
|
108
|
+
| `{{subagent_resume}}` | 기존 서브에이전트 재개 |
|
|
109
|
+
| `{{skill_activation}}` | 스킬 활성화 |
|
|
110
|
+
| `{{task_register}}` | 태스크 진행 추적 등록 |
|
|
111
|
+
| `{{user_question}}` | 사용자에게 선택지 질문 |
|
|
112
|
+
|
|
113
|
+
스키마는 `vocabulary/invocations.yml`, 하네스별 확장 템플릿은 `harness/<name>/invocations.yml`에 있다.
|
|
114
|
+
|
|
115
|
+
## 파일 레이아웃 (컨슈머 프로젝트 기준)
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
.nexus/
|
|
119
|
+
├── .gitignore # 화이트리스트 — context, memory, history만 추적
|
|
120
|
+
├── context/ # 설계 원칙·아키텍처
|
|
121
|
+
├── memory/ # empirical-·external-·pattern- prefix 교훈
|
|
122
|
+
├── state/
|
|
123
|
+
│ ├── plan.json # 현재 plan 세션
|
|
124
|
+
│ ├── tasks.json # 현재 태스크 목록
|
|
125
|
+
│ └── artifacts/ # 사이클 산출물
|
|
126
|
+
└── history.json # 종료된 사이클 아카이브
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
- `state/*`·`history.json` — MCP 도구만 편집
|
|
130
|
+
- `context/`·`memory/` — Lead가 사용자 태그로 관리
|
|
131
|
+
|
|
132
|
+
## 관련 문서
|
|
133
|
+
|
|
134
|
+
- [에이전트·스킬 명세 동기화](docs/agent-skill-sync.md)
|
|
135
|
+
- [MCP 서버 도구](docs/mcp-server-tools.md)
|
|
136
|
+
- [하네스 훅 권장](docs/harness-hooks.md)
|
|
137
|
+
|
|
138
|
+
## 라이선스
|
|
139
|
+
|
|
140
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/cli/sync.ts"],"names":[],"mappings":";AAgDA,wBAAgB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,IAAI,CAiBjE"}
|
package/dist/cli/sync.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { syncSpecsToTarget } from "../generate/sync.js";
|
|
4
|
+
function parseArgs(argv) {
|
|
5
|
+
let harness = null;
|
|
6
|
+
let target = null;
|
|
7
|
+
let dryRun = false;
|
|
8
|
+
for (const arg of argv) {
|
|
9
|
+
if (arg === "--dry-run") {
|
|
10
|
+
dryRun = true;
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
if (arg.startsWith("--harness=")) {
|
|
14
|
+
const value = arg.slice("--harness=".length);
|
|
15
|
+
if (value === "claude" || value === "codex" || value === "opencode") {
|
|
16
|
+
harness = value;
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
throw new Error(`Unsupported harness "${value}"`);
|
|
20
|
+
}
|
|
21
|
+
if (arg.startsWith("--target=")) {
|
|
22
|
+
target = arg.slice("--target=".length);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (!harness) {
|
|
26
|
+
throw new Error(`Missing required flag --harness=<claude|codex|opencode>`);
|
|
27
|
+
}
|
|
28
|
+
if (!target) {
|
|
29
|
+
throw new Error(`Missing required flag --target=<directory>`);
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
harness,
|
|
33
|
+
target: resolve(target),
|
|
34
|
+
dryRun,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function main(argv = process.argv.slice(2)) {
|
|
38
|
+
const parsed = parseArgs(argv);
|
|
39
|
+
const result = syncSpecsToTarget(parsed);
|
|
40
|
+
if (parsed.dryRun) {
|
|
41
|
+
console.log(`[nexus-sync] dry-run: ${result.files.length} files would be generated`);
|
|
42
|
+
for (const file of result.files) {
|
|
43
|
+
console.log(file.targetPath);
|
|
44
|
+
}
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
console.log(`[nexus-sync] harness=${result.harness} wrote ${result.writtenFiles.length}/${result.files.length} files to ${result.targetRoot}`);
|
|
48
|
+
}
|
|
49
|
+
const isDirectRun = import.meta.url === `file://${process.argv[1]}`;
|
|
50
|
+
if (isDirectRun) {
|
|
51
|
+
try {
|
|
52
|
+
main();
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.error("[nexus-sync] fatal:", error);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/cli/sync.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AASxD,SAAS,SAAS,CAAC,IAAc;IAC/B,IAAI,OAAO,GAAmB,IAAI,CAAC;IACnC,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACxB,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC7C,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;gBACpE,OAAO,GAAG,KAAK,CAAC;gBAChB,SAAS;YACX,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,GAAG,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,OAAO;QACL,OAAO;QACP,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;QACvB,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAiB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAEzC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CACT,yBAAyB,MAAM,CAAC,KAAK,CAAC,MAAM,2BAA2B,CACxE,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CACT,wBAAwB,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,YAAY,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,aAAa,MAAM,CAAC,UAAU,EAAE,CAClI,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACpE,IAAI,WAAW,EAAE,CAAC;IAChB,IAAI,CAAC;QACH,IAAI,EAAE,CAAC;IACT,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnE,YAAY,EACV,SAAS,EACT,aAAa,EACb,OAAO,EACP,YAAY,EACZ,WAAW,EACX,UAAU,GACX,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ClaudeAgentRules, CodexAgentRules, Harness, HarnessInvocationMap, HarnessLayout, InvocationSchema, OpencodeAgentRules } from "./types.js";
|
|
2
|
+
export declare function loadInvocationCatalog(): Map<string, InvocationSchema>;
|
|
3
|
+
export declare function loadHarnessInvocationMap(harness: Harness): HarnessInvocationMap["invocation_map"];
|
|
4
|
+
export declare function loadHarnessLayout(harness: Harness): HarnessLayout;
|
|
5
|
+
export declare function loadClaudeAgentRules(): ClaudeAgentRules;
|
|
6
|
+
export declare function loadCodexAgentRules(): CodexAgentRules;
|
|
7
|
+
export declare function loadOpencodeAgentRules(): OpencodeAgentRules;
|
|
8
|
+
//# sourceMappingURL=load-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-data.d.ts","sourceRoot":"","sources":["../../src/generate/load-data.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAEf,OAAO,EACP,oBAAoB,EACpB,aAAa,EAEb,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AASpB,wBAAgB,qBAAqB,IAAI,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAyBrE;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,GACf,oBAAoB,CAAC,gBAAgB,CAAC,CAKxC;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CAEjE;AAED,wBAAgB,oBAAoB,IAAI,gBAAgB,CAEvD;AAED,wBAAgB,mBAAmB,IAAI,eAAe,CAErD;AAED,wBAAgB,sBAAsB,IAAI,kBAAkB,CAE3D"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { parse as parseYaml } from "yaml";
|
|
4
|
+
const PACKAGE_ROOT = new URL("../../", import.meta.url);
|
|
5
|
+
function readYamlFile(relativePath) {
|
|
6
|
+
const absolutePath = new URL(relativePath, PACKAGE_ROOT);
|
|
7
|
+
return parseYaml(readFileSync(absolutePath, "utf8"));
|
|
8
|
+
}
|
|
9
|
+
export function loadInvocationCatalog() {
|
|
10
|
+
const catalog = readYamlFile("vocabulary/invocations.yml");
|
|
11
|
+
const result = new Map();
|
|
12
|
+
for (const invocation of catalog.invocations) {
|
|
13
|
+
const params = {};
|
|
14
|
+
for (const [name, schema] of Object.entries(invocation.params)) {
|
|
15
|
+
const resolved = { ...schema };
|
|
16
|
+
if (schema.type === "enum" && schema.values_ref) {
|
|
17
|
+
const enumValues = readYamlFile(join("vocabulary", schema.values_ref));
|
|
18
|
+
resolved.values = enumValues.values;
|
|
19
|
+
}
|
|
20
|
+
params[name] = resolved;
|
|
21
|
+
}
|
|
22
|
+
result.set(invocation.id, {
|
|
23
|
+
id: invocation.id,
|
|
24
|
+
params,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
export function loadHarnessInvocationMap(harness) {
|
|
30
|
+
const data = readYamlFile(`harness/${harness}/invocations.yml`);
|
|
31
|
+
return data.invocation_map;
|
|
32
|
+
}
|
|
33
|
+
export function loadHarnessLayout(harness) {
|
|
34
|
+
return readYamlFile(`harness/${harness}/layout.yml`);
|
|
35
|
+
}
|
|
36
|
+
export function loadClaudeAgentRules() {
|
|
37
|
+
return readYamlFile("harness/claude/agent-rules.yml");
|
|
38
|
+
}
|
|
39
|
+
export function loadCodexAgentRules() {
|
|
40
|
+
return readYamlFile("harness/codex/agent-rules.yml");
|
|
41
|
+
}
|
|
42
|
+
export function loadOpencodeAgentRules() {
|
|
43
|
+
return readYamlFile("harness/opencode/agent-rules.yml");
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=load-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-data.js","sourceRoot":"","sources":["../../src/generate/load-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAa1C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAExD,SAAS,YAAY,CAAI,YAAoB;IAC3C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACzD,OAAO,SAAS,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAM,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,MAAM,OAAO,GAAG,YAAY,CAAoB,4BAA4B,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IAEnD,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,MAAM,GAA+B,EAAE,CAAC;QAE9C,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/D,MAAM,QAAQ,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;YAC/B,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBAChD,MAAM,UAAU,GAAG,YAAY,CAC7B,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CACtC,CAAC;gBACF,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;YACtC,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;QAC1B,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE;YACxB,EAAE,EAAE,UAAU,CAAC,EAAE;YACjB,MAAM;SACP,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,OAAgB;IAEhB,MAAM,IAAI,GAAG,YAAY,CACvB,WAAW,OAAO,kBAAkB,CACrC,CAAC;IACF,OAAO,IAAI,CAAC,cAAc,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,OAAO,YAAY,CAAgB,WAAW,OAAO,aAAa,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,YAAY,CAAmB,gCAAgC,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,YAAY,CAAkB,+BAA+B,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,YAAY,CAAqB,kCAAkC,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-spec.d.ts","sourceRoot":"","sources":["../../src/generate/load-spec.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAa,YAAY,EAAE,MAAM,YAAY,CAAC;AAuD1D,wBAAgB,iBAAiB,IAAI,YAAY,EAAE,CAElD"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { readdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { parse as parseYaml } from "yaml";
|
|
4
|
+
const SPEC_ROOT = new URL("../../spec/", import.meta.url);
|
|
5
|
+
function parseFrontmatter(raw, sourcePath) {
|
|
6
|
+
if (!raw.startsWith("---\n")) {
|
|
7
|
+
throw new Error(`Missing frontmatter in ${sourcePath}`);
|
|
8
|
+
}
|
|
9
|
+
const end = raw.indexOf("\n---\n", 4);
|
|
10
|
+
if (end === -1) {
|
|
11
|
+
throw new Error(`Unterminated frontmatter in ${sourcePath}`);
|
|
12
|
+
}
|
|
13
|
+
const frontmatterRaw = raw.slice(4, end);
|
|
14
|
+
const body = raw.slice(end + 5).replace(/^\n/, "");
|
|
15
|
+
return {
|
|
16
|
+
frontmatter: parseYaml(frontmatterRaw),
|
|
17
|
+
body,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function loadKind(kind) {
|
|
21
|
+
const dir = new URL(`${kind}s/`, SPEC_ROOT);
|
|
22
|
+
const absoluteDir = dir.pathname;
|
|
23
|
+
const results = [];
|
|
24
|
+
for (const entry of readdirSync(absoluteDir, { withFileTypes: true })) {
|
|
25
|
+
if (!entry.isDirectory())
|
|
26
|
+
continue;
|
|
27
|
+
const sourcePath = join(absoluteDir, entry.name, "body.md");
|
|
28
|
+
const raw = readFileSync(sourcePath, "utf8");
|
|
29
|
+
const { frontmatter, body } = parseFrontmatter(raw, sourcePath);
|
|
30
|
+
const id = String(frontmatter.id ?? entry.name);
|
|
31
|
+
const name = String(frontmatter.name ?? id);
|
|
32
|
+
const description = String(frontmatter.description ?? "");
|
|
33
|
+
results.push({
|
|
34
|
+
kind,
|
|
35
|
+
id,
|
|
36
|
+
name,
|
|
37
|
+
description,
|
|
38
|
+
frontmatter,
|
|
39
|
+
body,
|
|
40
|
+
sourcePath,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return results.sort((a, b) => a.id.localeCompare(b.id));
|
|
44
|
+
}
|
|
45
|
+
export function loadSpecDocuments() {
|
|
46
|
+
return [...loadKind("agent"), ...loadKind("skill")];
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=load-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-spec.js","sourceRoot":"","sources":["../../src/generate/load-spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAG1C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE1D,SAAS,gBAAgB,CACvB,GAAW,EACX,UAAkB;IAElB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACtC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnD,OAAO;QACL,WAAW,EAAE,SAAS,CAAC,cAAc,CAA4B;QACjE,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,IAAe;IAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,SAAS,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC;IACjC,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACtE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QAEnC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAEhE,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QAE1D,OAAO,CAAC,IAAI,CAAC;YACX,IAAI;YACJ,EAAE;YACF,IAAI;YACJ,WAAW;YACX,WAAW;YACX,IAAI;YACJ,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { Harness, InvocationSchema } from "../types.js";
|
|
2
|
+
export declare function expandMacrosForHarness(body: string, _harness: Harness, catalog: Map<string, InvocationSchema>, invocationMap: Record<string, Record<string, unknown>>): string;
|
|
3
|
+
//# sourceMappingURL=expand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand.d.ts","sourceRoot":"","sources":["../../../src/generate/macros/expand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAe,MAAM,aAAa,CAAC;AAwD1E,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACtC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACrD,MAAM,CAWR"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { expandMacroExpressions } from "./parse.js";
|
|
2
|
+
import { validateMacro } from "./validate.js";
|
|
3
|
+
function stringifyParam(value) {
|
|
4
|
+
if (typeof value === "string") {
|
|
5
|
+
return value;
|
|
6
|
+
}
|
|
7
|
+
return `>>${value.heredoc}`;
|
|
8
|
+
}
|
|
9
|
+
function normalizeMacroParams(macro, config) {
|
|
10
|
+
const params = {};
|
|
11
|
+
for (const [key, value] of Object.entries(macro.params)) {
|
|
12
|
+
params[key] = stringifyParam(value);
|
|
13
|
+
}
|
|
14
|
+
const aliases = typeof config.role_aliases === "object" && config.role_aliases !== null
|
|
15
|
+
? config.role_aliases
|
|
16
|
+
: {};
|
|
17
|
+
if (params.target_role) {
|
|
18
|
+
params.target_role = aliases[params.target_role] ?? params.target_role;
|
|
19
|
+
}
|
|
20
|
+
if (!params.name &&
|
|
21
|
+
config.name_fallback === "target_role" &&
|
|
22
|
+
params.target_role) {
|
|
23
|
+
params.name = params.target_role;
|
|
24
|
+
}
|
|
25
|
+
return params;
|
|
26
|
+
}
|
|
27
|
+
function applyTemplate(template, params) {
|
|
28
|
+
let result = template;
|
|
29
|
+
for (const [key, value] of Object.entries(params)) {
|
|
30
|
+
result = result.replace(new RegExp(`\\{${key}\\}`, "g"), value);
|
|
31
|
+
}
|
|
32
|
+
result = result.replace(/,?\s*\w+:\s*"\{[^}]+\}"/g, "");
|
|
33
|
+
result = result.replace(/,?\s*\w+:\s*\{[^}]+\}/g, "");
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
export function expandMacrosForHarness(body, _harness, catalog, invocationMap) {
|
|
37
|
+
return expandMacroExpressions(body, (macro) => {
|
|
38
|
+
validateMacro(macro, catalog);
|
|
39
|
+
const config = invocationMap[macro.id] ?? {};
|
|
40
|
+
const template = config.template;
|
|
41
|
+
if (typeof template !== "string" || template.length === 0) {
|
|
42
|
+
throw new Error(`Missing template for macro "${macro.id}"`);
|
|
43
|
+
}
|
|
44
|
+
const params = normalizeMacroParams(macro, config);
|
|
45
|
+
return applyTemplate(template, params);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=expand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand.js","sourceRoot":"","sources":["../../../src/generate/macros/expand.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,SAAS,cAAc,CAAC,KAAmC;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAAkB,EAClB,MAA+B;IAE/B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACxD,MAAM,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,OAAO,GACX,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,IAAI,MAAM,CAAC,YAAY,KAAK,IAAI;QACrE,CAAC,CAAE,MAAM,CAAC,YAAuC;QACjD,CAAC,CAAC,EAAE,CAAC;IAET,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC;IACzE,CAAC;IAED,IACE,CAAC,MAAM,CAAC,IAAI;QACZ,MAAM,CAAC,aAAa,KAAK,aAAa;QACtC,MAAM,CAAC,WAAW,EAClB,CAAC;QACD,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC;IACnC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CACpB,QAAgB,EAChB,MAA8B;IAE9B,IAAI,MAAM,GAAG,QAAQ,CAAC;IAEtB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;IACxD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;IACtD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,IAAY,EACZ,QAAiB,EACjB,OAAsC,EACtC,aAAsD;IAEtD,OAAO,sBAAsB,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;QAC5C,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACnD,OAAO,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ParsedMacro } from "../types.js";
|
|
2
|
+
export declare function parseMacroExpression(expression: string): ParsedMacro;
|
|
3
|
+
export declare function expandMacroExpressions(input: string, replacer: (macro: ParsedMacro) => string): string;
|
|
4
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/generate/macros/parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgG/C,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,CAepE;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,MAAM,GACvC,MAAM,CA8CR"}
|