@ksm0709/context 0.0.19 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +105 -43
- package/dist/index.js +150 -47
- package/dist/omx/index.mjs +400 -50
- package/package.json +4 -3
package/dist/cli/index.js
CHANGED
|
@@ -20,7 +20,9 @@ var DEFAULTS = {
|
|
|
20
20
|
templateDir: ".context/templates",
|
|
21
21
|
indexFilename: "INDEX.md",
|
|
22
22
|
maxDomainDepth: 2,
|
|
23
|
-
knowledgeDir: "docs"
|
|
23
|
+
knowledgeDir: "docs",
|
|
24
|
+
guidesDir: ".context/guides",
|
|
25
|
+
workCompleteFile: ".context/.work-complete"
|
|
24
26
|
};
|
|
25
27
|
var LIMITS = {
|
|
26
28
|
maxPromptFileSize: 64 * 1024,
|
|
@@ -48,7 +50,7 @@ function resolveContextDir(projectDir) {
|
|
|
48
50
|
// package.json
|
|
49
51
|
var package_default = {
|
|
50
52
|
name: "@ksm0709/context",
|
|
51
|
-
version: "0.0.
|
|
53
|
+
version: "0.0.21",
|
|
52
54
|
author: {
|
|
53
55
|
name: "TaehoKang",
|
|
54
56
|
email: "ksm07091@gmail.com"
|
|
@@ -56,7 +58,7 @@ var package_default = {
|
|
|
56
58
|
type: "module",
|
|
57
59
|
main: "./dist/index.js",
|
|
58
60
|
bin: {
|
|
59
|
-
context: "
|
|
61
|
+
context: "dist/cli/index.js"
|
|
60
62
|
},
|
|
61
63
|
exports: {
|
|
62
64
|
".": {
|
|
@@ -72,7 +74,7 @@ var package_default = {
|
|
|
72
74
|
},
|
|
73
75
|
repository: {
|
|
74
76
|
type: "git",
|
|
75
|
-
url: "git@github.com
|
|
77
|
+
url: "git+ssh://git@github.com/ksm0709/context.git"
|
|
76
78
|
},
|
|
77
79
|
publishConfig: {
|
|
78
80
|
access: "public"
|
|
@@ -90,6 +92,7 @@ var package_default = {
|
|
|
90
92
|
"@opencode-ai/plugin": ">=1.0.0"
|
|
91
93
|
},
|
|
92
94
|
dependencies: {
|
|
95
|
+
"@ksm0709/context": "^0.0.20",
|
|
93
96
|
"jsonc-parser": "^3.0.0"
|
|
94
97
|
},
|
|
95
98
|
devDependencies: {
|
|
@@ -121,6 +124,12 @@ var DEFAULT_CONFIG = `{
|
|
|
121
124
|
"knowledge": {
|
|
122
125
|
"dir": "docs",
|
|
123
126
|
"sources": ["AGENTS.md"]
|
|
127
|
+
},
|
|
128
|
+
"omx": {
|
|
129
|
+
// Inject turn-end after native turn-complete via tmux send-keys
|
|
130
|
+
"turnEnd": {
|
|
131
|
+
"strategy": "turn-complete-sendkeys"
|
|
132
|
+
}
|
|
124
133
|
}
|
|
125
134
|
}`;
|
|
126
135
|
var DEFAULT_TURN_START = `## Knowledge Context
|
|
@@ -136,6 +145,8 @@ var DEFAULT_TURN_START = `## Knowledge Context
|
|
|
136
145
|
|
|
137
146
|
### \uC791\uC5C5 \uC804 \uD544\uC218
|
|
138
147
|
|
|
148
|
+
- **\uB370\uC77C\uB9AC \uB178\uD2B8 \uD655\uC778**: \uAC00\uC7A5 \uCD5C\uADFC\uC758 \uB370\uC77C\uB9AC \uB178\uD2B8(\`{{knowledgeDir}}/daily/YYYY-MM-DD.md\`)\uB97C \uC77D\uACE0 \uC774\uC804 \uC138\uC158\uC758 \uCEE8\uD14D\uC2A4\uD2B8\uC640 \uBBF8\uD574\uACB0 \uC774\uC288\uB97C \uD30C\uC545\uD558\uC138\uC694
|
|
149
|
+
- **\uC791\uC5C5 \uC758\uB3C4 \uC120\uC5B8**: \uC791\uC5C5 \uC2DC\uC791 \uC804, \uD604\uC7AC \uC138\uC158\uC758 \uBAA9\uD45C\uC640 \uC791\uC5C5 \uC758\uB3C4\uB97C \uBA85\uD655\uD788 \uD30C\uC545\uD558\uACE0 \uC120\uC5B8\uD558\uC138\uC694 (\uCD94\uD6C4 \uC791\uC5C5 \uACBD\uB85C \uAC80\uC99D \uC2DC \uAE30\uC900\uC774 \uB429\uB2C8\uB2E4)
|
|
139
150
|
- \uBA54\uC778 \uC5D0\uC774\uC804\uD2B8\uAC00 \uC544\uB798 **Available Knowledge** \uBAA9\uB85D\uC5D0\uC11C \uD604\uC7AC \uC791\uC5C5\uACFC \uAD00\uB828\uB41C \uBB38\uC11C\uB97C **\uC9C1\uC811 \uBA3C\uC800** \uC77D\uC73C\uC138\uC694
|
|
140
151
|
- \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
|
|
141
152
|
- \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
|
|
@@ -154,43 +165,18 @@ var DEFAULT_TURN_START = `## Knowledge Context
|
|
|
154
165
|
- \uC9C0\uC2DD \uB178\uD2B8\uC758 \uACB0\uC815\uC0AC\uD56D > \uC77C\uBC18\uC801 \uAD00\uD589
|
|
155
166
|
- \uC9C0\uC2DD \uB178\uD2B8\uC5D0 \uC5C6\uB294 \uC0C8\uB85C\uC6B4 \uACB0\uC815\uC774\uB098 \uBC18\uBCF5 \uAC00\uCE58\uAC00 \uC788\uB294 \uBC1C\uACAC\uC740 \uC791\uC5C5 \uBA54\uBAA8\uB098 \uC9C0\uC2DD \uB178\uD2B8 \uD6C4\uBCF4\uB85C \uAE30\uB85D\uD558\uC138\uC694
|
|
156
167
|
`;
|
|
157
|
-
var DEFAULT_TURN_END = `## \uC791\uC5C5 \
|
|
158
|
-
|
|
159
|
-
\
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
- \
|
|
164
|
-
- \
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
-
|
|
168
|
-
|
|
169
|
-
### 2. \uC9C0\uC2DD \uC815\uB9AC
|
|
170
|
-
|
|
171
|
-
\uC791\uC5C5 \uC911 \uAE30\uB85D\uD560 \uB9CC\uD55C \uBC1C\uACAC\uC774 \uC788\uC5C8\uB2E4\uBA74 \uC9C1\uC811 \uC815\uB9AC\uD558\uC138\uC694.
|
|
172
|
-
|
|
173
|
-
**\uAE30\uB85D \uB300\uC0C1 \uD310\uB2E8 \uAE30\uC900:**
|
|
174
|
-
|
|
175
|
-
| \uC0C1\uD669 | \uD15C\uD50C\uB9BF | \uD30C\uC77C\uBA85 \uD328\uD134 |
|
|
176
|
-
| ------------------------------- | --------------------------------------------------- | --------------------------- |
|
|
177
|
-
| \uC544\uD0A4\uD14D\uCC98/\uAE30\uC220 \uC2A4\uD0DD \uC911\uB300 \uACB0\uC815 | [ADR](.context/templates/adr.md) | \`adr-NNN-\uC81C\uBAA9.md\` |
|
|
178
|
-
| \uBC18\uBCF5 \uC0AC\uC6A9\uD560 \uCF54\uB4DC \uD328\uD134 \uBC1C\uACAC | [Pattern](.context/templates/pattern.md) | \`pattern-\uC81C\uBAA9.md\` |
|
|
179
|
-
| \uBE44\uC790\uBA85\uD55C \uBC84\uADF8 \uD574\uACB0 | [Bug](.context/templates/bug.md) | \`bug-\uC81C\uBAA9.md\` |
|
|
180
|
-
| \uC678\uBD80 API/\uB77C\uC774\uBE0C\uB7EC\uB9AC \uC608\uC0C1\uC678 \uB3D9\uC791 | [Gotcha](.context/templates/gotcha.md) | \`gotcha-\uB77C\uC774\uBE0C\uB7EC\uB9AC-\uC81C\uBAA9.md\` |
|
|
181
|
-
| \uC791\uC740 \uAE30\uC220\uC801 \uC120\uD0DD | [Decision](.context/templates/decision.md) | \`decision-\uC81C\uBAA9.md\` |
|
|
182
|
-
| \uBAA8\uB4C8/\uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694 \uD544\uC694 | [Context](.context/templates/context.md) | \`context-\uC81C\uBAA9.md\` |
|
|
183
|
-
| \uBC18\uBCF5 \uAC00\uB2A5\uD55C \uD504\uB85C\uC138\uC2A4 \uC815\uB9BD | [Runbook](.context/templates/runbook.md) | \`runbook-\uC81C\uBAA9.md\` |
|
|
184
|
-
| \uC2E4\uD5D8/\uB514\uBC84\uAE45 \uC911 \uD559\uC2B5 | [Insight](.context/templates/insight.md) | \`insight-\uC81C\uBAA9.md\` |
|
|
185
|
-
|
|
186
|
-
\uD574\uB2F9 \uC0AC\uD56D\uC774 \uC5C6\uC73C\uBA74 \uC774 \uB2E8\uACC4\uB294 \uAC74\uB108\uB6F0\uC138\uC694.
|
|
187
|
-
|
|
188
|
-
- \uAD00\uB828 \uD15C\uD50C\uB9BF \uD30C\uC77C\uC744 \uC77D\uACE0 \uADF8 \uAD6C\uC870\uC5D0 \uB9DE\uCDB0 \uB0B4\uC6A9\uC744 \uC815\uB9AC\uD558\uC138\uC694
|
|
189
|
-
- \uB178\uD2B8 \uCCAB \uC904\uC740 \uBA85\uD655\uD55C \uC81C\uBAA9(\`# Title\`)\uC73C\uB85C \uC2DC\uC791\uD558\uC138\uC694
|
|
190
|
-
- \uD575\uC2EC \uB0B4\uC6A9\uC744 \uC790\uAE30 \uC5B8\uC5B4\uB85C \uAC04\uACB0\uD558\uAC8C \uC11C\uC220\uD558\uACE0, \uAD00\uB828 \uB178\uD2B8\uB294 \`[[relative/path/file.md]]\` \uD615\uD0DC\uB85C \uC5F0\uACB0\uD558\uC138\uC694
|
|
191
|
-
- knowledge \uB514\uB809\uD1A0\uB9AC(\`{{knowledgeDir}}/\`) \uB610\uB294 \uC801\uC808\uD55C \uB3C4\uBA54\uC778 \uD3F4\uB354\uC5D0 \uC800\uC7A5\uD558\uACE0, \uD544\uC694\uD55C \uACBD\uC6B0 \uAE30\uC874 INDEX.md\uB098 \uAD00\uB828 \uB178\uD2B8\uB97C \uD568\uAED8 \uAC31\uC2E0\uD558\uC138\uC694
|
|
192
|
-
|
|
193
|
-
\uAE30\uC874 \uC124\uCE58\uC758 \uC0AC\uC6A9\uC790 \uD504\uB86C\uD504\uD2B8 \uD30C\uC77C\uC740 \uC790\uB3D9\uC73C\uB85C \uBC14\uB00C\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC0C8 \uAE30\uBCF8 \uD504\uB86C\uD504\uD2B8\uAC00 \uD544\uC694\uD558\uBA74 \`context update prompt\`\uB85C \uBA85\uC2DC\uC801\uC73C\uB85C \uC0C8\uB85C\uACE0\uCE68\uD558\uC138\uC694.
|
|
168
|
+
var DEFAULT_TURN_END = `## TURN END \uC791\uC5C5 \uC9C0\uCE68
|
|
169
|
+
\uC544\uB798 \uBA54\uB274 \uC911 \uD558\uB098\uB97C \uC120\uD0DD\uD574 \uC9C4\uD589 \uC0C1\uD669\uC5D0 \uB9DE\uAC8C \uC218\uD589\uD558\uC138\uC694.
|
|
170
|
+
**\uBC18\uB4DC\uC2DC \uB9C1\uD06C\uB41C \uAC00\uC774\uB4DC\uB97C \uCC38\uACE0\uD558\uC5EC \uC815\uD655\uD788 \uC218\uD589\uD574\uC57C \uD569\uB2C8\uB2E4.**
|
|
171
|
+
|
|
172
|
+
1. **\uACC4\uC18D \uC791\uC5C5**: \uAE30\uC874 \uC791\uC5C5\uC774 \uC644\uB8CC\uB418\uC9C0 \uC54A\uC558\uACE0 \uC544\uC9C1 \uC544\uB798 \uC561\uC158\uC744 \uCDE8\uD560 \uB2E8\uACC4\uAC00 \uC544\uB2C8\uB77C\uBA74 \uC791\uC5C5 \uC18D\uAC1C.
|
|
173
|
+
2. **\uB370\uC77C\uB9AC \uB178\uD2B8 \uAE30\uB85D**: [.context/guides/daily-note-guide.md] \uB370\uC77C\uB9AC \uB178\uD2B8\uC5D0 \uC911\uC694\uD55C \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uAE30\uB85D\uD558\uC5EC \uB2E4\uC74C \uC138\uC158\uC774\uB098 \uC5D0\uC774\uC804\uD2B8 \uD300\uC774 \uCC38\uACE0\uD560 \uC218 \uC788\uB3C4\uB85D \uD558\uC138\uC694. \uAE30\uC874 \uB0B4\uC6A9 \uC218\uC815\uC740 \uBD88\uAC00\uD558\uBA70, \uC0C8\uB85C\uC6B4 \uBA54\uBAA8\uB97C \uCD94\uAC00 \uD558\uB294\uAC83\uB9CC \uAC00\uB2A5\uD569\uB2C8\uB2E4. \uAC04\uB7B5\uD55C \uD55C \uB450 \uBB38\uC7A5\uC73C\uB85C \uC791\uC131\uD558\uC5EC \uD575\uC2EC \uCEE8\uD14D\uC2A4\uD2B8\uAC00 \uBA85\uD655\uD788 \uC804\uB2EC\uB418\uB3C4\uB85D \uD558\uC138\uC694.
|
|
174
|
+
3. **\uC9C0\uC2DD \uB178\uD2B8 \uC791\uC131**: [.context/guides/note-guide.md] \uC791\uC5C5\uAE30\uC5B5(\uB370\uC77C\uB9AC\uB178\uD2B8, \uC138\uC158 \uCEE8\uD14D\uC2A4\uD2B8)\uBCF4\uB2E4 \uC624\uB798 \uAE30\uC5B5\uB418\uC5B4\uC57C \uD558\uB294 \uC911\uC694\uD55C \uACB0\uC815, \uD328\uD134, \uC2E4\uC218, \uBC1C\uACAC\uC740 \uC9C0\uC2DD \uB178\uD2B8\uB85C \uAE30\uB85D\uD558\uC5EC \uD504\uB85C\uC81D\uD2B8\uC758 \uC9D1\uB2E8 \uC9C0\uC2DD\uC73C\uB85C \uB0A8\uAE30\uC138\uC694.
|
|
175
|
+
4. **\uB178\uD2B8/\uC2A4\uD0AC \uAC80\uC0C9 \uBC0F \uC77D\uAE30**: [.context/guides/search-guide.md] \uC5B4\uB824\uC6C0\uC5D0 \uCC98\uD588\uB2E4\uBA74 \uD604\uC7AC \uC9C4\uD589 \uC0C1\uD669\uC5D0 \uD544\uC694\uD55C \uC9C0\uC2DD\uC774\uB098 \uC2A4\uD0AC\uC774 \uC788\uB294\uC9C0 \uD655\uC778\uD558\uACE0, \uAD00\uB828 \uB178\uD2B8\uB97C \uC77D\uC5B4\uBCF4\uC138\uC694. \uC0C8\uB85C\uC6B4 \uC544\uC774\uB514\uC5B4\uB098 \uD574\uACB0\uCC45\uC774 \uB5A0\uC624\uB97C \uC218 \uC788\uC2B5\uB2C8\uB2E4.
|
|
176
|
+
5. **\uC791\uC5C5 \uACBD\uB85C \uB9AC\uBDF0**: [.context/guides/scope-review.md] \uC0AC\uC6A9\uC790\uAC00 \uC758\uB3C4\uD55C \uC791\uC5C5 \uBC94\uC704\uB97C \uBC97\uC5B4\uB098\uC9C0 \uC54A\uC558\uB294\uC9C0, \uC791\uC5C5\uC774 \uB108\uBB34 \uD06C\uAC70\uB098 \uBCF5\uC7A1\uD574\uC9C0\uC9C0\uB294 \uC54A\uC558\uB294\uC9C0 \uAC80\uD1A0\uD558\uC138\uC694.
|
|
177
|
+
6. **\uCCB4\uD06C\uD3EC\uC778\uD2B8 \uCEE4\uBC0B**: [.context/guides/commit-guide.md] \uC791\uC5C5\uC774 \uAE38\uC5B4\uC9C8 \uACBD\uC6B0, \uC911\uC694\uD55C \uB2E8\uACC4\uB9C8\uB2E4 \uCCB4\uD06C\uD3EC\uC778\uD2B8 \uCEE4\uBC0B\uC744 \uD558\uC5EC \uC791\uC5C5 \uB0B4\uC6A9\uC744 \uC548\uC804\uD558\uAC8C \uC800\uC7A5\uD558\uACE0, \uD544\uC694 \uC2DC \uC774\uC804 \uC0C1\uD0DC\uB85C \uB3CC\uC544\uAC08 \uC218 \uC788\uB3C4\uB85D \uD558\uC138\uC694.
|
|
178
|
+
7. **\uD004\uB9AC\uD2F0 \uAC80\uC99D**: [.context/guides/quality-check.md] **\uC791\uC5C5 \uC644\uB8CC \uC804\uC5D0 \uBC18\uB4DC\uC2DC \uC218\uD589\uD558\uC138\uC694**. \uCF54\uB4DC \uB9B0\uD2B8, \uD3EC\uB9F7\uD130, \uD14C\uC2A4\uD2B8, \uBE4C\uB4DC, \uCF54\uB4DC\uB9AC\uBDF0\uB97C \uC2E4\uD589\uD558\uC5EC \uC791\uC5C5 \uACB0\uACFC\uBB3C\uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \uD488\uC9C8 \uAE30\uC900\uC744 \uCDA9\uC871\uD558\uB294\uC9C0 \uD655\uC778\uD558\uC138\uC694.
|
|
179
|
+
8. **\uC791\uC5C5 \uC644\uB8CC**: [.context/guides/complete-guide.md] \uBAA8\uB4E0 \uC791\uC5C5\uC774 \uC644\uB8CC\uB418\uC5C8\uB2E4\uBA74, \uC774 \uAC00\uC774\uB4DC\uB97C \uB530\uB974\uC138\uC694. \uC774 \uC791\uC5C5 \uC9C0\uCE68\uC774 \uB354\uC774\uC0C1 \uD2B8\uB9AC\uAC70\uB418\uC9C0 \uC54A\uC744 \uAC83\uC785\uB2C8\uB2E4.
|
|
194
180
|
`;
|
|
195
181
|
var DEFAULT_ADR_TEMPLATE = `# ADR-NNN: [\uC81C\uBAA9]
|
|
196
182
|
|
|
@@ -398,6 +384,78 @@ Overview: [1-2 sentence description of this domain]
|
|
|
398
384
|
|
|
399
385
|
- [[../other-domain/INDEX.md]] -- Description
|
|
400
386
|
`;
|
|
387
|
+
var DEFAULT_WORK_COMPLETE_TEMPLATE = `timestamp={{currentTimestamp}}
|
|
388
|
+
session_id={{sessionId}}
|
|
389
|
+
turn_id={{turnId}}
|
|
390
|
+
`;
|
|
391
|
+
var DEFAULT_DAILY_NOTE_GUIDE = `# \uB370\uC77C\uB9AC \uB178\uD2B8 \uAE30\uB85D \uAC00\uC774\uB4DC
|
|
392
|
+
|
|
393
|
+
- [ ] \`docs/daily/YYYY-MM-DD.md\` \uD30C\uC77C(\uC624\uB298 \uB0A0\uC9DC \uAE30\uC900)\uC744 \uC0DD\uC131\uD558\uAC70\uB098 \uC5C5\uB370\uC774\uD2B8\uD558\uC138\uC694.
|
|
394
|
+
- [ ] **\uC8FC\uC758**: \uB370\uC77C\uB9AC \uB178\uD2B8\uC758 \uAE30\uC874 \uB0B4\uC6A9\uC740 \uC808\uB300 \uC218\uC815\uD558\uAC70\uB098 \uC0AD\uC81C\uD558\uC9C0 \uB9C8\uC138\uC694.
|
|
395
|
+
- [ ] \uD30C\uC77C \uB9E8 \uB9C8\uC9C0\uB9C9 \uC904\uC5D0 \uB2E4\uC74C\uACFC \uAC19\uC740 \uD615\uC2DD\uC73C\uB85C\uB9CC \uAE30\uB85D\uC744 \uCD94\uAC00(Append)\uD558\uC138\uC694:
|
|
396
|
+
\`[{{currentTimestamp}}] <\uAE30\uC5B5 \uD560 \uB0B4\uC6A9>\`
|
|
397
|
+
- [ ] \`<\uAE30\uC5B5 \uD560 \uB0B4\uC6A9>\`\uC5D0\uB294 \uC644\uBCBD\uD55C \uCEE8\uD14D\uC2A4\uD2B8 \uC778\uACC4\uB97C \uC704\uD574 \uC624\uB298 \uC644\uB8CC\uD55C \uD575\uC2EC \uC791\uC5C5 \uC694\uC57D, \uBBF8\uD574\uACB0 \uC774\uC288(TODO), \uC911\uC694 \uBA54\uBAA8, \uC9C0\uC2DD \uB178\uD2B8 \`[[wikilink]]\` \uB4F1\uC744 \uD3EC\uD568\uD558\uC138\uC694.`;
|
|
398
|
+
var DEFAULT_NOTE_GUIDE = `# \uC9C0\uC2DD \uB178\uD2B8 \uC791\uC131 \uBC0F \uAD00\uB9AC \uAC00\uC774\uB4DC
|
|
399
|
+
|
|
400
|
+
- [ ] \uC81C\uD154\uCE74\uC2A4\uD150(Zettelkasten) 3\uB300 \uC6D0\uCE59 \uC900\uC218:
|
|
401
|
+
- [ ] \uC6D0\uC790\uC131: \uD55C \uB178\uD2B8\uB2F9 \uD55C \uC8FC\uC81C
|
|
402
|
+
- [ ] \uC5F0\uACB0: \uACE0\uB9BD\uB41C \uB178\uD2B8 \uBC29\uC9C0
|
|
403
|
+
- [ ] \uC790\uAE30 \uC5B8\uC5B4 \uC11C\uC220: \uD575\uC2EC\uC744 \uC774\uD574\uD558\uACE0 \uAC04\uACB0\uD558\uAC8C \uC11C\uC220
|
|
404
|
+
- [ ] **\uAE30\uB85D \uB300\uC0C1 \uD310\uB2E8 \uAE30\uC900:**
|
|
405
|
+
|
|
406
|
+
| \uC0C1\uD669 | \uD15C\uD50C\uB9BF | \uD30C\uC77C\uBA85 \uD328\uD134 |
|
|
407
|
+
| --- | --- | --- |
|
|
408
|
+
| \uC544\uD0A4\uD14D\uCC98/\uAE30\uC220 \uC2A4\uD0DD \uC911\uB300 \uACB0\uC815 | \`.context/templates/adr.md\` | \`adr-NNN-\uC81C\uBAA9.md\` |
|
|
409
|
+
| \uBC18\uBCF5 \uC0AC\uC6A9\uD560 \uCF54\uB4DC \uD328\uD134 \uBC1C\uACAC | \`.context/templates/pattern.md\` | \`pattern-\uC81C\uBAA9.md\` |
|
|
410
|
+
| \uBE44\uC790\uBA85\uD55C \uBC84\uADF8 \uD574\uACB0 | \`.context/templates/bug.md\` | \`bug-\uC81C\uBAA9.md\` |
|
|
411
|
+
| \uC678\uBD80 API/\uB77C\uC774\uBE0C\uB7EC\uB9AC \uC608\uC0C1\uC678 \uB3D9\uC791 | \`.context/templates/gotcha.md\` | \`gotcha-\uB77C\uC774\uBE0C\uB7EC\uB9AC-\uC81C\uBAA9.md\` |
|
|
412
|
+
| \uC791\uC740 \uAE30\uC220\uC801 \uC120\uD0DD | \`.context/templates/decision.md\` | \`decision-\uC81C\uBAA9.md\` |
|
|
413
|
+
| \uBAA8\uB4C8/\uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694 \uD544\uC694 | \`.context/templates/context.md\` | \`context-\uC81C\uBAA9.md\` |
|
|
414
|
+
| \uBC18\uBCF5 \uAC00\uB2A5\uD55C \uD504\uB85C\uC138\uC2A4 \uC815\uB9BD | \`.context/templates/runbook.md\` | \`runbook-\uC81C\uBAA9.md\` |
|
|
415
|
+
| \uC2E4\uD5D8/\uB514\uBC84\uAE45 \uC911 \uD559\uC2B5 | \`.context/templates/insight.md\` | \`insight-\uC81C\uBAA9.md\` |
|
|
416
|
+
|
|
417
|
+
- [ ] \uC0C8\uB85C \uC791\uC131\uD55C \uB178\uD2B8\uB294 \uACE0\uB9BD\uB418\uC9C0 \uC54A\uB3C4\uB85D \uBC18\uB4DC\uC2DC \uAE30\uC874 \uAD00\uB828 \uB178\uD2B8\uB098 \`INDEX.md\`\uC640 \`[[wikilink]]\`\uB85C \uC591\uBC29\uD5A5 \uC5F0\uACB0\uD558\uC138\uC694.
|
|
418
|
+
- [ ] **\uC9C0\uC2DD \uC815\uB9AC \uBC0F \uC720\uC9C0\uBCF4\uC218 \uC6CC\uD06C\uD50C\uB85C\uC6B0:**
|
|
419
|
+
- [ ] **\uBD88\uD544\uC694\uD574\uC9C4 \uC9C0\uC2DD \uC81C\uAC70**: \uB354 \uC774\uC0C1 \uC720\uD6A8\uD558\uC9C0 \uC54A\uAC70\uB098 \uC798\uBABB\uB41C \uC815\uBCF4\uAC00 \uB2F4\uAE34 \uACFC\uAC70 \uB178\uD2B8\uB294 \uACFC\uAC10\uD788 \uC0AD\uC81C\uD558\uAC70\uB098 \uC0C1\uB2E8\uC5D0 Deprecated \uD45C\uC2DC\uB97C \uD558\uC5EC \uD63C\uB780\uC744 \uBC29\uC9C0\uD558\uC138\uC694.
|
|
420
|
+
- [ ] **\uC911\uBCF5 \uB178\uD2B8 \uD569\uBCD1(Merge)**: \uBE44\uC2B7\uD55C \uC8FC\uC81C\uB97C \uB2E4\uB8E8\uB294 \uC5EC\uB7EC \uAC1C\uC758 \uB178\uD2B8(redundant notes)\uAC00 \uBC1C\uACAC\uB418\uBA74, \uD558\uB098\uC758 \uD575\uC2EC \uB178\uD2B8\uB85C \uB0B4\uC6A9\uC744 \uD1B5\uD569\uD558\uACE0 \uB098\uBA38\uC9C0 \uB178\uD2B8\uB294 \uC0AD\uC81C\uD558\uC138\uC694.
|
|
421
|
+
- [ ] **\uC5F0\uACB0\uC131 \uC810\uAC80**: \uC9C0\uC2DD\uC744 \uAC31\uC2E0\uD558\uAC70\uB098 \uD569\uBCD1\uD560 \uB54C \uB04A\uC5B4\uC9C4 \uB9C1\uD06C(Dead link)\uAC00 \uBC1C\uC0DD\uD558\uC9C0 \uC54A\uB3C4\uB85D, \uC774 \uB178\uD2B8\uB97C \uCC38\uC870\uD558\uB358 \uB2E4\uB978 \uB178\uD2B8\uB098 \`INDEX.md\`\uC758 \uB9C1\uD06C\uB4E4\uB3C4 \uD568\uAED8 \uC5C5\uB370\uC774\uD2B8\uD558\uC138\uC694.`;
|
|
422
|
+
var DEFAULT_SEARCH_GUIDE = `# \uB178\uD2B8/\uC2A4\uD0AC \uAC80\uC0C9 \uBC0F \uC77D\uAE30 \uAC00\uC774\uB4DC
|
|
423
|
+
|
|
424
|
+
- [ ] \uAD00\uB828 \uD0A4\uC6CC\uB4DC \uAC80\uC0C9
|
|
425
|
+
- [ ] INDEX.md \uD655\uC778
|
|
426
|
+
- [ ] \uAD00\uB828 \uB178\uD2B8 \uD0D0\uC0C9`;
|
|
427
|
+
var DEFAULT_QUALITY_CHECK_GUIDE = `# \uD004\uB9AC\uD2F0 \uAC80\uC99D \uAC00\uC774\uB4DC
|
|
428
|
+
|
|
429
|
+
- [ ] Lint/Format \uD655\uC778
|
|
430
|
+
- [ ] \uD14C\uC2A4\uD2B8 \uC2E4\uD589
|
|
431
|
+
- [ ] \uBE4C\uB4DC \uD655\uC778
|
|
432
|
+
- [ ] \uCF54\uB4DC \uB9AC\uBDF0 \uC694\uCCAD \uBC0F \uD1B5\uACFC`;
|
|
433
|
+
var DEFAULT_SCOPE_REVIEW_GUIDE = `# \uC791\uC5C5 \uACBD\uB85C \uB9AC\uBDF0 \uAC00\uC774\uB4DC
|
|
434
|
+
|
|
435
|
+
- [ ] \uD604\uC7AC \uC791\uC5C5 \uBC94\uC704 \uD655\uC778
|
|
436
|
+
- [ ] \uC2A4\uCF54\uD504 \uC774\uD0C8 \uC5EC\uBD80 \uAC80\uD1A0`;
|
|
437
|
+
var DEFAULT_COMMIT_GUIDE = `# \uCCB4\uD06C\uD3EC\uC778\uD2B8 \uCEE4\uBC0B \uAC00\uC774\uB4DC
|
|
438
|
+
|
|
439
|
+
- [ ] \uC791\uC5C5 \uB0B4\uC6A9 \uC2A4\uD14C\uC774\uC9D5
|
|
440
|
+
- [ ] \uC6D0\uC790\uC801 \uCEE4\uBC0B \uBA54\uC2DC\uC9C0 \uC791\uC131`;
|
|
441
|
+
var DEFAULT_COMPLETE_GUIDE = `# \uC791\uC5C5 \uC644\uB8CC \uAC00\uC774\uB4DC
|
|
442
|
+
|
|
443
|
+
- [ ] \uBAA8\uB4E0 \uCEE4\uBC0B \uBC0F \uD478\uC2DC \uC791\uC5C5 \uC644\uB8CC \uD6C4 \uC218\uD589\uD558\uC138\uC694.
|
|
444
|
+
- [ ] \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8\uC5D0 \`.context/.work-complete\` \uD30C\uC77C\uC744 \uC0DD\uC131\uD558\uAC70\uB098 \uB36E\uC5B4\uC4F0\uC138\uC694.
|
|
445
|
+
- [ ] \uD30C\uC77C \uB0B4\uC6A9\uC740 \`.context/templates/work-complete.txt\` \uD15C\uD50C\uB9BF\uC744 \uBCF5\uC0AC\uD558\uC5EC \uC791\uC131\uD574\uC57C \uD569\uB2C8\uB2E4. (\uC815\uD655\uD788 \uC544\uB798 3\uC904 \uD615\uC2DD\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4):
|
|
446
|
+
timestamp={{currentTimestamp}}
|
|
447
|
+
session_id={{sessionId}}
|
|
448
|
+
turn_id={{turnId}}
|
|
449
|
+
- [ ] \uC774 \uB3D9\uC791\uC740 \uC791\uC5C5 \uC644\uB8CC\uB97C \uC2DC\uC2A4\uD15C\uC5D0 \uC54C\uB9AC\uACE0 \uD504\uB86C\uD504\uD2B8 \uC8FC\uC785 \uB8E8\uD504\uB97C \uC885\uB8CC\uC2DC\uD0A4\uB294 \uD2B8\uB9AC\uAC70\uC785\uB2C8\uB2E4.`;
|
|
450
|
+
var GUIDE_FILES = {
|
|
451
|
+
"daily-note-guide.md": DEFAULT_DAILY_NOTE_GUIDE,
|
|
452
|
+
"note-guide.md": DEFAULT_NOTE_GUIDE,
|
|
453
|
+
"search-guide.md": DEFAULT_SEARCH_GUIDE,
|
|
454
|
+
"quality-check.md": DEFAULT_QUALITY_CHECK_GUIDE,
|
|
455
|
+
"scope-review.md": DEFAULT_SCOPE_REVIEW_GUIDE,
|
|
456
|
+
"commit-guide.md": DEFAULT_COMMIT_GUIDE,
|
|
457
|
+
"complete-guide.md": DEFAULT_COMPLETE_GUIDE
|
|
458
|
+
};
|
|
401
459
|
var TEMPLATE_FILES = {
|
|
402
460
|
"adr.md": DEFAULT_ADR_TEMPLATE,
|
|
403
461
|
"pattern.md": DEFAULT_PATTERN_TEMPLATE,
|
|
@@ -407,18 +465,22 @@ var TEMPLATE_FILES = {
|
|
|
407
465
|
"context.md": DEFAULT_CONTEXT_TEMPLATE,
|
|
408
466
|
"runbook.md": DEFAULT_RUNBOOK_TEMPLATE,
|
|
409
467
|
"insight.md": DEFAULT_INSIGHT_TEMPLATE,
|
|
410
|
-
"index.md": DEFAULT_INDEX_TEMPLATE
|
|
468
|
+
"index.md": DEFAULT_INDEX_TEMPLATE,
|
|
469
|
+
"work-complete.txt": DEFAULT_WORK_COMPLETE_TEMPLATE
|
|
411
470
|
};
|
|
412
471
|
function updateScaffold(projectDir) {
|
|
413
472
|
const contextDir = join2(projectDir, resolveContextDir(projectDir));
|
|
414
473
|
mkdirSync(join2(contextDir, "prompts"), { recursive: true });
|
|
415
474
|
mkdirSync(join2(contextDir, "templates"), { recursive: true });
|
|
475
|
+
mkdirSync(join2(contextDir, "guides"), { recursive: true });
|
|
416
476
|
const templateEntries = Object.fromEntries(Object.entries(TEMPLATE_FILES).map(([filename, content]) => [`templates/${filename}`, content]));
|
|
477
|
+
const guideEntries = Object.fromEntries(Object.entries(GUIDE_FILES).map(([filename, content]) => [`guides/${filename}`, content]));
|
|
417
478
|
const templates = {
|
|
418
479
|
"config.jsonc": DEFAULT_CONFIG,
|
|
419
480
|
[`prompts/${DEFAULTS.turnStartFile}`]: DEFAULT_TURN_START,
|
|
420
481
|
[`prompts/${DEFAULTS.turnEndFile}`]: DEFAULT_TURN_END,
|
|
421
|
-
...templateEntries
|
|
482
|
+
...templateEntries,
|
|
483
|
+
...guideEntries
|
|
422
484
|
};
|
|
423
485
|
const updated = [];
|
|
424
486
|
for (const [path, content] of Object.entries(templates)) {
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// src/index.ts
|
|
3
|
+
import { existsSync as existsSync4, readFileSync as readFileSync5, statSync as statSync2, unlinkSync } from "fs";
|
|
3
4
|
import { isAbsolute, join as join5 } from "path";
|
|
4
5
|
|
|
5
6
|
// node_modules/jsonc-parser/lib/esm/impl/scanner.js
|
|
@@ -820,7 +821,9 @@ var DEFAULTS = {
|
|
|
820
821
|
templateDir: ".context/templates",
|
|
821
822
|
indexFilename: "INDEX.md",
|
|
822
823
|
maxDomainDepth: 2,
|
|
823
|
-
knowledgeDir: "docs"
|
|
824
|
+
knowledgeDir: "docs",
|
|
825
|
+
guidesDir: ".context/guides",
|
|
826
|
+
workCompleteFile: ".context/.work-complete"
|
|
824
827
|
};
|
|
825
828
|
var LIMITS = {
|
|
826
829
|
maxPromptFileSize: 64 * 1024,
|
|
@@ -859,6 +862,11 @@ function getDefaultConfig() {
|
|
|
859
862
|
mode: "auto",
|
|
860
863
|
indexFilename: DEFAULTS.indexFilename,
|
|
861
864
|
maxDomainDepth: DEFAULTS.maxDomainDepth
|
|
865
|
+
},
|
|
866
|
+
omx: {
|
|
867
|
+
turnEnd: {
|
|
868
|
+
strategy: "turn-complete-sendkeys"
|
|
869
|
+
}
|
|
862
870
|
}
|
|
863
871
|
};
|
|
864
872
|
}
|
|
@@ -875,6 +883,11 @@ function mergeWithDefaults(partial) {
|
|
|
875
883
|
mode: partial.knowledge?.mode ?? defaults.knowledge.mode,
|
|
876
884
|
indexFilename: partial.knowledge?.indexFilename ?? defaults.knowledge.indexFilename,
|
|
877
885
|
maxDomainDepth: partial.knowledge?.maxDomainDepth ?? defaults.knowledge.maxDomainDepth
|
|
886
|
+
},
|
|
887
|
+
omx: {
|
|
888
|
+
turnEnd: {
|
|
889
|
+
strategy: partial.omx?.turnEnd?.strategy ?? defaults.omx?.turnEnd?.strategy
|
|
890
|
+
}
|
|
878
891
|
}
|
|
879
892
|
};
|
|
880
893
|
}
|
|
@@ -1104,7 +1117,10 @@ function readPromptFile(filePath) {
|
|
|
1104
1117
|
}
|
|
1105
1118
|
function resolvePromptVariables(content, vars) {
|
|
1106
1119
|
const normalized = (vars.knowledgeDir || "docs").replace(/\\/g, "/").replace(/\/+$/, "");
|
|
1107
|
-
|
|
1120
|
+
let resolved = content.replaceAll("{{knowledgeDir}}", normalized);
|
|
1121
|
+
resolved = resolved.replaceAll("{{sessionId}}", vars.sessionId ?? "");
|
|
1122
|
+
resolved = resolved.replaceAll("{{turnId}}", vars.turnId ?? "");
|
|
1123
|
+
return resolved;
|
|
1108
1124
|
}
|
|
1109
1125
|
|
|
1110
1126
|
// src/lib/scaffold.ts
|
|
@@ -1113,7 +1129,7 @@ import { join as join4 } from "path";
|
|
|
1113
1129
|
// package.json
|
|
1114
1130
|
var package_default = {
|
|
1115
1131
|
name: "@ksm0709/context",
|
|
1116
|
-
version: "0.0.
|
|
1132
|
+
version: "0.0.21",
|
|
1117
1133
|
author: {
|
|
1118
1134
|
name: "TaehoKang",
|
|
1119
1135
|
email: "ksm07091@gmail.com"
|
|
@@ -1121,7 +1137,7 @@ var package_default = {
|
|
|
1121
1137
|
type: "module",
|
|
1122
1138
|
main: "./dist/index.js",
|
|
1123
1139
|
bin: {
|
|
1124
|
-
context: "
|
|
1140
|
+
context: "dist/cli/index.js"
|
|
1125
1141
|
},
|
|
1126
1142
|
exports: {
|
|
1127
1143
|
".": {
|
|
@@ -1137,7 +1153,7 @@ var package_default = {
|
|
|
1137
1153
|
},
|
|
1138
1154
|
repository: {
|
|
1139
1155
|
type: "git",
|
|
1140
|
-
url: "git@github.com
|
|
1156
|
+
url: "git+ssh://git@github.com/ksm0709/context.git"
|
|
1141
1157
|
},
|
|
1142
1158
|
publishConfig: {
|
|
1143
1159
|
access: "public"
|
|
@@ -1155,6 +1171,7 @@ var package_default = {
|
|
|
1155
1171
|
"@opencode-ai/plugin": ">=1.0.0"
|
|
1156
1172
|
},
|
|
1157
1173
|
dependencies: {
|
|
1174
|
+
"@ksm0709/context": "^0.0.20",
|
|
1158
1175
|
"jsonc-parser": "^3.0.0"
|
|
1159
1176
|
},
|
|
1160
1177
|
devDependencies: {
|
|
@@ -1186,6 +1203,12 @@ var DEFAULT_CONFIG = `{
|
|
|
1186
1203
|
"knowledge": {
|
|
1187
1204
|
"dir": "docs",
|
|
1188
1205
|
"sources": ["AGENTS.md"]
|
|
1206
|
+
},
|
|
1207
|
+
"omx": {
|
|
1208
|
+
// Inject turn-end after native turn-complete via tmux send-keys
|
|
1209
|
+
"turnEnd": {
|
|
1210
|
+
"strategy": "turn-complete-sendkeys"
|
|
1211
|
+
}
|
|
1189
1212
|
}
|
|
1190
1213
|
}`;
|
|
1191
1214
|
var DEFAULT_TURN_START = `## Knowledge Context
|
|
@@ -1201,6 +1224,8 @@ var DEFAULT_TURN_START = `## Knowledge Context
|
|
|
1201
1224
|
|
|
1202
1225
|
### \uC791\uC5C5 \uC804 \uD544\uC218
|
|
1203
1226
|
|
|
1227
|
+
- **\uB370\uC77C\uB9AC \uB178\uD2B8 \uD655\uC778**: \uAC00\uC7A5 \uCD5C\uADFC\uC758 \uB370\uC77C\uB9AC \uB178\uD2B8(\`{{knowledgeDir}}/daily/YYYY-MM-DD.md\`)\uB97C \uC77D\uACE0 \uC774\uC804 \uC138\uC158\uC758 \uCEE8\uD14D\uC2A4\uD2B8\uC640 \uBBF8\uD574\uACB0 \uC774\uC288\uB97C \uD30C\uC545\uD558\uC138\uC694
|
|
1228
|
+
- **\uC791\uC5C5 \uC758\uB3C4 \uC120\uC5B8**: \uC791\uC5C5 \uC2DC\uC791 \uC804, \uD604\uC7AC \uC138\uC158\uC758 \uBAA9\uD45C\uC640 \uC791\uC5C5 \uC758\uB3C4\uB97C \uBA85\uD655\uD788 \uD30C\uC545\uD558\uACE0 \uC120\uC5B8\uD558\uC138\uC694 (\uCD94\uD6C4 \uC791\uC5C5 \uACBD\uB85C \uAC80\uC99D \uC2DC \uAE30\uC900\uC774 \uB429\uB2C8\uB2E4)
|
|
1204
1229
|
- \uBA54\uC778 \uC5D0\uC774\uC804\uD2B8\uAC00 \uC544\uB798 **Available Knowledge** \uBAA9\uB85D\uC5D0\uC11C \uD604\uC7AC \uC791\uC5C5\uACFC \uAD00\uB828\uB41C \uBB38\uC11C\uB97C **\uC9C1\uC811 \uBA3C\uC800** \uC77D\uC73C\uC138\uC694
|
|
1205
1230
|
- \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
|
|
1206
1231
|
- \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
|
|
@@ -1219,43 +1244,18 @@ var DEFAULT_TURN_START = `## Knowledge Context
|
|
|
1219
1244
|
- \uC9C0\uC2DD \uB178\uD2B8\uC758 \uACB0\uC815\uC0AC\uD56D > \uC77C\uBC18\uC801 \uAD00\uD589
|
|
1220
1245
|
- \uC9C0\uC2DD \uB178\uD2B8\uC5D0 \uC5C6\uB294 \uC0C8\uB85C\uC6B4 \uACB0\uC815\uC774\uB098 \uBC18\uBCF5 \uAC00\uCE58\uAC00 \uC788\uB294 \uBC1C\uACAC\uC740 \uC791\uC5C5 \uBA54\uBAA8\uB098 \uC9C0\uC2DD \uB178\uD2B8 \uD6C4\uBCF4\uB85C \uAE30\uB85D\uD558\uC138\uC694
|
|
1221
1246
|
`;
|
|
1222
|
-
var DEFAULT_TURN_END = `## \uC791\uC5C5 \
|
|
1223
|
-
|
|
1224
|
-
\
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
- \
|
|
1229
|
-
- \
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
-
|
|
1233
|
-
|
|
1234
|
-
### 2. \uC9C0\uC2DD \uC815\uB9AC
|
|
1235
|
-
|
|
1236
|
-
\uC791\uC5C5 \uC911 \uAE30\uB85D\uD560 \uB9CC\uD55C \uBC1C\uACAC\uC774 \uC788\uC5C8\uB2E4\uBA74 \uC9C1\uC811 \uC815\uB9AC\uD558\uC138\uC694.
|
|
1237
|
-
|
|
1238
|
-
**\uAE30\uB85D \uB300\uC0C1 \uD310\uB2E8 \uAE30\uC900:**
|
|
1239
|
-
|
|
1240
|
-
| \uC0C1\uD669 | \uD15C\uD50C\uB9BF | \uD30C\uC77C\uBA85 \uD328\uD134 |
|
|
1241
|
-
| ------------------------------- | --------------------------------------------------- | --------------------------- |
|
|
1242
|
-
| \uC544\uD0A4\uD14D\uCC98/\uAE30\uC220 \uC2A4\uD0DD \uC911\uB300 \uACB0\uC815 | [ADR](.context/templates/adr.md) | \`adr-NNN-\uC81C\uBAA9.md\` |
|
|
1243
|
-
| \uBC18\uBCF5 \uC0AC\uC6A9\uD560 \uCF54\uB4DC \uD328\uD134 \uBC1C\uACAC | [Pattern](.context/templates/pattern.md) | \`pattern-\uC81C\uBAA9.md\` |
|
|
1244
|
-
| \uBE44\uC790\uBA85\uD55C \uBC84\uADF8 \uD574\uACB0 | [Bug](.context/templates/bug.md) | \`bug-\uC81C\uBAA9.md\` |
|
|
1245
|
-
| \uC678\uBD80 API/\uB77C\uC774\uBE0C\uB7EC\uB9AC \uC608\uC0C1\uC678 \uB3D9\uC791 | [Gotcha](.context/templates/gotcha.md) | \`gotcha-\uB77C\uC774\uBE0C\uB7EC\uB9AC-\uC81C\uBAA9.md\` |
|
|
1246
|
-
| \uC791\uC740 \uAE30\uC220\uC801 \uC120\uD0DD | [Decision](.context/templates/decision.md) | \`decision-\uC81C\uBAA9.md\` |
|
|
1247
|
-
| \uBAA8\uB4C8/\uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694 \uD544\uC694 | [Context](.context/templates/context.md) | \`context-\uC81C\uBAA9.md\` |
|
|
1248
|
-
| \uBC18\uBCF5 \uAC00\uB2A5\uD55C \uD504\uB85C\uC138\uC2A4 \uC815\uB9BD | [Runbook](.context/templates/runbook.md) | \`runbook-\uC81C\uBAA9.md\` |
|
|
1249
|
-
| \uC2E4\uD5D8/\uB514\uBC84\uAE45 \uC911 \uD559\uC2B5 | [Insight](.context/templates/insight.md) | \`insight-\uC81C\uBAA9.md\` |
|
|
1250
|
-
|
|
1251
|
-
\uD574\uB2F9 \uC0AC\uD56D\uC774 \uC5C6\uC73C\uBA74 \uC774 \uB2E8\uACC4\uB294 \uAC74\uB108\uB6F0\uC138\uC694.
|
|
1252
|
-
|
|
1253
|
-
- \uAD00\uB828 \uD15C\uD50C\uB9BF \uD30C\uC77C\uC744 \uC77D\uACE0 \uADF8 \uAD6C\uC870\uC5D0 \uB9DE\uCDB0 \uB0B4\uC6A9\uC744 \uC815\uB9AC\uD558\uC138\uC694
|
|
1254
|
-
- \uB178\uD2B8 \uCCAB \uC904\uC740 \uBA85\uD655\uD55C \uC81C\uBAA9(\`# Title\`)\uC73C\uB85C \uC2DC\uC791\uD558\uC138\uC694
|
|
1255
|
-
- \uD575\uC2EC \uB0B4\uC6A9\uC744 \uC790\uAE30 \uC5B8\uC5B4\uB85C \uAC04\uACB0\uD558\uAC8C \uC11C\uC220\uD558\uACE0, \uAD00\uB828 \uB178\uD2B8\uB294 \`[[relative/path/file.md]]\` \uD615\uD0DC\uB85C \uC5F0\uACB0\uD558\uC138\uC694
|
|
1256
|
-
- knowledge \uB514\uB809\uD1A0\uB9AC(\`{{knowledgeDir}}/\`) \uB610\uB294 \uC801\uC808\uD55C \uB3C4\uBA54\uC778 \uD3F4\uB354\uC5D0 \uC800\uC7A5\uD558\uACE0, \uD544\uC694\uD55C \uACBD\uC6B0 \uAE30\uC874 INDEX.md\uB098 \uAD00\uB828 \uB178\uD2B8\uB97C \uD568\uAED8 \uAC31\uC2E0\uD558\uC138\uC694
|
|
1257
|
-
|
|
1258
|
-
\uAE30\uC874 \uC124\uCE58\uC758 \uC0AC\uC6A9\uC790 \uD504\uB86C\uD504\uD2B8 \uD30C\uC77C\uC740 \uC790\uB3D9\uC73C\uB85C \uBC14\uB00C\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC0C8 \uAE30\uBCF8 \uD504\uB86C\uD504\uD2B8\uAC00 \uD544\uC694\uD558\uBA74 \`context update prompt\`\uB85C \uBA85\uC2DC\uC801\uC73C\uB85C \uC0C8\uB85C\uACE0\uCE68\uD558\uC138\uC694.
|
|
1247
|
+
var DEFAULT_TURN_END = `## TURN END \uC791\uC5C5 \uC9C0\uCE68
|
|
1248
|
+
\uC544\uB798 \uBA54\uB274 \uC911 \uD558\uB098\uB97C \uC120\uD0DD\uD574 \uC9C4\uD589 \uC0C1\uD669\uC5D0 \uB9DE\uAC8C \uC218\uD589\uD558\uC138\uC694.
|
|
1249
|
+
**\uBC18\uB4DC\uC2DC \uB9C1\uD06C\uB41C \uAC00\uC774\uB4DC\uB97C \uCC38\uACE0\uD558\uC5EC \uC815\uD655\uD788 \uC218\uD589\uD574\uC57C \uD569\uB2C8\uB2E4.**
|
|
1250
|
+
|
|
1251
|
+
1. **\uACC4\uC18D \uC791\uC5C5**: \uAE30\uC874 \uC791\uC5C5\uC774 \uC644\uB8CC\uB418\uC9C0 \uC54A\uC558\uACE0 \uC544\uC9C1 \uC544\uB798 \uC561\uC158\uC744 \uCDE8\uD560 \uB2E8\uACC4\uAC00 \uC544\uB2C8\uB77C\uBA74 \uC791\uC5C5 \uC18D\uAC1C.
|
|
1252
|
+
2. **\uB370\uC77C\uB9AC \uB178\uD2B8 \uAE30\uB85D**: [.context/guides/daily-note-guide.md] \uB370\uC77C\uB9AC \uB178\uD2B8\uC5D0 \uC911\uC694\uD55C \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uAE30\uB85D\uD558\uC5EC \uB2E4\uC74C \uC138\uC158\uC774\uB098 \uC5D0\uC774\uC804\uD2B8 \uD300\uC774 \uCC38\uACE0\uD560 \uC218 \uC788\uB3C4\uB85D \uD558\uC138\uC694. \uAE30\uC874 \uB0B4\uC6A9 \uC218\uC815\uC740 \uBD88\uAC00\uD558\uBA70, \uC0C8\uB85C\uC6B4 \uBA54\uBAA8\uB97C \uCD94\uAC00 \uD558\uB294\uAC83\uB9CC \uAC00\uB2A5\uD569\uB2C8\uB2E4. \uAC04\uB7B5\uD55C \uD55C \uB450 \uBB38\uC7A5\uC73C\uB85C \uC791\uC131\uD558\uC5EC \uD575\uC2EC \uCEE8\uD14D\uC2A4\uD2B8\uAC00 \uBA85\uD655\uD788 \uC804\uB2EC\uB418\uB3C4\uB85D \uD558\uC138\uC694.
|
|
1253
|
+
3. **\uC9C0\uC2DD \uB178\uD2B8 \uC791\uC131**: [.context/guides/note-guide.md] \uC791\uC5C5\uAE30\uC5B5(\uB370\uC77C\uB9AC\uB178\uD2B8, \uC138\uC158 \uCEE8\uD14D\uC2A4\uD2B8)\uBCF4\uB2E4 \uC624\uB798 \uAE30\uC5B5\uB418\uC5B4\uC57C \uD558\uB294 \uC911\uC694\uD55C \uACB0\uC815, \uD328\uD134, \uC2E4\uC218, \uBC1C\uACAC\uC740 \uC9C0\uC2DD \uB178\uD2B8\uB85C \uAE30\uB85D\uD558\uC5EC \uD504\uB85C\uC81D\uD2B8\uC758 \uC9D1\uB2E8 \uC9C0\uC2DD\uC73C\uB85C \uB0A8\uAE30\uC138\uC694.
|
|
1254
|
+
4. **\uB178\uD2B8/\uC2A4\uD0AC \uAC80\uC0C9 \uBC0F \uC77D\uAE30**: [.context/guides/search-guide.md] \uC5B4\uB824\uC6C0\uC5D0 \uCC98\uD588\uB2E4\uBA74 \uD604\uC7AC \uC9C4\uD589 \uC0C1\uD669\uC5D0 \uD544\uC694\uD55C \uC9C0\uC2DD\uC774\uB098 \uC2A4\uD0AC\uC774 \uC788\uB294\uC9C0 \uD655\uC778\uD558\uACE0, \uAD00\uB828 \uB178\uD2B8\uB97C \uC77D\uC5B4\uBCF4\uC138\uC694. \uC0C8\uB85C\uC6B4 \uC544\uC774\uB514\uC5B4\uB098 \uD574\uACB0\uCC45\uC774 \uB5A0\uC624\uB97C \uC218 \uC788\uC2B5\uB2C8\uB2E4.
|
|
1255
|
+
5. **\uC791\uC5C5 \uACBD\uB85C \uB9AC\uBDF0**: [.context/guides/scope-review.md] \uC0AC\uC6A9\uC790\uAC00 \uC758\uB3C4\uD55C \uC791\uC5C5 \uBC94\uC704\uB97C \uBC97\uC5B4\uB098\uC9C0 \uC54A\uC558\uB294\uC9C0, \uC791\uC5C5\uC774 \uB108\uBB34 \uD06C\uAC70\uB098 \uBCF5\uC7A1\uD574\uC9C0\uC9C0\uB294 \uC54A\uC558\uB294\uC9C0 \uAC80\uD1A0\uD558\uC138\uC694.
|
|
1256
|
+
6. **\uCCB4\uD06C\uD3EC\uC778\uD2B8 \uCEE4\uBC0B**: [.context/guides/commit-guide.md] \uC791\uC5C5\uC774 \uAE38\uC5B4\uC9C8 \uACBD\uC6B0, \uC911\uC694\uD55C \uB2E8\uACC4\uB9C8\uB2E4 \uCCB4\uD06C\uD3EC\uC778\uD2B8 \uCEE4\uBC0B\uC744 \uD558\uC5EC \uC791\uC5C5 \uB0B4\uC6A9\uC744 \uC548\uC804\uD558\uAC8C \uC800\uC7A5\uD558\uACE0, \uD544\uC694 \uC2DC \uC774\uC804 \uC0C1\uD0DC\uB85C \uB3CC\uC544\uAC08 \uC218 \uC788\uB3C4\uB85D \uD558\uC138\uC694.
|
|
1257
|
+
7. **\uD004\uB9AC\uD2F0 \uAC80\uC99D**: [.context/guides/quality-check.md] **\uC791\uC5C5 \uC644\uB8CC \uC804\uC5D0 \uBC18\uB4DC\uC2DC \uC218\uD589\uD558\uC138\uC694**. \uCF54\uB4DC \uB9B0\uD2B8, \uD3EC\uB9F7\uD130, \uD14C\uC2A4\uD2B8, \uBE4C\uB4DC, \uCF54\uB4DC\uB9AC\uBDF0\uB97C \uC2E4\uD589\uD558\uC5EC \uC791\uC5C5 \uACB0\uACFC\uBB3C\uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \uD488\uC9C8 \uAE30\uC900\uC744 \uCDA9\uC871\uD558\uB294\uC9C0 \uD655\uC778\uD558\uC138\uC694.
|
|
1258
|
+
8. **\uC791\uC5C5 \uC644\uB8CC**: [.context/guides/complete-guide.md] \uBAA8\uB4E0 \uC791\uC5C5\uC774 \uC644\uB8CC\uB418\uC5C8\uB2E4\uBA74, \uC774 \uAC00\uC774\uB4DC\uB97C \uB530\uB974\uC138\uC694. \uC774 \uC791\uC5C5 \uC9C0\uCE68\uC774 \uB354\uC774\uC0C1 \uD2B8\uB9AC\uAC70\uB418\uC9C0 \uC54A\uC744 \uAC83\uC785\uB2C8\uB2E4.
|
|
1259
1259
|
`;
|
|
1260
1260
|
var DEFAULT_ADR_TEMPLATE = `# ADR-NNN: [\uC81C\uBAA9]
|
|
1261
1261
|
|
|
@@ -1463,6 +1463,78 @@ Overview: [1-2 sentence description of this domain]
|
|
|
1463
1463
|
|
|
1464
1464
|
- [[../other-domain/INDEX.md]] -- Description
|
|
1465
1465
|
`;
|
|
1466
|
+
var DEFAULT_WORK_COMPLETE_TEMPLATE = `timestamp={{currentTimestamp}}
|
|
1467
|
+
session_id={{sessionId}}
|
|
1468
|
+
turn_id={{turnId}}
|
|
1469
|
+
`;
|
|
1470
|
+
var DEFAULT_DAILY_NOTE_GUIDE = `# \uB370\uC77C\uB9AC \uB178\uD2B8 \uAE30\uB85D \uAC00\uC774\uB4DC
|
|
1471
|
+
|
|
1472
|
+
- [ ] \`docs/daily/YYYY-MM-DD.md\` \uD30C\uC77C(\uC624\uB298 \uB0A0\uC9DC \uAE30\uC900)\uC744 \uC0DD\uC131\uD558\uAC70\uB098 \uC5C5\uB370\uC774\uD2B8\uD558\uC138\uC694.
|
|
1473
|
+
- [ ] **\uC8FC\uC758**: \uB370\uC77C\uB9AC \uB178\uD2B8\uC758 \uAE30\uC874 \uB0B4\uC6A9\uC740 \uC808\uB300 \uC218\uC815\uD558\uAC70\uB098 \uC0AD\uC81C\uD558\uC9C0 \uB9C8\uC138\uC694.
|
|
1474
|
+
- [ ] \uD30C\uC77C \uB9E8 \uB9C8\uC9C0\uB9C9 \uC904\uC5D0 \uB2E4\uC74C\uACFC \uAC19\uC740 \uD615\uC2DD\uC73C\uB85C\uB9CC \uAE30\uB85D\uC744 \uCD94\uAC00(Append)\uD558\uC138\uC694:
|
|
1475
|
+
\`[{{currentTimestamp}}] <\uAE30\uC5B5 \uD560 \uB0B4\uC6A9>\`
|
|
1476
|
+
- [ ] \`<\uAE30\uC5B5 \uD560 \uB0B4\uC6A9>\`\uC5D0\uB294 \uC644\uBCBD\uD55C \uCEE8\uD14D\uC2A4\uD2B8 \uC778\uACC4\uB97C \uC704\uD574 \uC624\uB298 \uC644\uB8CC\uD55C \uD575\uC2EC \uC791\uC5C5 \uC694\uC57D, \uBBF8\uD574\uACB0 \uC774\uC288(TODO), \uC911\uC694 \uBA54\uBAA8, \uC9C0\uC2DD \uB178\uD2B8 \`[[wikilink]]\` \uB4F1\uC744 \uD3EC\uD568\uD558\uC138\uC694.`;
|
|
1477
|
+
var DEFAULT_NOTE_GUIDE = `# \uC9C0\uC2DD \uB178\uD2B8 \uC791\uC131 \uBC0F \uAD00\uB9AC \uAC00\uC774\uB4DC
|
|
1478
|
+
|
|
1479
|
+
- [ ] \uC81C\uD154\uCE74\uC2A4\uD150(Zettelkasten) 3\uB300 \uC6D0\uCE59 \uC900\uC218:
|
|
1480
|
+
- [ ] \uC6D0\uC790\uC131: \uD55C \uB178\uD2B8\uB2F9 \uD55C \uC8FC\uC81C
|
|
1481
|
+
- [ ] \uC5F0\uACB0: \uACE0\uB9BD\uB41C \uB178\uD2B8 \uBC29\uC9C0
|
|
1482
|
+
- [ ] \uC790\uAE30 \uC5B8\uC5B4 \uC11C\uC220: \uD575\uC2EC\uC744 \uC774\uD574\uD558\uACE0 \uAC04\uACB0\uD558\uAC8C \uC11C\uC220
|
|
1483
|
+
- [ ] **\uAE30\uB85D \uB300\uC0C1 \uD310\uB2E8 \uAE30\uC900:**
|
|
1484
|
+
|
|
1485
|
+
| \uC0C1\uD669 | \uD15C\uD50C\uB9BF | \uD30C\uC77C\uBA85 \uD328\uD134 |
|
|
1486
|
+
| --- | --- | --- |
|
|
1487
|
+
| \uC544\uD0A4\uD14D\uCC98/\uAE30\uC220 \uC2A4\uD0DD \uC911\uB300 \uACB0\uC815 | \`.context/templates/adr.md\` | \`adr-NNN-\uC81C\uBAA9.md\` |
|
|
1488
|
+
| \uBC18\uBCF5 \uC0AC\uC6A9\uD560 \uCF54\uB4DC \uD328\uD134 \uBC1C\uACAC | \`.context/templates/pattern.md\` | \`pattern-\uC81C\uBAA9.md\` |
|
|
1489
|
+
| \uBE44\uC790\uBA85\uD55C \uBC84\uADF8 \uD574\uACB0 | \`.context/templates/bug.md\` | \`bug-\uC81C\uBAA9.md\` |
|
|
1490
|
+
| \uC678\uBD80 API/\uB77C\uC774\uBE0C\uB7EC\uB9AC \uC608\uC0C1\uC678 \uB3D9\uC791 | \`.context/templates/gotcha.md\` | \`gotcha-\uB77C\uC774\uBE0C\uB7EC\uB9AC-\uC81C\uBAA9.md\` |
|
|
1491
|
+
| \uC791\uC740 \uAE30\uC220\uC801 \uC120\uD0DD | \`.context/templates/decision.md\` | \`decision-\uC81C\uBAA9.md\` |
|
|
1492
|
+
| \uBAA8\uB4C8/\uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694 \uD544\uC694 | \`.context/templates/context.md\` | \`context-\uC81C\uBAA9.md\` |
|
|
1493
|
+
| \uBC18\uBCF5 \uAC00\uB2A5\uD55C \uD504\uB85C\uC138\uC2A4 \uC815\uB9BD | \`.context/templates/runbook.md\` | \`runbook-\uC81C\uBAA9.md\` |
|
|
1494
|
+
| \uC2E4\uD5D8/\uB514\uBC84\uAE45 \uC911 \uD559\uC2B5 | \`.context/templates/insight.md\` | \`insight-\uC81C\uBAA9.md\` |
|
|
1495
|
+
|
|
1496
|
+
- [ ] \uC0C8\uB85C \uC791\uC131\uD55C \uB178\uD2B8\uB294 \uACE0\uB9BD\uB418\uC9C0 \uC54A\uB3C4\uB85D \uBC18\uB4DC\uC2DC \uAE30\uC874 \uAD00\uB828 \uB178\uD2B8\uB098 \`INDEX.md\`\uC640 \`[[wikilink]]\`\uB85C \uC591\uBC29\uD5A5 \uC5F0\uACB0\uD558\uC138\uC694.
|
|
1497
|
+
- [ ] **\uC9C0\uC2DD \uC815\uB9AC \uBC0F \uC720\uC9C0\uBCF4\uC218 \uC6CC\uD06C\uD50C\uB85C\uC6B0:**
|
|
1498
|
+
- [ ] **\uBD88\uD544\uC694\uD574\uC9C4 \uC9C0\uC2DD \uC81C\uAC70**: \uB354 \uC774\uC0C1 \uC720\uD6A8\uD558\uC9C0 \uC54A\uAC70\uB098 \uC798\uBABB\uB41C \uC815\uBCF4\uAC00 \uB2F4\uAE34 \uACFC\uAC70 \uB178\uD2B8\uB294 \uACFC\uAC10\uD788 \uC0AD\uC81C\uD558\uAC70\uB098 \uC0C1\uB2E8\uC5D0 Deprecated \uD45C\uC2DC\uB97C \uD558\uC5EC \uD63C\uB780\uC744 \uBC29\uC9C0\uD558\uC138\uC694.
|
|
1499
|
+
- [ ] **\uC911\uBCF5 \uB178\uD2B8 \uD569\uBCD1(Merge)**: \uBE44\uC2B7\uD55C \uC8FC\uC81C\uB97C \uB2E4\uB8E8\uB294 \uC5EC\uB7EC \uAC1C\uC758 \uB178\uD2B8(redundant notes)\uAC00 \uBC1C\uACAC\uB418\uBA74, \uD558\uB098\uC758 \uD575\uC2EC \uB178\uD2B8\uB85C \uB0B4\uC6A9\uC744 \uD1B5\uD569\uD558\uACE0 \uB098\uBA38\uC9C0 \uB178\uD2B8\uB294 \uC0AD\uC81C\uD558\uC138\uC694.
|
|
1500
|
+
- [ ] **\uC5F0\uACB0\uC131 \uC810\uAC80**: \uC9C0\uC2DD\uC744 \uAC31\uC2E0\uD558\uAC70\uB098 \uD569\uBCD1\uD560 \uB54C \uB04A\uC5B4\uC9C4 \uB9C1\uD06C(Dead link)\uAC00 \uBC1C\uC0DD\uD558\uC9C0 \uC54A\uB3C4\uB85D, \uC774 \uB178\uD2B8\uB97C \uCC38\uC870\uD558\uB358 \uB2E4\uB978 \uB178\uD2B8\uB098 \`INDEX.md\`\uC758 \uB9C1\uD06C\uB4E4\uB3C4 \uD568\uAED8 \uC5C5\uB370\uC774\uD2B8\uD558\uC138\uC694.`;
|
|
1501
|
+
var DEFAULT_SEARCH_GUIDE = `# \uB178\uD2B8/\uC2A4\uD0AC \uAC80\uC0C9 \uBC0F \uC77D\uAE30 \uAC00\uC774\uB4DC
|
|
1502
|
+
|
|
1503
|
+
- [ ] \uAD00\uB828 \uD0A4\uC6CC\uB4DC \uAC80\uC0C9
|
|
1504
|
+
- [ ] INDEX.md \uD655\uC778
|
|
1505
|
+
- [ ] \uAD00\uB828 \uB178\uD2B8 \uD0D0\uC0C9`;
|
|
1506
|
+
var DEFAULT_QUALITY_CHECK_GUIDE = `# \uD004\uB9AC\uD2F0 \uAC80\uC99D \uAC00\uC774\uB4DC
|
|
1507
|
+
|
|
1508
|
+
- [ ] Lint/Format \uD655\uC778
|
|
1509
|
+
- [ ] \uD14C\uC2A4\uD2B8 \uC2E4\uD589
|
|
1510
|
+
- [ ] \uBE4C\uB4DC \uD655\uC778
|
|
1511
|
+
- [ ] \uCF54\uB4DC \uB9AC\uBDF0 \uC694\uCCAD \uBC0F \uD1B5\uACFC`;
|
|
1512
|
+
var DEFAULT_SCOPE_REVIEW_GUIDE = `# \uC791\uC5C5 \uACBD\uB85C \uB9AC\uBDF0 \uAC00\uC774\uB4DC
|
|
1513
|
+
|
|
1514
|
+
- [ ] \uD604\uC7AC \uC791\uC5C5 \uBC94\uC704 \uD655\uC778
|
|
1515
|
+
- [ ] \uC2A4\uCF54\uD504 \uC774\uD0C8 \uC5EC\uBD80 \uAC80\uD1A0`;
|
|
1516
|
+
var DEFAULT_COMMIT_GUIDE = `# \uCCB4\uD06C\uD3EC\uC778\uD2B8 \uCEE4\uBC0B \uAC00\uC774\uB4DC
|
|
1517
|
+
|
|
1518
|
+
- [ ] \uC791\uC5C5 \uB0B4\uC6A9 \uC2A4\uD14C\uC774\uC9D5
|
|
1519
|
+
- [ ] \uC6D0\uC790\uC801 \uCEE4\uBC0B \uBA54\uC2DC\uC9C0 \uC791\uC131`;
|
|
1520
|
+
var DEFAULT_COMPLETE_GUIDE = `# \uC791\uC5C5 \uC644\uB8CC \uAC00\uC774\uB4DC
|
|
1521
|
+
|
|
1522
|
+
- [ ] \uBAA8\uB4E0 \uCEE4\uBC0B \uBC0F \uD478\uC2DC \uC791\uC5C5 \uC644\uB8CC \uD6C4 \uC218\uD589\uD558\uC138\uC694.
|
|
1523
|
+
- [ ] \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8\uC5D0 \`.context/.work-complete\` \uD30C\uC77C\uC744 \uC0DD\uC131\uD558\uAC70\uB098 \uB36E\uC5B4\uC4F0\uC138\uC694.
|
|
1524
|
+
- [ ] \uD30C\uC77C \uB0B4\uC6A9\uC740 \`.context/templates/work-complete.txt\` \uD15C\uD50C\uB9BF\uC744 \uBCF5\uC0AC\uD558\uC5EC \uC791\uC131\uD574\uC57C \uD569\uB2C8\uB2E4. (\uC815\uD655\uD788 \uC544\uB798 3\uC904 \uD615\uC2DD\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4):
|
|
1525
|
+
timestamp={{currentTimestamp}}
|
|
1526
|
+
session_id={{sessionId}}
|
|
1527
|
+
turn_id={{turnId}}
|
|
1528
|
+
- [ ] \uC774 \uB3D9\uC791\uC740 \uC791\uC5C5 \uC644\uB8CC\uB97C \uC2DC\uC2A4\uD15C\uC5D0 \uC54C\uB9AC\uACE0 \uD504\uB86C\uD504\uD2B8 \uC8FC\uC785 \uB8E8\uD504\uB97C \uC885\uB8CC\uC2DC\uD0A4\uB294 \uD2B8\uB9AC\uAC70\uC785\uB2C8\uB2E4.`;
|
|
1529
|
+
var GUIDE_FILES = {
|
|
1530
|
+
"daily-note-guide.md": DEFAULT_DAILY_NOTE_GUIDE,
|
|
1531
|
+
"note-guide.md": DEFAULT_NOTE_GUIDE,
|
|
1532
|
+
"search-guide.md": DEFAULT_SEARCH_GUIDE,
|
|
1533
|
+
"quality-check.md": DEFAULT_QUALITY_CHECK_GUIDE,
|
|
1534
|
+
"scope-review.md": DEFAULT_SCOPE_REVIEW_GUIDE,
|
|
1535
|
+
"commit-guide.md": DEFAULT_COMMIT_GUIDE,
|
|
1536
|
+
"complete-guide.md": DEFAULT_COMPLETE_GUIDE
|
|
1537
|
+
};
|
|
1466
1538
|
var TEMPLATE_FILES = {
|
|
1467
1539
|
"adr.md": DEFAULT_ADR_TEMPLATE,
|
|
1468
1540
|
"pattern.md": DEFAULT_PATTERN_TEMPLATE,
|
|
@@ -1472,7 +1544,8 @@ var TEMPLATE_FILES = {
|
|
|
1472
1544
|
"context.md": DEFAULT_CONTEXT_TEMPLATE,
|
|
1473
1545
|
"runbook.md": DEFAULT_RUNBOOK_TEMPLATE,
|
|
1474
1546
|
"insight.md": DEFAULT_INSIGHT_TEMPLATE,
|
|
1475
|
-
"index.md": DEFAULT_INDEX_TEMPLATE
|
|
1547
|
+
"index.md": DEFAULT_INDEX_TEMPLATE,
|
|
1548
|
+
"work-complete.txt": DEFAULT_WORK_COMPLETE_TEMPLATE
|
|
1476
1549
|
};
|
|
1477
1550
|
function scaffoldIfNeeded(projectDir) {
|
|
1478
1551
|
const contextDir = join4(projectDir, resolveContextDir(projectDir));
|
|
@@ -1484,12 +1557,17 @@ function scaffoldIfNeeded(projectDir) {
|
|
|
1484
1557
|
mkdirSync(promptsDir, { recursive: true });
|
|
1485
1558
|
const templatesDir = join4(contextDir, "templates");
|
|
1486
1559
|
mkdirSync(templatesDir, { recursive: true });
|
|
1560
|
+
const guidesDir = join4(contextDir, "guides");
|
|
1561
|
+
mkdirSync(guidesDir, { recursive: true });
|
|
1487
1562
|
writeFileSync(join4(contextDir, "config.jsonc"), DEFAULT_CONFIG, "utf-8");
|
|
1488
1563
|
writeFileSync(join4(promptsDir, DEFAULTS.turnStartFile), DEFAULT_TURN_START, "utf-8");
|
|
1489
1564
|
writeFileSync(join4(promptsDir, DEFAULTS.turnEndFile), DEFAULT_TURN_END, "utf-8");
|
|
1490
1565
|
for (const [filename, content] of Object.entries(TEMPLATE_FILES)) {
|
|
1491
1566
|
writeFileSync(join4(templatesDir, filename), content, "utf-8");
|
|
1492
1567
|
}
|
|
1568
|
+
for (const [filename, content] of Object.entries(GUIDE_FILES)) {
|
|
1569
|
+
writeFileSync(join4(guidesDir, filename), content, "utf-8");
|
|
1570
|
+
}
|
|
1493
1571
|
writeVersion(contextDir, PLUGIN_VERSION);
|
|
1494
1572
|
return true;
|
|
1495
1573
|
} catch {
|
|
@@ -1513,17 +1591,25 @@ function autoUpdateTemplates(projectDir) {
|
|
|
1513
1591
|
const stored = getStoredVersion(projectDir);
|
|
1514
1592
|
if (stored === PLUGIN_VERSION)
|
|
1515
1593
|
return [];
|
|
1594
|
+
mkdirSync(join4(contextDir, "prompts"), { recursive: true });
|
|
1516
1595
|
mkdirSync(join4(contextDir, "templates"), { recursive: true });
|
|
1596
|
+
mkdirSync(join4(contextDir, "guides"), { recursive: true });
|
|
1597
|
+
const filesToUpdate = {
|
|
1598
|
+
[`prompts/${DEFAULTS.turnStartFile}`]: DEFAULT_TURN_START,
|
|
1599
|
+
[`prompts/${DEFAULTS.turnEndFile}`]: DEFAULT_TURN_END,
|
|
1600
|
+
...Object.fromEntries(Object.entries(TEMPLATE_FILES).map(([f, c]) => [`templates/${f}`, c])),
|
|
1601
|
+
...Object.fromEntries(Object.entries(GUIDE_FILES).map(([f, c]) => [`guides/${f}`, c]))
|
|
1602
|
+
};
|
|
1517
1603
|
const updated = [];
|
|
1518
|
-
for (const [
|
|
1519
|
-
const filePath = join4(contextDir,
|
|
1604
|
+
for (const [path, content] of Object.entries(filesToUpdate)) {
|
|
1605
|
+
const filePath = join4(contextDir, path);
|
|
1520
1606
|
try {
|
|
1521
1607
|
const existing = readFileSync4(filePath, "utf-8");
|
|
1522
1608
|
if (existing === content)
|
|
1523
1609
|
continue;
|
|
1524
1610
|
} catch {}
|
|
1525
1611
|
writeFileSync(filePath, content, "utf-8");
|
|
1526
|
-
updated.push(
|
|
1612
|
+
updated.push(path);
|
|
1527
1613
|
}
|
|
1528
1614
|
writeVersion(contextDir, PLUGIN_VERSION);
|
|
1529
1615
|
return updated;
|
|
@@ -1569,7 +1655,10 @@ var plugin = async ({ directory, client }) => {
|
|
|
1569
1655
|
const lastUserMsg = output.messages.filter((m) => m.info.role === "user").at(-1);
|
|
1570
1656
|
if (!lastUserMsg)
|
|
1571
1657
|
return;
|
|
1572
|
-
const promptVars = {
|
|
1658
|
+
const promptVars = {
|
|
1659
|
+
knowledgeDir: config.knowledge.dir ?? "docs",
|
|
1660
|
+
sessionId: lastUserMsg.info.sessionID
|
|
1661
|
+
};
|
|
1573
1662
|
const turnStartPath = resolvePromptPath(directory, contextDir, config.prompts.turnStart ?? join5(DEFAULTS.promptDir, DEFAULTS.turnStartFile));
|
|
1574
1663
|
const turnStartRaw = readPromptFile(turnStartPath) ?? "";
|
|
1575
1664
|
const turnStart = resolvePromptVariables(turnStartRaw, promptVars);
|
|
@@ -1587,6 +1676,20 @@ var plugin = async ({ directory, client }) => {
|
|
|
1587
1676
|
text: combinedContent
|
|
1588
1677
|
});
|
|
1589
1678
|
}
|
|
1679
|
+
const signalPath = join5(directory, DEFAULTS.workCompleteFile);
|
|
1680
|
+
if (existsSync4(signalPath)) {
|
|
1681
|
+
const content = readFileSync5(signalPath, "utf-8");
|
|
1682
|
+
const match = content.match(/^session_id=(.*)$/m);
|
|
1683
|
+
const fileSessionId = match ? match[1].trim() : undefined;
|
|
1684
|
+
if (fileSessionId && fileSessionId !== lastUserMsg.info.sessionID) {} else {
|
|
1685
|
+
const { mtimeMs } = statSync2(signalPath);
|
|
1686
|
+
const userCreatedAt = lastUserMsg.info.time.created;
|
|
1687
|
+
if (mtimeMs >= userCreatedAt) {
|
|
1688
|
+
return;
|
|
1689
|
+
}
|
|
1690
|
+
unlinkSync(signalPath);
|
|
1691
|
+
}
|
|
1692
|
+
}
|
|
1590
1693
|
const turnEndPath = resolvePromptPath(directory, contextDir, config.prompts.turnEnd ?? join5(DEFAULTS.promptDir, DEFAULTS.turnEndFile));
|
|
1591
1694
|
const turnEndRaw = readPromptFile(turnEndPath);
|
|
1592
1695
|
if (!turnEndRaw)
|
package/dist/omx/index.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// src/omx/index.ts
|
|
2
|
-
import {
|
|
2
|
+
import { existsSync as existsSync5, readFileSync as readFileSync6, unlinkSync } from "node:fs";
|
|
3
|
+
import { isAbsolute, join as join5 } from "node:path";
|
|
3
4
|
|
|
4
5
|
// src/constants.ts
|
|
5
6
|
var DEFAULTS = {
|
|
@@ -11,7 +12,9 @@ var DEFAULTS = {
|
|
|
11
12
|
templateDir: ".context/templates",
|
|
12
13
|
indexFilename: "INDEX.md",
|
|
13
14
|
maxDomainDepth: 2,
|
|
14
|
-
knowledgeDir: "docs"
|
|
15
|
+
knowledgeDir: "docs",
|
|
16
|
+
guidesDir: ".context/guides",
|
|
17
|
+
workCompleteFile: ".context/.work-complete"
|
|
15
18
|
};
|
|
16
19
|
var LIMITS = {
|
|
17
20
|
maxPromptFileSize: 64 * 1024,
|
|
@@ -55,6 +58,11 @@ function getDefaultConfig() {
|
|
|
55
58
|
mode: "auto",
|
|
56
59
|
indexFilename: DEFAULTS.indexFilename,
|
|
57
60
|
maxDomainDepth: DEFAULTS.maxDomainDepth
|
|
61
|
+
},
|
|
62
|
+
omx: {
|
|
63
|
+
turnEnd: {
|
|
64
|
+
strategy: "turn-complete-sendkeys"
|
|
65
|
+
}
|
|
58
66
|
}
|
|
59
67
|
};
|
|
60
68
|
}
|
|
@@ -71,6 +79,11 @@ function mergeWithDefaults(partial) {
|
|
|
71
79
|
mode: partial.knowledge?.mode ?? defaults.knowledge.mode,
|
|
72
80
|
indexFilename: partial.knowledge?.indexFilename ?? defaults.knowledge.indexFilename,
|
|
73
81
|
maxDomainDepth: partial.knowledge?.maxDomainDepth ?? defaults.knowledge.maxDomainDepth
|
|
82
|
+
},
|
|
83
|
+
omx: {
|
|
84
|
+
turnEnd: {
|
|
85
|
+
strategy: partial.omx?.turnEnd?.strategy ?? defaults.omx?.turnEnd?.strategy
|
|
86
|
+
}
|
|
74
87
|
}
|
|
75
88
|
};
|
|
76
89
|
}
|
|
@@ -300,7 +313,10 @@ function readPromptFile(filePath) {
|
|
|
300
313
|
}
|
|
301
314
|
function resolvePromptVariables(content, vars) {
|
|
302
315
|
const normalized = (vars.knowledgeDir || "docs").replace(/\\/g, "/").replace(/\/+$/, "");
|
|
303
|
-
|
|
316
|
+
let resolved = content.replaceAll("{{knowledgeDir}}", normalized);
|
|
317
|
+
resolved = resolved.replaceAll("{{sessionId}}", vars.sessionId ?? "");
|
|
318
|
+
resolved = resolved.replaceAll("{{turnId}}", vars.turnId ?? "");
|
|
319
|
+
return resolved;
|
|
304
320
|
}
|
|
305
321
|
|
|
306
322
|
// src/lib/scaffold.ts
|
|
@@ -309,7 +325,7 @@ import { join as join4 } from "node:path";
|
|
|
309
325
|
// package.json
|
|
310
326
|
var package_default = {
|
|
311
327
|
name: "@ksm0709/context",
|
|
312
|
-
version: "0.0.
|
|
328
|
+
version: "0.0.21",
|
|
313
329
|
author: {
|
|
314
330
|
name: "TaehoKang",
|
|
315
331
|
email: "ksm07091@gmail.com"
|
|
@@ -317,7 +333,7 @@ var package_default = {
|
|
|
317
333
|
type: "module",
|
|
318
334
|
main: "./dist/index.js",
|
|
319
335
|
bin: {
|
|
320
|
-
context: "
|
|
336
|
+
context: "dist/cli/index.js"
|
|
321
337
|
},
|
|
322
338
|
exports: {
|
|
323
339
|
".": {
|
|
@@ -333,7 +349,7 @@ var package_default = {
|
|
|
333
349
|
},
|
|
334
350
|
repository: {
|
|
335
351
|
type: "git",
|
|
336
|
-
url: "git@github.com
|
|
352
|
+
url: "git+ssh://git@github.com/ksm0709/context.git"
|
|
337
353
|
},
|
|
338
354
|
publishConfig: {
|
|
339
355
|
access: "public"
|
|
@@ -351,6 +367,7 @@ var package_default = {
|
|
|
351
367
|
"@opencode-ai/plugin": ">=1.0.0"
|
|
352
368
|
},
|
|
353
369
|
dependencies: {
|
|
370
|
+
"@ksm0709/context": "^0.0.20",
|
|
354
371
|
"jsonc-parser": "^3.0.0"
|
|
355
372
|
},
|
|
356
373
|
devDependencies: {
|
|
@@ -382,6 +399,12 @@ var DEFAULT_CONFIG = `{
|
|
|
382
399
|
"knowledge": {
|
|
383
400
|
"dir": "docs",
|
|
384
401
|
"sources": ["AGENTS.md"]
|
|
402
|
+
},
|
|
403
|
+
"omx": {
|
|
404
|
+
// Inject turn-end after native turn-complete via tmux send-keys
|
|
405
|
+
"turnEnd": {
|
|
406
|
+
"strategy": "turn-complete-sendkeys"
|
|
407
|
+
}
|
|
385
408
|
}
|
|
386
409
|
}`;
|
|
387
410
|
var DEFAULT_TURN_START = `## Knowledge Context
|
|
@@ -397,6 +420,8 @@ var DEFAULT_TURN_START = `## Knowledge Context
|
|
|
397
420
|
|
|
398
421
|
### 작업 전 필수
|
|
399
422
|
|
|
423
|
+
- **데일리 노트 확인**: 가장 최근의 데일리 노트(\`{{knowledgeDir}}/daily/YYYY-MM-DD.md\`)를 읽고 이전 세션의 컨텍스트와 미해결 이슈를 파악하세요
|
|
424
|
+
- **작업 의도 선언**: 작업 시작 전, 현재 세션의 목표와 작업 의도를 명확히 파악하고 선언하세요 (추후 작업 경로 검증 시 기준이 됩니다)
|
|
400
425
|
- 메인 에이전트가 아래 **Available Knowledge** 목록에서 현재 작업과 관련된 문서를 **직접 먼저** 읽으세요
|
|
401
426
|
- 도메인 폴더 구조가 있다면 INDEX.md의 요약을 참고하여 필요한 노트만 선택적으로 읽으세요
|
|
402
427
|
- 문서 내 [[링크]]를 따라가며 관련 노트를 탐색하세요 -- 링크를 놓치면 중요한 맥락을 잃습니다
|
|
@@ -415,43 +440,18 @@ var DEFAULT_TURN_START = `## Knowledge Context
|
|
|
415
440
|
- 지식 노트의 결정사항 > 일반적 관행
|
|
416
441
|
- 지식 노트에 없는 새로운 결정이나 반복 가치가 있는 발견은 작업 메모나 지식 노트 후보로 기록하세요
|
|
417
442
|
`;
|
|
418
|
-
var DEFAULT_TURN_END = `## 작업
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
-
|
|
425
|
-
-
|
|
426
|
-
-
|
|
427
|
-
-
|
|
428
|
-
-
|
|
429
|
-
|
|
430
|
-
### 2. 지식 정리
|
|
431
|
-
|
|
432
|
-
작업 중 기록할 만한 발견이 있었다면 직접 정리하세요.
|
|
433
|
-
|
|
434
|
-
**기록 대상 판단 기준:**
|
|
435
|
-
|
|
436
|
-
| 상황 | 템플릿 | 파일명 패턴 |
|
|
437
|
-
| ------------------------------- | --------------------------------------------------- | --------------------------- |
|
|
438
|
-
| 아키텍처/기술 스택 중대 결정 | [ADR](.context/templates/adr.md) | \`adr-NNN-제목.md\` |
|
|
439
|
-
| 반복 사용할 코드 패턴 발견 | [Pattern](.context/templates/pattern.md) | \`pattern-제목.md\` |
|
|
440
|
-
| 비자명한 버그 해결 | [Bug](.context/templates/bug.md) | \`bug-제목.md\` |
|
|
441
|
-
| 외부 API/라이브러리 예상외 동작 | [Gotcha](.context/templates/gotcha.md) | \`gotcha-라이브러리-제목.md\` |
|
|
442
|
-
| 작은 기술적 선택 | [Decision](.context/templates/decision.md) | \`decision-제목.md\` |
|
|
443
|
-
| 모듈/프로젝트 개요 필요 | [Context](.context/templates/context.md) | \`context-제목.md\` |
|
|
444
|
-
| 반복 가능한 프로세스 정립 | [Runbook](.context/templates/runbook.md) | \`runbook-제목.md\` |
|
|
445
|
-
| 실험/디버깅 중 학습 | [Insight](.context/templates/insight.md) | \`insight-제목.md\` |
|
|
446
|
-
|
|
447
|
-
해당 사항이 없으면 이 단계는 건너뛰세요.
|
|
448
|
-
|
|
449
|
-
- 관련 템플릿 파일을 읽고 그 구조에 맞춰 내용을 정리하세요
|
|
450
|
-
- 노트 첫 줄은 명확한 제목(\`# Title\`)으로 시작하세요
|
|
451
|
-
- 핵심 내용을 자기 언어로 간결하게 서술하고, 관련 노트는 \`[[relative/path/file.md]]\` 형태로 연결하세요
|
|
452
|
-
- knowledge 디렉토리(\`{{knowledgeDir}}/\`) 또는 적절한 도메인 폴더에 저장하고, 필요한 경우 기존 INDEX.md나 관련 노트를 함께 갱신하세요
|
|
453
|
-
|
|
454
|
-
기존 설치의 사용자 프롬프트 파일은 자동으로 바뀌지 않습니다. 새 기본 프롬프트가 필요하면 \`context update prompt\`로 명시적으로 새로고침하세요.
|
|
443
|
+
var DEFAULT_TURN_END = `## TURN END 작업 지침
|
|
444
|
+
아래 메뉴 중 하나를 선택해 진행 상황에 맞게 수행하세요.
|
|
445
|
+
**반드시 링크된 가이드를 참고하여 정확히 수행해야 합니다.**
|
|
446
|
+
|
|
447
|
+
1. **계속 작업**: 기존 작업이 완료되지 않았고 아직 아래 액션을 취할 단계가 아니라면 작업 속개.
|
|
448
|
+
2. **데일리 노트 기록**: [.context/guides/daily-note-guide.md] 데일리 노트에 중요한 컨텍스트를 기록하여 다음 세션이나 에이전트 팀이 참고할 수 있도록 하세요. 기존 내용 수정은 불가하며, 새로운 메모를 추가 하는것만 가능합니다. 간략한 한 두 문장으로 작성하여 핵심 컨텍스트가 명확히 전달되도록 하세요.
|
|
449
|
+
3. **지식 노트 작성**: [.context/guides/note-guide.md] 작업기억(데일리노트, 세션 컨텍스트)보다 오래 기억되어야 하는 중요한 결정, 패턴, 실수, 발견은 지식 노트로 기록하여 프로젝트의 집단 지식으로 남기세요.
|
|
450
|
+
4. **노트/스킬 검색 및 읽기**: [.context/guides/search-guide.md] 어려움에 처했다면 현재 진행 상황에 필요한 지식이나 스킬이 있는지 확인하고, 관련 노트를 읽어보세요. 새로운 아이디어나 해결책이 떠오를 수 있습니다.
|
|
451
|
+
5. **작업 경로 리뷰**: [.context/guides/scope-review.md] 사용자가 의도한 작업 범위를 벗어나지 않았는지, 작업이 너무 크거나 복잡해지지는 않았는지 검토하세요.
|
|
452
|
+
6. **체크포인트 커밋**: [.context/guides/commit-guide.md] 작업이 길어질 경우, 중요한 단계마다 체크포인트 커밋을 하여 작업 내용을 안전하게 저장하고, 필요 시 이전 상태로 돌아갈 수 있도록 하세요.
|
|
453
|
+
7. **퀄리티 검증**: [.context/guides/quality-check.md] **작업 완료 전에 반드시 수행하세요**. 코드 린트, 포맷터, 테스트, 빌드, 코드리뷰를 실행하여 작업 결과물이 프로젝트의 품질 기준을 충족하는지 확인하세요.
|
|
454
|
+
8. **작업 완료**: [.context/guides/complete-guide.md] 모든 작업이 완료되었다면, 이 가이드를 따르세요. 이 작업 지침이 더이상 트리거되지 않을 것입니다.
|
|
455
455
|
`;
|
|
456
456
|
var DEFAULT_ADR_TEMPLATE = `# ADR-NNN: [제목]
|
|
457
457
|
|
|
@@ -659,6 +659,78 @@ Overview: [1-2 sentence description of this domain]
|
|
|
659
659
|
|
|
660
660
|
- [[../other-domain/INDEX.md]] -- Description
|
|
661
661
|
`;
|
|
662
|
+
var DEFAULT_WORK_COMPLETE_TEMPLATE = `timestamp={{currentTimestamp}}
|
|
663
|
+
session_id={{sessionId}}
|
|
664
|
+
turn_id={{turnId}}
|
|
665
|
+
`;
|
|
666
|
+
var DEFAULT_DAILY_NOTE_GUIDE = `# 데일리 노트 기록 가이드
|
|
667
|
+
|
|
668
|
+
- [ ] \`docs/daily/YYYY-MM-DD.md\` 파일(오늘 날짜 기준)을 생성하거나 업데이트하세요.
|
|
669
|
+
- [ ] **주의**: 데일리 노트의 기존 내용은 절대 수정하거나 삭제하지 마세요.
|
|
670
|
+
- [ ] 파일 맨 마지막 줄에 다음과 같은 형식으로만 기록을 추가(Append)하세요:
|
|
671
|
+
\`[{{currentTimestamp}}] <기억 할 내용>\`
|
|
672
|
+
- [ ] \`<기억 할 내용>\`에는 완벽한 컨텍스트 인계를 위해 오늘 완료한 핵심 작업 요약, 미해결 이슈(TODO), 중요 메모, 지식 노트 \`[[wikilink]]\` 등을 포함하세요.`;
|
|
673
|
+
var DEFAULT_NOTE_GUIDE = `# 지식 노트 작성 및 관리 가이드
|
|
674
|
+
|
|
675
|
+
- [ ] 제텔카스텐(Zettelkasten) 3대 원칙 준수:
|
|
676
|
+
- [ ] 원자성: 한 노트당 한 주제
|
|
677
|
+
- [ ] 연결: 고립된 노트 방지
|
|
678
|
+
- [ ] 자기 언어 서술: 핵심을 이해하고 간결하게 서술
|
|
679
|
+
- [ ] **기록 대상 판단 기준:**
|
|
680
|
+
|
|
681
|
+
| 상황 | 템플릿 | 파일명 패턴 |
|
|
682
|
+
| --- | --- | --- |
|
|
683
|
+
| 아키텍처/기술 스택 중대 결정 | \`.context/templates/adr.md\` | \`adr-NNN-제목.md\` |
|
|
684
|
+
| 반복 사용할 코드 패턴 발견 | \`.context/templates/pattern.md\` | \`pattern-제목.md\` |
|
|
685
|
+
| 비자명한 버그 해결 | \`.context/templates/bug.md\` | \`bug-제목.md\` |
|
|
686
|
+
| 외부 API/라이브러리 예상외 동작 | \`.context/templates/gotcha.md\` | \`gotcha-라이브러리-제목.md\` |
|
|
687
|
+
| 작은 기술적 선택 | \`.context/templates/decision.md\` | \`decision-제목.md\` |
|
|
688
|
+
| 모듈/프로젝트 개요 필요 | \`.context/templates/context.md\` | \`context-제목.md\` |
|
|
689
|
+
| 반복 가능한 프로세스 정립 | \`.context/templates/runbook.md\` | \`runbook-제목.md\` |
|
|
690
|
+
| 실험/디버깅 중 학습 | \`.context/templates/insight.md\` | \`insight-제목.md\` |
|
|
691
|
+
|
|
692
|
+
- [ ] 새로 작성한 노트는 고립되지 않도록 반드시 기존 관련 노트나 \`INDEX.md\`와 \`[[wikilink]]\`로 양방향 연결하세요.
|
|
693
|
+
- [ ] **지식 정리 및 유지보수 워크플로우:**
|
|
694
|
+
- [ ] **불필요해진 지식 제거**: 더 이상 유효하지 않거나 잘못된 정보가 담긴 과거 노트는 과감히 삭제하거나 상단에 Deprecated 표시를 하여 혼란을 방지하세요.
|
|
695
|
+
- [ ] **중복 노트 합병(Merge)**: 비슷한 주제를 다루는 여러 개의 노트(redundant notes)가 발견되면, 하나의 핵심 노트로 내용을 통합하고 나머지 노트는 삭제하세요.
|
|
696
|
+
- [ ] **연결성 점검**: 지식을 갱신하거나 합병할 때 끊어진 링크(Dead link)가 발생하지 않도록, 이 노트를 참조하던 다른 노트나 \`INDEX.md\`의 링크들도 함께 업데이트하세요.`;
|
|
697
|
+
var DEFAULT_SEARCH_GUIDE = `# 노트/스킬 검색 및 읽기 가이드
|
|
698
|
+
|
|
699
|
+
- [ ] 관련 키워드 검색
|
|
700
|
+
- [ ] INDEX.md 확인
|
|
701
|
+
- [ ] 관련 노트 탐색`;
|
|
702
|
+
var DEFAULT_QUALITY_CHECK_GUIDE = `# 퀄리티 검증 가이드
|
|
703
|
+
|
|
704
|
+
- [ ] Lint/Format 확인
|
|
705
|
+
- [ ] 테스트 실행
|
|
706
|
+
- [ ] 빌드 확인
|
|
707
|
+
- [ ] 코드 리뷰 요청 및 통과`;
|
|
708
|
+
var DEFAULT_SCOPE_REVIEW_GUIDE = `# 작업 경로 리뷰 가이드
|
|
709
|
+
|
|
710
|
+
- [ ] 현재 작업 범위 확인
|
|
711
|
+
- [ ] 스코프 이탈 여부 검토`;
|
|
712
|
+
var DEFAULT_COMMIT_GUIDE = `# 체크포인트 커밋 가이드
|
|
713
|
+
|
|
714
|
+
- [ ] 작업 내용 스테이징
|
|
715
|
+
- [ ] 원자적 커밋 메시지 작성`;
|
|
716
|
+
var DEFAULT_COMPLETE_GUIDE = `# 작업 완료 가이드
|
|
717
|
+
|
|
718
|
+
- [ ] 모든 커밋 및 푸시 작업 완료 후 수행하세요.
|
|
719
|
+
- [ ] 프로젝트 루트에 \`.context/.work-complete\` 파일을 생성하거나 덮어쓰세요.
|
|
720
|
+
- [ ] 파일 내용은 \`.context/templates/work-complete.txt\` 템플릿을 복사하여 작성해야 합니다. (정확히 아래 3줄 형식이어야 합니다):
|
|
721
|
+
timestamp={{currentTimestamp}}
|
|
722
|
+
session_id={{sessionId}}
|
|
723
|
+
turn_id={{turnId}}
|
|
724
|
+
- [ ] 이 동작은 작업 완료를 시스템에 알리고 프롬프트 주입 루프를 종료시키는 트리거입니다.`;
|
|
725
|
+
var GUIDE_FILES = {
|
|
726
|
+
"daily-note-guide.md": DEFAULT_DAILY_NOTE_GUIDE,
|
|
727
|
+
"note-guide.md": DEFAULT_NOTE_GUIDE,
|
|
728
|
+
"search-guide.md": DEFAULT_SEARCH_GUIDE,
|
|
729
|
+
"quality-check.md": DEFAULT_QUALITY_CHECK_GUIDE,
|
|
730
|
+
"scope-review.md": DEFAULT_SCOPE_REVIEW_GUIDE,
|
|
731
|
+
"commit-guide.md": DEFAULT_COMMIT_GUIDE,
|
|
732
|
+
"complete-guide.md": DEFAULT_COMPLETE_GUIDE
|
|
733
|
+
};
|
|
662
734
|
var TEMPLATE_FILES = {
|
|
663
735
|
"adr.md": DEFAULT_ADR_TEMPLATE,
|
|
664
736
|
"pattern.md": DEFAULT_PATTERN_TEMPLATE,
|
|
@@ -668,7 +740,8 @@ var TEMPLATE_FILES = {
|
|
|
668
740
|
"context.md": DEFAULT_CONTEXT_TEMPLATE,
|
|
669
741
|
"runbook.md": DEFAULT_RUNBOOK_TEMPLATE,
|
|
670
742
|
"insight.md": DEFAULT_INSIGHT_TEMPLATE,
|
|
671
|
-
"index.md": DEFAULT_INDEX_TEMPLATE
|
|
743
|
+
"index.md": DEFAULT_INDEX_TEMPLATE,
|
|
744
|
+
"work-complete.txt": DEFAULT_WORK_COMPLETE_TEMPLATE
|
|
672
745
|
};
|
|
673
746
|
function scaffoldIfNeeded(projectDir) {
|
|
674
747
|
const contextDir = join4(projectDir, resolveContextDir(projectDir));
|
|
@@ -680,12 +753,17 @@ function scaffoldIfNeeded(projectDir) {
|
|
|
680
753
|
mkdirSync(promptsDir, { recursive: true });
|
|
681
754
|
const templatesDir = join4(contextDir, "templates");
|
|
682
755
|
mkdirSync(templatesDir, { recursive: true });
|
|
756
|
+
const guidesDir = join4(contextDir, "guides");
|
|
757
|
+
mkdirSync(guidesDir, { recursive: true });
|
|
683
758
|
writeFileSync(join4(contextDir, "config.jsonc"), DEFAULT_CONFIG, "utf-8");
|
|
684
759
|
writeFileSync(join4(promptsDir, DEFAULTS.turnStartFile), DEFAULT_TURN_START, "utf-8");
|
|
685
760
|
writeFileSync(join4(promptsDir, DEFAULTS.turnEndFile), DEFAULT_TURN_END, "utf-8");
|
|
686
761
|
for (const [filename, content] of Object.entries(TEMPLATE_FILES)) {
|
|
687
762
|
writeFileSync(join4(templatesDir, filename), content, "utf-8");
|
|
688
763
|
}
|
|
764
|
+
for (const [filename, content] of Object.entries(GUIDE_FILES)) {
|
|
765
|
+
writeFileSync(join4(guidesDir, filename), content, "utf-8");
|
|
766
|
+
}
|
|
689
767
|
writeVersion(contextDir, PLUGIN_VERSION);
|
|
690
768
|
return true;
|
|
691
769
|
} catch {
|
|
@@ -749,23 +827,112 @@ function injectIntoAgentsMd(agentsMdPath, content) {
|
|
|
749
827
|
writeFileAtomically(agentsMdPath, nextContent);
|
|
750
828
|
}
|
|
751
829
|
|
|
830
|
+
// src/omx/tmux-submit.ts
|
|
831
|
+
import { spawnSync } from "node:child_process";
|
|
832
|
+
function runTmux(args) {
|
|
833
|
+
const result = spawnSync("tmux", args, { encoding: "utf-8" });
|
|
834
|
+
if (result.error) {
|
|
835
|
+
return { ok: false, error: result.error.message };
|
|
836
|
+
}
|
|
837
|
+
if (result.status !== 0) {
|
|
838
|
+
return {
|
|
839
|
+
ok: false,
|
|
840
|
+
error: (result.stderr || "").trim() || `tmux exited ${result.status}`
|
|
841
|
+
};
|
|
842
|
+
}
|
|
843
|
+
return { ok: true };
|
|
844
|
+
}
|
|
845
|
+
function sleep(ms) {
|
|
846
|
+
return new Promise((resolve) => globalThis.setTimeout(resolve, ms));
|
|
847
|
+
}
|
|
848
|
+
async function sendTmuxSubmitSequence(target, attempts = 3) {
|
|
849
|
+
const totalAttempts = Math.max(1, Math.floor(attempts));
|
|
850
|
+
const delays = [180, 240, 320, 420];
|
|
851
|
+
for (let index = 0;index < totalAttempts; index += 1) {
|
|
852
|
+
const result = runTmux(["send-keys", "-t", target, "C-m"]);
|
|
853
|
+
if (!result.ok) {
|
|
854
|
+
return {
|
|
855
|
+
ok: false,
|
|
856
|
+
attempts: index + 1,
|
|
857
|
+
error: result.error
|
|
858
|
+
};
|
|
859
|
+
}
|
|
860
|
+
const delay = delays[index] ?? delays.at(-1) ?? 320;
|
|
861
|
+
await sleep(delay);
|
|
862
|
+
}
|
|
863
|
+
return {
|
|
864
|
+
ok: true,
|
|
865
|
+
attempts: totalAttempts
|
|
866
|
+
};
|
|
867
|
+
}
|
|
868
|
+
|
|
752
869
|
// src/omx/index.ts
|
|
870
|
+
var TURN_END_STATE_KEY = "last_turn_end_turn_id";
|
|
871
|
+
var TURN_END_PENDING_SKIP_KEY = "turn_end_pending_followup_scopes";
|
|
872
|
+
function parseWorkComplete(content) {
|
|
873
|
+
const result = {};
|
|
874
|
+
for (const line of content.split(`
|
|
875
|
+
`)) {
|
|
876
|
+
const trimmed = line.trim();
|
|
877
|
+
if (trimmed.startsWith("session_id=")) {
|
|
878
|
+
result.sessionId = trimmed.substring("session_id=".length).trim();
|
|
879
|
+
} else if (trimmed.startsWith("turn_id=")) {
|
|
880
|
+
result.turnId = trimmed.substring("turn_id=".length).trim();
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
return result;
|
|
884
|
+
}
|
|
885
|
+
function clearCurrentFollowupScope(pendingScopes, scopeKey) {
|
|
886
|
+
if (!scopeKey || !pendingScopes[scopeKey]) {
|
|
887
|
+
return pendingScopes;
|
|
888
|
+
}
|
|
889
|
+
const nextScopes = { ...pendingScopes };
|
|
890
|
+
delete nextScopes[scopeKey];
|
|
891
|
+
return nextScopes;
|
|
892
|
+
}
|
|
753
893
|
function resolveProjectDir(event) {
|
|
754
894
|
return event.context?.projectDir ?? event.context?.directory ?? process.cwd();
|
|
755
895
|
}
|
|
756
|
-
|
|
757
|
-
if (
|
|
896
|
+
function resolvePromptPath(directory, contextDir, promptPath) {
|
|
897
|
+
if (isAbsolute(promptPath))
|
|
898
|
+
return promptPath;
|
|
899
|
+
if (promptPath.startsWith(".context/") || promptPath.startsWith(".opencode/")) {
|
|
900
|
+
return join5(directory, promptPath);
|
|
901
|
+
}
|
|
902
|
+
return join5(directory, contextDir, promptPath);
|
|
903
|
+
}
|
|
904
|
+
function buildPromptVars(config) {
|
|
905
|
+
return { knowledgeDir: config.knowledge.dir ?? DEFAULTS.knowledgeDir };
|
|
906
|
+
}
|
|
907
|
+
function buildKnowledgeContent(projectDir, config) {
|
|
908
|
+
const knowledgeIndex = buildKnowledgeIndexV2(projectDir, config.knowledge);
|
|
909
|
+
return knowledgeIndex.mode === "flat" ? formatKnowledgeIndex(knowledgeIndex.individualFiles) : formatDomainIndex(knowledgeIndex);
|
|
910
|
+
}
|
|
911
|
+
function resolveFollowupScopeKey(event) {
|
|
912
|
+
if (event.session_id && event.session_id.trim().length > 0) {
|
|
913
|
+
return `session:${event.session_id.trim()}`;
|
|
914
|
+
}
|
|
915
|
+
if (event.thread_id && event.thread_id.trim().length > 0) {
|
|
916
|
+
return `thread:${event.thread_id.trim()}`;
|
|
917
|
+
}
|
|
918
|
+
return null;
|
|
919
|
+
}
|
|
920
|
+
async function logWarn(sdk, message, meta = {}) {
|
|
921
|
+
if (typeof sdk.log.warn === "function") {
|
|
922
|
+
await sdk.log.warn(message, meta);
|
|
758
923
|
return;
|
|
759
924
|
}
|
|
925
|
+
await sdk.log.info(message, meta);
|
|
926
|
+
}
|
|
927
|
+
async function onSessionStart(event, sdk) {
|
|
760
928
|
const projectDir = resolveProjectDir(event);
|
|
761
929
|
const contextDir = resolveContextDir(projectDir);
|
|
762
930
|
scaffoldIfNeeded(projectDir);
|
|
763
931
|
const config = loadConfig(projectDir);
|
|
764
|
-
const promptVars =
|
|
765
|
-
const turnStartPath =
|
|
932
|
+
const promptVars = buildPromptVars(config);
|
|
933
|
+
const turnStartPath = resolvePromptPath(projectDir, contextDir, config.prompts.turnStart ?? join5(DEFAULTS.promptDir, DEFAULTS.turnStartFile));
|
|
766
934
|
const turnStart = resolvePromptVariables(readPromptFile(turnStartPath), promptVars);
|
|
767
|
-
const
|
|
768
|
-
const indexContent = knowledgeIndex.mode === "flat" ? formatKnowledgeIndex(knowledgeIndex.individualFiles) : formatDomainIndex(knowledgeIndex);
|
|
935
|
+
const indexContent = buildKnowledgeContent(projectDir, config);
|
|
769
936
|
const combinedContent = [turnStart, indexContent].filter(Boolean).join(`
|
|
770
937
|
|
|
771
938
|
`);
|
|
@@ -775,6 +942,189 @@ async function onHookEvent(event, sdk) {
|
|
|
775
942
|
injectIntoAgentsMd(join5(projectDir, "AGENTS.md"), combinedContent);
|
|
776
943
|
await sdk.log.info(`Injected context into AGENTS.md for ${projectDir}`);
|
|
777
944
|
}
|
|
945
|
+
async function onTurnComplete(event, sdk) {
|
|
946
|
+
const projectDir = resolveProjectDir(event);
|
|
947
|
+
const contextDir = resolveContextDir(projectDir);
|
|
948
|
+
const config = loadConfig(projectDir);
|
|
949
|
+
const strategy = config.omx?.turnEnd?.strategy ?? "off";
|
|
950
|
+
if (strategy !== "turn-complete-sendkeys") {
|
|
951
|
+
return;
|
|
952
|
+
}
|
|
953
|
+
if (process.env.OMX_TEAM_WORKER) {
|
|
954
|
+
await logWarn(sdk, "turn_end_skipped_team_worker", {
|
|
955
|
+
event: event.event,
|
|
956
|
+
session_id: event.session_id,
|
|
957
|
+
turn_id: event.turn_id
|
|
958
|
+
});
|
|
959
|
+
return;
|
|
960
|
+
}
|
|
961
|
+
if (!event.turn_id) {
|
|
962
|
+
await logWarn(sdk, "turn_end_skipped_missing_turn_id", {
|
|
963
|
+
event: event.event,
|
|
964
|
+
session_id: event.session_id
|
|
965
|
+
});
|
|
966
|
+
return;
|
|
967
|
+
}
|
|
968
|
+
const followupScopeKey = resolveFollowupScopeKey(event);
|
|
969
|
+
let pendingFollowupScopes = typeof sdk.state?.read === "function" ? await sdk.state.read(TURN_END_PENDING_SKIP_KEY, {}) ?? {} : {};
|
|
970
|
+
const workCompleteFile = join5(projectDir, DEFAULTS.workCompleteFile);
|
|
971
|
+
if (existsSync5(workCompleteFile)) {
|
|
972
|
+
const content = readFileSync6(workCompleteFile, "utf-8");
|
|
973
|
+
const { sessionId: fileSessionId, turnId: fileTurnId } = parseWorkComplete(content);
|
|
974
|
+
const currentScopeId = event.session_id ?? event.thread_id ?? "";
|
|
975
|
+
if (!fileSessionId || fileSessionId === currentScopeId) {
|
|
976
|
+
pendingFollowupScopes = clearCurrentFollowupScope(pendingFollowupScopes, followupScopeKey);
|
|
977
|
+
if (fileTurnId === event.turn_id) {
|
|
978
|
+
if (typeof sdk.state?.write === "function") {
|
|
979
|
+
await sdk.state.write(TURN_END_PENDING_SKIP_KEY, pendingFollowupScopes);
|
|
980
|
+
}
|
|
981
|
+
await sdk.log.info("turn_end_skipped_work_complete", {
|
|
982
|
+
event: event.event,
|
|
983
|
+
session_id: event.session_id,
|
|
984
|
+
turn_id: event.turn_id
|
|
985
|
+
});
|
|
986
|
+
return;
|
|
987
|
+
}
|
|
988
|
+
unlinkSync(workCompleteFile);
|
|
989
|
+
if (typeof sdk.state?.write === "function") {
|
|
990
|
+
await sdk.state.write(TURN_END_PENDING_SKIP_KEY, pendingFollowupScopes);
|
|
991
|
+
}
|
|
992
|
+
await sdk.log.info("turn_end_work_complete_cleared", {
|
|
993
|
+
event: event.event,
|
|
994
|
+
session_id: event.session_id,
|
|
995
|
+
turn_id: event.turn_id,
|
|
996
|
+
cleared_turn_id: fileTurnId
|
|
997
|
+
});
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
if (followupScopeKey && pendingFollowupScopes[followupScopeKey]) {
|
|
1001
|
+
const nextPendingScopes = { ...pendingFollowupScopes };
|
|
1002
|
+
delete nextPendingScopes[followupScopeKey];
|
|
1003
|
+
if (typeof sdk.state?.write === "function") {
|
|
1004
|
+
await sdk.state.write(TURN_END_PENDING_SKIP_KEY, nextPendingScopes);
|
|
1005
|
+
}
|
|
1006
|
+
await sdk.log.info("turn_end_skipped_followup_turn", {
|
|
1007
|
+
event: event.event,
|
|
1008
|
+
session_id: event.session_id,
|
|
1009
|
+
thread_id: event.thread_id,
|
|
1010
|
+
turn_id: event.turn_id,
|
|
1011
|
+
scope_key: followupScopeKey
|
|
1012
|
+
});
|
|
1013
|
+
return;
|
|
1014
|
+
}
|
|
1015
|
+
const lastTurnID = typeof sdk.state?.read === "function" ? await sdk.state.read(TURN_END_STATE_KEY) : undefined;
|
|
1016
|
+
if (lastTurnID === event.turn_id) {
|
|
1017
|
+
await sdk.log.info("turn_end_skipped_duplicate_turn", {
|
|
1018
|
+
event: event.event,
|
|
1019
|
+
session_id: event.session_id,
|
|
1020
|
+
turn_id: event.turn_id
|
|
1021
|
+
});
|
|
1022
|
+
return;
|
|
1023
|
+
}
|
|
1024
|
+
const promptVars = {
|
|
1025
|
+
...buildPromptVars(config),
|
|
1026
|
+
sessionId: event.session_id ?? event.thread_id ?? "unknown",
|
|
1027
|
+
turnId: event.turn_id ?? ""
|
|
1028
|
+
};
|
|
1029
|
+
const turnEndPath = resolvePromptPath(projectDir, contextDir, config.prompts.turnEnd ?? join5(DEFAULTS.promptDir, DEFAULTS.turnEndFile));
|
|
1030
|
+
const turnEndRaw = readPromptFile(turnEndPath);
|
|
1031
|
+
if (!turnEndRaw) {
|
|
1032
|
+
await sdk.log.info("turn_end_skipped_empty_prompt", {
|
|
1033
|
+
event: event.event,
|
|
1034
|
+
session_id: event.session_id,
|
|
1035
|
+
turn_id: event.turn_id
|
|
1036
|
+
});
|
|
1037
|
+
return;
|
|
1038
|
+
}
|
|
1039
|
+
if (typeof sdk.tmux?.sendKeys !== "function") {
|
|
1040
|
+
await logWarn(sdk, "turn_end_sendkeys_failed", {
|
|
1041
|
+
event: event.event,
|
|
1042
|
+
session_id: event.session_id,
|
|
1043
|
+
turn_id: event.turn_id,
|
|
1044
|
+
reason: "tmux_sendkeys_unavailable"
|
|
1045
|
+
});
|
|
1046
|
+
return;
|
|
1047
|
+
}
|
|
1048
|
+
const turnEnd = resolvePromptVariables(turnEndRaw, promptVars);
|
|
1049
|
+
const reminderText = `<system-reminder>
|
|
1050
|
+
${turnEnd}
|
|
1051
|
+
</system-reminder>`;
|
|
1052
|
+
const sessionName = typeof event.context?.session_name === "string" && event.context.session_name.trim().length > 0 ? event.context.session_name.trim() : undefined;
|
|
1053
|
+
const result = await sdk.tmux.sendKeys({
|
|
1054
|
+
sessionName,
|
|
1055
|
+
text: reminderText,
|
|
1056
|
+
submit: false
|
|
1057
|
+
});
|
|
1058
|
+
if (!result.ok) {
|
|
1059
|
+
await logWarn(sdk, "turn_end_sendkeys_failed", {
|
|
1060
|
+
event: event.event,
|
|
1061
|
+
session_id: event.session_id,
|
|
1062
|
+
turn_id: event.turn_id,
|
|
1063
|
+
reason: result.reason,
|
|
1064
|
+
target: result.target,
|
|
1065
|
+
error: result.error
|
|
1066
|
+
});
|
|
1067
|
+
return;
|
|
1068
|
+
}
|
|
1069
|
+
const submitTarget = result.paneId ?? result.target;
|
|
1070
|
+
if (!submitTarget) {
|
|
1071
|
+
await logWarn(sdk, "turn_end_sendkeys_failed", {
|
|
1072
|
+
event: event.event,
|
|
1073
|
+
session_id: event.session_id,
|
|
1074
|
+
turn_id: event.turn_id,
|
|
1075
|
+
reason: "missing_submit_target"
|
|
1076
|
+
});
|
|
1077
|
+
return;
|
|
1078
|
+
}
|
|
1079
|
+
const submitResult = await sendTmuxSubmitSequence(submitTarget);
|
|
1080
|
+
if (!submitResult.ok) {
|
|
1081
|
+
await logWarn(sdk, "turn_end_sendkeys_failed", {
|
|
1082
|
+
event: event.event,
|
|
1083
|
+
session_id: event.session_id,
|
|
1084
|
+
turn_id: event.turn_id,
|
|
1085
|
+
reason: "submit_sequence_failed",
|
|
1086
|
+
target: submitTarget,
|
|
1087
|
+
error: submitResult.error,
|
|
1088
|
+
submit_attempts: submitResult.attempts
|
|
1089
|
+
});
|
|
1090
|
+
return;
|
|
1091
|
+
}
|
|
1092
|
+
if (typeof sdk.state?.write === "function") {
|
|
1093
|
+
await sdk.state.write(TURN_END_STATE_KEY, event.turn_id);
|
|
1094
|
+
if (followupScopeKey) {
|
|
1095
|
+
await sdk.state.write(TURN_END_PENDING_SKIP_KEY, {
|
|
1096
|
+
...pendingFollowupScopes,
|
|
1097
|
+
[followupScopeKey]: {
|
|
1098
|
+
sourceTurnId: event.turn_id,
|
|
1099
|
+
createdAt: Date.now()
|
|
1100
|
+
}
|
|
1101
|
+
});
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
await sdk.log.info("turn_end_submit_sequence_sent", {
|
|
1105
|
+
event: event.event,
|
|
1106
|
+
session_id: event.session_id,
|
|
1107
|
+
turn_id: event.turn_id,
|
|
1108
|
+
target: submitTarget,
|
|
1109
|
+
submit_attempts: submitResult.attempts
|
|
1110
|
+
});
|
|
1111
|
+
await sdk.log.info("turn_end_sent", {
|
|
1112
|
+
event: event.event,
|
|
1113
|
+
session_id: event.session_id,
|
|
1114
|
+
turn_id: event.turn_id,
|
|
1115
|
+
target: result.target,
|
|
1116
|
+
pane_id: result.paneId
|
|
1117
|
+
});
|
|
1118
|
+
}
|
|
1119
|
+
async function onHookEvent(event, sdk) {
|
|
1120
|
+
if (event.event === "session-start") {
|
|
1121
|
+
await onSessionStart(event, sdk);
|
|
1122
|
+
return;
|
|
1123
|
+
}
|
|
1124
|
+
if (event.event === "turn-complete") {
|
|
1125
|
+
await onTurnComplete(event, sdk);
|
|
1126
|
+
}
|
|
1127
|
+
}
|
|
778
1128
|
export {
|
|
779
1129
|
onHookEvent
|
|
780
1130
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ksm0709/context",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.21",
|
|
4
4
|
"author": {
|
|
5
5
|
"name": "TaehoKang",
|
|
6
6
|
"email": "ksm07091@gmail.com"
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"type": "module",
|
|
9
9
|
"main": "./dist/index.js",
|
|
10
10
|
"bin": {
|
|
11
|
-
"context": "
|
|
11
|
+
"context": "dist/cli/index.js"
|
|
12
12
|
},
|
|
13
13
|
"exports": {
|
|
14
14
|
".": {
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
},
|
|
25
25
|
"repository": {
|
|
26
26
|
"type": "git",
|
|
27
|
-
"url": "git@github.com
|
|
27
|
+
"url": "git+ssh://git@github.com/ksm0709/context.git"
|
|
28
28
|
},
|
|
29
29
|
"publishConfig": {
|
|
30
30
|
"access": "public"
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
"@opencode-ai/plugin": ">=1.0.0"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
+
"@ksm0709/context": "^0.0.20",
|
|
45
46
|
"jsonc-parser": "^3.0.0"
|
|
46
47
|
},
|
|
47
48
|
"devDependencies": {
|