@ksm0709/context 0.0.8 → 0.0.9

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.
@@ -0,0 +1,478 @@
1
+ #!/usr/bin/env bun
2
+ // @bun
3
+
4
+ // src/cli/index.ts
5
+ import { resolve } from "path";
6
+
7
+ // src/lib/scaffold.ts
8
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
9
+ import { join } from "path";
10
+
11
+ // src/constants.ts
12
+ var DEFAULTS = {
13
+ configPath: ".opencode/context/config.jsonc",
14
+ promptDir: ".opencode/context/prompts",
15
+ turnStartFile: "turn-start.md",
16
+ turnEndFile: "turn-end.md",
17
+ knowledgeSources: ["AGENTS.md"],
18
+ knowledgeDir: "docs",
19
+ templateDir: ".opencode/context/templates",
20
+ indexFilename: "INDEX.md",
21
+ maxDomainDepth: 2
22
+ };
23
+ var LIMITS = {
24
+ maxPromptFileSize: 64 * 1024,
25
+ maxIndexEntries: 100,
26
+ maxTotalInjectionSize: 128 * 1024,
27
+ maxScanDepth: 3,
28
+ maxSummaryLength: 100,
29
+ maxIndexFileSize: 32 * 1024
30
+ };
31
+ // package.json
32
+ var package_default = {
33
+ name: "@ksm0709/context",
34
+ version: "0.0.8",
35
+ author: {
36
+ name: "TaehoKang",
37
+ email: "ksm07091@gmail.com"
38
+ },
39
+ type: "module",
40
+ main: "./dist/index.js",
41
+ bin: {
42
+ context: "./dist/cli/index.js"
43
+ },
44
+ exports: {
45
+ ".": {
46
+ import: "./dist/index.js",
47
+ types: "./dist/index.d.ts",
48
+ default: "./dist/index.js"
49
+ }
50
+ },
51
+ repository: {
52
+ type: "git",
53
+ url: "git@github.com:ksm0709/context.git"
54
+ },
55
+ publishConfig: {
56
+ access: "public"
57
+ },
58
+ scripts: {
59
+ build: "bun build ./src/index.ts --outdir dist --target bun && bun build ./src/cli/index.ts --outdir dist/cli --target bun",
60
+ test: "vitest run",
61
+ lint: "eslint src --ext .ts"
62
+ },
63
+ files: [
64
+ "dist"
65
+ ],
66
+ peerDependencies: {
67
+ "@opencode-ai/plugin": ">=1.0.0"
68
+ },
69
+ dependencies: {
70
+ "jsonc-parser": "^3.0.0"
71
+ },
72
+ devDependencies: {
73
+ "@opencode-ai/plugin": "^1.2.10",
74
+ "@eslint/js": "^9.39.1",
75
+ "@types/node": "^20.11.5",
76
+ "@typescript-eslint/eslint-plugin": "8.47.0",
77
+ "@typescript-eslint/parser": "8.47.0",
78
+ "bun-types": "latest",
79
+ eslint: "^9.39.1",
80
+ "eslint-config-prettier": "10.1.8",
81
+ "eslint-plugin-prettier": "^5.1.3",
82
+ prettier: "^3.2.4",
83
+ "typescript-eslint": "^8.47.0",
84
+ vitest: "^3.2.4"
85
+ }
86
+ };
87
+
88
+ // src/lib/scaffold.ts
89
+ var PLUGIN_VERSION = package_default.version;
90
+ var DEFAULT_CONFIG = `{
91
+ // Context Plugin Configuration
92
+ // See: https://github.com/ksm0709/context
93
+ "prompts": {
94
+ "turnStart": ".opencode/context/prompts/turn-start.md",
95
+ "turnEnd": ".opencode/context/prompts/turn-end.md"
96
+ },
97
+ "knowledge": {
98
+ "dir": "docs",
99
+ "sources": ["AGENTS.md"]
100
+ }
101
+ }`;
102
+ var DEFAULT_TURN_START = `## Knowledge Context
103
+
104
+ \uC774 \uD504\uB85C\uC81D\uD2B8\uB294 **\uC81C\uD154\uCE74\uC2A4\uD150(Zettelkasten)** \uBC29\uC2DD\uC73C\uB85C \uC9C0\uC2DD\uC744 \uAD00\uB9AC\uD569\uB2C8\uB2E4.
105
+ \uC138\uC158 \uAC04 \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uBCF4\uC874\uD558\uC5EC, \uC774\uC804 \uC138\uC158\uC758 \uACB0\uC815/\uD328\uD134/\uC2E4\uC218\uAC00 \uB2E4\uC74C \uC138\uC158\uC5D0\uC11C \uC7AC\uD65C\uC6A9\uB429\uB2C8\uB2E4.
106
+
107
+ ### \uC81C\uD154\uCE74\uC2A4\uD150 \uD575\uC2EC \uC6D0\uCE59
108
+
109
+ 1. **\uC6D0\uC790\uC131** -- \uD558\uB098\uC758 \uB178\uD2B8 = \uD558\uB098\uC758 \uC8FC\uC81C. \uC5EC\uB7EC \uC8FC\uC81C\uB97C \uC11E\uC9C0 \uB9C8\uC138\uC694.
110
+ 2. **\uC5F0\uACB0** -- \uBAA8\uB4E0 \uB178\uD2B8\uB294 [[wikilink]]\uB85C \uAD00\uB828 \uB178\uD2B8\uC5D0 \uC5F0\uACB0. \uACE0\uB9BD\uB41C \uB178\uD2B8\uB294 \uBC1C\uACAC\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
111
+ 3. **\uC790\uAE30 \uC5B8\uC5B4** -- \uBCF5\uC0AC-\uBD99\uC5EC\uB123\uAE30\uAC00 \uC544\uB2CC, \uD575\uC2EC\uC744 \uC774\uD574\uD558\uACE0 \uAC04\uACB0\uD558\uAC8C \uC11C\uC220\uD558\uC138\uC694.
112
+
113
+ ### \uC791\uC5C5 \uC804 \uD544\uC218
114
+
115
+ - \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
116
+ - \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
117
+ - \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
118
+ - \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
119
+
120
+ ### \uAC1C\uBC1C \uC6D0\uCE59
121
+
122
+ - **TDD** (Test-Driven Development): \uD14C\uC2A4\uD2B8\uB97C \uBA3C\uC800 \uC791\uC131\uD558\uACE0(RED), \uAD6C\uD604\uD558\uC5EC \uD1B5\uACFC\uC2DC\uD0A8 \uB4A4(GREEN), \uB9AC\uD329\uD1A0\uB9C1\uD558\uC138\uC694
123
+ - **DDD** (Domain-Driven Design): \uB3C4\uBA54\uC778 \uAC1C\uB150\uC744 \uCF54\uB4DC \uAD6C\uC870\uC5D0 \uBC18\uC601\uD558\uC138\uC694. \uD0C0\uC785\uACFC \uBAA8\uB4C8\uC740 \uBE44\uC988\uB2C8\uC2A4 \uB3C4\uBA54\uC778\uC744 \uAE30\uC900\uC73C\uB85C \uBD84\uB9AC\uD558\uC138\uC694
124
+ - **\uD14C\uC2A4\uD2B8 \uCEE4\uBC84\uB9AC\uC9C0**: \uC0C8\uB85C \uC791\uC131\uD558\uAC70\uB098 \uBCC0\uACBD\uD55C \uCF54\uB4DC\uB294 \uD14C\uC2A4\uD2B8 \uCEE4\uBC84\uB9AC\uC9C0 80% \uC774\uC0C1\uC744 \uBAA9\uD45C\uB85C \uD558\uC138\uC694. \uAD6C\uD604 \uC804\uC5D0 \uD14C\uC2A4\uD2B8\uBD80\uD130 \uC791\uC131\uD558\uBA74 \uC790\uC5F0\uC2A4\uB7FD\uAC8C \uB2EC\uC131\uB429\uB2C8\uB2E4
125
+
126
+ ### \uC6B0\uC120\uC21C\uC704
127
+
128
+ - AGENTS.md\uC758 \uC9C0\uC2DC\uC0AC\uD56D\uC774 \uD56D\uC0C1 \uCD5C\uC6B0\uC120
129
+ - \uC9C0\uC2DD \uB178\uD2B8\uC758 \uACB0\uC815\uC0AC\uD56D > \uC77C\uBC18\uC801 \uAD00\uD589
130
+ - \uC9C0\uC2DD \uB178\uD2B8\uC5D0 \uC5C6\uB294 \uC0C8\uB85C\uC6B4 \uACB0\uC815\uC740 \uC791\uC5C5 \uC644\uB8CC \uC2DC \uAE30\uB85D\uD558\uC138\uC694
131
+ `;
132
+ var DEFAULT_TURN_END = `## \uC791\uC5C5 \uB9C8\uBB34\uB9AC \uCCB4\uD06C\uB9AC\uC2A4\uD2B8
133
+
134
+ \uC791\uC5C5\uC744 \uC644\uB8CC\uD558\uAE30 \uC804\uC5D0 \uBC18\uB4DC\uC2DC:
135
+
136
+ ### \uD004\uB9AC\uD2F0 \uBCF4\uC7A5
137
+
138
+ - [ ] \uBCC0\uACBD\uD55C \uCF54\uB4DC\uC5D0 \uB300\uD574 lint \uC2E4\uD589
139
+ - [ ] \uBCC0\uACBD\uD55C \uCF54\uB4DC\uC5D0 \uB300\uD574 formatter \uC2E4\uD589 (lint\uC640 \uBCC4\uAC1C)
140
+ - [ ] \uAE30\uC874 \uD14C\uC2A4\uD2B8 \uD1B5\uACFC \uD655\uC778
141
+ - [ ] \uBCC0\uACBD \uBC94\uC704 \uD655\uC778: \uC694\uCCAD\uACFC \uBB34\uAD00\uD55C \uD30C\uC77C\uC744 \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uC558\uB294\uAC00?
142
+ - [ ] \uC0C8\uB85C \uC791\uC131\uD558\uAC70\uB098 \uBCC0\uACBD\uD55C \uCF54\uB4DC\uC758 \uD14C\uC2A4\uD2B8 \uCEE4\uBC84\uB9AC\uC9C0 80% \uC774\uC0C1 \uB2EC\uC131
143
+
144
+ ### \uC9C0\uC2DD \uC815\uB9AC (Zettelkasten)
145
+
146
+ \uC544\uB798 \uC0C1\uD669\uC5D0 \uD574\uB2F9\uD558\uBA74, \uD574\uB2F9 \uD15C\uD50C\uB9BF \uD30C\uC77C\uC744 \uC77D\uACE0 \uADF8 \uAD6C\uC870\uC5D0 \uB9DE\uCDB0 \uB178\uD2B8\uB97C \uC791\uC131\uD558\uC138\uC694.
147
+
148
+ | \uC0C1\uD669 | \uD15C\uD50C\uB9BF | \uD30C\uC77C\uBA85 \uD328\uD134 |
149
+ | ------------------------------- | --------------------------------------------------- | --------------------------- |
150
+ | \uC544\uD0A4\uD14D\uCC98/\uAE30\uC220 \uC2A4\uD0DD \uC911\uB300 \uACB0\uC815 | [ADR](.opencode/context/templates/adr.md) | \`adr-NNN-\uC81C\uBAA9.md\` |
151
+ | \uBC18\uBCF5 \uC0AC\uC6A9\uD560 \uCF54\uB4DC \uD328\uD134 \uBC1C\uACAC | [Pattern](.opencode/context/templates/pattern.md) | \`pattern-\uC81C\uBAA9.md\` |
152
+ | \uBE44\uC790\uBA85\uD55C \uBC84\uADF8 \uD574\uACB0 | [Bug](.opencode/context/templates/bug.md) | \`bug-\uC81C\uBAA9.md\` |
153
+ | \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\` |
154
+ | \uC791\uC740 \uAE30\uC220\uC801 \uC120\uD0DD | [Decision](.opencode/context/templates/decision.md) | \`decision-\uC81C\uBAA9.md\` |
155
+ | \uBAA8\uB4C8/\uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694 \uD544\uC694 | [Context](.opencode/context/templates/context.md) | \`context-\uC81C\uBAA9.md\` |
156
+ | \uBC18\uBCF5 \uAC00\uB2A5\uD55C \uD504\uB85C\uC138\uC2A4 \uC815\uB9BD | [Runbook](.opencode/context/templates/runbook.md) | \`runbook-\uC81C\uBAA9.md\` |
157
+ | \uC2E4\uD5D8/\uB514\uBC84\uAE45 \uC911 \uD559\uC2B5 | [Insight](.opencode/context/templates/insight.md) | \`insight-\uC81C\uBAA9.md\` |
158
+
159
+ - [ ] \uC704 \uC0C1\uD669\uC5D0 \uD574\uB2F9\uD558\uB294 \uBC1C\uACAC\uC774 \uC788\uC5C8\uB2E4\uBA74 \uB178\uD2B8\uB97C \uC791\uC131\uD588\uB294\uAC00?
160
+ - [ ] \uAD00\uB828 \uAE30\uC874 \uB178\uD2B8\uC5D0 [[\uB9C1\uD06C]]\uB97C \uCD94\uAC00\uD588\uB294\uAC00?
161
+ - [ ] \uAE30\uC874 \uB178\uD2B8\uC758 \uB0B4\uC6A9\uC774 \uBCC0\uACBD\uC0AC\uD56D\uACFC \uBD88\uC77C\uCE58\uD558\uBA74 \uC5C5\uB370\uC774\uD2B8\uD588\uB294\uAC00?
162
+ - [ ] \uB178\uD2B8\uB97C \uB3C4\uBA54\uC778 \uD3F4\uB354\uC5D0 \uC800\uC7A5\uD588\uB2E4\uBA74 \uD574\uB2F9 INDEX.md\uC5D0 \uCD94\uAC00\uD588\uB294\uAC00?
163
+
164
+ #### \uB178\uD2B8 \uC791\uC131 \uADDC\uCE59
165
+
166
+ - \uCCAB \uC904: \uBA85\uD655\uD55C \uC81C\uBAA9 (\`# Title\`)
167
+ - \uD575\uC2EC \uB0B4\uC6A9\uC744 \uC790\uC2E0\uC758 \uC5B8\uC5B4\uB85C \uAC04\uACB0\uD558\uAC8C \uC11C\uC220
168
+ - \uAD00\uB828 \uB178\uD2B8\uB97C \`[[relative/path/file.md]]\` \uD615\uD0DC\uC758 wikilink\uB85C \uC5F0\uACB0
169
+ - 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
170
+ `;
171
+ var DEFAULT_ADR_TEMPLATE = `# ADR-NNN: [\uC81C\uBAA9]
172
+
173
+ ## \uC0C1\uD0DC
174
+
175
+ Accepted | Deprecated | Superseded by [[ADR-YYY]]
176
+
177
+ ## \uB9E5\uB77D
178
+
179
+ \uC774 \uACB0\uC815\uC744 \uB0B4\uB9AC\uAC8C \uB41C \uBC30\uACBD/\uBB38\uC81C \uC0C1\uD669
180
+
181
+ ## \uACB0\uC815
182
+
183
+ \uBB34\uC5C7\uC744 \uC5B4\uB5BB\uAC8C \uD558\uAE30\uB85C \uD588\uB294\uC9C0
184
+
185
+ ## \uACB0\uACFC
186
+
187
+ ### \uAE0D\uC815\uC801
188
+
189
+ - ...
190
+
191
+ ### \uBD80\uC815\uC801 (\uD2B8\uB808\uC774\uB4DC\uC624\uD504)
192
+
193
+ - ...
194
+
195
+ ## \uAD00\uB828 \uB178\uD2B8
196
+
197
+ - [[\uAD00\uB828-\uACB0\uC815.md]] / [[\uAD00\uB828-\uD328\uD134.md]]
198
+ `;
199
+ var DEFAULT_PATTERN_TEMPLATE = `# Pattern: [\uD328\uD134 \uC774\uB984]
200
+
201
+ ## \uBB38\uC81C
202
+
203
+ \uC774 \uD328\uD134\uC774 \uD574\uACB0\uD558\uB294 \uBB38\uC81C
204
+
205
+ ## \uD574\uBC95
206
+
207
+ // \uD328\uD134\uC758 \uB300\uD45C\uC801 \uC608\uC2DC \uCF54\uB4DC
208
+
209
+ ## \uC0AC\uC6A9 \uC2DC\uC810
210
+
211
+ - \uC774\uB7F4 \uB54C \uC0AC\uC6A9
212
+
213
+ ## \uC0AC\uC6A9\uD558\uC9C0 \uB9D0 \uAC83
214
+
215
+ - \uC774\uB7F4 \uB54C\uB294 \uC0AC\uC6A9 \uAE08\uC9C0 (\uC548\uD2F0\uD328\uD134 \uACBD\uACE0)
216
+
217
+ ## \uCF54\uB4DC\uBCA0\uC774\uC2A4 \uB0B4 \uC608\uC2DC
218
+
219
+ - [[\uACBD\uB85C/\uD30C\uC77C.ts]] -- \uC2E4\uC81C \uC801\uC6A9 \uC0AC\uB840
220
+
221
+ ## \uAD00\uB828 \uD328\uD134
222
+
223
+ - [[\uB300\uC548-\uD328\uD134.md]] / [[\uBCF4\uC644-\uD328\uD134.md]]
224
+ `;
225
+ var DEFAULT_BUG_TEMPLATE = `# Bug: [\uAC04\uB2E8\uD55C \uC124\uBA85]
226
+
227
+ ## \uC99D\uC0C1
228
+
229
+ - \uC5D0\uB7EC \uBA54\uC2DC\uC9C0: \`...\`
230
+ - \uAD00\uCC30\uB41C \uB3D9\uC791: ...
231
+
232
+ ## \uC6D0\uC778
233
+
234
+ \uC2E4\uC81C \uC6D0\uC778 \uBD84\uC11D
235
+
236
+ ## \uD574\uACB0
237
+
238
+ // \uC218\uC815 \uCF54\uB4DC
239
+
240
+ ## \uC608\uBC29
241
+
242
+ \uD5A5\uD6C4 \uAC19\uC740 \uBB38\uC81C\uB97C \uBC29\uC9C0\uD558\uB294 \uBC29\uBC95
243
+
244
+ ## \uAD00\uB828 \uB178\uD2B8
245
+
246
+ - [[\uC720\uC0AC-\uBC84\uADF8.md]] / [[\uC608\uBC29-\uD328\uD134.md]]
247
+ `;
248
+ var DEFAULT_GOTCHA_TEMPLATE = `# Gotcha: [\uB77C\uC774\uBE0C\uB7EC\uB9AC] -- [\uD568\uC815 \uC124\uBA85]
249
+
250
+ ## \uC608\uC0C1 vs \uC2E4\uC81C
251
+
252
+ \uC608\uC0C1\uD55C \uB3D9\uC791\uACFC \uC2E4\uC81C \uB3D9\uC791\uC758 \uCC28\uC774
253
+
254
+ ## \uC6B0\uD68C\uBC95
255
+
256
+ // \uC791\uB3D9\uD558\uB294 \uD574\uACB0 \uCF54\uB4DC
257
+
258
+ ## \uC6D0\uC778 (\uC54C\uB824\uC9C4 \uACBD\uC6B0)
259
+
260
+ \uC65C \uC774\uB807\uAC8C \uB3D9\uC791\uD558\uB294\uC9C0
261
+
262
+ ## \uAD00\uB828
263
+
264
+ - \uC774\uC288: [GitHub issue / \uBB38\uC11C \uB9C1\uD06C]
265
+ - [[\uAD00\uB828-gotcha.md]]
266
+ `;
267
+ var DEFAULT_DECISION_TEMPLATE = `# Decision: [\uC81C\uBAA9]
268
+
269
+ ## \uACB0\uC815
270
+
271
+ \uBB34\uC5C7\uC744 \uC120\uD0DD\uD588\uB294\uC9C0
272
+
273
+ ## \uADFC\uAC70
274
+
275
+ \uC65C \uC774\uAC83\uC744 \uC120\uD0DD\uD588\uB294\uC9C0
276
+
277
+ ## \uACE0\uB824\uD55C \uB300\uC548
278
+
279
+ - \uB300\uC548 1: \uD0C8\uB77D \uC774\uC720
280
+ - \uB300\uC548 2: \uD0C8\uB77D \uC774\uC720
281
+
282
+ ## \uAD00\uB828 \uB178\uD2B8
283
+
284
+ - [[\uAD00\uB828-ADR.md]] / [[\uAD00\uB828-\uD328\uD134.md]]
285
+ `;
286
+ var DEFAULT_CONTEXT_TEMPLATE = `# Context: [\uD504\uB85C\uC81D\uD2B8/\uBAA8\uB4C8\uBA85]
287
+
288
+ ## \uAC1C\uC694
289
+
290
+ \uBB34\uC5C7\uC774\uACE0 \uBB34\uC5C7\uC744 \uD558\uB294\uC9C0
291
+
292
+ ## \uAE30\uC220 \uC2A4\uD0DD
293
+
294
+ - \uC5B8\uC5B4 / \uD504\uB808\uC784\uC6CC\uD06C / \uC8FC\uC694 \uB77C\uC774\uBE0C\uB7EC\uB9AC
295
+
296
+ ## \uC544\uD0A4\uD14D\uCC98
297
+
298
+ \uACE0\uC218\uC900 \uAD6C\uC870\uC640 \uD328\uD134
299
+
300
+ ## \uCEE8\uBCA4\uC158
301
+
302
+ - \uD30C\uC77C \uAD6C\uC870 / \uB124\uC774\uBC0D / \uD14C\uC2A4\uD2B8 \uBC29\uC2DD
303
+
304
+ ## \uC9C4\uC785\uC810
305
+
306
+ - [[src/index.ts]] / [[config.json]]
307
+
308
+ ## \uAD00\uB828 \uB178\uD2B8
309
+
310
+ - [[\uAD00\uB828-context.md]] / [[\uC8FC\uC694-ADR.md]]
311
+ `;
312
+ var DEFAULT_RUNBOOK_TEMPLATE = `# Runbook: [\uC808\uCC28 \uC774\uB984]
313
+
314
+ ## \uBAA9\uC801
315
+
316
+ \uC774 \uC808\uCC28\uAC00 \uB2EC\uC131\uD558\uB294 \uAC83
317
+
318
+ ## \uC0AC\uC804 \uC870\uAC74
319
+
320
+ - \uD544\uC694\uD55C \uAC83 1
321
+
322
+ ## \uB2E8\uACC4
323
+
324
+ 1. \uCCAB \uBC88\uC9F8 \uB2E8\uACC4
325
+ 2. \uB450 \uBC88\uC9F8 \uB2E8\uACC4
326
+
327
+ ## \uD655\uC778 \uBC29\uBC95
328
+
329
+ \uC131\uACF5\uD588\uB294\uC9C0 \uD655\uC778\uD558\uB294 \uBC29\uBC95
330
+
331
+ ## \uBB38\uC81C \uD574\uACB0
332
+
333
+ | \uC99D\uC0C1 | \uD574\uACB0 |
334
+ | ------ | --------------- |
335
+ | \uC774\uC288 1 | [[\uAD00\uB828-bug.md]] |
336
+
337
+ ## \uAD00\uB828 \uB178\uD2B8
338
+
339
+ - [[\uAD00\uB828-runbook.md]] / [[\uAD00\uB828-context.md]]
340
+ `;
341
+ var DEFAULT_INSIGHT_TEMPLATE = `# Insight: [\uBC1C\uACAC \uC81C\uBAA9]
342
+
343
+ ## \uBC1C\uACAC
344
+
345
+ \uBB34\uC5C7\uC744 \uC54C\uAC8C \uB418\uC5C8\uB294\uC9C0
346
+
347
+ ## \uB9E5\uB77D
348
+
349
+ \uC5B4\uB5BB\uAC8C \uBC1C\uACAC\uD588\uB294\uC9C0 (\uC5B4\uB5A4 \uC791\uC5C5 \uC911, \uC5B4\uB5A4 \uC2E4\uD5D8)
350
+
351
+ ## \uC2DC\uC0AC\uC810
352
+
353
+ \uC774\uAC83\uC774 \uD5A5\uD6C4 \uC791\uC5C5\uC5D0 \uBBF8\uCE58\uB294 \uC601\uD5A5
354
+
355
+ ## \uC801\uC6A9
356
+
357
+ \uC774 \uBC1C\uACAC\uC744 \uBC14\uD0D5\uC73C\uB85C \uC5B4\uB5BB\uAC8C \uD589\uB3D9\uC744 \uBC14\uAFD4\uC57C \uD558\uB294\uC9C0
358
+
359
+ ## \uAD00\uB828 \uB178\uD2B8
360
+
361
+ - [[\uAD00\uB828-insight.md]] / [[\uC601\uD5A5\uBC1B\uB294-\uD328\uD134.md]] / [[\uAD00\uB828-ADR.md]]
362
+ `;
363
+ var DEFAULT_INDEX_TEMPLATE = `# [Domain] Domain
364
+
365
+ Overview: [1-2 sentence description of this domain]
366
+
367
+ ## Notes
368
+
369
+ | File | Summary | Read When... |
370
+ |------|---------|--------------|
371
+ | [[example.md]] | Example summary | Working on X |
372
+
373
+ ## Related Domains
374
+
375
+ - [[../other-domain/INDEX.md]] -- Description
376
+ `;
377
+ var TEMPLATE_FILES = {
378
+ "adr.md": DEFAULT_ADR_TEMPLATE,
379
+ "pattern.md": DEFAULT_PATTERN_TEMPLATE,
380
+ "bug.md": DEFAULT_BUG_TEMPLATE,
381
+ "gotcha.md": DEFAULT_GOTCHA_TEMPLATE,
382
+ "decision.md": DEFAULT_DECISION_TEMPLATE,
383
+ "context.md": DEFAULT_CONTEXT_TEMPLATE,
384
+ "runbook.md": DEFAULT_RUNBOOK_TEMPLATE,
385
+ "insight.md": DEFAULT_INSIGHT_TEMPLATE,
386
+ "index.md": DEFAULT_INDEX_TEMPLATE
387
+ };
388
+ function updateScaffold(projectDir) {
389
+ const contextDir = join(projectDir, ".opencode", "context");
390
+ mkdirSync(join(contextDir, "prompts"), { recursive: true });
391
+ mkdirSync(join(contextDir, "templates"), { recursive: true });
392
+ const templateEntries = Object.fromEntries(Object.entries(TEMPLATE_FILES).map(([filename, content]) => [`templates/${filename}`, content]));
393
+ const templates = {
394
+ "config.jsonc": DEFAULT_CONFIG,
395
+ [`prompts/${DEFAULTS.turnStartFile}`]: DEFAULT_TURN_START,
396
+ [`prompts/${DEFAULTS.turnEndFile}`]: DEFAULT_TURN_END,
397
+ ...templateEntries
398
+ };
399
+ const updated = [];
400
+ for (const [path, content] of Object.entries(templates)) {
401
+ const filePath = join(contextDir, path);
402
+ try {
403
+ const existing = readFileSync(filePath, "utf-8");
404
+ if (existing === content)
405
+ continue;
406
+ } catch {}
407
+ writeFileSync(filePath, content, "utf-8");
408
+ updated.push(path);
409
+ }
410
+ writeVersion(contextDir, PLUGIN_VERSION);
411
+ return updated;
412
+ }
413
+ function writeVersion(contextDir, version) {
414
+ writeFileSync(join(contextDir, ".version"), version, "utf-8");
415
+ }
416
+
417
+ // src/cli/commands/update.ts
418
+ function runUpdate(projectDir) {
419
+ const updated = updateScaffold(projectDir);
420
+ if (updated.length === 0) {
421
+ process.stdout.write(`All scaffold files are already up to date.
422
+ `);
423
+ } else {
424
+ process.stdout.write(`Updated ${updated.length} file(s):
425
+ `);
426
+ for (const f of updated) {
427
+ process.stdout.write(` - ${f}
428
+ `);
429
+ }
430
+ }
431
+ }
432
+
433
+ // src/cli/index.ts
434
+ var COMMANDS = {
435
+ update: "Force-update scaffold files to latest plugin version"
436
+ };
437
+ function printHelp(out) {
438
+ const write = out ?? ((s) => process.stdout.write(s));
439
+ write(`Usage: context <command>
440
+
441
+ `);
442
+ write(`Commands:
443
+ `);
444
+ for (const [name, desc] of Object.entries(COMMANDS)) {
445
+ write(` ${name.padEnd(12)}${desc}
446
+ `);
447
+ }
448
+ write(`
449
+ `);
450
+ }
451
+ function runCli(argv) {
452
+ const [command, ...rest] = argv;
453
+ const projectDir = resolve(rest[0] ?? process.cwd());
454
+ switch (command) {
455
+ case "update":
456
+ runUpdate(projectDir);
457
+ break;
458
+ case undefined:
459
+ case "--help":
460
+ case "-h":
461
+ printHelp();
462
+ break;
463
+ default:
464
+ process.stderr.write(`Unknown command: ${command}
465
+
466
+ `);
467
+ printHelp((s) => process.stderr.write(s));
468
+ process.exit(1);
469
+ }
470
+ }
471
+ if (import.meta.path === Bun.main) {
472
+ runCli(process.argv.slice(2));
473
+ }
474
+ export {
475
+ runCli,
476
+ printHelp,
477
+ COMMANDS
478
+ };
package/dist/index.js CHANGED
@@ -1091,11 +1091,65 @@ function readPromptFile(filePath) {
1091
1091
  // src/lib/scaffold.ts
1092
1092
  import { existsSync as existsSync2, mkdirSync, readFileSync as readFileSync4, writeFileSync } from "fs";
1093
1093
  import { join as join3 } from "path";
1094
-
1095
- // src/version.ts
1096
- var PLUGIN_VERSION = "0.0.6";
1094
+ // package.json
1095
+ var package_default = {
1096
+ name: "@ksm0709/context",
1097
+ version: "0.0.9",
1098
+ author: {
1099
+ name: "TaehoKang",
1100
+ email: "ksm07091@gmail.com"
1101
+ },
1102
+ type: "module",
1103
+ main: "./dist/index.js",
1104
+ bin: {
1105
+ context: "./dist/cli/index.js"
1106
+ },
1107
+ exports: {
1108
+ ".": {
1109
+ import: "./dist/index.js",
1110
+ types: "./dist/index.d.ts",
1111
+ default: "./dist/index.js"
1112
+ }
1113
+ },
1114
+ repository: {
1115
+ type: "git",
1116
+ url: "git@github.com:ksm0709/context.git"
1117
+ },
1118
+ publishConfig: {
1119
+ access: "public"
1120
+ },
1121
+ scripts: {
1122
+ build: "bun build ./src/index.ts --outdir dist --target bun && bun build ./src/cli/index.ts --outdir dist/cli --target bun",
1123
+ test: "vitest run",
1124
+ lint: "eslint src --ext .ts"
1125
+ },
1126
+ files: [
1127
+ "dist"
1128
+ ],
1129
+ peerDependencies: {
1130
+ "@opencode-ai/plugin": ">=1.0.0"
1131
+ },
1132
+ dependencies: {
1133
+ "jsonc-parser": "^3.0.0"
1134
+ },
1135
+ devDependencies: {
1136
+ "@opencode-ai/plugin": "^1.2.10",
1137
+ "@eslint/js": "^9.39.1",
1138
+ "@types/node": "^20.11.5",
1139
+ "@typescript-eslint/eslint-plugin": "8.47.0",
1140
+ "@typescript-eslint/parser": "8.47.0",
1141
+ "bun-types": "latest",
1142
+ eslint: "^9.39.1",
1143
+ "eslint-config-prettier": "10.1.8",
1144
+ "eslint-plugin-prettier": "^5.1.3",
1145
+ prettier: "^3.2.4",
1146
+ "typescript-eslint": "^8.47.0",
1147
+ vitest: "^3.2.4"
1148
+ }
1149
+ };
1097
1150
 
1098
1151
  // src/lib/scaffold.ts
1152
+ var PLUGIN_VERSION = package_default.version;
1099
1153
  var DEFAULT_CONFIG = `{
1100
1154
  // Context Plugin Configuration
1101
1155
  // See: https://github.com/ksm0709/context
@@ -1136,23 +1190,48 @@ var DEFAULT_TURN_START = `## Knowledge Context
1136
1190
 
1137
1191
  - AGENTS.md\uC758 \uC9C0\uC2DC\uC0AC\uD56D\uC774 \uD56D\uC0C1 \uCD5C\uC6B0\uC120
1138
1192
  - \uC9C0\uC2DD \uB178\uD2B8\uC758 \uACB0\uC815\uC0AC\uD56D > \uC77C\uBC18\uC801 \uAD00\uD589
1139
- - \uC9C0\uC2DD \uB178\uD2B8\uC5D0 \uC5C6\uB294 \uC0C8\uB85C\uC6B4 \uACB0\uC815\uC740 \uC791\uC5C5 \uC644\uB8CC \uC2DC \uAE30\uB85D\uD558\uC138\uC694
1193
+ - \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
1140
1194
  `;
1141
- var DEFAULT_TURN_END = `## \uC791\uC5C5 \uB9C8\uBB34\uB9AC \uCCB4\uD06C\uB9AC\uC2A4\uD2B8
1142
-
1143
- \uC791\uC5C5\uC744 \uC644\uB8CC\uD558\uAE30 \uC804\uC5D0 \uBC18\uB4DC\uC2DC:
1144
-
1145
- ### \uD004\uB9AC\uD2F0 \uBCF4\uC7A5
1146
-
1147
- - [ ] \uBCC0\uACBD\uD55C \uCF54\uB4DC\uC5D0 \uB300\uD574 lint \uC2E4\uD589
1148
- - [ ] \uBCC0\uACBD\uD55C \uCF54\uB4DC\uC5D0 \uB300\uD574 formatter \uC2E4\uD589 (lint\uC640 \uBCC4\uAC1C)
1149
- - [ ] \uAE30\uC874 \uD14C\uC2A4\uD2B8 \uD1B5\uACFC \uD655\uC778
1150
- - [ ] \uBCC0\uACBD \uBC94\uC704 \uD655\uC778: \uC694\uCCAD\uACFC \uBB34\uAD00\uD55C \uD30C\uC77C\uC744 \uAC74\uB4DC\uB9AC\uC9C0 \uC54A\uC558\uB294\uAC00?
1151
- - [ ] \uC0C8\uB85C \uC791\uC131\uD558\uAC70\uB098 \uBCC0\uACBD\uD55C \uCF54\uB4DC\uC758 \uD14C\uC2A4\uD2B8 \uCEE4\uBC84\uB9AC\uC9C0 80% \uC774\uC0C1 \uB2EC\uC131
1152
-
1153
- ### \uC9C0\uC2DD \uC815\uB9AC (Zettelkasten)
1154
-
1155
- \uC544\uB798 \uC0C1\uD669\uC5D0 \uD574\uB2F9\uD558\uBA74, \uD574\uB2F9 \uD15C\uD50C\uB9BF \uD30C\uC77C\uC744 \uC77D\uACE0 \uADF8 \uAD6C\uC870\uC5D0 \uB9DE\uCDB0 \uB178\uD2B8\uB97C \uC791\uC131\uD558\uC138\uC694.
1195
+ var DEFAULT_TURN_END = `## \uC791\uC5C5 \uB9C8\uBB34\uB9AC
1196
+
1197
+ \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.
1198
+ \uBA54\uC778 \uC5D0\uC774\uC804\uD2B8\uAC00 \uC9C1\uC811 \uC218\uD589\uD558\uC9C0 \uB9C8\uC138\uC694.
1199
+
1200
+ ### 1. \uD004\uB9AC\uD2F0 \uCCB4\uD06C (\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8 \uC704\uC784)
1201
+
1202
+ \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.
1203
+
1204
+ \`\`\`
1205
+ task(
1206
+ category="quick",
1207
+ load_skills=[],
1208
+ description="Quality check for changed files",
1209
+ prompt="""
1210
+ TASK: \uBCC0\uACBD\uB41C \uD30C\uC77C\uB4E4\uC5D0 \uB300\uD574 \uD004\uB9AC\uD2F0 \uCCB4\uD06C\uB97C \uC218\uD589\uD558\uC138\uC694.
1211
+ EXPECTED OUTCOME: \uBAA8\uB4E0 \uCCB4\uD06C \uD1B5\uACFC \uB610\uB294 \uC2E4\uD328 \uD56D\uBAA9 \uBAA9\uB85D
1212
+ REQUIRED TOOLS: Bash (lint, format, test \uC2E4\uD589)
1213
+ MUST DO:
1214
+ - \uBCC0\uACBD\uD55C \uCF54\uB4DC\uC5D0 \uB300\uD574 lint \uC2E4\uD589
1215
+ - \uBCC0\uACBD\uD55C \uCF54\uB4DC\uC5D0 \uB300\uD574 formatter \uC2E4\uD589 (lint\uC640 \uBCC4\uAC1C)
1216
+ - \uAE30\uC874 \uD14C\uC2A4\uD2B8 \uD1B5\uACFC \uD655\uC778
1217
+ - \uC0C8\uB85C \uC791\uC131/\uBCC0\uACBD\uD55C \uCF54\uB4DC\uC758 \uD14C\uC2A4\uD2B8 \uCEE4\uBC84\uB9AC\uC9C0 80% \uC774\uC0C1 \uD655\uC778
1218
+ - \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
1219
+ - \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
1220
+ MUST NOT DO:
1221
+ - \uCF54\uB4DC\uB97C \uC9C1\uC811 \uC218\uC815\uD558\uC9C0 \uB9C8\uC138\uC694 (\uBCF4\uACE0\uB9CC)
1222
+ - \uD14C\uC2A4\uD2B8\uB97C \uC0AD\uC81C\uD558\uAC70\uB098 \uC2A4\uD0B5\uD558\uC9C0 \uB9C8\uC138\uC694
1223
+ CONTEXT: [\uBCC0\uACBD\uD55C \uD30C\uC77C \uBAA9\uB85D\uACFC \uBCC0\uACBD \uB0B4\uC6A9 \uC694\uC57D\uC744 \uC5EC\uAE30\uC5D0 \uD3EC\uD568]
1224
+ """
1225
+ )
1226
+ \`\`\`
1227
+
1228
+ \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.
1229
+
1230
+ ### 2. \uC9C0\uC2DD \uC815\uB9AC (\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8 \uC704\uC784)
1231
+
1232
+ \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.
1233
+
1234
+ **\uAE30\uB85D \uB300\uC0C1 \uD310\uB2E8 \uAE30\uC900:**
1156
1235
 
1157
1236
  | \uC0C1\uD669 | \uD15C\uD50C\uB9BF | \uD30C\uC77C\uBA85 \uD328\uD134 |
1158
1237
  | ------------------------------- | --------------------------------------------------- | --------------------------- |
@@ -1165,17 +1244,32 @@ var DEFAULT_TURN_END = `## \uC791\uC5C5 \uB9C8\uBB34\uB9AC \uCCB4\uD06C\uB9AC\uC
1165
1244
  | \uBC18\uBCF5 \uAC00\uB2A5\uD55C \uD504\uB85C\uC138\uC2A4 \uC815\uB9BD | [Runbook](.opencode/context/templates/runbook.md) | \`runbook-\uC81C\uBAA9.md\` |
1166
1245
  | \uC2E4\uD5D8/\uB514\uBC84\uAE45 \uC911 \uD559\uC2B5 | [Insight](.opencode/context/templates/insight.md) | \`insight-\uC81C\uBAA9.md\` |
1167
1246
 
1168
- - [ ] \uC704 \uC0C1\uD669\uC5D0 \uD574\uB2F9\uD558\uB294 \uBC1C\uACAC\uC774 \uC788\uC5C8\uB2E4\uBA74 \uB178\uD2B8\uB97C \uC791\uC131\uD588\uB294\uAC00?
1169
- - [ ] \uAD00\uB828 \uAE30\uC874 \uB178\uD2B8\uC5D0 [[\uB9C1\uD06C]]\uB97C \uCD94\uAC00\uD588\uB294\uAC00?
1170
- - [ ] \uAE30\uC874 \uB178\uD2B8\uC758 \uB0B4\uC6A9\uC774 \uBCC0\uACBD\uC0AC\uD56D\uACFC \uBD88\uC77C\uCE58\uD558\uBA74 \uC5C5\uB370\uC774\uD2B8\uD588\uB294\uAC00?
1171
- - [ ] \uB178\uD2B8\uB97C \uB3C4\uBA54\uC778 \uD3F4\uB354\uC5D0 \uC800\uC7A5\uD588\uB2E4\uBA74 \uD574\uB2F9 INDEX.md\uC5D0 \uCD94\uAC00\uD588\uB294\uAC00?
1172
-
1173
- #### \uB178\uD2B8 \uC791\uC131 \uADDC\uCE59
1174
-
1175
- - \uCCAB \uC904: \uBA85\uD655\uD55C \uC81C\uBAA9 (\`# Title\`)
1176
- - \uD575\uC2EC \uB0B4\uC6A9\uC744 \uC790\uC2E0\uC758 \uC5B8\uC5B4\uB85C \uAC04\uACB0\uD558\uAC8C \uC11C\uC220
1177
- - \uAD00\uB828 \uB178\uD2B8\uB97C \`[[relative/path/file.md]]\` \uD615\uD0DC\uC758 wikilink\uB85C \uC5F0\uACB0
1178
- - 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
1247
+ \uD574\uB2F9 \uC0AC\uD56D\uC774 \uC5C6\uC73C\uBA74 \uC774 \uB2E8\uACC4\uB294 \uAC74\uB108\uB6F0\uC138\uC694.
1248
+
1249
+ \`\`\`
1250
+ task(
1251
+ category="quick",
1252
+ load_skills=[],
1253
+ description="Write Zettelkasten knowledge note",
1254
+ prompt="""
1255
+ TASK: \uC544\uB798 \uB0B4\uC6A9\uC744 \uBC14\uD0D5\uC73C\uB85C Zettelkasten \uC9C0\uC2DD \uB178\uD2B8\uB97C \uC791\uC131\uD558\uC138\uC694.
1256
+ EXPECTED OUTCOME: \uD15C\uD50C\uB9BF\uC5D0 \uB9DE\uB294 \uB178\uD2B8 \uD30C\uC77C \uC0DD\uC131, \uAD00\uB828 \uB178\uD2B8 \uB9C1\uD06C \uC5F0\uACB0
1257
+ REQUIRED TOOLS: Read (\uD15C\uD50C\uB9BF \uC77D\uAE30), Write (\uB178\uD2B8 \uC791\uC131), Edit (\uAE30\uC874 \uB178\uD2B8 \uB9C1\uD06C \uCD94\uAC00)
1258
+ MUST DO:
1259
+ - \uD574\uB2F9 \uD15C\uD50C\uB9BF \uD30C\uC77C\uC744 \uC77D\uACE0 \uADF8 \uAD6C\uC870\uC5D0 \uB9DE\uCDB0 \uB178\uD2B8 \uC791\uC131
1260
+ - \uB178\uD2B8 \uCCAB \uC904: \uBA85\uD655\uD55C \uC81C\uBAA9 (# Title)
1261
+ - \uD575\uC2EC \uB0B4\uC6A9\uC744 \uC790\uAE30 \uC5B8\uC5B4\uB85C \uAC04\uACB0\uD558\uAC8C \uC11C\uC220 (\uBCF5\uC0AC-\uBD99\uC5EC\uB123\uAE30 \uAE08\uC9C0)
1262
+ - \uAD00\uB828 \uB178\uD2B8\uB97C [[relative/path/file.md]] \uD615\uD0DC\uC758 wikilink\uB85C \uC5F0\uACB0
1263
+ - 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
1264
+ - \uAE30\uC874 \uB178\uD2B8\uC758 \uB0B4\uC6A9\uC774 \uBCC0\uACBD\uC0AC\uD56D\uACFC \uBD88\uC77C\uCE58\uD558\uBA74 \uC5C5\uB370\uC774\uD2B8
1265
+ - \uB3C4\uBA54\uC778 \uD3F4\uB354\uC5D0 \uC800\uC7A5\uD588\uB2E4\uBA74 \uD574\uB2F9 INDEX.md\uC5D0 \uD56D\uBAA9 \uCD94\uAC00
1266
+ MUST NOT DO:
1267
+ - \uC18C\uC2A4 \uCF54\uB4DC\uB97C \uC218\uC815\uD558\uC9C0 \uB9C8\uC138\uC694 (\uB178\uD2B8\uB9CC \uC791\uC131)
1268
+ - \uB178\uD2B8\uC5D0 \uC5EC\uB7EC \uC8FC\uC81C\uB97C \uC11E\uC9C0 \uB9C8\uC138\uC694 (\uC6D0\uC790\uC131 \uC6D0\uCE59)
1269
+ 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]
1270
+ """
1271
+ )
1272
+ \`\`\`
1179
1273
  `;
1180
1274
  var DEFAULT_ADR_TEMPLATE = `# ADR-NNN: [\uC81C\uBAA9]
1181
1275
 
@@ -1416,31 +1510,6 @@ function scaffoldIfNeeded(projectDir) {
1416
1510
  return false;
1417
1511
  }
1418
1512
  }
1419
- function updateScaffold(projectDir) {
1420
- const contextDir = join3(projectDir, ".opencode", "context");
1421
- mkdirSync(join3(contextDir, "prompts"), { recursive: true });
1422
- mkdirSync(join3(contextDir, "templates"), { recursive: true });
1423
- const templateEntries = Object.fromEntries(Object.entries(TEMPLATE_FILES).map(([filename, content]) => [`templates/${filename}`, content]));
1424
- const templates = {
1425
- "config.jsonc": DEFAULT_CONFIG,
1426
- [`prompts/${DEFAULTS.turnStartFile}`]: DEFAULT_TURN_START,
1427
- [`prompts/${DEFAULTS.turnEndFile}`]: DEFAULT_TURN_END,
1428
- ...templateEntries
1429
- };
1430
- const updated = [];
1431
- for (const [path, content] of Object.entries(templates)) {
1432
- const filePath = join3(contextDir, path);
1433
- try {
1434
- const existing = readFileSync4(filePath, "utf-8");
1435
- if (existing === content)
1436
- continue;
1437
- } catch {}
1438
- writeFileSync(filePath, content, "utf-8");
1439
- updated.push(path);
1440
- }
1441
- writeVersion(contextDir, PLUGIN_VERSION);
1442
- return updated;
1443
- }
1444
1513
  function getStoredVersion(projectDir) {
1445
1514
  try {
1446
1515
  return readFileSync4(join3(projectDir, ".opencode", "context", ".version"), "utf-8").trim();
@@ -1499,29 +1568,6 @@ var plugin = async ({ directory, client }) => {
1499
1568
  }
1500
1569
  const config = loadConfig(directory);
1501
1570
  return {
1502
- config: async (cfg) => {
1503
- cfg.command ??= {};
1504
- cfg.command["context-update"] = {
1505
- template: "",
1506
- description: "Update context scaffold files to latest plugin version"
1507
- };
1508
- },
1509
- "command.execute.before": async (input, output) => {
1510
- if (input.command !== "context-update")
1511
- return;
1512
- const updated = updateScaffold(directory);
1513
- const text = updated.length === 0 ? "All scaffold files are already up to date." : `Updated ${updated.length} file(s):
1514
- ${updated.map((f) => `- ${f}`).join(`
1515
- `)}`;
1516
- const now = Date.now();
1517
- output.parts.splice(0, output.parts.length, {
1518
- id: `context-update-${now}`,
1519
- sessionID: input.sessionID,
1520
- messageID: `context-update-msg-${now}`,
1521
- type: "text",
1522
- text
1523
- });
1524
- },
1525
1571
  "experimental.chat.messages.transform": async (_input, output) => {
1526
1572
  if (output.messages.length === 0)
1527
1573
  return;
package/package.json CHANGED
@@ -1,12 +1,15 @@
1
1
  {
2
2
  "name": "@ksm0709/context",
3
- "version": "0.0.8",
3
+ "version": "0.0.9",
4
4
  "author": {
5
5
  "name": "TaehoKang",
6
6
  "email": "ksm07091@gmail.com"
7
7
  },
8
8
  "type": "module",
9
9
  "main": "./dist/index.js",
10
+ "bin": {
11
+ "context": "./dist/cli/index.js"
12
+ },
10
13
  "exports": {
11
14
  ".": {
12
15
  "import": "./dist/index.js",
@@ -22,13 +25,12 @@
22
25
  "access": "public"
23
26
  },
24
27
  "scripts": {
25
- "build": "bun build ./src/index.ts --outdir dist --target bun",
28
+ "build": "bun build ./src/index.ts --outdir dist --target bun && bun build ./src/cli/index.ts --outdir dist/cli --target bun",
26
29
  "test": "vitest run",
27
30
  "lint": "eslint src --ext .ts"
28
31
  },
29
32
  "files": [
30
- "dist",
31
- "src/version.ts"
33
+ "dist"
32
34
  ],
33
35
  "peerDependencies": {
34
36
  "@opencode-ai/plugin": ">=1.0.0"
package/src/version.ts DELETED
@@ -1 +0,0 @@
1
- export const PLUGIN_VERSION = '0.0.6';