@moreih29/nexus-core 0.11.0 → 0.13.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.
Files changed (210) hide show
  1. package/README.md +48 -63
  2. package/assets/agents/architect/body.ko.md +177 -0
  3. package/{agents → assets/agents}/architect/body.md +16 -0
  4. package/assets/agents/designer/body.ko.md +125 -0
  5. package/{agents → assets/agents}/designer/body.md +16 -0
  6. package/assets/agents/engineer/body.ko.md +106 -0
  7. package/{agents → assets/agents}/engineer/body.md +14 -0
  8. package/assets/agents/lead/body.ko.md +70 -0
  9. package/assets/agents/lead/body.md +70 -0
  10. package/assets/agents/postdoc/body.ko.md +122 -0
  11. package/{agents → assets/agents}/postdoc/body.md +16 -0
  12. package/assets/agents/researcher/body.ko.md +137 -0
  13. package/{agents → assets/agents}/researcher/body.md +15 -0
  14. package/assets/agents/reviewer/body.ko.md +138 -0
  15. package/{agents → assets/agents}/reviewer/body.md +15 -0
  16. package/assets/agents/strategist/body.ko.md +116 -0
  17. package/{agents → assets/agents}/strategist/body.md +16 -0
  18. package/assets/agents/tester/body.ko.md +195 -0
  19. package/{agents → assets/agents}/tester/body.md +15 -0
  20. package/assets/agents/writer/body.ko.md +122 -0
  21. package/{agents → assets/agents}/writer/body.md +14 -0
  22. package/assets/capability-matrix.yml +198 -0
  23. package/assets/hooks/agent-bootstrap/handler.test.ts +368 -0
  24. package/assets/hooks/agent-bootstrap/handler.ts +119 -0
  25. package/assets/hooks/agent-bootstrap/meta.yml +10 -0
  26. package/assets/hooks/agent-finalize/handler.test.ts +368 -0
  27. package/assets/hooks/agent-finalize/handler.ts +76 -0
  28. package/assets/hooks/agent-finalize/meta.yml +10 -0
  29. package/assets/hooks/capability-matrix.yml +313 -0
  30. package/assets/hooks/post-tool-telemetry/handler.test.ts +302 -0
  31. package/assets/hooks/post-tool-telemetry/handler.ts +49 -0
  32. package/assets/hooks/post-tool-telemetry/meta.yml +11 -0
  33. package/assets/hooks/prompt-router/handler.test.ts +801 -0
  34. package/assets/hooks/prompt-router/handler.ts +261 -0
  35. package/assets/hooks/prompt-router/meta.yml +11 -0
  36. package/assets/hooks/session-init/handler.test.ts +274 -0
  37. package/assets/hooks/session-init/handler.ts +30 -0
  38. package/assets/hooks/session-init/meta.yml +9 -0
  39. package/assets/lsp-servers.json +55 -0
  40. package/assets/schema/lsp-servers.schema.json +67 -0
  41. package/assets/skills/nx-init/body.ko.md +197 -0
  42. package/{skills → assets/skills}/nx-init/body.md +11 -0
  43. package/assets/skills/nx-plan/body.ko.md +361 -0
  44. package/{skills → assets/skills}/nx-plan/body.md +13 -0
  45. package/assets/skills/nx-run/body.ko.md +161 -0
  46. package/{skills → assets/skills}/nx-run/body.md +11 -0
  47. package/assets/skills/nx-sync/body.ko.md +92 -0
  48. package/{skills → assets/skills}/nx-sync/body.md +10 -0
  49. package/assets/tools/tool-name-map.yml +353 -0
  50. package/dist/hooks/opencode-mount.d.ts +35 -0
  51. package/dist/hooks/opencode-mount.d.ts.map +1 -0
  52. package/dist/hooks/opencode-mount.js +332 -0
  53. package/dist/hooks/opencode-mount.js.map +1 -0
  54. package/dist/hooks/runtime.d.ts +37 -0
  55. package/dist/hooks/runtime.d.ts.map +1 -0
  56. package/dist/hooks/runtime.js +274 -0
  57. package/dist/hooks/runtime.js.map +1 -0
  58. package/dist/hooks/types.d.ts +196 -0
  59. package/dist/hooks/types.d.ts.map +1 -0
  60. package/dist/hooks/types.js +85 -0
  61. package/dist/hooks/types.js.map +1 -0
  62. package/dist/lsp/cache.d.ts +9 -0
  63. package/dist/lsp/cache.d.ts.map +1 -0
  64. package/dist/lsp/cache.js +216 -0
  65. package/dist/lsp/cache.js.map +1 -0
  66. package/dist/lsp/client.d.ts +24 -0
  67. package/dist/lsp/client.d.ts.map +1 -0
  68. package/dist/lsp/client.js +166 -0
  69. package/dist/lsp/client.js.map +1 -0
  70. package/dist/lsp/detect.d.ts +77 -0
  71. package/dist/lsp/detect.d.ts.map +1 -0
  72. package/dist/lsp/detect.js +116 -0
  73. package/dist/lsp/detect.js.map +1 -0
  74. package/dist/mcp/server.d.ts +5 -0
  75. package/dist/mcp/server.d.ts.map +1 -0
  76. package/dist/mcp/server.js +34 -0
  77. package/dist/mcp/server.js.map +1 -0
  78. package/dist/mcp/tools/artifact.d.ts +4 -0
  79. package/dist/mcp/tools/artifact.d.ts.map +1 -0
  80. package/dist/mcp/tools/artifact.js +36 -0
  81. package/dist/mcp/tools/artifact.js.map +1 -0
  82. package/dist/mcp/tools/history.d.ts +3 -0
  83. package/dist/mcp/tools/history.d.ts.map +1 -0
  84. package/dist/mcp/tools/history.js +29 -0
  85. package/dist/mcp/tools/history.js.map +1 -0
  86. package/dist/mcp/tools/lsp.d.ts +13 -0
  87. package/dist/mcp/tools/lsp.d.ts.map +1 -0
  88. package/dist/mcp/tools/lsp.js +225 -0
  89. package/dist/mcp/tools/lsp.js.map +1 -0
  90. package/dist/mcp/tools/plan.d.ts +3 -0
  91. package/dist/mcp/tools/plan.d.ts.map +1 -0
  92. package/dist/mcp/tools/plan.js +317 -0
  93. package/dist/mcp/tools/plan.js.map +1 -0
  94. package/dist/mcp/tools/task.d.ts +3 -0
  95. package/dist/mcp/tools/task.d.ts.map +1 -0
  96. package/dist/mcp/tools/task.js +252 -0
  97. package/dist/mcp/tools/task.js.map +1 -0
  98. package/dist/shared/invocations.d.ts +74 -0
  99. package/dist/shared/invocations.d.ts.map +1 -0
  100. package/dist/shared/invocations.js +247 -0
  101. package/dist/shared/invocations.js.map +1 -0
  102. package/dist/shared/json-store.d.ts +37 -0
  103. package/dist/shared/json-store.d.ts.map +1 -0
  104. package/dist/shared/json-store.js +163 -0
  105. package/dist/shared/json-store.js.map +1 -0
  106. package/dist/shared/mcp-utils.d.ts +3 -0
  107. package/dist/shared/mcp-utils.d.ts.map +1 -0
  108. package/dist/shared/mcp-utils.js +6 -0
  109. package/dist/shared/mcp-utils.js.map +1 -0
  110. package/dist/shared/paths.d.ts +21 -0
  111. package/dist/shared/paths.d.ts.map +1 -0
  112. package/dist/shared/paths.js +81 -0
  113. package/dist/shared/paths.js.map +1 -0
  114. package/dist/shared/tool-log.d.ts +8 -0
  115. package/dist/shared/tool-log.d.ts.map +1 -0
  116. package/dist/shared/tool-log.js +22 -0
  117. package/dist/shared/tool-log.js.map +1 -0
  118. package/dist/types/state.d.ts +862 -0
  119. package/dist/types/state.d.ts.map +1 -0
  120. package/dist/types/state.js +66 -0
  121. package/dist/types/state.js.map +1 -0
  122. package/docs/consuming/codex-lead-merge.md +106 -0
  123. package/docs/plugin-guide.md +360 -0
  124. package/docs/plugin-template/claude/.github/workflows/build.yml +60 -0
  125. package/docs/plugin-template/claude/README.md +110 -0
  126. package/docs/plugin-template/claude/package.json +16 -0
  127. package/docs/plugin-template/codex/.github/workflows/build.yml +51 -0
  128. package/docs/plugin-template/codex/README.md +147 -0
  129. package/docs/plugin-template/codex/package.json +17 -0
  130. package/docs/plugin-template/opencode/.github/workflows/build.yml +61 -0
  131. package/docs/plugin-template/opencode/README.md +121 -0
  132. package/docs/plugin-template/opencode/package.json +25 -0
  133. package/package.json +21 -21
  134. package/scripts/build-agents.test.ts +1279 -0
  135. package/scripts/build-agents.ts +978 -0
  136. package/scripts/build-hooks.test.ts +1385 -0
  137. package/scripts/build-hooks.ts +584 -0
  138. package/scripts/cli.test.ts +367 -0
  139. package/scripts/cli.ts +547 -0
  140. package/agents/architect/meta.yml +0 -13
  141. package/agents/designer/meta.yml +0 -13
  142. package/agents/engineer/meta.yml +0 -11
  143. package/agents/postdoc/meta.yml +0 -13
  144. package/agents/researcher/meta.yml +0 -12
  145. package/agents/reviewer/meta.yml +0 -12
  146. package/agents/strategist/meta.yml +0 -13
  147. package/agents/tester/meta.yml +0 -12
  148. package/agents/writer/meta.yml +0 -11
  149. package/conformance/README.md +0 -311
  150. package/conformance/examples/plan.extension.schema.example.json +0 -25
  151. package/conformance/lifecycle/README.md +0 -48
  152. package/conformance/lifecycle/agent-complete.json +0 -44
  153. package/conformance/lifecycle/agent-resume.json +0 -43
  154. package/conformance/lifecycle/agent-spawn.json +0 -36
  155. package/conformance/lifecycle/memory-access-record.json +0 -27
  156. package/conformance/lifecycle/session-end.json +0 -48
  157. package/conformance/scenarios/full-plan-cycle.json +0 -147
  158. package/conformance/scenarios/task-deps-ordering.json +0 -95
  159. package/conformance/schema/fixture.schema.json +0 -354
  160. package/conformance/state-schemas/agent-tracker.schema.json +0 -63
  161. package/conformance/state-schemas/history.schema.json +0 -134
  162. package/conformance/state-schemas/memory-access.schema.json +0 -36
  163. package/conformance/state-schemas/plan.schema.json +0 -77
  164. package/conformance/state-schemas/tasks.schema.json +0 -98
  165. package/conformance/tools/artifact-write.json +0 -97
  166. package/conformance/tools/context.json +0 -172
  167. package/conformance/tools/history-search.json +0 -219
  168. package/conformance/tools/plan-decide.json +0 -139
  169. package/conformance/tools/plan-start.json +0 -81
  170. package/conformance/tools/plan-status.json +0 -127
  171. package/conformance/tools/plan-update.json +0 -341
  172. package/conformance/tools/task-add.json +0 -156
  173. package/conformance/tools/task-close.json +0 -161
  174. package/conformance/tools/task-list.json +0 -177
  175. package/conformance/tools/task-update.json +0 -167
  176. package/docs/behavioral-contracts.md +0 -145
  177. package/docs/consumer-implementation-guide.md +0 -852
  178. package/docs/memory-lifecycle-contract.md +0 -119
  179. package/docs/nexus-layout.md +0 -224
  180. package/docs/nexus-outputs-contract.md +0 -344
  181. package/docs/nexus-state-overview.md +0 -170
  182. package/docs/nexus-tools-contract.md +0 -438
  183. package/manifest.json +0 -449
  184. package/schema/README.md +0 -69
  185. package/schema/agent.schema.json +0 -23
  186. package/schema/common.schema.json +0 -17
  187. package/schema/manifest.schema.json +0 -78
  188. package/schema/memory-policy.schema.json +0 -98
  189. package/schema/skill.schema.json +0 -54
  190. package/schema/task-exceptions.schema.json +0 -40
  191. package/schema/vocabulary.schema.json +0 -167
  192. package/scripts/.gitkeep +0 -0
  193. package/scripts/conformance-coverage.ts +0 -466
  194. package/scripts/import-from-claude-nexus.ts +0 -403
  195. package/scripts/lib/frontmatter.ts +0 -71
  196. package/scripts/lib/lint.ts +0 -348
  197. package/scripts/lib/structure.ts +0 -159
  198. package/scripts/lib/validate.ts +0 -794
  199. package/scripts/validate.ts +0 -90
  200. package/skills/nx-init/meta.yml +0 -8
  201. package/skills/nx-plan/meta.yml +0 -10
  202. package/skills/nx-run/meta.yml +0 -9
  203. package/skills/nx-sync/meta.yml +0 -7
  204. package/vocabulary/capabilities.yml +0 -65
  205. package/vocabulary/categories.yml +0 -11
  206. package/vocabulary/invocations.yml +0 -147
  207. package/vocabulary/memory_policy.yml +0 -88
  208. package/vocabulary/resume-tiers.yml +0 -11
  209. package/vocabulary/tags.yml +0 -60
  210. package/vocabulary/task-exceptions.yml +0 -29
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/types/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,gBAAgB,mDAAiD,CAAC;AAC/E,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAG1D,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;EAKlC,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAGxE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAGxD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMzB,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAGtD,eAAO,MAAM,eAAe;;;;;;;;;;;;EAI1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAGxD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYzB,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAGtD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAGxD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAM7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAG9D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG5B,CAAC;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,66 @@
1
+ import { z } from "zod";
2
+ // resume_tier
3
+ export const ResumeTierSchema = z.enum(["persistent", "bounded", "ephemeral"]);
4
+ // PlanIssue.analysis entry
5
+ export const PlanAnalysisEntrySchema = z.object({
6
+ role: z.string(),
7
+ agent_id: z.string().optional(),
8
+ summary: z.string(),
9
+ recorded_at: z.string(), // ISO
10
+ });
11
+ // PlanIssue
12
+ export const PlanIssueSchema = z.object({
13
+ id: z.number(),
14
+ title: z.string(),
15
+ status: z.enum(["pending", "decided"]),
16
+ decision: z.string().optional(),
17
+ analysis: z.array(PlanAnalysisEntrySchema).optional(),
18
+ });
19
+ // PlanFile
20
+ export const PlanFileSchema = z.object({
21
+ id: z.number(),
22
+ topic: z.string(),
23
+ issues: z.array(PlanIssueSchema),
24
+ research_summary: z.string().optional(),
25
+ created_at: z.string(),
26
+ });
27
+ // TaskOwner
28
+ export const TaskOwnerSchema = z.object({
29
+ role: z.string(),
30
+ agent_id: z.string().optional(),
31
+ resume_tier: ResumeTierSchema.optional(),
32
+ });
33
+ // TaskItem
34
+ export const TaskItemSchema = z.object({
35
+ id: z.number(),
36
+ title: z.string(),
37
+ status: z.enum(["pending", "in_progress", "completed"]),
38
+ context: z.string(),
39
+ acceptance: z.string(),
40
+ approach: z.string().optional(),
41
+ risk: z.string().optional(),
42
+ plan_issue: z.number().optional(),
43
+ deps: z.array(z.number()).optional(),
44
+ owner: TaskOwnerSchema,
45
+ created_at: z.string(),
46
+ });
47
+ // TasksFile
48
+ export const TasksFileSchema = z.object({
49
+ goal: z.string().optional(),
50
+ decisions: z.array(z.string()).optional(),
51
+ tasks: z.array(TaskItemSchema),
52
+ });
53
+ // HistoryCycle (memoryHint 제거)
54
+ export const HistoryCycleSchema = z.object({
55
+ schema_version: z.string().optional(),
56
+ completed_at: z.string(),
57
+ branch: z.string(),
58
+ plan: PlanFileSchema.optional(),
59
+ tasks: z.array(TaskItemSchema).optional(),
60
+ });
61
+ // HistoryFile
62
+ export const HistoryFileSchema = z.object({
63
+ schema_version: z.string().optional(),
64
+ cycles: z.array(HistoryCycleSchema),
65
+ });
66
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/types/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ # Codex Lead Agent 수동 머지 가이드
2
+
3
+ Codex 하네스에서 nexus-core의 lead agent system prompt를 AGENTS.md에 주입하는 수동 절차를 설명합니다.
4
+
5
+ ## 배경
6
+
7
+ Codex는 main agent의 system prompt를 주입하는 공식 경로를 제공하지 않습니다. `~/.codex/AGENTS.md`(글로벌) 또는 레포 루트 `AGENTS.md`(프로젝트)만 자동 로드됩니다.
8
+
9
+ nexus-core는 플러그인 배포자이므로 사용자의 `AGENTS.md`를 자동으로 수정하지 않습니다. lead agent body를 AGENTS.md에 반영하는 것은 **consumer의 책임**입니다.
10
+
11
+ ## 산출물 위치
12
+
13
+ `nexus-core sync` 실행 후 다음 경로에 fragment 파일이 생성됩니다.
14
+
15
+ ```
16
+ dist/codex/install/AGENTS.fragment.md
17
+ ```
18
+
19
+ 이 파일은 **Managed** 경로입니다. 빌드 시마다 덮어씁니다. 직접 편집하지 마세요.
20
+
21
+ ## Fragment 포맷
22
+
23
+ fragment 파일은 primary agent(`mode: primary`)마다 다음 구조의 블록을 포함합니다.
24
+
25
+ ```markdown
26
+ <!-- nexus-core:lead:start -->
27
+ # lead
28
+
29
+ (lead agent body 전문)
30
+ <!-- nexus-core:lead:end -->
31
+ ```
32
+
33
+ 마커 형식: `<!-- nexus-core:<agent-id>:start -->` / `<!-- nexus-core:<agent-id>:end -->`
34
+
35
+ - **마커**: agent frontmatter의 `id` 필드 값을 사용합니다.
36
+ - **헤딩**: agent frontmatter의 `name` 필드 값을 사용합니다.
37
+ - `id`와 `name`은 대개 동일하지만 두 필드는 별개 소스입니다.
38
+
39
+ 마커는 이후 업데이트 시 교체 구역을 식별하는 데 사용합니다.
40
+
41
+ ## 수동 머지 절차
42
+
43
+ ### 1. Fragment 확인
44
+
45
+ ```bash
46
+ bunx @moreih29/nexus-core sync --harness=codex --target=./
47
+ ```
48
+
49
+ sync 완료 후 `dist/codex/install/AGENTS.fragment.md`가 생성되었는지 확인합니다.
50
+
51
+ ### 2. 대상 AGENTS.md 선택
52
+
53
+ | 범위 | 경로 | 용도 |
54
+ |---|---|---|
55
+ | 글로벌 | `~/.codex/AGENTS.md` | 모든 프로젝트에 적용 |
56
+ | 프로젝트 | `<repo-root>/AGENTS.md` | 해당 레포에만 적용 |
57
+
58
+ 용도에 맞는 파일을 선택합니다. 파일이 없으면 새로 생성합니다.
59
+
60
+ ### 3. Fragment 내용 복사
61
+
62
+ `dist/codex/install/AGENTS.fragment.md`의 내용 전체(마커 포함)를 선택한 AGENTS.md에 붙여 넣습니다.
63
+
64
+ ```markdown
65
+ # (기존 AGENTS.md 내용)
66
+
67
+ <!-- nexus-core:lead:start -->
68
+ # lead
69
+
70
+ (fragment 내용)
71
+ <!-- nexus-core:lead:end -->
72
+ ```
73
+
74
+ 마커를 포함해 복사해야 이후 업데이트 시 구역을 정확히 식별할 수 있습니다.
75
+
76
+ ### 4. 이후 업데이트 시
77
+
78
+ nexus-core를 업데이트한 후 sync를 재실행하면 fragment 파일이 새 버전으로 덮어써집니다.
79
+ AGENTS.md에서 기존 마커 구역(`<!-- nexus-core:lead:start -->` ~ `<!-- nexus-core:lead:end -->`)을 새 fragment 내용으로 교체합니다.
80
+
81
+ ## 자동화 옵션
82
+
83
+ consumer 플러그인이 install 스크립트에서 이 머지 작업을 자동화할 수 있습니다. nexus-core는 자동 머지 스크립트를 제공하지 않습니다.
84
+
85
+ 자동화 예시 (install 스크립트에서 구현):
86
+
87
+ ```bash
88
+ FRAGMENT="dist/codex/install/AGENTS.fragment.md"
89
+ TARGET="$HOME/.codex/AGENTS.md"
90
+ MARKER_BEGIN="<!-- nexus-core:lead:start -->"
91
+ MARKER_END="<!-- nexus-core:lead:end -->"
92
+
93
+ # 기존 마커 구역 제거 후 새 내용 삽입
94
+ if grep -q "${MARKER_BEGIN}" "$TARGET" 2>/dev/null; then
95
+ sed -i.bak "/${MARKER_BEGIN}/,/${MARKER_END}/d" "$TARGET"
96
+ fi
97
+
98
+ cat "$FRAGMENT" >> "$TARGET"
99
+ ```
100
+
101
+ 이 패턴은 `docs/plugin-template/codex/README.md`의 block-marker 패턴과 동일한 방식입니다.
102
+
103
+ ## 관련 문서
104
+
105
+ - `docs/plugin-template/codex/README.md` — Codex 플러그인 전체 설치 흐름
106
+ - `.nexus/context/architecture.md` §2-1 — dist/ 하네스별 출력 트리
@@ -0,0 +1,360 @@
1
+ # nexus-core Plugin 개발 가이드
2
+
3
+ 플러그인 repo 저자를 위한 end-to-end 온보딩 문서입니다.
4
+
5
+ ## 1. 3 레이어 스택 개요
6
+
7
+ ```
8
+ nexus-core (@moreih29/nexus-core)
9
+ └── 공통 자산 정의 (agents/, skills/, hooks/, capability-matrix)
10
+ └── 빌드 도구 (nexus-core sync / init / validate)
11
+
12
+ plugin repo (your-org/my-X-plugin)
13
+ └── nexus-core를 devDependency로 참조
14
+ └── sync로 하네스별 자산을 생성·커밋
15
+ └── 하네스 spec에 맞는 형식으로 배포
16
+
17
+ end user (컨슈머)
18
+ └── 플러그인을 Claude Code / OpenCode / Codex에 설치
19
+ ```
20
+
21
+ nexus-core는 자산을 **정의**합니다. plugin repo는 자산을 **패키징**합니다. end user는 플러그인을 **소비**합니다.
22
+
23
+ ---
24
+
25
+ ## 2. `nexus-core sync` 사용법
26
+
27
+ sync 명령은 nexus-core의 자산을 plugin repo의 하네스별 형식으로 변환해 기록합니다.
28
+
29
+ ### 기본 사용법
30
+
31
+ ```bash
32
+ bunx @moreih29/nexus-core sync --harness=<claude|opencode|codex> --target=<dir>
33
+ ```
34
+
35
+ ### 플래그 전체 목록
36
+
37
+ | 플래그 | 기본값 | 설명 |
38
+ |---|---|---|
39
+ | `--harness=<name>` | 전체 (all) | 대상 하네스를 `claude`, `opencode`, `codex` 중 하나로 제한 |
40
+ | `--target=<dir>` | `dist/` | 출력 디렉터리. plugin repo 루트를 지정하려면 `--target=./` |
41
+ | `--dry-run` | — | 변경될 파일 목록만 출력. 실제 쓰기 없음 |
42
+ | `--force` | — | Template 파일(처음 한 번만 생성되는 파일)도 강제 덮어쓰기 |
43
+ | `--strict` | — | Managed 파일에 미커밋 로컬 변경이 있으면 오류로 중단 |
44
+ | `--only=<name>` | — | 특정 에이전트 또는 스킬 이름만 처리 |
45
+
46
+ ### 덮어쓰기 정책
47
+
48
+ | 분류 | 예시 경로 | 정책 |
49
+ |---|---|---|
50
+ | **Managed** | `agents/*.md`, `src/agents/*.ts`, `plugin/skills/*/SKILL.md`, `dist/claude/settings.json`, `dist/codex/install/AGENTS.fragment.md` | 항상 덮어씀 (`--dry-run` 시 제외) |
51
+ | **Template** | `.claude-plugin/plugin.json`, `package.json` | 파일이 없을 때만 생성. `--force`로 강제 가능 |
52
+
53
+ **직접 편집하지 말아야 할 경로**: Managed 경로는 다음 sync 시 덮어집니다. 커스터마이즈가 필요하면 Template 경로나 별도 파일을 사용하세요.
54
+
55
+ ### 실전 예시
56
+
57
+ ```bash
58
+ # 플러그인 repo 루트에서 claude 하네스 동기화
59
+ bunx @moreih29/nexus-core sync --harness=claude --target=./
60
+
61
+ # 변경 사항 미리 확인
62
+ bunx @moreih29/nexus-core sync --harness=opencode --target=./ --dry-run
63
+
64
+ # CI에서 미커밋 변경 감지 (엄격 모드)
65
+ bunx @moreih29/nexus-core sync --harness=codex --target=./ --strict
66
+
67
+ # 특정 에이전트만 재빌드
68
+ bunx @moreih29/nexus-core sync --harness=claude --target=./ --only=architect
69
+ ```
70
+
71
+ ---
72
+
73
+ ## 2-1. Lead primary agent 주입
74
+
75
+ ### 배경
76
+
77
+ nexus-core는 10개 에이전트 중 `lead`를 primary orchestrator로 지정합니다. 3 하네스는 빌드 시 `lead` agent body를 main thread 시스템 프롬프트로 자동 주입합니다. 이를 통해 컨슈머가 플러그인을 설치하는 순간 Lead가 기본 실행 에이전트로 동작합니다.
78
+
79
+ ### `mode` 필드
80
+
81
+ 에이전트 `assets/agents/<name>/body.md` frontmatter에 `mode` 필드가 있습니다.
82
+
83
+ | 값 | 의미 |
84
+ |---|---|
85
+ | `primary` | 3 하네스의 main thread 시스템 프롬프트로 주입 |
86
+ | `subagent` | 기본값. 서브에이전트로만 호출 가능 |
87
+ | `all` | main thread 주입 + 서브에이전트 호출 모두 허용 |
88
+
89
+ `lead`는 `mode: primary`로 정의되어 있습니다. 이 필드가 없는 에이전트는 `subagent`로 처리됩니다.
90
+
91
+ ### 하네스별 주입 경로
92
+
93
+ | 하네스 | 주입 경로 | Managed 산출물 | Consumer 작업 |
94
+ |---|---|---|---|
95
+ | Claude | `settings.json`의 `agent` 키 | `dist/claude/settings.json` | 없음 (자동) |
96
+ | OpenCode | `AgentConfig.mode = "primary"` | `dist/opencode/src/agents/<name>.ts` | 없음 (자동) |
97
+ | Codex | `AGENTS.md` 수동 머지 | `dist/codex/install/AGENTS.fragment.md` | [docs/consuming/codex-lead-merge.md](./consuming/codex-lead-merge.md) 참조 |
98
+
99
+ ---
100
+
101
+ ## 3. `nexus-core init` 사용법
102
+
103
+ init 명령은 nexus-core에 포함된 플러그인 템플릿을 지정 경로로 복사합니다.
104
+ 새 plugin repo를 처음 생성할 때 한 번 실행합니다.
105
+
106
+ ### 기본 사용법
107
+
108
+ ```bash
109
+ bunx @moreih29/nexus-core init --harness=<claude|opencode|codex> --target=<dir>
110
+ ```
111
+
112
+ ### 플래그
113
+
114
+ | 플래그 | 기본값 | 설명 |
115
+ |---|---|---|
116
+ | `--harness=<name>` | `claude` | 복사할 하네스 템플릿 지정 |
117
+ | `--target=<dir>` | (필수) | 템플릿을 복사할 대상 경로 |
118
+
119
+ `--target`은 필수입니다. 생략 시 오류로 종료됩니다.
120
+
121
+ ### 전체 흐름
122
+
123
+ ```bash
124
+ # 1. 새 플러그인 디렉터리 생성
125
+ bunx @moreih29/nexus-core init --harness=claude --target=./my-claude-plugin
126
+
127
+ # 2. 이동 및 의존성 설치
128
+ cd my-claude-plugin
129
+ bun install
130
+
131
+ # 3. 자산 동기화 (nexus-core에서 에이전트·스킬 가져오기)
132
+ bunx @moreih29/nexus-core sync --harness=claude --target=./
133
+
134
+ # 4. 매니페스트 커스터마이즈 (name, version, description 변경)
135
+ # .claude-plugin/plugin.json 편집
136
+
137
+ # 5. 커밋
138
+ git init
139
+ git add .
140
+ git commit -m "Initial plugin scaffold"
141
+ ```
142
+
143
+ ---
144
+
145
+ ## 4. 하네스별 install 구현 가이드
146
+
147
+ ### 4-1. Claude
148
+
149
+ Claude 플러그인은 플러그인 repo 자체가 설치 단위입니다. 컨슈머는 별도 install 명령 없이
150
+ 마켓플레이스에서 플러그인을 등록하거나 `claude --plugin-dir <path>`로 직접 로드합니다.
151
+
152
+ **plugin repo 저자가 할 일:**
153
+
154
+ 1. `nexus-core sync --harness=claude --target=./` 실행 후 커밋
155
+ 2. `.claude-plugin/plugin.json` 의 `name`, `version`, `description` 커스터마이즈
156
+ 3. 마켓플레이스 카탈로그에 GitHub 소스로 등록
157
+
158
+ ```json
159
+ {
160
+ "source": "github",
161
+ "repo": "your-org/my-claude-plugin",
162
+ "ref": "v1.0.0"
163
+ }
164
+ ```
165
+
166
+ **컨슈머 측 추가 작업 없음.** Claude Code가 플러그인 디렉터리를 캐시로 복사하고
167
+ `agents/`, `skills/`, `hooks/` 등을 자동으로 인식합니다.
168
+
169
+ 캐시 위치: `~/.claude/plugins/cache/<marketplace>/<plugin>/<version>/`
170
+
171
+ `plugin.json`의 `version` 필드가 업데이트 감지 기준입니다. 릴리즈마다 버전을 올리세요.
172
+
173
+ **Lead primary agent 주입**: sync는 `.claude-plugin/` 디렉터리가 아닌 플러그인 루트에 `dist/claude/settings.json`을 생성합니다. 이 파일에는 `{ "agent": "lead" }` 키가 포함되어, Claude Code가 플러그인 활성 시 main thread를 `lead` 에이전트로 실행합니다. 사용자가 다른 에이전트로 override하려면 프로젝트 또는 사용자 `.claude/settings.json`에서 scope 우선순위에 따라 재정의할 수 있습니다.
174
+
175
+ ---
176
+
177
+ ### 4-2. OpenCode
178
+
179
+ OpenCode 플러그인은 npm 패키지로 배포됩니다. 컨슈머가 `opencode.json`의 `plugin` 배열에
180
+ 패키지명을 추가하면 OpenCode 시작 시 Bun이 자동 설치합니다.
181
+
182
+ **plugin repo 저자가 할 일:**
183
+
184
+ 1. `nexus-core sync --harness=opencode --target=./` 실행 후 커밋
185
+ 2. `package.json`의 `name`을 실제 npm 패키지명으로 변경
186
+ 3. npm에 배포: `npm publish --access public`
187
+ 4. 컨슈머에게 다음 안내 제공:
188
+
189
+ ```json
190
+ // .opencode/opencode.json (컨슈머 프로젝트)
191
+ {
192
+ "plugin": ["@your-org/my-opencode-plugin"]
193
+ }
194
+ ```
195
+
196
+ **에이전트 활성화**: OpenCode는 `plugin` 배열 등록만으로 에이전트가 자동 활성화되지 않을 수 있습니다.
197
+ sync 결과물인 `opencode.json.fragment`를 참고해 컨슈머의 `opencode.json`에 `agents` 배열을 추가하거나,
198
+ `postinstall` 스크립트로 자동화하세요.
199
+
200
+ ```js
201
+ // postinstall.mjs (package.json scripts.postinstall: "node postinstall.mjs")
202
+ import { readFileSync, writeFileSync, existsSync } from "node:fs";
203
+ const fragment = JSON.parse(readFileSync("./opencode.json.fragment", "utf-8"));
204
+ const target = ".opencode/opencode.json";
205
+ const existing = existsSync(target) ? JSON.parse(readFileSync(target, "utf-8")) : {};
206
+ existing.agents = [...(existing.agents || []), ...fragment.agents];
207
+ writeFileSync(target, JSON.stringify(existing, null, 2));
208
+ ```
209
+
210
+ `package.json`이 `"type": "module"`이므로 `require()` 대신 ESM 방식(`import` / `fs.readFileSync + JSON.parse`)을 사용합니다.
211
+
212
+ 자산 경로(`src/agents/*.ts`)는 TypeScript를 그대로 참조합니다. OpenCode가 TypeScript를 직접 실행합니다.
213
+
214
+ **Lead primary agent 주입**: `lead` 에이전트는 `mode: "primary"`로 빌드됩니다. sync가 생성하는 `src/agents/lead.ts`의 `AgentConfig` 객체에 `mode: "primary"` 필드가 설정되어 OpenCode primary mode로 등록됩니다. 컨슈머 측 추가 작업은 없습니다.
215
+
216
+ ---
217
+
218
+ ### 4-3. Codex
219
+
220
+ Codex는 플러그인 시스템(`.codex-plugin/plugin.json`)과 native agent 시스템(`config.toml [agents.*]`)이
221
+ **별개**입니다. 에이전트를 활성화하려면 두 경로를 모두 처리해야 합니다.
222
+
223
+ **plugin repo 저자가 할 일:**
224
+
225
+ 1. `nexus-core sync --harness=codex --target=./` 실행 후 커밋
226
+ 2. install 헬퍼 스크립트(`install/install.sh`) 작성 또는 `package.json`의 `install-plugin` 스크립트 구현
227
+
228
+ install 스크립트가 수행해야 하는 작업:
229
+
230
+ ```bash
231
+ #!/usr/bin/env bash
232
+ # install/install.sh — 컨슈머 machine에서 실행
233
+
234
+ PLUGIN_NAME="my-codex-plugin"
235
+
236
+ # 1. config.toml에 MCP 서버 + agent 테이블 병합 (block-marker 패턴)
237
+ MARKER_BEGIN="# BEGIN ${PLUGIN_NAME}"
238
+ MARKER_END="# END ${PLUGIN_NAME}"
239
+ CONFIG="$HOME/.codex/config.toml"
240
+
241
+ # 기존 블록 제거 후 새 내용 삽입
242
+ if grep -q "${MARKER_BEGIN}" "$CONFIG" 2>/dev/null; then
243
+ sed -i.bak "/${MARKER_BEGIN}/,/${MARKER_END}/d" "$CONFIG"
244
+ fi
245
+
246
+ {
247
+ echo "${MARKER_BEGIN}"
248
+ cat install/config.fragment.toml
249
+ echo "${MARKER_END}"
250
+ } >> "$CONFIG"
251
+
252
+ # 2. agent TOML 파일을 user scope로 복사
253
+ mkdir -p "$HOME/.codex/agents"
254
+ cp agents/*.toml "$HOME/.codex/agents/"
255
+
256
+ # 3. lead agent body를 AGENTS.md에 머지 (block-marker 패턴)
257
+ FRAGMENT="dist/codex/install/AGENTS.fragment.md"
258
+ AGENTS_TARGET="$HOME/.codex/AGENTS.md"
259
+ FRAG_BEGIN="<!-- nexus-core:lead:start -->"
260
+ FRAG_END="<!-- nexus-core:lead:end -->"
261
+
262
+ if grep -q "${FRAG_BEGIN}" "$AGENTS_TARGET" 2>/dev/null; then
263
+ sed -i.bak "/${FRAG_BEGIN}/,/${FRAG_END}/d" "$AGENTS_TARGET"
264
+ fi
265
+
266
+ cat "$FRAGMENT" >> "$AGENTS_TARGET"
267
+
268
+ echo "Installed ${PLUGIN_NAME}"
269
+ ```
270
+
271
+ **block-marker 패턴**: `# BEGIN <plugin-name>` / `# END <plugin-name>` 마커 사이의 내용만 교체합니다.
272
+ 기존 사용자 설정을 덮어쓰지 않습니다. oh-my-codex의 `omx setup` 패턴에서 가져온 방식입니다.
273
+
274
+ `install/config.fragment.toml`에는 MCP 서버 설정이 포함됩니다.
275
+
276
+ ```toml
277
+ [mcp_servers.nx]
278
+ command = "nexus-mcp"
279
+ ```
280
+
281
+ `nexus-mcp`는 `@moreih29/nexus-core`를 전역 설치하면 PATH에 추가됩니다.
282
+
283
+ **Lead primary agent 주입**: sync는 `dist/codex/install/AGENTS.fragment.md`를 생성합니다. 이 파일은 `<!-- nexus-core:lead:start -->` / `<!-- nexus-core:lead:end -->` 마커로 감싸진 `lead` agent body를 포함합니다. Codex는 `AGENTS.md`를 공식 로드 경로로 사용하므로 컨슈머가 직접 머지해야 합니다. 위 install 스크립트의 3단계가 이를 자동화합니다. 자세한 수동 머지 절차는 [docs/consuming/codex-lead-merge.md](./consuming/codex-lead-merge.md) 참조.
284
+
285
+ ---
286
+
287
+ ## 5. 주의사항 및 FAQ
288
+
289
+ ### Q: sync 후 plugin.json이 바뀌지 않아요
290
+
291
+ `plugin.json`은 Template 파일입니다. 최초 생성 후에는 덮어쓰지 않습니다. 의도적으로 재생성하려면 `--force` 플래그를 사용하세요.
292
+
293
+ ```bash
294
+ bunx @moreih29/nexus-core sync --harness=claude --target=./ --force
295
+ ```
296
+
297
+ 주의: `--force`는 Template 파일의 기존 편집 내용도 덮어씁니다.
298
+
299
+ ### Q: 사용자가 agents/*.md를 직접 수정해도 되나요?
300
+
301
+ Managed 파일(`agents/`, `skills/` 등)은 다음 sync 시 덮어씁니다. 사용자 커스텀 내용은 보존되지 않습니다.
302
+ 에이전트 동작을 커스터마이즈하려면 `plugin.json`의 `agents` 배열에서 파일 경로를 재지정하거나,
303
+ 별도 경로에 커스텀 에이전트를 추가하세요.
304
+
305
+ ### Q: --strict 플래그는 언제 사용하나요?
306
+
307
+ CI 파이프라인에서 "sync 결과가 항상 커밋된 상태"임을 보장하고 싶을 때 사용합니다.
308
+ Managed 파일에 로컬 변경이 감지되면 오류로 중단합니다.
309
+
310
+ ### Q: OpenCode에서 git URL로 플러그인을 설치할 수 있나요?
311
+
312
+ OpenCode의 `plugin` 배열은 npm 패키지명을 기준으로 동작합니다. git URL 기반 설치의 공식 지원 여부는 확인되지 않았습니다. npm 배포를 권장합니다.
313
+
314
+ ### Q: Codex에서 npm으로 플러그인을 설치할 수 있나요?
315
+
316
+ Codex 플러그인의 npm 기반 설치는 공식 지원 여부가 확인되지 않았습니다. 로컬 경로 또는 GitHub 소스 방식을 사용하세요.
317
+
318
+ ### Q: 여러 하네스를 한 번에 동기화할 수 있나요?
319
+
320
+ `--harness` 플래그를 생략하면 모든 하네스를 순차로 처리합니다. `--target`은 공통 출력 루트가 됩니다.
321
+
322
+ ```bash
323
+ # dist/claude/, dist/opencode/, dist/codex/ 에 동시 생성
324
+ bunx @moreih29/nexus-core sync --target=./dist
325
+ ```
326
+
327
+ 각 하네스 디렉터리를 별도 git repo로 분리하는 구성에서는 `--harness` 플래그로 개별 실행을 권장합니다.
328
+
329
+ ### Q: plugin.json에서 오버라이드한 자산 경로가 sync 후 사라지나요?
330
+
331
+ Template 파일인 `plugin.json`은 `--force` 없이는 덮어쓰지 않습니다. 오버라이드 내용은 보존됩니다.
332
+
333
+ ### Q: lead 대신 다른 에이전트를 primary로 쓰고 싶으면?
334
+
335
+ `assets/agents/<name>/body.md` frontmatter에서 원하는 에이전트의 `mode` 값을 `primary`로 변경하고 `lead`의 `mode`를 `subagent`로 바꿉니다. 이후 sync를 재실행하면 해당 에이전트가 3 하네스에 primary로 주입됩니다. Claude만 빠르게 override하려면 컨슈머 프로젝트 또는 사용자 `.claude/settings.json`에서 `agent` 키를 재정의하세요.
336
+
337
+ ### Q: primary agent를 여러 개 등록할 수 있나요?
338
+
339
+ 빌드는 `mode: primary`인 에이전트를 전부 처리합니다. 단, 하네스별 동작이 다릅니다.
340
+
341
+ - **Claude**: `dist/claude/settings.json`은 첫 번째 primary만 기록하고, 복수 발견 시 경고 log를 출력합니다.
342
+ - **Codex**: `AGENTS.fragment.md`에 primary 에이전트를 순차 append합니다.
343
+ - **OpenCode**: 해당 에이전트 TS 모듈 각각에 `mode: "primary"`를 설정합니다.
344
+
345
+ ---
346
+
347
+ ## 6. 보조 명령
348
+
349
+ ```bash
350
+ bunx @moreih29/nexus-core list # 에이전트·스킬·훅 전체 목록과 설명 출력
351
+ bunx @moreih29/nexus-core validate # assets/ frontmatter 및 YAML 파일 유효성 검사
352
+ bunx @moreih29/nexus-core mcp # MCP stdio 서버 직접 실행 (nexus-mcp와 동일)
353
+ bunx @moreih29/nexus-core --help # 전체 명령 도움말
354
+ ```
355
+
356
+ 전역 설치(`bun add -g @moreih29/nexus-core`) 환경에서는 `nexus-core list` 형태로도 사용할 수 있습니다.
357
+
358
+ `bunx @moreih29/nexus-core validate`는 CI에서 자산 정합성을 검증하는 용도로 사용합니다.
359
+ 검증 대상: `assets/agents/*/body.md` frontmatter, `assets/skills/*/body.md` frontmatter,
360
+ `assets/capability-matrix.yml`, `assets/tools/tool-name-map.yml`.
@@ -0,0 +1,60 @@
1
+ name: Build
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ sync-verify:
11
+ name: Verify nexus-core sync
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+
16
+ - uses: oven-sh/setup-bun@v2
17
+ with:
18
+ bun-version: latest
19
+
20
+ - name: Install dependencies
21
+ run: bun install
22
+
23
+ - name: Run sync
24
+ run: bunx @moreih29/nexus-core sync --harness=claude --target=./
25
+
26
+ - name: Check for uncommitted changes
27
+ run: |
28
+ git diff --exit-code || (
29
+ echo "Sync produced uncommitted changes. Run 'bun run sync' and commit the result."
30
+ exit 1
31
+ )
32
+
33
+ - name: Validate assets
34
+ run: bunx @moreih29/nexus-core validate
35
+
36
+ release:
37
+ name: Release
38
+ runs-on: ubuntu-latest
39
+ needs: sync-verify
40
+ if: github.ref == 'refs/heads/main' && github.event_name == 'push'
41
+ steps:
42
+ - uses: actions/checkout@v4
43
+
44
+ - uses: oven-sh/setup-bun@v2
45
+ with:
46
+ bun-version: latest
47
+
48
+ - name: Install dependencies
49
+ run: bun install
50
+
51
+ - name: Run sync
52
+ run: bunx @moreih29/nexus-core sync --harness=claude --target=./
53
+
54
+ # plugin.json의 version 필드를 기준으로 릴리즈 태그를 생성합니다.
55
+ # 실제 릴리즈 자동화는 프로젝트 요구에 맞게 조정하세요.
56
+ - name: Create release archive
57
+ run: |
58
+ VERSION=$(node -e "console.log(require('./.claude-plugin/plugin.json').version)")
59
+ echo "Plugin version: $VERSION"
60
+ git archive --format=tar.gz --output="release-v${VERSION}.tar.gz" HEAD