@ksm0709/context 0.0.17 → 0.0.19

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 CHANGED
@@ -8,6 +8,10 @@ Context plugin for Bun
8
8
 
9
9
  <!-- Example usage code goes here -->
10
10
 
11
+ ## OMX Support
12
+
13
+ This plugin supports OMX (OpenCode Managed eXtension). See [[docs/omx-setup.md]] for setup instructions.
14
+
11
15
  ## Installation
12
16
 
13
17
  <!-- Installation instructions go here -->
package/dist/cli/index.js CHANGED
@@ -2,25 +2,25 @@
2
2
  // @bun
3
3
 
4
4
  // src/cli/commands/update.ts
5
- import { resolve, join as join2 } from "path";
6
- import { existsSync as existsSync2 } from "fs";
5
+ import { resolve, join as join3 } from "path";
6
+ import { existsSync as existsSync3 } from "fs";
7
7
  import { homedir } from "os";
8
8
 
9
9
  // src/lib/scaffold.ts
10
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
11
- import { join } from "path";
10
+ import { existsSync as existsSync2, mkdirSync, readFileSync, writeFileSync } from "fs";
11
+ import { join as join2 } from "path";
12
12
 
13
13
  // src/constants.ts
14
14
  var DEFAULTS = {
15
- configPath: ".opencode/context/config.jsonc",
16
- promptDir: ".opencode/context/prompts",
15
+ configPath: ".context/config.jsonc",
16
+ promptDir: ".context/prompts",
17
17
  turnStartFile: "turn-start.md",
18
18
  turnEndFile: "turn-end.md",
19
- blockedToolPatterns: ["^task$", "^background_", "agent"],
20
19
  knowledgeSources: ["AGENTS.md"],
21
- templateDir: ".opencode/context/templates",
20
+ templateDir: ".context/templates",
22
21
  indexFilename: "INDEX.md",
23
- maxDomainDepth: 2
22
+ maxDomainDepth: 2,
23
+ knowledgeDir: "docs"
24
24
  };
25
25
  var LIMITS = {
26
26
  maxPromptFileSize: 64 * 1024,
@@ -30,10 +30,25 @@ var LIMITS = {
30
30
  maxSummaryLength: 100,
31
31
  maxIndexFileSize: 32 * 1024
32
32
  };
33
+
34
+ // src/lib/context-dir.ts
35
+ import { existsSync } from "fs";
36
+ import { join } from "path";
37
+ function resolveContextDir(projectDir) {
38
+ const nextContextDir = ".context";
39
+ if (existsSync(join(projectDir, nextContextDir))) {
40
+ return nextContextDir;
41
+ }
42
+ const legacyContextDir = ".opencode/context";
43
+ if (existsSync(join(projectDir, legacyContextDir))) {
44
+ return legacyContextDir;
45
+ }
46
+ return nextContextDir;
47
+ }
33
48
  // package.json
34
49
  var package_default = {
35
50
  name: "@ksm0709/context",
36
- version: "0.0.17",
51
+ version: "0.0.19",
37
52
  author: {
38
53
  name: "TaehoKang",
39
54
  email: "ksm07091@gmail.com"
@@ -48,6 +63,11 @@ var package_default = {
48
63
  import: "./dist/index.js",
49
64
  types: "./dist/index.d.ts",
50
65
  default: "./dist/index.js"
66
+ },
67
+ "./omx": {
68
+ import: "./dist/omx/index.mjs",
69
+ types: "./dist/omx/index.d.ts",
70
+ default: "./dist/omx/index.mjs"
51
71
  }
52
72
  },
53
73
  repository: {
@@ -58,10 +78,10 @@ var package_default = {
58
78
  access: "public"
59
79
  },
60
80
  scripts: {
61
- build: "bun build ./src/index.ts --outdir dist --target bun && bun build ./src/cli/index.ts --outdir dist/cli --target bun",
81
+ build: "bun build ./src/index.ts --outdir dist --target bun && bun build ./src/cli/index.ts --outdir dist/cli --target bun && bun build ./src/omx/index.ts --outdir dist/omx --target node --format esm --external jsonc-parser && mv dist/omx/index.js dist/omx/index.mjs",
62
82
  test: "vitest run",
63
83
  lint: "eslint src --ext .ts",
64
- prepublishOnly: "bun build ./src/index.ts --outdir dist --target bun && bun build ./src/cli/index.ts --outdir dist/cli --target bun"
84
+ prepublishOnly: "bun build ./src/index.ts --outdir dist --target bun && bun build ./src/cli/index.ts --outdir dist/cli --target bun && bun build ./src/omx/index.ts --outdir dist/omx --target node --format esm --external jsonc-parser && mv dist/omx/index.js dist/omx/index.mjs"
65
85
  },
66
86
  files: [
67
87
  "dist"
@@ -70,7 +90,6 @@ var package_default = {
70
90
  "@opencode-ai/plugin": ">=1.0.0"
71
91
  },
72
92
  dependencies: {
73
- "@ksm0709/context": "0.0.17",
74
93
  "jsonc-parser": "^3.0.0"
75
94
  },
76
95
  devDependencies: {
@@ -85,7 +104,8 @@ var package_default = {
85
104
  "eslint-plugin-prettier": "^5.1.3",
86
105
  prettier: "^3.2.4",
87
106
  "typescript-eslint": "^8.47.0",
88
- vitest: "^3.2.4"
107
+ vitest: "^3.2.4",
108
+ "@vitest/coverage-v8": "^3.2.4"
89
109
  }
90
110
  };
91
111
 
@@ -95,11 +115,8 @@ var DEFAULT_CONFIG = `{
95
115
  // Context Plugin Configuration
96
116
  // See: https://github.com/ksm0709/context
97
117
  "prompts": {
98
- "turnStart": ".opencode/context/prompts/turn-start.md",
99
- "turnEnd": ".opencode/context/prompts/turn-end.md"
100
- },
101
- "subagentConfig": {
102
- "blockedToolPatterns": ["^task$", "^background_", "agent"]
118
+ "turnStart": "prompts/turn-start.md",
119
+ "turnEnd": "prompts/turn-end.md"
103
120
  },
104
121
  "knowledge": {
105
122
  "dir": "docs",
@@ -119,55 +136,11 @@ var DEFAULT_TURN_START = `## Knowledge Context
119
136
 
120
137
  ### \uC791\uC5C5 \uC804 \uD544\uC218
121
138
 
122
- - \uC544\uB798 **Available Knowledge** \uBAA9\uB85D\uC5D0\uC11C \uD604\uC7AC \uC791\uC5C5\uACFC \uAD00\uB828\uB41C \uBB38\uC11C\uB97C **\uBA3C\uC800** \uC77D\uC73C\uC138\uC694
123
- ${"<"}!-- primary-only -->
124
- - \uC9C1\uC811 \uC77D\uAE30 \uC804\uC5D0 \uC544\uB798\uC640 \uAC19\uC774 **\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8(explore)\uC5D0 \uC704\uC784**\uD558\uC5EC, \uC5F0\uAD00\uB41C \uB178\uD2B8\uB97C \uC9D1\uC911 \uD0D0\uC0C9\uD558\uACE0 \uC791\uC5C5\uC5D0 \uD544\uC694\uD55C \uB0B4\uC6A9\uC744 \uC694\uC57D\uD558\uB3C4\uB85D \uC9C0\uC2DC\uD558\uC138\uC694.
125
- ${"<"}!-- /primary-only -->
126
- ${"<"}!-- subagent-only -->
127
- - \uAD00\uB828 \uBB38\uC11C\uB97C \uC9C1\uC811 \uC77D\uACE0 \uC791\uC5C5\uC5D0 \uC801\uC6A9\uD558\uC138\uC694. \uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8\uB97C \uD638\uCD9C\uD558\uC9C0 \uB9C8\uC138\uC694.
128
- ${"<"}!-- /subagent-only -->
129
- - \uB3C4\uBA54\uC778 \uD3F4\uB354 \uAD6C\uC870\uAC00 \uC788\uB2E4\uBA74 INDEX.md\uC758 \uC694\uC57D\uC744 \uCC38\uACE0\uD558\uC5EC \uD544\uC694\uD55C \uB178\uD2B8\uB9CC \uC120\uD0DD\uC801\uC73C\uB85C \uC77D\uC73C\uC138\uC694
130
- - \uBB38\uC11C \uB0B4 [[\uB9C1\uD06C]]\uB97C \uB530\uB77C\uAC00\uBA70 \uAD00\uB828 \uB178\uD2B8\uB97C \uD0D0\uC0C9\uD558\uC138\uC694 -- \uB9C1\uD06C\uB97C \uB193\uCE58\uBA74 \uC911\uC694\uD55C \uB9E5\uB77D\uC744 \uC783\uC2B5\uB2C8\uB2E4
131
- - \uC9C0\uC2DD \uD30C\uC77C\uC5D0 \uAE30\uB85D\uB41C \uC544\uD0A4\uD14D\uCC98 \uACB0\uC815, \uD328\uD134, \uC81C\uC57D\uC0AC\uD56D\uC744 \uBC18\uB4DC\uC2DC \uB530\uB974\uC138\uC694
132
-
133
- ${"<"}!-- primary-only -->
134
- ### \uC9C0\uC2DD \uD0D0\uC0C9 (\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8 \uC704\uC784)
135
-
136
- \uD604\uC7AC \uC791\uC5C5\uACFC \uAD00\uB828\uB41C \uC9C0\uC2DD \uB178\uD2B8\uB97C \uC77D\uACE0 \uC694\uC57D\uD558\uB294 \uC791\uC5C5\uC744 **\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8\uC5D0 \uC704\uC784**\uD558\uC5EC \uCEE8\uD14D\uC2A4\uD2B8 \uD30C\uC545\uC744 \uD6A8\uC728\uD654\uD558\uC138\uC694.
137
- \uBA54\uC778 \uC5D0\uC774\uC804\uD2B8\uB294 \uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8\uAC00 \uC694\uC57D\uD574\uC900 \uB0B4\uC6A9\uC744 \uBC14\uD0D5\uC73C\uB85C \uC791\uC5C5\uC744 \uC9C4\uD589\uD558\uC138\uC694.
138
-
139
- \`\`\`
140
- task(
141
- subagent_type="explore",
142
- load_skills=[],
143
- description="Analyze and summarize related knowledge notes",
144
- run_in_background=false,
145
- prompt="""
146
- TASK: \uC0AC\uC6A9\uC790\uC758 \uC791\uC5C5 \uC694\uCCAD\uACFC 'Available Knowledge' \uBAA9\uB85D\uC744 \uBD84\uC11D\uD558\uC5EC, \uC774\uBC88 \uC791\uC5C5\uC5D0 \uC9C1\uC811\uC801\uC73C\uB85C \uD544\uC694\uD55C \uC9C0\uC2DD \uB178\uD2B8\uB97C \uD0D0\uC0C9\uD558\uACE0 \uD575\uC2EC\uC744 \uC694\uC57D\uD558\uC138\uC694.
147
- EXPECTED OUTCOME: \uC791\uC5C5\uC5D0 \uC801\uC6A9\uD574\uC57C \uD560 \uD575\uC2EC \uC81C\uC57D\uC0AC\uD56D, \uC544\uD0A4\uD14D\uCC98 \uACB0\uC815, \uCF54\uB4DC \uD328\uD134, \uC8FC\uC758\uC0AC\uD56D(Gotchas) \uC694\uC57D \uB9AC\uD3EC\uD2B8
148
- REQUIRED TOOLS: Read (\uC9C0\uC2DD \uB178\uD2B8 \uC77D\uAE30), Glob/Grep (\uD544\uC694 \uC2DC \uC5F0\uAD00 \uC9C0\uC2DD \uAC80\uC0C9)
149
- MUST DO:
150
- - \uC791\uC5C5\uACFC \uAD00\uB828\uC131\uC774 \uB192\uC740 \uB178\uD2B8\uB9CC \uC120\uBCC4\uC801\uC73C\uB85C \uC77D\uAE30
151
- - \uB3C4\uBA54\uC778 \uD3F4\uB354 \uAD6C\uC870\uC778 \uACBD\uC6B0 INDEX.md\uB97C \uC6B0\uC120 \uC77D\uACE0 \uD544\uC694\uD55C \uC138\uBD80 \uB178\uD2B8 \uD0D0\uC0C9
152
- - \uC77D\uC740 \uB178\uD2B8 \uB0B4\uC758 [[wikilink]]\uB97C \uB530\uB77C\uAC00\uBA70 \uC911\uC694\uD55C \uC5F0\uAD00 \uB9E5\uB77D \uD30C\uC545
153
- - \uBCF5\uC0AC-\uBD99\uC5EC\uB123\uAE30\uAC00 \uC544\uB2CC, \uC774\uBC88 \uC791\uC5C5\uC5D0 \uC5B4\uB5BB\uAC8C \uC801\uC6A9\uD560\uC9C0 \uBA85\uD655\uD788 \uC694\uC57D
154
- MUST NOT DO:
155
- - \uCF54\uB4DC\uB97C \uC9C1\uC811 \uC218\uC815\uD558\uAC70\uB098 \uC791\uC131\uD558\uC9C0 \uB9C8\uC138\uC694 (\uD0D0\uC0C9 \uBC0F \uC694\uC57D\uB9CC \uC218\uD589)
156
- - \uC791\uC5C5\uACFC \uBB34\uAD00\uD55C \uB178\uD2B8\uAE4C\uC9C0 \uBD88\uD544\uC694\uD558\uAC8C \uD0D0\uC0C9\uD558\uC9C0 \uB9C8\uC138\uC694
157
- CONTEXT:
158
- - \uD604\uC7AC \uC791\uC5C5: [\uC0AC\uC6A9\uC790\uC758 \uC791\uC5C5 \uC694\uCCAD \uB0B4\uC6A9 \uC694\uC57D]
159
- - \uCC38\uACE0\uD560 \uC9C0\uC2DD \uBAA9\uB85D: [\uBA54\uC778 \uD504\uB86C\uD504\uD2B8 \uD558\uB2E8\uC758 Available Knowledge \uBAA9\uB85D \uCC38\uACE0]
160
- """
161
- )
162
- \`\`\`
163
-
164
- ${"<"}!-- /primary-only -->
165
-
166
-
167
- - \uC544\uB798 **Available Knowledge** \uBAA9\uB85D\uC5D0\uC11C \uD604\uC7AC \uC791\uC5C5\uACFC \uAD00\uB828\uB41C \uBB38\uC11C\uB97C **\uBA3C\uC800** \uC77D\uC73C\uC138\uC694
139
+ - \uBA54\uC778 \uC5D0\uC774\uC804\uD2B8\uAC00 \uC544\uB798 **Available Knowledge** \uBAA9\uB85D\uC5D0\uC11C \uD604\uC7AC \uC791\uC5C5\uACFC \uAD00\uB828\uB41C \uBB38\uC11C\uB97C **\uC9C1\uC811 \uBA3C\uC800** \uC77D\uC73C\uC138\uC694
168
140
  - \uB3C4\uBA54\uC778 \uD3F4\uB354 \uAD6C\uC870\uAC00 \uC788\uB2E4\uBA74 INDEX.md\uC758 \uC694\uC57D\uC744 \uCC38\uACE0\uD558\uC5EC \uD544\uC694\uD55C \uB178\uD2B8\uB9CC \uC120\uD0DD\uC801\uC73C\uB85C \uC77D\uC73C\uC138\uC694
169
141
  - \uBB38\uC11C \uB0B4 [[\uB9C1\uD06C]]\uB97C \uB530\uB77C\uAC00\uBA70 \uAD00\uB828 \uB178\uD2B8\uB97C \uD0D0\uC0C9\uD558\uC138\uC694 -- \uB9C1\uD06C\uB97C \uB193\uCE58\uBA74 \uC911\uC694\uD55C \uB9E5\uB77D\uC744 \uC783\uC2B5\uB2C8\uB2E4
170
142
  - \uC9C0\uC2DD \uD30C\uC77C\uC5D0 \uAE30\uB85D\uB41C \uC544\uD0A4\uD14D\uCC98 \uACB0\uC815, \uD328\uD134, \uC81C\uC57D\uC0AC\uD56D\uC744 \uBC18\uB4DC\uC2DC \uB530\uB974\uC138\uC694
143
+ - \uC77D\uC740 \uC9C0\uC2DD\uC744 \uD604\uC7AC \uC791\uC5C5\uC758 \uC124\uACC4, \uAD6C\uD604, \uAC80\uC99D\uC5D0 \uC9C1\uC811 \uBC18\uC601\uD558\uC138\uC694
171
144
 
172
145
  ### \uAC1C\uBC1C \uC6D0\uCE59
173
146
 
@@ -179,99 +152,45 @@ ${"<"}!-- /primary-only -->
179
152
 
180
153
  - AGENTS.md\uC758 \uC9C0\uC2DC\uC0AC\uD56D\uC774 \uD56D\uC0C1 \uCD5C\uC6B0\uC120
181
154
  - \uC9C0\uC2DD \uB178\uD2B8\uC758 \uACB0\uC815\uC0AC\uD56D > \uC77C\uBC18\uC801 \uAD00\uD589
182
- ${"<"}!-- primary-only -->
183
- - \uC9C0\uC2DD \uB178\uD2B8\uC5D0 \uC5C6\uB294 \uC0C8\uB85C\uC6B4 \uACB0\uC815\uC740 \uC791\uC5C5 \uC644\uB8CC \uC2DC \uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8\uC5D0 \uC704\uC784\uD558\uC5EC \uAE30\uB85D\uD558\uC138\uC694
184
- ${"<"}!-- /primary-only -->
155
+ - \uC9C0\uC2DD \uB178\uD2B8\uC5D0 \uC5C6\uB294 \uC0C8\uB85C\uC6B4 \uACB0\uC815\uC774\uB098 \uBC18\uBCF5 \uAC00\uCE58\uAC00 \uC788\uB294 \uBC1C\uACAC\uC740 \uC791\uC5C5 \uBA54\uBAA8\uB098 \uC9C0\uC2DD \uB178\uD2B8 \uD6C4\uBCF4\uB85C \uAE30\uB85D\uD558\uC138\uC694
185
156
  `;
186
- var DEFAULT_TURN_END = `${"<"}!-- primary-only -->
187
- ## \uC791\uC5C5 \uB9C8\uBB34\uB9AC
188
-
189
- \uC791\uC5C5\uC774 \uC644\uB8CC\uB418\uBA74, \uC544\uB798 \uB450 \uAC00\uC9C0\uB97C **\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8\uC5D0 \uC704\uC784**\uD558\uC138\uC694.
190
- \uBA54\uC778 \uC5D0\uC774\uC804\uD2B8\uAC00 \uC9C1\uC811 \uC218\uD589\uD558\uC9C0 \uB9C8\uC138\uC694.
191
-
192
- ### 1. \uD004\uB9AC\uD2F0 \uCCB4\uD06C (\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8 \uC704\uC784)
193
-
194
- \uBCC0\uACBD\uD55C \uCF54\uB4DC\uC758 \uD488\uC9C8\uC744 \uAC80\uC99D\uD558\uB294 \uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8\uB97C \uC2E4\uD589\uD558\uC138\uC694.
195
-
196
- \`\`\`
197
- task(
198
- category="quick",
199
- load_skills=[],
200
- description="Quality check for changed files",
201
- prompt="""
202
- TASK: \uBCC0\uACBD\uB41C \uD30C\uC77C\uB4E4\uC5D0 \uB300\uD574 \uD004\uB9AC\uD2F0 \uCCB4\uD06C\uB97C \uC218\uD589\uD558\uC138\uC694.
203
- EXPECTED OUTCOME: \uBAA8\uB4E0 \uCCB4\uD06C \uD1B5\uACFC \uB610\uB294 \uC2E4\uD328 \uD56D\uBAA9 \uBAA9\uB85D
204
- REQUIRED TOOLS: Bash (lint, format, test \uC2E4\uD589)
205
- MUST DO:
206
- - \uBCC0\uACBD\uD55C \uCF54\uB4DC\uC5D0 \uB300\uD574 lint \uC2E4\uD589
207
- - \uBCC0\uACBD\uD55C \uCF54\uB4DC\uC5D0 \uB300\uD574 formatter \uC2E4\uD589 (lint\uC640 \uBCC4\uAC1C)
208
- - \uAE30\uC874 \uD14C\uC2A4\uD2B8 \uD1B5\uACFC \uD655\uC778
209
- - \uC0C8\uB85C \uC791\uC131/\uBCC0\uACBD\uD55C \uCF54\uB4DC\uC758 \uD14C\uC2A4\uD2B8 \uCEE4\uBC84\uB9AC\uC9C0 80% \uC774\uC0C1 \uD655\uC778
210
- - \uBCC0\uACBD \uBC94\uC704 \uD655\uC778: \uC694\uCCAD\uACFC \uBB34\uAD00\uD55C \uD30C\uC77C\uC744 \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uC558\uB294\uC9C0 \uAC80\uC99D
211
- - \uC2E4\uD328 \uD56D\uBAA9\uC774 \uC788\uC73C\uBA74 \uAD6C\uCCB4\uC801\uC778 \uC5D0\uB7EC \uBA54\uC2DC\uC9C0\uC640 \uD30C\uC77C \uC704\uCE58\uB97C \uBCF4\uACE0
212
- MUST NOT DO:
213
- - \uCF54\uB4DC\uB97C \uC9C1\uC811 \uC218\uC815\uD558\uC9C0 \uB9C8\uC138\uC694 (\uBCF4\uACE0\uB9CC)
214
- - \uD14C\uC2A4\uD2B8\uB97C \uC0AD\uC81C\uD558\uAC70\uB098 \uC2A4\uD0B5\uD558\uC9C0 \uB9C8\uC138\uC694
215
- CONTEXT: [\uBCC0\uACBD\uD55C \uD30C\uC77C \uBAA9\uB85D\uACFC \uBCC0\uACBD \uB0B4\uC6A9 \uC694\uC57D\uC744 \uC5EC\uAE30\uC5D0 \uD3EC\uD568]
216
- """
217
- )
218
- \`\`\`
219
-
220
- \uD004\uB9AC\uD2F0 \uCCB4\uD06C \uC2E4\uD328 \uC2DC: \uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8 \uBCF4\uACE0\uB97C \uBC14\uD0D5\uC73C\uB85C \uC9C1\uC811 \uC218\uC815\uD55C \uB4A4, \uB2E4\uC2DC \uC704\uC784\uD558\uC138\uC694.
221
-
222
- ### 2. \uC9C0\uC2DD \uC815\uB9AC (\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8 \uC704\uC784)
223
-
224
- \uC791\uC5C5 \uC911 \uAE30\uB85D\uD560 \uB9CC\uD55C \uBC1C\uACAC\uC774 \uC788\uC5C8\uB2E4\uBA74, \uC9C0\uC2DD \uB178\uD2B8 \uC791\uC131\uC744 \uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8\uC5D0 \uC704\uC784\uD558\uC138\uC694.
157
+ var DEFAULT_TURN_END = `## \uC791\uC5C5 \uB9C8\uBB34\uB9AC
158
+
159
+ \uC791\uC5C5\uC774 \uC644\uB8CC\uB418\uBA74 \uC544\uB798 \uD56D\uBAA9\uC744 \uBA54\uC778 \uC5D0\uC774\uC804\uD2B8\uAC00 \uC9C1\uC811 \uD655\uC778\uD558\uC138\uC694.
160
+
161
+ ### 1. \uD004\uB9AC\uD2F0 \uCCB4\uD06C
162
+
163
+ - \uBCC0\uACBD\uD55C \uCF54\uB4DC\uC5D0 \uB300\uD574 \uD544\uC694\uD55C lint, format, test, build \uAC80\uC99D\uC744 \uC9C1\uC811 \uC2E4\uD589\uD558\uC138\uC694
164
+ - \uC0C8\uB85C \uC791\uC131\uD558\uAC70\uB098 \uBCC0\uACBD\uD55C \uCF54\uB4DC\uC758 \uCEE4\uBC84\uB9AC\uC9C0 \uAE30\uB300\uCE58\uB97C \uD655\uC778\uD558\uC138\uC694
165
+ - \uBCC0\uACBD \uBC94\uC704\uB97C \uAC80\uD1A0\uD558\uC5EC \uC694\uCCAD\uACFC \uBB34\uAD00\uD55C \uD30C\uC77C\uC744 \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uC558\uB294\uC9C0 \uD655\uC778\uD558\uC138\uC694
166
+ - \uC2E4\uD328 \uD56D\uBAA9\uC774 \uC788\uC73C\uBA74 \uC6D0\uC778, \uC5D0\uB7EC \uBA54\uC2DC\uC9C0, \uAD00\uB828 \uD30C\uC77C \uC704\uCE58\uB97C \uC815\uB9AC\uD55C \uB4A4 \uC9C1\uC811 \uC218\uC815\uD558\uC138\uC694
167
+ - \uC791\uC5C5\uC774 \uB05D\uB0AC\uB2E4\uACE0 \uD310\uB2E8\uD558\uAE30 \uC804\uC5D0 \uC704 \uAC80\uC99D \uACB0\uACFC\uB97C \uC9C1\uC811 \uB2E4\uC2DC \uD655\uC778\uD558\uC138\uC694
168
+
169
+ ### 2. \uC9C0\uC2DD \uC815\uB9AC
170
+
171
+ \uC791\uC5C5 \uC911 \uAE30\uB85D\uD560 \uB9CC\uD55C \uBC1C\uACAC\uC774 \uC788\uC5C8\uB2E4\uBA74 \uC9C1\uC811 \uC815\uB9AC\uD558\uC138\uC694.
225
172
 
226
173
  **\uAE30\uB85D \uB300\uC0C1 \uD310\uB2E8 \uAE30\uC900:**
227
174
 
228
175
  | \uC0C1\uD669 | \uD15C\uD50C\uB9BF | \uD30C\uC77C\uBA85 \uD328\uD134 |
229
176
  | ------------------------------- | --------------------------------------------------- | --------------------------- |
230
- | \uC544\uD0A4\uD14D\uCC98/\uAE30\uC220 \uC2A4\uD0DD \uC911\uB300 \uACB0\uC815 | [ADR](.opencode/context/templates/adr.md) | \`adr-NNN-\uC81C\uBAA9.md\` |
231
- | \uBC18\uBCF5 \uC0AC\uC6A9\uD560 \uCF54\uB4DC \uD328\uD134 \uBC1C\uACAC | [Pattern](.opencode/context/templates/pattern.md) | \`pattern-\uC81C\uBAA9.md\` |
232
- | \uBE44\uC790\uBA85\uD55C \uBC84\uADF8 \uD574\uACB0 | [Bug](.opencode/context/templates/bug.md) | \`bug-\uC81C\uBAA9.md\` |
233
- | \uC678\uBD80 API/\uB77C\uC774\uBE0C\uB7EC\uB9AC \uC608\uC0C1\uC678 \uB3D9\uC791 | [Gotcha](.opencode/context/templates/gotcha.md) | \`gotcha-\uB77C\uC774\uBE0C\uB7EC\uB9AC-\uC81C\uBAA9.md\` |
234
- | \uC791\uC740 \uAE30\uC220\uC801 \uC120\uD0DD | [Decision](.opencode/context/templates/decision.md) | \`decision-\uC81C\uBAA9.md\` |
235
- | \uBAA8\uB4C8/\uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694 \uD544\uC694 | [Context](.opencode/context/templates/context.md) | \`context-\uC81C\uBAA9.md\` |
236
- | \uBC18\uBCF5 \uAC00\uB2A5\uD55C \uD504\uB85C\uC138\uC2A4 \uC815\uB9BD | [Runbook](.opencode/context/templates/runbook.md) | \`runbook-\uC81C\uBAA9.md\` |
237
- | \uC2E4\uD5D8/\uB514\uBC84\uAE45 \uC911 \uD559\uC2B5 | [Insight](.opencode/context/templates/insight.md) | \`insight-\uC81C\uBAA9.md\` |
177
+ | \uC544\uD0A4\uD14D\uCC98/\uAE30\uC220 \uC2A4\uD0DD \uC911\uB300 \uACB0\uC815 | [ADR](.context/templates/adr.md) | \`adr-NNN-\uC81C\uBAA9.md\` |
178
+ | \uBC18\uBCF5 \uC0AC\uC6A9\uD560 \uCF54\uB4DC \uD328\uD134 \uBC1C\uACAC | [Pattern](.context/templates/pattern.md) | \`pattern-\uC81C\uBAA9.md\` |
179
+ | \uBE44\uC790\uBA85\uD55C \uBC84\uADF8 \uD574\uACB0 | [Bug](.context/templates/bug.md) | \`bug-\uC81C\uBAA9.md\` |
180
+ | \uC678\uBD80 API/\uB77C\uC774\uBE0C\uB7EC\uB9AC \uC608\uC0C1\uC678 \uB3D9\uC791 | [Gotcha](.context/templates/gotcha.md) | \`gotcha-\uB77C\uC774\uBE0C\uB7EC\uB9AC-\uC81C\uBAA9.md\` |
181
+ | \uC791\uC740 \uAE30\uC220\uC801 \uC120\uD0DD | [Decision](.context/templates/decision.md) | \`decision-\uC81C\uBAA9.md\` |
182
+ | \uBAA8\uB4C8/\uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694 \uD544\uC694 | [Context](.context/templates/context.md) | \`context-\uC81C\uBAA9.md\` |
183
+ | \uBC18\uBCF5 \uAC00\uB2A5\uD55C \uD504\uB85C\uC138\uC2A4 \uC815\uB9BD | [Runbook](.context/templates/runbook.md) | \`runbook-\uC81C\uBAA9.md\` |
184
+ | \uC2E4\uD5D8/\uB514\uBC84\uAE45 \uC911 \uD559\uC2B5 | [Insight](.context/templates/insight.md) | \`insight-\uC81C\uBAA9.md\` |
238
185
 
239
186
  \uD574\uB2F9 \uC0AC\uD56D\uC774 \uC5C6\uC73C\uBA74 \uC774 \uB2E8\uACC4\uB294 \uAC74\uB108\uB6F0\uC138\uC694.
240
187
 
241
- \`\`\`
242
- task(
243
- category="quick",
244
- load_skills=[],
245
- description="Write Zettelkasten knowledge note",
246
- prompt="""
247
- TASK: \uC544\uB798 \uB0B4\uC6A9\uC744 \uBC14\uD0D5\uC73C\uB85C Zettelkasten \uC9C0\uC2DD \uB178\uD2B8\uB97C \uC791\uC131\uD558\uC138\uC694.
248
- EXPECTED OUTCOME: \uD15C\uD50C\uB9BF\uC5D0 \uB9DE\uB294 \uB178\uD2B8 \uD30C\uC77C \uC0DD\uC131, \uAD00\uB828 \uB178\uD2B8 \uB9C1\uD06C \uC5F0\uACB0
249
- REQUIRED TOOLS: Read (\uD15C\uD50C\uB9BF \uC77D\uAE30), Write (\uB178\uD2B8 \uC791\uC131), Edit (\uAE30\uC874 \uB178\uD2B8 \uB9C1\uD06C \uCD94\uAC00)
250
- MUST DO:
251
- - \uD574\uB2F9 \uD15C\uD50C\uB9BF \uD30C\uC77C\uC744 \uC77D\uACE0 \uADF8 \uAD6C\uC870\uC5D0 \uB9DE\uCDB0 \uB178\uD2B8 \uC791\uC131
252
- - \uB178\uD2B8 \uCCAB \uC904: \uBA85\uD655\uD55C \uC81C\uBAA9 (# Title)
253
- - \uD575\uC2EC \uB0B4\uC6A9\uC744 \uC790\uAE30 \uC5B8\uC5B4\uB85C \uAC04\uACB0\uD558\uAC8C \uC11C\uC220 (\uBCF5\uC0AC-\uBD99\uC5EC\uB123\uAE30 \uAE08\uC9C0)
254
- - \uAD00\uB828 \uB178\uD2B8\uB97C [[relative/path/file.md]] \uD615\uD0DC\uC758 wikilink\uB85C \uC5F0\uACB0
255
- - knowledge \uB514\uB809\uD1A0\uB9AC (\uAE30\uBCF8: docs/)\uC5D0 \uC800\uC7A5. \uB3C4\uBA54\uC778 \uD3F4\uB354\uAC00 \uC788\uB2E4\uBA74 \uC801\uC808\uD55C \uB3C4\uBA54\uC778\uC5D0 \uC800\uC7A5
256
- - \uAE30\uC874 \uB178\uD2B8\uC758 \uB0B4\uC6A9\uC774 \uBCC0\uACBD\uC0AC\uD56D\uACFC \uBD88\uC77C\uCE58\uD558\uBA74 \uC5C5\uB370\uC774\uD2B8
257
- - \uB3C4\uBA54\uC778 \uD3F4\uB354\uC5D0 \uC800\uC7A5\uD588\uB2E4\uBA74 \uD574\uB2F9 INDEX.md\uC5D0 \uD56D\uBAA9 \uCD94\uAC00
258
- MUST NOT DO:
259
- - \uC18C\uC2A4 \uCF54\uB4DC\uB97C \uC218\uC815\uD558\uC9C0 \uB9C8\uC138\uC694 (\uB178\uD2B8\uB9CC \uC791\uC131)
260
- - \uB178\uD2B8\uC5D0 \uC5EC\uB7EC \uC8FC\uC81C\uB97C \uC11E\uC9C0 \uB9C8\uC138\uC694 (\uC6D0\uC790\uC131 \uC6D0\uCE59)
261
- CONTEXT: [\uAE30\uB85D\uD560 \uBC1C\uACAC \uB0B4\uC6A9, \uD574\uB2F9\uD558\uB294 \uD15C\uD50C\uB9BF \uC885\uB958, \uAD00\uB828 \uAE30\uC874 \uB178\uD2B8 \uBAA9\uB85D\uC744 \uC5EC\uAE30\uC5D0 \uD3EC\uD568]
262
- """
263
- )
264
- \`\`\`
265
-
266
- ${"<"}!-- /primary-only -->
267
- ${"<"}!-- subagent-only -->
268
- <environment-constraints>
269
- \uB2F9\uC2E0\uC740 \uD604\uC7AC \uBA54\uC778 \uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uD130\uAC00 \uD638\uCD9C\uD55C **\uB9D0\uB2E8 \uC6CC\uCEE4(Worker) \uC5D0\uC774\uC804\uD2B8**\uC785\uB2C8\uB2E4.
270
- \uD604\uC7AC \uB2F9\uC2E0\uC758 \uC2E4\uD589 \uD658\uACBD(Sandbox)\uC5D0\uC11C\uB294 \uB124\uD2B8\uC6CC\uD06C \uC790\uC6D0 \uBCF4\uD638\uB97C \uC704\uD574 **\uB2E4\uB978 \uC5D0\uC774\uC804\uD2B8\uB97C \uC0DD\uC131, \uD638\uCD9C, \uC704\uC784\uD558\uB294 \uBAA8\uB4E0 \uB3C4\uAD6C(\uC608: task, background_task \uB4F1)\uC758 \uAD8C\uD55C\uC774 \uC2DC\uC2A4\uD15C \uB808\uBCA8\uC5D0\uC11C \uD68C\uC218**\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
271
-
272
- \uB9CC\uC57D \uC791\uC5C5 \uC911 \uB2E4\uB978 \uC804\uBB38\uAC00(explore, librarian \uB4F1)\uC758 \uB3C4\uC6C0\uC774 \uD544\uC694\uD558\uB2E4\uBA74, \uC9C1\uC811 \uC5D0\uC774\uC804\uD2B8\uB97C \uBD80\uB974\uB824 \uC2DC\uB3C4\uD558\uC9C0 \uB9C8\uC138\uC694. \uB300\uC2E0 \uD604\uC7AC\uAE4C\uC9C0\uC758 \uBD84\uC11D \uACB0\uACFC\uB97C \uC694\uC57D\uD558\uACE0 "OOO \uC5D0\uC774\uC804\uD2B8\uC758 \uB3C4\uC6C0\uC774 \uD544\uC694\uD568"\uC774\uB77C\uB294 \uBA54\uC2DC\uC9C0\uC640 \uD568\uAED8 \uC791\uC5C5\uC744 \uC885\uB8CC(Complete)\uD558\uC5EC \uBA54\uC778 \uC5D0\uC774\uC804\uD2B8\uC5D0\uAC8C \uC81C\uC5B4\uAD8C\uC744 \uBC18\uD658\uD558\uC138\uC694.
273
- </environment-constraints>
274
- ${"<"}!-- /subagent-only -->
188
+ - \uAD00\uB828 \uD15C\uD50C\uB9BF \uD30C\uC77C\uC744 \uC77D\uACE0 \uADF8 \uAD6C\uC870\uC5D0 \uB9DE\uCDB0 \uB0B4\uC6A9\uC744 \uC815\uB9AC\uD558\uC138\uC694
189
+ - \uB178\uD2B8 \uCCAB \uC904\uC740 \uBA85\uD655\uD55C \uC81C\uBAA9(\`# Title\`)\uC73C\uB85C \uC2DC\uC791\uD558\uC138\uC694
190
+ - \uD575\uC2EC \uB0B4\uC6A9\uC744 \uC790\uAE30 \uC5B8\uC5B4\uB85C \uAC04\uACB0\uD558\uAC8C \uC11C\uC220\uD558\uACE0, \uAD00\uB828 \uB178\uD2B8\uB294 \`[[relative/path/file.md]]\` \uD615\uD0DC\uB85C \uC5F0\uACB0\uD558\uC138\uC694
191
+ - knowledge \uB514\uB809\uD1A0\uB9AC(\`{{knowledgeDir}}/\`) \uB610\uB294 \uC801\uC808\uD55C \uB3C4\uBA54\uC778 \uD3F4\uB354\uC5D0 \uC800\uC7A5\uD558\uACE0, \uD544\uC694\uD55C \uACBD\uC6B0 \uAE30\uC874 INDEX.md\uB098 \uAD00\uB828 \uB178\uD2B8\uB97C \uD568\uAED8 \uAC31\uC2E0\uD558\uC138\uC694
192
+
193
+ \uAE30\uC874 \uC124\uCE58\uC758 \uC0AC\uC6A9\uC790 \uD504\uB86C\uD504\uD2B8 \uD30C\uC77C\uC740 \uC790\uB3D9\uC73C\uB85C \uBC14\uB00C\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC0C8 \uAE30\uBCF8 \uD504\uB86C\uD504\uD2B8\uAC00 \uD544\uC694\uD558\uBA74 \`context update prompt\`\uB85C \uBA85\uC2DC\uC801\uC73C\uB85C \uC0C8\uB85C\uACE0\uCE68\uD558\uC138\uC694.
275
194
  `;
276
195
  var DEFAULT_ADR_TEMPLATE = `# ADR-NNN: [\uC81C\uBAA9]
277
196
 
@@ -491,9 +410,9 @@ var TEMPLATE_FILES = {
491
410
  "index.md": DEFAULT_INDEX_TEMPLATE
492
411
  };
493
412
  function updateScaffold(projectDir) {
494
- const contextDir = join(projectDir, ".opencode", "context");
495
- mkdirSync(join(contextDir, "prompts"), { recursive: true });
496
- mkdirSync(join(contextDir, "templates"), { recursive: true });
413
+ const contextDir = join2(projectDir, resolveContextDir(projectDir));
414
+ mkdirSync(join2(contextDir, "prompts"), { recursive: true });
415
+ mkdirSync(join2(contextDir, "templates"), { recursive: true });
497
416
  const templateEntries = Object.fromEntries(Object.entries(TEMPLATE_FILES).map(([filename, content]) => [`templates/${filename}`, content]));
498
417
  const templates = {
499
418
  "config.jsonc": DEFAULT_CONFIG,
@@ -503,7 +422,7 @@ function updateScaffold(projectDir) {
503
422
  };
504
423
  const updated = [];
505
424
  for (const [path, content] of Object.entries(templates)) {
506
- const filePath = join(contextDir, path);
425
+ const filePath = join2(contextDir, path);
507
426
  try {
508
427
  const existing = readFileSync(filePath, "utf-8");
509
428
  if (existing === content)
@@ -516,18 +435,18 @@ function updateScaffold(projectDir) {
516
435
  return updated;
517
436
  }
518
437
  function writeVersion(contextDir, version) {
519
- writeFileSync(join(contextDir, ".version"), version, "utf-8");
438
+ writeFileSync(join2(contextDir, ".version"), version, "utf-8");
520
439
  }
521
440
  function updatePrompts(projectDir) {
522
- const contextDir = join(projectDir, ".opencode", "context");
523
- mkdirSync(join(contextDir, "prompts"), { recursive: true });
441
+ const contextDir = join2(projectDir, resolveContextDir(projectDir));
442
+ mkdirSync(join2(contextDir, "prompts"), { recursive: true });
524
443
  const prompts = {
525
444
  [`prompts/${DEFAULTS.turnStartFile}`]: DEFAULT_TURN_START,
526
445
  [`prompts/${DEFAULTS.turnEndFile}`]: DEFAULT_TURN_END
527
446
  };
528
447
  const updated = [];
529
448
  for (const [path, content] of Object.entries(prompts)) {
530
- const filePath = join(contextDir, path);
449
+ const filePath = join2(contextDir, path);
531
450
  try {
532
451
  const existing = readFileSync(filePath, "utf-8");
533
452
  if (existing === content)
@@ -594,20 +513,20 @@ function runUpdatePrompt(projectDir) {
594
513
  }
595
514
  }
596
515
  function detectPackageManager() {
597
- if (existsSync2("bun.lock") || existsSync2("bun.lockb"))
516
+ if (existsSync3("bun.lock") || existsSync3("bun.lockb"))
598
517
  return "bun";
599
- if (existsSync2("pnpm-lock.yaml"))
518
+ if (existsSync3("pnpm-lock.yaml"))
600
519
  return "pnpm";
601
- if (existsSync2("yarn.lock"))
520
+ if (existsSync3("yarn.lock"))
602
521
  return "yarn";
603
- if (existsSync2("package-lock.json"))
522
+ if (existsSync3("package-lock.json"))
604
523
  return "npm";
605
524
  return "bun";
606
525
  }
607
526
  function detectGlobalInstalls() {
608
527
  const installs = [];
609
- const bunGlobalBin = join2(homedir(), ".bun", "bin", "context");
610
- if (existsSync2(bunGlobalBin)) {
528
+ const bunGlobalBin = join3(homedir(), ".bun", "bin", "context");
529
+ if (existsSync3(bunGlobalBin)) {
611
530
  installs.push({ pm: "bun", label: "bun global", installCmd: ["bun", "install", "-g"] });
612
531
  }
613
532
  const spawnSync = globalThis.Bun?.spawnSync;
@@ -659,6 +578,108 @@ function runUpdatePlugin(version) {
659
578
  `);
660
579
  }
661
580
 
581
+ // src/cli/commands/migrate.ts
582
+ import { resolve as resolve2, join as join4 } from "path";
583
+ import { existsSync as existsSync4, cpSync, rmSync, readFileSync as readFileSync2, writeFileSync as writeFileSync2 } from "fs";
584
+ var LEGACY_CONTEXT_DIR = ".opencode/context";
585
+ var NEW_CONTEXT_DIR = ".context";
586
+ function runMigrate(args) {
587
+ const keepFlag = args.includes("--keep");
588
+ const pathArg = args.find((a) => !a.startsWith("--"));
589
+ const projectDir = resolve2(pathArg ?? process.cwd());
590
+ const legacyDir = join4(projectDir, LEGACY_CONTEXT_DIR);
591
+ const newDir = join4(projectDir, NEW_CONTEXT_DIR);
592
+ if (!existsSync4(legacyDir)) {
593
+ process.stdout.write(`Nothing to migrate.
594
+ `);
595
+ return;
596
+ }
597
+ if (existsSync4(newDir)) {
598
+ process.stderr.write(`Target .context/ already exists. Aborting.
599
+ `);
600
+ process.exit(1);
601
+ return;
602
+ }
603
+ cpSync(legacyDir, newDir, { recursive: true });
604
+ updateConfigPaths(newDir);
605
+ if (!keepFlag) {
606
+ rmSync(legacyDir, { recursive: true, force: true });
607
+ }
608
+ process.stdout.write(`Migrated .opencode/context/ \u2192 .context/
609
+ `);
610
+ }
611
+ function updateConfigPaths(contextDir) {
612
+ const configPath = join4(contextDir, "config.jsonc");
613
+ if (!existsSync4(configPath))
614
+ return;
615
+ try {
616
+ const content = readFileSync2(configPath, "utf-8");
617
+ const updated = content.replaceAll(".opencode/context/", "");
618
+ if (updated !== content) {
619
+ writeFileSync2(configPath, updated, "utf-8");
620
+ }
621
+ } catch {}
622
+ }
623
+
624
+ // src/cli/commands/install.ts
625
+ import { join as join5, resolve as resolve3, dirname } from "path";
626
+ import { existsSync as existsSync5, mkdirSync as mkdirSync2, copyFileSync } from "fs";
627
+ import { fileURLToPath } from "url";
628
+ import { createRequire } from "module";
629
+ function resolveOmxSource() {
630
+ try {
631
+ const cliDir = dirname(fileURLToPath(import.meta.url));
632
+ const pkgRoot = resolve3(cliDir, "..", "..");
633
+ const source = join5(pkgRoot, "dist", "omx", "index.mjs");
634
+ if (existsSync5(source))
635
+ return source;
636
+ } catch {}
637
+ try {
638
+ const req = createRequire(import.meta.url);
639
+ return req.resolve("@ksm0709/context/omx");
640
+ } catch {
641
+ return null;
642
+ }
643
+ }
644
+ function installOmx(projectDir, sourcePath) {
645
+ if (!existsSync5(sourcePath)) {
646
+ process.stderr.write(`Could not find OMX plugin source file: ${sourcePath}
647
+ `);
648
+ process.exit(1);
649
+ return;
650
+ }
651
+ const targetDir = join5(projectDir, ".omx", "hooks");
652
+ mkdirSync2(targetDir, { recursive: true });
653
+ copyFileSync(sourcePath, join5(targetDir, "context.mjs"));
654
+ process.stdout.write(`Installed context plugin to .omx/hooks/context.mjs
655
+ `);
656
+ }
657
+ function runInstall(args) {
658
+ const [subcommand] = args;
659
+ switch (subcommand) {
660
+ case "omx": {
661
+ const source = resolveOmxSource();
662
+ if (!source) {
663
+ process.stderr.write(`Could not find OMX plugin source file (dist/omx/index.mjs).
664
+ `);
665
+ process.exit(1);
666
+ return;
667
+ }
668
+ installOmx(process.cwd(), source);
669
+ break;
670
+ }
671
+ case undefined:
672
+ process.stderr.write(`Missing install target. Usage: context install omx
673
+ `);
674
+ process.exit(1);
675
+ break;
676
+ default:
677
+ process.stderr.write(`Unknown install target: ${subcommand}
678
+ `);
679
+ process.exit(1);
680
+ }
681
+ }
682
+
662
683
  // src/cli/index.ts
663
684
  var PLUGIN_VERSION2 = package_default.version;
664
685
  function printHelp(out) {
@@ -676,6 +697,10 @@ function printHelp(out) {
676
697
  write(` update prompt [path] Force-update prompt files only
677
698
  `);
678
699
  write(` update plugin [version] Update @ksm0709/context package
700
+ `);
701
+ write(` migrate [path] [--keep] Migrate .opencode/context/ \u2192 .context/
702
+ `);
703
+ write(` install omx Install OMX hook plugin to .omx/hooks/
679
704
  `);
680
705
  write(`
681
706
  `);
@@ -690,6 +715,12 @@ function runCli(argv) {
690
715
  case "update":
691
716
  runUpdate(rest);
692
717
  break;
718
+ case "migrate":
719
+ runMigrate(rest);
720
+ break;
721
+ case "install":
722
+ runInstall(rest);
723
+ break;
693
724
  case "--version":
694
725
  case "-v":
695
726
  process.stdout.write(`${PLUGIN_VERSION2}