@ksm0709/context 0.0.8 → 0.0.10

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,600 @@
1
+ #!/usr/bin/env bun
2
+ // @bun
3
+
4
+ // src/cli/commands/update.ts
5
+ import { resolve } from "path";
6
+ import { existsSync as existsSync2 } from "fs";
7
+
8
+ // src/lib/scaffold.ts
9
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
10
+ import { join } from "path";
11
+
12
+ // src/constants.ts
13
+ var DEFAULTS = {
14
+ configPath: ".opencode/context/config.jsonc",
15
+ promptDir: ".opencode/context/prompts",
16
+ turnStartFile: "turn-start.md",
17
+ turnEndFile: "turn-end.md",
18
+ knowledgeSources: ["AGENTS.md"],
19
+ knowledgeDir: "docs",
20
+ templateDir: ".opencode/context/templates",
21
+ indexFilename: "INDEX.md",
22
+ maxDomainDepth: 2
23
+ };
24
+ var LIMITS = {
25
+ maxPromptFileSize: 64 * 1024,
26
+ maxIndexEntries: 100,
27
+ maxTotalInjectionSize: 128 * 1024,
28
+ maxScanDepth: 3,
29
+ maxSummaryLength: 100,
30
+ maxIndexFileSize: 32 * 1024
31
+ };
32
+ // package.json
33
+ var package_default = {
34
+ name: "@ksm0709/context",
35
+ version: "0.0.10",
36
+ author: {
37
+ name: "TaehoKang",
38
+ email: "ksm07091@gmail.com"
39
+ },
40
+ type: "module",
41
+ main: "./dist/index.js",
42
+ bin: {
43
+ context: "./dist/cli/index.js"
44
+ },
45
+ exports: {
46
+ ".": {
47
+ import: "./dist/index.js",
48
+ types: "./dist/index.d.ts",
49
+ default: "./dist/index.js"
50
+ }
51
+ },
52
+ repository: {
53
+ type: "git",
54
+ url: "git@github.com:ksm0709/context.git"
55
+ },
56
+ publishConfig: {
57
+ access: "public"
58
+ },
59
+ scripts: {
60
+ build: "bun build ./src/index.ts --outdir dist --target bun && bun build ./src/cli/index.ts --outdir dist/cli --target bun",
61
+ test: "vitest run",
62
+ lint: "eslint src --ext .ts"
63
+ },
64
+ files: [
65
+ "dist"
66
+ ],
67
+ peerDependencies: {
68
+ "@opencode-ai/plugin": ">=1.0.0"
69
+ },
70
+ dependencies: {
71
+ "jsonc-parser": "^3.0.0"
72
+ },
73
+ devDependencies: {
74
+ "@opencode-ai/plugin": "^1.2.10",
75
+ "@eslint/js": "^9.39.1",
76
+ "@types/node": "^20.11.5",
77
+ "@typescript-eslint/eslint-plugin": "8.47.0",
78
+ "@typescript-eslint/parser": "8.47.0",
79
+ "bun-types": "latest",
80
+ eslint: "^9.39.1",
81
+ "eslint-config-prettier": "10.1.8",
82
+ "eslint-plugin-prettier": "^5.1.3",
83
+ prettier: "^3.2.4",
84
+ "typescript-eslint": "^8.47.0",
85
+ vitest: "^3.2.4"
86
+ }
87
+ };
88
+
89
+ // src/lib/scaffold.ts
90
+ var PLUGIN_VERSION = package_default.version;
91
+ var DEFAULT_CONFIG = `{
92
+ // Context Plugin Configuration
93
+ // See: https://github.com/ksm0709/context
94
+ "prompts": {
95
+ "turnStart": ".opencode/context/prompts/turn-start.md",
96
+ "turnEnd": ".opencode/context/prompts/turn-end.md"
97
+ },
98
+ "knowledge": {
99
+ "dir": "docs",
100
+ "sources": ["AGENTS.md"]
101
+ }
102
+ }`;
103
+ var DEFAULT_TURN_START = `## Knowledge Context
104
+
105
+ \uC774 \uD504\uB85C\uC81D\uD2B8\uB294 **\uC81C\uD154\uCE74\uC2A4\uD150(Zettelkasten)** \uBC29\uC2DD\uC73C\uB85C \uC9C0\uC2DD\uC744 \uAD00\uB9AC\uD569\uB2C8\uB2E4.
106
+ \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.
107
+
108
+ ### \uC81C\uD154\uCE74\uC2A4\uD150 \uD575\uC2EC \uC6D0\uCE59
109
+
110
+ 1. **\uC6D0\uC790\uC131** -- \uD558\uB098\uC758 \uB178\uD2B8 = \uD558\uB098\uC758 \uC8FC\uC81C. \uC5EC\uB7EC \uC8FC\uC81C\uB97C \uC11E\uC9C0 \uB9C8\uC138\uC694.
111
+ 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.
112
+ 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.
113
+
114
+ ### \uC791\uC5C5 \uC804 \uD544\uC218
115
+
116
+ - \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
117
+ - \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
118
+ - \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
119
+ - \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
120
+
121
+ ### \uAC1C\uBC1C \uC6D0\uCE59
122
+
123
+ - **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
124
+ - **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
125
+ - **\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
126
+
127
+ ### \uC6B0\uC120\uC21C\uC704
128
+
129
+ - AGENTS.md\uC758 \uC9C0\uC2DC\uC0AC\uD56D\uC774 \uD56D\uC0C1 \uCD5C\uC6B0\uC120
130
+ - \uC9C0\uC2DD \uB178\uD2B8\uC758 \uACB0\uC815\uC0AC\uD56D > \uC77C\uBC18\uC801 \uAD00\uD589
131
+ - \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
132
+ `;
133
+ var DEFAULT_TURN_END = `## \uC791\uC5C5 \uB9C8\uBB34\uB9AC
134
+
135
+ \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.
136
+ \uBA54\uC778 \uC5D0\uC774\uC804\uD2B8\uAC00 \uC9C1\uC811 \uC218\uD589\uD558\uC9C0 \uB9C8\uC138\uC694.
137
+
138
+ ### 1. \uD004\uB9AC\uD2F0 \uCCB4\uD06C (\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8 \uC704\uC784)
139
+
140
+ \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.
141
+
142
+ \`\`\`
143
+ task(
144
+ category="quick",
145
+ load_skills=[],
146
+ description="Quality check for changed files",
147
+ prompt="""
148
+ TASK: \uBCC0\uACBD\uB41C \uD30C\uC77C\uB4E4\uC5D0 \uB300\uD574 \uD004\uB9AC\uD2F0 \uCCB4\uD06C\uB97C \uC218\uD589\uD558\uC138\uC694.
149
+ EXPECTED OUTCOME: \uBAA8\uB4E0 \uCCB4\uD06C \uD1B5\uACFC \uB610\uB294 \uC2E4\uD328 \uD56D\uBAA9 \uBAA9\uB85D
150
+ REQUIRED TOOLS: Bash (lint, format, test \uC2E4\uD589)
151
+ MUST DO:
152
+ - \uBCC0\uACBD\uD55C \uCF54\uB4DC\uC5D0 \uB300\uD574 lint \uC2E4\uD589
153
+ - \uBCC0\uACBD\uD55C \uCF54\uB4DC\uC5D0 \uB300\uD574 formatter \uC2E4\uD589 (lint\uC640 \uBCC4\uAC1C)
154
+ - \uAE30\uC874 \uD14C\uC2A4\uD2B8 \uD1B5\uACFC \uD655\uC778
155
+ - \uC0C8\uB85C \uC791\uC131/\uBCC0\uACBD\uD55C \uCF54\uB4DC\uC758 \uD14C\uC2A4\uD2B8 \uCEE4\uBC84\uB9AC\uC9C0 80% \uC774\uC0C1 \uD655\uC778
156
+ - \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
157
+ - \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
158
+ MUST NOT DO:
159
+ - \uCF54\uB4DC\uB97C \uC9C1\uC811 \uC218\uC815\uD558\uC9C0 \uB9C8\uC138\uC694 (\uBCF4\uACE0\uB9CC)
160
+ - \uD14C\uC2A4\uD2B8\uB97C \uC0AD\uC81C\uD558\uAC70\uB098 \uC2A4\uD0B5\uD558\uC9C0 \uB9C8\uC138\uC694
161
+ CONTEXT: [\uBCC0\uACBD\uD55C \uD30C\uC77C \uBAA9\uB85D\uACFC \uBCC0\uACBD \uB0B4\uC6A9 \uC694\uC57D\uC744 \uC5EC\uAE30\uC5D0 \uD3EC\uD568]
162
+ """
163
+ )
164
+ \`\`\`
165
+
166
+ \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.
167
+
168
+ ### 2. \uC9C0\uC2DD \uC815\uB9AC (\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8 \uC704\uC784)
169
+
170
+ \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.
171
+
172
+ **\uAE30\uB85D \uB300\uC0C1 \uD310\uB2E8 \uAE30\uC900:**
173
+
174
+ | \uC0C1\uD669 | \uD15C\uD50C\uB9BF | \uD30C\uC77C\uBA85 \uD328\uD134 |
175
+ | ------------------------------- | --------------------------------------------------- | --------------------------- |
176
+ | \uC544\uD0A4\uD14D\uCC98/\uAE30\uC220 \uC2A4\uD0DD \uC911\uB300 \uACB0\uC815 | [ADR](.opencode/context/templates/adr.md) | \`adr-NNN-\uC81C\uBAA9.md\` |
177
+ | \uBC18\uBCF5 \uC0AC\uC6A9\uD560 \uCF54\uB4DC \uD328\uD134 \uBC1C\uACAC | [Pattern](.opencode/context/templates/pattern.md) | \`pattern-\uC81C\uBAA9.md\` |
178
+ | \uBE44\uC790\uBA85\uD55C \uBC84\uADF8 \uD574\uACB0 | [Bug](.opencode/context/templates/bug.md) | \`bug-\uC81C\uBAA9.md\` |
179
+ | \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\` |
180
+ | \uC791\uC740 \uAE30\uC220\uC801 \uC120\uD0DD | [Decision](.opencode/context/templates/decision.md) | \`decision-\uC81C\uBAA9.md\` |
181
+ | \uBAA8\uB4C8/\uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694 \uD544\uC694 | [Context](.opencode/context/templates/context.md) | \`context-\uC81C\uBAA9.md\` |
182
+ | \uBC18\uBCF5 \uAC00\uB2A5\uD55C \uD504\uB85C\uC138\uC2A4 \uC815\uB9BD | [Runbook](.opencode/context/templates/runbook.md) | \`runbook-\uC81C\uBAA9.md\` |
183
+ | \uC2E4\uD5D8/\uB514\uBC84\uAE45 \uC911 \uD559\uC2B5 | [Insight](.opencode/context/templates/insight.md) | \`insight-\uC81C\uBAA9.md\` |
184
+
185
+ \uD574\uB2F9 \uC0AC\uD56D\uC774 \uC5C6\uC73C\uBA74 \uC774 \uB2E8\uACC4\uB294 \uAC74\uB108\uB6F0\uC138\uC694.
186
+
187
+ \`\`\`
188
+ task(
189
+ category="quick",
190
+ load_skills=[],
191
+ description="Write Zettelkasten knowledge note",
192
+ prompt="""
193
+ TASK: \uC544\uB798 \uB0B4\uC6A9\uC744 \uBC14\uD0D5\uC73C\uB85C Zettelkasten \uC9C0\uC2DD \uB178\uD2B8\uB97C \uC791\uC131\uD558\uC138\uC694.
194
+ EXPECTED OUTCOME: \uD15C\uD50C\uB9BF\uC5D0 \uB9DE\uB294 \uB178\uD2B8 \uD30C\uC77C \uC0DD\uC131, \uAD00\uB828 \uB178\uD2B8 \uB9C1\uD06C \uC5F0\uACB0
195
+ REQUIRED TOOLS: Read (\uD15C\uD50C\uB9BF \uC77D\uAE30), Write (\uB178\uD2B8 \uC791\uC131), Edit (\uAE30\uC874 \uB178\uD2B8 \uB9C1\uD06C \uCD94\uAC00)
196
+ MUST DO:
197
+ - \uD574\uB2F9 \uD15C\uD50C\uB9BF \uD30C\uC77C\uC744 \uC77D\uACE0 \uADF8 \uAD6C\uC870\uC5D0 \uB9DE\uCDB0 \uB178\uD2B8 \uC791\uC131
198
+ - \uB178\uD2B8 \uCCAB \uC904: \uBA85\uD655\uD55C \uC81C\uBAA9 (# Title)
199
+ - \uD575\uC2EC \uB0B4\uC6A9\uC744 \uC790\uAE30 \uC5B8\uC5B4\uB85C \uAC04\uACB0\uD558\uAC8C \uC11C\uC220 (\uBCF5\uC0AC-\uBD99\uC5EC\uB123\uAE30 \uAE08\uC9C0)
200
+ - \uAD00\uB828 \uB178\uD2B8\uB97C [[relative/path/file.md]] \uD615\uD0DC\uC758 wikilink\uB85C \uC5F0\uACB0
201
+ - 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
202
+ - \uAE30\uC874 \uB178\uD2B8\uC758 \uB0B4\uC6A9\uC774 \uBCC0\uACBD\uC0AC\uD56D\uACFC \uBD88\uC77C\uCE58\uD558\uBA74 \uC5C5\uB370\uC774\uD2B8
203
+ - \uB3C4\uBA54\uC778 \uD3F4\uB354\uC5D0 \uC800\uC7A5\uD588\uB2E4\uBA74 \uD574\uB2F9 INDEX.md\uC5D0 \uD56D\uBAA9 \uCD94\uAC00
204
+ MUST NOT DO:
205
+ - \uC18C\uC2A4 \uCF54\uB4DC\uB97C \uC218\uC815\uD558\uC9C0 \uB9C8\uC138\uC694 (\uB178\uD2B8\uB9CC \uC791\uC131)
206
+ - \uB178\uD2B8\uC5D0 \uC5EC\uB7EC \uC8FC\uC81C\uB97C \uC11E\uC9C0 \uB9C8\uC138\uC694 (\uC6D0\uC790\uC131 \uC6D0\uCE59)
207
+ 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]
208
+ """
209
+ )
210
+ \`\`\`
211
+ `;
212
+ var DEFAULT_ADR_TEMPLATE = `# ADR-NNN: [\uC81C\uBAA9]
213
+
214
+ ## \uC0C1\uD0DC
215
+
216
+ Accepted | Deprecated | Superseded by [[ADR-YYY]]
217
+
218
+ ## \uB9E5\uB77D
219
+
220
+ \uC774 \uACB0\uC815\uC744 \uB0B4\uB9AC\uAC8C \uB41C \uBC30\uACBD/\uBB38\uC81C \uC0C1\uD669
221
+
222
+ ## \uACB0\uC815
223
+
224
+ \uBB34\uC5C7\uC744 \uC5B4\uB5BB\uAC8C \uD558\uAE30\uB85C \uD588\uB294\uC9C0
225
+
226
+ ## \uACB0\uACFC
227
+
228
+ ### \uAE0D\uC815\uC801
229
+
230
+ - ...
231
+
232
+ ### \uBD80\uC815\uC801 (\uD2B8\uB808\uC774\uB4DC\uC624\uD504)
233
+
234
+ - ...
235
+
236
+ ## \uAD00\uB828 \uB178\uD2B8
237
+
238
+ - [[\uAD00\uB828-\uACB0\uC815.md]] / [[\uAD00\uB828-\uD328\uD134.md]]
239
+ `;
240
+ var DEFAULT_PATTERN_TEMPLATE = `# Pattern: [\uD328\uD134 \uC774\uB984]
241
+
242
+ ## \uBB38\uC81C
243
+
244
+ \uC774 \uD328\uD134\uC774 \uD574\uACB0\uD558\uB294 \uBB38\uC81C
245
+
246
+ ## \uD574\uBC95
247
+
248
+ // \uD328\uD134\uC758 \uB300\uD45C\uC801 \uC608\uC2DC \uCF54\uB4DC
249
+
250
+ ## \uC0AC\uC6A9 \uC2DC\uC810
251
+
252
+ - \uC774\uB7F4 \uB54C \uC0AC\uC6A9
253
+
254
+ ## \uC0AC\uC6A9\uD558\uC9C0 \uB9D0 \uAC83
255
+
256
+ - \uC774\uB7F4 \uB54C\uB294 \uC0AC\uC6A9 \uAE08\uC9C0 (\uC548\uD2F0\uD328\uD134 \uACBD\uACE0)
257
+
258
+ ## \uCF54\uB4DC\uBCA0\uC774\uC2A4 \uB0B4 \uC608\uC2DC
259
+
260
+ - [[\uACBD\uB85C/\uD30C\uC77C.ts]] -- \uC2E4\uC81C \uC801\uC6A9 \uC0AC\uB840
261
+
262
+ ## \uAD00\uB828 \uD328\uD134
263
+
264
+ - [[\uB300\uC548-\uD328\uD134.md]] / [[\uBCF4\uC644-\uD328\uD134.md]]
265
+ `;
266
+ var DEFAULT_BUG_TEMPLATE = `# Bug: [\uAC04\uB2E8\uD55C \uC124\uBA85]
267
+
268
+ ## \uC99D\uC0C1
269
+
270
+ - \uC5D0\uB7EC \uBA54\uC2DC\uC9C0: \`...\`
271
+ - \uAD00\uCC30\uB41C \uB3D9\uC791: ...
272
+
273
+ ## \uC6D0\uC778
274
+
275
+ \uC2E4\uC81C \uC6D0\uC778 \uBD84\uC11D
276
+
277
+ ## \uD574\uACB0
278
+
279
+ // \uC218\uC815 \uCF54\uB4DC
280
+
281
+ ## \uC608\uBC29
282
+
283
+ \uD5A5\uD6C4 \uAC19\uC740 \uBB38\uC81C\uB97C \uBC29\uC9C0\uD558\uB294 \uBC29\uBC95
284
+
285
+ ## \uAD00\uB828 \uB178\uD2B8
286
+
287
+ - [[\uC720\uC0AC-\uBC84\uADF8.md]] / [[\uC608\uBC29-\uD328\uD134.md]]
288
+ `;
289
+ var DEFAULT_GOTCHA_TEMPLATE = `# Gotcha: [\uB77C\uC774\uBE0C\uB7EC\uB9AC] -- [\uD568\uC815 \uC124\uBA85]
290
+
291
+ ## \uC608\uC0C1 vs \uC2E4\uC81C
292
+
293
+ \uC608\uC0C1\uD55C \uB3D9\uC791\uACFC \uC2E4\uC81C \uB3D9\uC791\uC758 \uCC28\uC774
294
+
295
+ ## \uC6B0\uD68C\uBC95
296
+
297
+ // \uC791\uB3D9\uD558\uB294 \uD574\uACB0 \uCF54\uB4DC
298
+
299
+ ## \uC6D0\uC778 (\uC54C\uB824\uC9C4 \uACBD\uC6B0)
300
+
301
+ \uC65C \uC774\uB807\uAC8C \uB3D9\uC791\uD558\uB294\uC9C0
302
+
303
+ ## \uAD00\uB828
304
+
305
+ - \uC774\uC288: [GitHub issue / \uBB38\uC11C \uB9C1\uD06C]
306
+ - [[\uAD00\uB828-gotcha.md]]
307
+ `;
308
+ var DEFAULT_DECISION_TEMPLATE = `# Decision: [\uC81C\uBAA9]
309
+
310
+ ## \uACB0\uC815
311
+
312
+ \uBB34\uC5C7\uC744 \uC120\uD0DD\uD588\uB294\uC9C0
313
+
314
+ ## \uADFC\uAC70
315
+
316
+ \uC65C \uC774\uAC83\uC744 \uC120\uD0DD\uD588\uB294\uC9C0
317
+
318
+ ## \uACE0\uB824\uD55C \uB300\uC548
319
+
320
+ - \uB300\uC548 1: \uD0C8\uB77D \uC774\uC720
321
+ - \uB300\uC548 2: \uD0C8\uB77D \uC774\uC720
322
+
323
+ ## \uAD00\uB828 \uB178\uD2B8
324
+
325
+ - [[\uAD00\uB828-ADR.md]] / [[\uAD00\uB828-\uD328\uD134.md]]
326
+ `;
327
+ var DEFAULT_CONTEXT_TEMPLATE = `# Context: [\uD504\uB85C\uC81D\uD2B8/\uBAA8\uB4C8\uBA85]
328
+
329
+ ## \uAC1C\uC694
330
+
331
+ \uBB34\uC5C7\uC774\uACE0 \uBB34\uC5C7\uC744 \uD558\uB294\uC9C0
332
+
333
+ ## \uAE30\uC220 \uC2A4\uD0DD
334
+
335
+ - \uC5B8\uC5B4 / \uD504\uB808\uC784\uC6CC\uD06C / \uC8FC\uC694 \uB77C\uC774\uBE0C\uB7EC\uB9AC
336
+
337
+ ## \uC544\uD0A4\uD14D\uCC98
338
+
339
+ \uACE0\uC218\uC900 \uAD6C\uC870\uC640 \uD328\uD134
340
+
341
+ ## \uCEE8\uBCA4\uC158
342
+
343
+ - \uD30C\uC77C \uAD6C\uC870 / \uB124\uC774\uBC0D / \uD14C\uC2A4\uD2B8 \uBC29\uC2DD
344
+
345
+ ## \uC9C4\uC785\uC810
346
+
347
+ - [[src/index.ts]] / [[config.json]]
348
+
349
+ ## \uAD00\uB828 \uB178\uD2B8
350
+
351
+ - [[\uAD00\uB828-context.md]] / [[\uC8FC\uC694-ADR.md]]
352
+ `;
353
+ var DEFAULT_RUNBOOK_TEMPLATE = `# Runbook: [\uC808\uCC28 \uC774\uB984]
354
+
355
+ ## \uBAA9\uC801
356
+
357
+ \uC774 \uC808\uCC28\uAC00 \uB2EC\uC131\uD558\uB294 \uAC83
358
+
359
+ ## \uC0AC\uC804 \uC870\uAC74
360
+
361
+ - \uD544\uC694\uD55C \uAC83 1
362
+
363
+ ## \uB2E8\uACC4
364
+
365
+ 1. \uCCAB \uBC88\uC9F8 \uB2E8\uACC4
366
+ 2. \uB450 \uBC88\uC9F8 \uB2E8\uACC4
367
+
368
+ ## \uD655\uC778 \uBC29\uBC95
369
+
370
+ \uC131\uACF5\uD588\uB294\uC9C0 \uD655\uC778\uD558\uB294 \uBC29\uBC95
371
+
372
+ ## \uBB38\uC81C \uD574\uACB0
373
+
374
+ | \uC99D\uC0C1 | \uD574\uACB0 |
375
+ | ------ | --------------- |
376
+ | \uC774\uC288 1 | [[\uAD00\uB828-bug.md]] |
377
+
378
+ ## \uAD00\uB828 \uB178\uD2B8
379
+
380
+ - [[\uAD00\uB828-runbook.md]] / [[\uAD00\uB828-context.md]]
381
+ `;
382
+ var DEFAULT_INSIGHT_TEMPLATE = `# Insight: [\uBC1C\uACAC \uC81C\uBAA9]
383
+
384
+ ## \uBC1C\uACAC
385
+
386
+ \uBB34\uC5C7\uC744 \uC54C\uAC8C \uB418\uC5C8\uB294\uC9C0
387
+
388
+ ## \uB9E5\uB77D
389
+
390
+ \uC5B4\uB5BB\uAC8C \uBC1C\uACAC\uD588\uB294\uC9C0 (\uC5B4\uB5A4 \uC791\uC5C5 \uC911, \uC5B4\uB5A4 \uC2E4\uD5D8)
391
+
392
+ ## \uC2DC\uC0AC\uC810
393
+
394
+ \uC774\uAC83\uC774 \uD5A5\uD6C4 \uC791\uC5C5\uC5D0 \uBBF8\uCE58\uB294 \uC601\uD5A5
395
+
396
+ ## \uC801\uC6A9
397
+
398
+ \uC774 \uBC1C\uACAC\uC744 \uBC14\uD0D5\uC73C\uB85C \uC5B4\uB5BB\uAC8C \uD589\uB3D9\uC744 \uBC14\uAFD4\uC57C \uD558\uB294\uC9C0
399
+
400
+ ## \uAD00\uB828 \uB178\uD2B8
401
+
402
+ - [[\uAD00\uB828-insight.md]] / [[\uC601\uD5A5\uBC1B\uB294-\uD328\uD134.md]] / [[\uAD00\uB828-ADR.md]]
403
+ `;
404
+ var DEFAULT_INDEX_TEMPLATE = `# [Domain] Domain
405
+
406
+ Overview: [1-2 sentence description of this domain]
407
+
408
+ ## Notes
409
+
410
+ | File | Summary | Read When... |
411
+ |------|---------|--------------|
412
+ | [[example.md]] | Example summary | Working on X |
413
+
414
+ ## Related Domains
415
+
416
+ - [[../other-domain/INDEX.md]] -- Description
417
+ `;
418
+ var TEMPLATE_FILES = {
419
+ "adr.md": DEFAULT_ADR_TEMPLATE,
420
+ "pattern.md": DEFAULT_PATTERN_TEMPLATE,
421
+ "bug.md": DEFAULT_BUG_TEMPLATE,
422
+ "gotcha.md": DEFAULT_GOTCHA_TEMPLATE,
423
+ "decision.md": DEFAULT_DECISION_TEMPLATE,
424
+ "context.md": DEFAULT_CONTEXT_TEMPLATE,
425
+ "runbook.md": DEFAULT_RUNBOOK_TEMPLATE,
426
+ "insight.md": DEFAULT_INSIGHT_TEMPLATE,
427
+ "index.md": DEFAULT_INDEX_TEMPLATE
428
+ };
429
+ function updateScaffold(projectDir) {
430
+ const contextDir = join(projectDir, ".opencode", "context");
431
+ mkdirSync(join(contextDir, "prompts"), { recursive: true });
432
+ mkdirSync(join(contextDir, "templates"), { recursive: true });
433
+ const templateEntries = Object.fromEntries(Object.entries(TEMPLATE_FILES).map(([filename, content]) => [`templates/${filename}`, content]));
434
+ const templates = {
435
+ "config.jsonc": DEFAULT_CONFIG,
436
+ [`prompts/${DEFAULTS.turnStartFile}`]: DEFAULT_TURN_START,
437
+ [`prompts/${DEFAULTS.turnEndFile}`]: DEFAULT_TURN_END,
438
+ ...templateEntries
439
+ };
440
+ const updated = [];
441
+ for (const [path, content] of Object.entries(templates)) {
442
+ const filePath = join(contextDir, path);
443
+ try {
444
+ const existing = readFileSync(filePath, "utf-8");
445
+ if (existing === content)
446
+ continue;
447
+ } catch {}
448
+ writeFileSync(filePath, content, "utf-8");
449
+ updated.push(path);
450
+ }
451
+ writeVersion(contextDir, PLUGIN_VERSION);
452
+ return updated;
453
+ }
454
+ function writeVersion(contextDir, version) {
455
+ writeFileSync(join(contextDir, ".version"), version, "utf-8");
456
+ }
457
+ function updatePrompts(projectDir) {
458
+ const contextDir = join(projectDir, ".opencode", "context");
459
+ mkdirSync(join(contextDir, "prompts"), { recursive: true });
460
+ const prompts = {
461
+ [`prompts/${DEFAULTS.turnStartFile}`]: DEFAULT_TURN_START,
462
+ [`prompts/${DEFAULTS.turnEndFile}`]: DEFAULT_TURN_END
463
+ };
464
+ const updated = [];
465
+ for (const [path, content] of Object.entries(prompts)) {
466
+ const filePath = join(contextDir, path);
467
+ try {
468
+ const existing = readFileSync(filePath, "utf-8");
469
+ if (existing === content)
470
+ continue;
471
+ } catch {}
472
+ writeFileSync(filePath, content, "utf-8");
473
+ updated.push(path);
474
+ }
475
+ return updated;
476
+ }
477
+
478
+ // src/cli/commands/update.ts
479
+ var KNOWN_SUBCOMMANDS = ["all", "prompt", "plugin"];
480
+ function runUpdate(args) {
481
+ const [subcommand, ...rest] = args;
482
+ switch (subcommand) {
483
+ case undefined:
484
+ case "all":
485
+ runUpdateAll(resolve(rest[0] ?? process.cwd()));
486
+ break;
487
+ case "prompt":
488
+ runUpdatePrompt(resolve(rest[0] ?? process.cwd()));
489
+ break;
490
+ case "plugin":
491
+ runUpdatePlugin(rest[0] ?? "latest");
492
+ break;
493
+ default:
494
+ if (!KNOWN_SUBCOMMANDS.includes(subcommand)) {
495
+ runUpdateAll(resolve(subcommand));
496
+ } else {
497
+ process.stderr.write(`Unknown update subcommand: ${subcommand}
498
+ `);
499
+ process.exit(1);
500
+ }
501
+ break;
502
+ }
503
+ }
504
+ function runUpdateAll(projectDir) {
505
+ const updated = updateScaffold(projectDir);
506
+ if (updated.length === 0) {
507
+ process.stdout.write(`All scaffold files are already up to date.
508
+ `);
509
+ } else {
510
+ process.stdout.write(`Updated ${updated.length} file(s):
511
+ `);
512
+ for (const f of updated) {
513
+ process.stdout.write(` - ${f}
514
+ `);
515
+ }
516
+ }
517
+ }
518
+ function runUpdatePrompt(projectDir) {
519
+ const updated = updatePrompts(projectDir);
520
+ if (updated.length === 0) {
521
+ process.stdout.write(`All prompt files are already up to date.
522
+ `);
523
+ } else {
524
+ process.stdout.write(`Updated ${updated.length} prompt file(s):
525
+ `);
526
+ for (const f of updated) {
527
+ process.stdout.write(` - ${f}
528
+ `);
529
+ }
530
+ }
531
+ }
532
+ function detectPackageManager() {
533
+ if (existsSync2("bun.lock") || existsSync2("bun.lockb"))
534
+ return "bun";
535
+ if (existsSync2("pnpm-lock.yaml"))
536
+ return "pnpm";
537
+ if (existsSync2("yarn.lock"))
538
+ return "yarn";
539
+ if (existsSync2("package-lock.json"))
540
+ return "npm";
541
+ return "bun";
542
+ }
543
+ function runUpdatePlugin(version) {
544
+ const pm = detectPackageManager();
545
+ const pkg = `@ksm0709/context@${version}`;
546
+ process.stdout.write(`Updating ${pkg} using ${pm}...
547
+ `);
548
+ const result = Bun.spawnSync([pm, "add", pkg]);
549
+ if (result.exitCode !== 0) {
550
+ process.stderr.write(`Failed to update: ${result.stderr.toString()}
551
+ `);
552
+ process.exit(1);
553
+ }
554
+ process.stdout.write(`Successfully updated to ${pkg}.
555
+ `);
556
+ }
557
+
558
+ // src/cli/index.ts
559
+ function printHelp(out) {
560
+ const write = out ?? ((s) => process.stdout.write(s));
561
+ write(`Usage: context <command>
562
+
563
+ `);
564
+ write(`Commands:
565
+ `);
566
+ write(` update [all] [path] Force-update all scaffold files
567
+ `);
568
+ write(` update prompt [path] Force-update prompt files only
569
+ `);
570
+ write(` update plugin [version] Update @ksm0709/context package
571
+ `);
572
+ write(`
573
+ `);
574
+ }
575
+ function runCli(argv) {
576
+ const [command, ...rest] = argv;
577
+ switch (command) {
578
+ case "update":
579
+ runUpdate(rest);
580
+ break;
581
+ case undefined:
582
+ case "--help":
583
+ case "-h":
584
+ printHelp();
585
+ break;
586
+ default:
587
+ process.stderr.write(`Unknown command: ${command}
588
+
589
+ `);
590
+ printHelp((s) => process.stderr.write(s));
591
+ process.exit(1);
592
+ }
593
+ }
594
+ if (import.meta.path === Bun.main) {
595
+ runCli(process.argv.slice(2));
596
+ }
597
+ export {
598
+ runCli,
599
+ printHelp
600
+ };
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.10",
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.10",
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';