@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 +4 -0
- package/dist/cli/index.js +194 -163
- package/dist/index.js +122 -257
- package/dist/omx/index.mjs +780 -0
- package/package.json +10 -5
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
|
|
6
|
-
import { existsSync as
|
|
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: ".
|
|
16
|
-
promptDir: ".
|
|
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: ".
|
|
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.
|
|
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": "
|
|
99
|
-
"turnEnd": "
|
|
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
|
-
|
|
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 =
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
\uBCC0\uACBD\
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
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](.
|
|
231
|
-
| \uBC18\uBCF5 \uC0AC\uC6A9\uD560 \uCF54\uB4DC \uD328\uD134 \uBC1C\uACAC | [Pattern](.
|
|
232
|
-
| \uBE44\uC790\uBA85\uD55C \uBC84\uADF8 \uD574\uACB0 | [Bug](.
|
|
233
|
-
| \uC678\uBD80 API/\uB77C\uC774\uBE0C\uB7EC\uB9AC \uC608\uC0C1\uC678 \uB3D9\uC791 | [Gotcha](.
|
|
234
|
-
| \uC791\uC740 \uAE30\uC220\uC801 \uC120\uD0DD | [Decision](.
|
|
235
|
-
| \uBAA8\uB4C8/\uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694 \uD544\uC694 | [Context](.
|
|
236
|
-
| \uBC18\uBCF5 \uAC00\uB2A5\uD55C \uD504\uB85C\uC138\uC2A4 \uC815\uB9BD | [Runbook](.
|
|
237
|
-
| \uC2E4\uD5D8/\uB514\uBC84\uAE45 \uC911 \uD559\uC2B5 | [Insight](.
|
|
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
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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 =
|
|
495
|
-
mkdirSync(
|
|
496
|
-
mkdirSync(
|
|
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 =
|
|
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(
|
|
438
|
+
writeFileSync(join2(contextDir, ".version"), version, "utf-8");
|
|
520
439
|
}
|
|
521
440
|
function updatePrompts(projectDir) {
|
|
522
|
-
const contextDir =
|
|
523
|
-
mkdirSync(
|
|
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 =
|
|
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 (
|
|
516
|
+
if (existsSync3("bun.lock") || existsSync3("bun.lockb"))
|
|
598
517
|
return "bun";
|
|
599
|
-
if (
|
|
518
|
+
if (existsSync3("pnpm-lock.yaml"))
|
|
600
519
|
return "pnpm";
|
|
601
|
-
if (
|
|
520
|
+
if (existsSync3("yarn.lock"))
|
|
602
521
|
return "yarn";
|
|
603
|
-
if (
|
|
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 =
|
|
610
|
-
if (
|
|
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}
|