@ksm0709/context 0.0.7 → 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
+ };