@ksm0709/context 0.0.20 → 0.0.22
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 +99 -42
- package/dist/index.js +164 -60
- package/dist/omx/index.mjs +173 -46
- package/package.json +2 -1
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.22",
|
|
52
54
|
author: {
|
|
53
55
|
name: "TaehoKang",
|
|
54
56
|
email: "ksm07091@gmail.com"
|
|
@@ -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.21",
|
|
93
96
|
"jsonc-parser": "^3.0.0"
|
|
94
97
|
},
|
|
95
98
|
devDependencies: {
|
|
@@ -119,7 +122,7 @@ var DEFAULT_CONFIG = `{
|
|
|
119
122
|
"turnEnd": "prompts/turn-end.md"
|
|
120
123
|
},
|
|
121
124
|
"knowledge": {
|
|
122
|
-
"dir": "
|
|
125
|
+
"dir": ".context/memory",
|
|
123
126
|
"sources": ["AGENTS.md"]
|
|
124
127
|
},
|
|
125
128
|
"omx": {
|
|
@@ -142,6 +145,8 @@ var DEFAULT_TURN_START = `## Knowledge Context
|
|
|
142
145
|
|
|
143
146
|
### \uC791\uC5C5 \uC804 \uD544\uC218
|
|
144
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)
|
|
145
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
|
|
146
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
|
|
147
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
|
|
@@ -160,43 +165,19 @@ var DEFAULT_TURN_START = `## Knowledge Context
|
|
|
160
165
|
- \uC9C0\uC2DD \uB178\uD2B8\uC758 \uACB0\uC815\uC0AC\uD56D > \uC77C\uBC18\uC801 \uAD00\uD589
|
|
161
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
|
|
162
167
|
`;
|
|
163
|
-
var DEFAULT_TURN_END = `## \uC791\uC5C5 \
|
|
164
|
-
|
|
165
|
-
\
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
- \
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
- \uC791\uC5C5\uC774 \
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
\uC791\uC5C5 \uC911 \uAE30\uB85D\uD560 \uB9CC\uD55C \uBC1C\uACAC\uC774 \uC788\uC5C8\uB2E4\uBA74 \uC9C1\uC811 \uC815\uB9AC\uD558\uC138\uC694.
|
|
178
|
-
|
|
179
|
-
**\uAE30\uB85D \uB300\uC0C1 \uD310\uB2E8 \uAE30\uC900:**
|
|
180
|
-
|
|
181
|
-
| \uC0C1\uD669 | \uD15C\uD50C\uB9BF | \uD30C\uC77C\uBA85 \uD328\uD134 |
|
|
182
|
-
| ------------------------------- | --------------------------------------------------- | --------------------------- |
|
|
183
|
-
| \uC544\uD0A4\uD14D\uCC98/\uAE30\uC220 \uC2A4\uD0DD \uC911\uB300 \uACB0\uC815 | [ADR](.context/templates/adr.md) | \`adr-NNN-\uC81C\uBAA9.md\` |
|
|
184
|
-
| \uBC18\uBCF5 \uC0AC\uC6A9\uD560 \uCF54\uB4DC \uD328\uD134 \uBC1C\uACAC | [Pattern](.context/templates/pattern.md) | \`pattern-\uC81C\uBAA9.md\` |
|
|
185
|
-
| \uBE44\uC790\uBA85\uD55C \uBC84\uADF8 \uD574\uACB0 | [Bug](.context/templates/bug.md) | \`bug-\uC81C\uBAA9.md\` |
|
|
186
|
-
| \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\` |
|
|
187
|
-
| \uC791\uC740 \uAE30\uC220\uC801 \uC120\uD0DD | [Decision](.context/templates/decision.md) | \`decision-\uC81C\uBAA9.md\` |
|
|
188
|
-
| \uBAA8\uB4C8/\uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694 \uD544\uC694 | [Context](.context/templates/context.md) | \`context-\uC81C\uBAA9.md\` |
|
|
189
|
-
| \uBC18\uBCF5 \uAC00\uB2A5\uD55C \uD504\uB85C\uC138\uC2A4 \uC815\uB9BD | [Runbook](.context/templates/runbook.md) | \`runbook-\uC81C\uBAA9.md\` |
|
|
190
|
-
| \uC2E4\uD5D8/\uB514\uBC84\uAE45 \uC911 \uD559\uC2B5 | [Insight](.context/templates/insight.md) | \`insight-\uC81C\uBAA9.md\` |
|
|
191
|
-
|
|
192
|
-
\uD574\uB2F9 \uC0AC\uD56D\uC774 \uC5C6\uC73C\uBA74 \uC774 \uB2E8\uACC4\uB294 \uAC74\uB108\uB6F0\uC138\uC694.
|
|
193
|
-
|
|
194
|
-
- \uAD00\uB828 \uD15C\uD50C\uB9BF \uD30C\uC77C\uC744 \uC77D\uACE0 \uADF8 \uAD6C\uC870\uC5D0 \uB9DE\uCDB0 \uB0B4\uC6A9\uC744 \uC815\uB9AC\uD558\uC138\uC694
|
|
195
|
-
- \uB178\uD2B8 \uCCAB \uC904\uC740 \uBA85\uD655\uD55C \uC81C\uBAA9(\`# Title\`)\uC73C\uB85C \uC2DC\uC791\uD558\uC138\uC694
|
|
196
|
-
- \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
|
|
197
|
-
- 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
|
|
198
|
-
|
|
199
|
-
\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
|
+
\uC774 \uC9C0\uCE68\uC740 \uC5D0\uC774\uC804\uD2B8\uB97C \uC704\uD55C \uAC83\uC774\uBA70, \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC9C1\uC811\uC801\uC73C\uB85C \uB178\uCD9C\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
|
|
170
|
+
\uC544\uB798 \uBA54\uB274 \uC911 \uD558\uB098\uB97C \uC120\uD0DD\uD574 \uC9C4\uD589 \uC0C1\uD669\uC5D0 \uB9DE\uAC8C \uC218\uD589\uD558\uC138\uC694.
|
|
171
|
+
**\uBC18\uB4DC\uC2DC \uB9C1\uD06C\uB41C \uAC00\uC774\uB4DC\uB97C \uCC38\uACE0\uD558\uC5EC \uC815\uD655\uD788 \uC218\uD589\uD574\uC57C \uD569\uB2C8\uB2E4.**
|
|
172
|
+
|
|
173
|
+
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.
|
|
174
|
+
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.
|
|
175
|
+
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.
|
|
176
|
+
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.
|
|
177
|
+
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.
|
|
178
|
+
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.
|
|
179
|
+
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.
|
|
180
|
+
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.
|
|
200
181
|
`;
|
|
201
182
|
var DEFAULT_ADR_TEMPLATE = `# ADR-NNN: [\uC81C\uBAA9]
|
|
202
183
|
|
|
@@ -404,6 +385,78 @@ Overview: [1-2 sentence description of this domain]
|
|
|
404
385
|
|
|
405
386
|
- [[../other-domain/INDEX.md]] -- Description
|
|
406
387
|
`;
|
|
388
|
+
var DEFAULT_WORK_COMPLETE_TEMPLATE = `timestamp={{currentTimestamp}}
|
|
389
|
+
session_id={{sessionId}}
|
|
390
|
+
turn_id={{turnId}}
|
|
391
|
+
`;
|
|
392
|
+
var DEFAULT_DAILY_NOTE_GUIDE = `# \uB370\uC77C\uB9AC \uB178\uD2B8 \uAE30\uB85D \uAC00\uC774\uB4DC
|
|
393
|
+
|
|
394
|
+
- [ ] \`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.
|
|
395
|
+
- [ ] **\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.
|
|
396
|
+
- [ ] \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:
|
|
397
|
+
\`[{{currentTimestamp}}] <\uAE30\uC5B5 \uD560 \uB0B4\uC6A9>\`
|
|
398
|
+
- [ ] \`<\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.`;
|
|
399
|
+
var DEFAULT_NOTE_GUIDE = `# \uC9C0\uC2DD \uB178\uD2B8 \uC791\uC131 \uBC0F \uAD00\uB9AC \uAC00\uC774\uB4DC
|
|
400
|
+
|
|
401
|
+
- [ ] \uC81C\uD154\uCE74\uC2A4\uD150(Zettelkasten) 3\uB300 \uC6D0\uCE59 \uC900\uC218:
|
|
402
|
+
- [ ] \uC6D0\uC790\uC131: \uD55C \uB178\uD2B8\uB2F9 \uD55C \uC8FC\uC81C
|
|
403
|
+
- [ ] \uC5F0\uACB0: \uACE0\uB9BD\uB41C \uB178\uD2B8 \uBC29\uC9C0
|
|
404
|
+
- [ ] \uC790\uAE30 \uC5B8\uC5B4 \uC11C\uC220: \uD575\uC2EC\uC744 \uC774\uD574\uD558\uACE0 \uAC04\uACB0\uD558\uAC8C \uC11C\uC220
|
|
405
|
+
- [ ] **\uAE30\uB85D \uB300\uC0C1 \uD310\uB2E8 \uAE30\uC900:**
|
|
406
|
+
|
|
407
|
+
| \uC0C1\uD669 | \uD15C\uD50C\uB9BF | \uD30C\uC77C\uBA85 \uD328\uD134 |
|
|
408
|
+
| --- | --- | --- |
|
|
409
|
+
| \uC544\uD0A4\uD14D\uCC98/\uAE30\uC220 \uC2A4\uD0DD \uC911\uB300 \uACB0\uC815 | \`.context/templates/adr.md\` | \`adr-NNN-\uC81C\uBAA9.md\` |
|
|
410
|
+
| \uBC18\uBCF5 \uC0AC\uC6A9\uD560 \uCF54\uB4DC \uD328\uD134 \uBC1C\uACAC | \`.context/templates/pattern.md\` | \`pattern-\uC81C\uBAA9.md\` |
|
|
411
|
+
| \uBE44\uC790\uBA85\uD55C \uBC84\uADF8 \uD574\uACB0 | \`.context/templates/bug.md\` | \`bug-\uC81C\uBAA9.md\` |
|
|
412
|
+
| \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\` |
|
|
413
|
+
| \uC791\uC740 \uAE30\uC220\uC801 \uC120\uD0DD | \`.context/templates/decision.md\` | \`decision-\uC81C\uBAA9.md\` |
|
|
414
|
+
| \uBAA8\uB4C8/\uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694 \uD544\uC694 | \`.context/templates/context.md\` | \`context-\uC81C\uBAA9.md\` |
|
|
415
|
+
| \uBC18\uBCF5 \uAC00\uB2A5\uD55C \uD504\uB85C\uC138\uC2A4 \uC815\uB9BD | \`.context/templates/runbook.md\` | \`runbook-\uC81C\uBAA9.md\` |
|
|
416
|
+
| \uC2E4\uD5D8/\uB514\uBC84\uAE45 \uC911 \uD559\uC2B5 | \`.context/templates/insight.md\` | \`insight-\uC81C\uBAA9.md\` |
|
|
417
|
+
|
|
418
|
+
- [ ] \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.
|
|
419
|
+
- [ ] **\uC9C0\uC2DD \uC815\uB9AC \uBC0F \uC720\uC9C0\uBCF4\uC218 \uC6CC\uD06C\uD50C\uB85C\uC6B0:**
|
|
420
|
+
- [ ] **\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.
|
|
421
|
+
- [ ] **\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.
|
|
422
|
+
- [ ] **\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.`;
|
|
423
|
+
var DEFAULT_SEARCH_GUIDE = `# \uB178\uD2B8/\uC2A4\uD0AC \uAC80\uC0C9 \uBC0F \uC77D\uAE30 \uAC00\uC774\uB4DC
|
|
424
|
+
|
|
425
|
+
- [ ] \uAD00\uB828 \uD0A4\uC6CC\uB4DC \uAC80\uC0C9
|
|
426
|
+
- [ ] INDEX.md \uD655\uC778
|
|
427
|
+
- [ ] \uAD00\uB828 \uB178\uD2B8 \uD0D0\uC0C9`;
|
|
428
|
+
var DEFAULT_QUALITY_CHECK_GUIDE = `# \uD004\uB9AC\uD2F0 \uAC80\uC99D \uAC00\uC774\uB4DC
|
|
429
|
+
|
|
430
|
+
- [ ] Lint/Format \uD655\uC778
|
|
431
|
+
- [ ] \uD14C\uC2A4\uD2B8 \uC2E4\uD589
|
|
432
|
+
- [ ] \uBE4C\uB4DC \uD655\uC778
|
|
433
|
+
- [ ] \uCF54\uB4DC \uB9AC\uBDF0 \uC694\uCCAD \uBC0F \uD1B5\uACFC`;
|
|
434
|
+
var DEFAULT_SCOPE_REVIEW_GUIDE = `# \uC791\uC5C5 \uACBD\uB85C \uB9AC\uBDF0 \uAC00\uC774\uB4DC
|
|
435
|
+
|
|
436
|
+
- [ ] \uD604\uC7AC \uC791\uC5C5 \uBC94\uC704 \uD655\uC778
|
|
437
|
+
- [ ] \uC2A4\uCF54\uD504 \uC774\uD0C8 \uC5EC\uBD80 \uAC80\uD1A0`;
|
|
438
|
+
var DEFAULT_COMMIT_GUIDE = `# \uCCB4\uD06C\uD3EC\uC778\uD2B8 \uCEE4\uBC0B \uAC00\uC774\uB4DC
|
|
439
|
+
|
|
440
|
+
- [ ] \uC791\uC5C5 \uB0B4\uC6A9 \uC2A4\uD14C\uC774\uC9D5
|
|
441
|
+
- [ ] \uC6D0\uC790\uC801 \uCEE4\uBC0B \uBA54\uC2DC\uC9C0 \uC791\uC131`;
|
|
442
|
+
var DEFAULT_COMPLETE_GUIDE = `# \uC791\uC5C5 \uC644\uB8CC \uAC00\uC774\uB4DC
|
|
443
|
+
|
|
444
|
+
- [ ] \uBAA8\uB4E0 \uCEE4\uBC0B \uBC0F \uD478\uC2DC \uC791\uC5C5 \uC644\uB8CC \uD6C4 \uC218\uD589\uD558\uC138\uC694.
|
|
445
|
+
- [ ] \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8\uC5D0 \`.context/.work-complete\` \uD30C\uC77C\uC744 \uC0DD\uC131\uD558\uAC70\uB098 \uB36E\uC5B4\uC4F0\uC138\uC694.
|
|
446
|
+
- [ ] \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):
|
|
447
|
+
timestamp={{currentTimestamp}}
|
|
448
|
+
session_id={{sessionId}}
|
|
449
|
+
turn_id={{turnId}}
|
|
450
|
+
- [ ] \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.`;
|
|
451
|
+
var GUIDE_FILES = {
|
|
452
|
+
"daily-note-guide.md": DEFAULT_DAILY_NOTE_GUIDE,
|
|
453
|
+
"note-guide.md": DEFAULT_NOTE_GUIDE,
|
|
454
|
+
"search-guide.md": DEFAULT_SEARCH_GUIDE,
|
|
455
|
+
"quality-check.md": DEFAULT_QUALITY_CHECK_GUIDE,
|
|
456
|
+
"scope-review.md": DEFAULT_SCOPE_REVIEW_GUIDE,
|
|
457
|
+
"commit-guide.md": DEFAULT_COMMIT_GUIDE,
|
|
458
|
+
"complete-guide.md": DEFAULT_COMPLETE_GUIDE
|
|
459
|
+
};
|
|
407
460
|
var TEMPLATE_FILES = {
|
|
408
461
|
"adr.md": DEFAULT_ADR_TEMPLATE,
|
|
409
462
|
"pattern.md": DEFAULT_PATTERN_TEMPLATE,
|
|
@@ -413,18 +466,22 @@ var TEMPLATE_FILES = {
|
|
|
413
466
|
"context.md": DEFAULT_CONTEXT_TEMPLATE,
|
|
414
467
|
"runbook.md": DEFAULT_RUNBOOK_TEMPLATE,
|
|
415
468
|
"insight.md": DEFAULT_INSIGHT_TEMPLATE,
|
|
416
|
-
"index.md": DEFAULT_INDEX_TEMPLATE
|
|
469
|
+
"index.md": DEFAULT_INDEX_TEMPLATE,
|
|
470
|
+
"work-complete.txt": DEFAULT_WORK_COMPLETE_TEMPLATE
|
|
417
471
|
};
|
|
418
472
|
function updateScaffold(projectDir) {
|
|
419
473
|
const contextDir = join2(projectDir, resolveContextDir(projectDir));
|
|
420
474
|
mkdirSync(join2(contextDir, "prompts"), { recursive: true });
|
|
421
475
|
mkdirSync(join2(contextDir, "templates"), { recursive: true });
|
|
476
|
+
mkdirSync(join2(contextDir, "guides"), { recursive: true });
|
|
422
477
|
const templateEntries = Object.fromEntries(Object.entries(TEMPLATE_FILES).map(([filename, content]) => [`templates/${filename}`, content]));
|
|
478
|
+
const guideEntries = Object.fromEntries(Object.entries(GUIDE_FILES).map(([filename, content]) => [`guides/${filename}`, content]));
|
|
423
479
|
const templates = {
|
|
424
480
|
"config.jsonc": DEFAULT_CONFIG,
|
|
425
481
|
[`prompts/${DEFAULTS.turnStartFile}`]: DEFAULT_TURN_START,
|
|
426
482
|
[`prompts/${DEFAULTS.turnEndFile}`]: DEFAULT_TURN_END,
|
|
427
|
-
...templateEntries
|
|
483
|
+
...templateEntries,
|
|
484
|
+
...guideEntries
|
|
428
485
|
};
|
|
429
486
|
const updated = [];
|
|
430
487
|
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,
|
|
@@ -1114,7 +1117,10 @@ function readPromptFile(filePath) {
|
|
|
1114
1117
|
}
|
|
1115
1118
|
function resolvePromptVariables(content, vars) {
|
|
1116
1119
|
const normalized = (vars.knowledgeDir || "docs").replace(/\\/g, "/").replace(/\/+$/, "");
|
|
1117
|
-
|
|
1120
|
+
let resolved = content.replaceAll("{{knowledgeDir}}", normalized);
|
|
1121
|
+
resolved = resolved.replaceAll("{{sessionId}}", vars.sessionId ?? "");
|
|
1122
|
+
resolved = resolved.replaceAll("{{turnId}}", vars.turnId ?? "");
|
|
1123
|
+
return resolved;
|
|
1118
1124
|
}
|
|
1119
1125
|
|
|
1120
1126
|
// src/lib/scaffold.ts
|
|
@@ -1123,7 +1129,7 @@ import { join as join4 } from "path";
|
|
|
1123
1129
|
// package.json
|
|
1124
1130
|
var package_default = {
|
|
1125
1131
|
name: "@ksm0709/context",
|
|
1126
|
-
version: "0.0.
|
|
1132
|
+
version: "0.0.22",
|
|
1127
1133
|
author: {
|
|
1128
1134
|
name: "TaehoKang",
|
|
1129
1135
|
email: "ksm07091@gmail.com"
|
|
@@ -1165,6 +1171,7 @@ var package_default = {
|
|
|
1165
1171
|
"@opencode-ai/plugin": ">=1.0.0"
|
|
1166
1172
|
},
|
|
1167
1173
|
dependencies: {
|
|
1174
|
+
"@ksm0709/context": "^0.0.21",
|
|
1168
1175
|
"jsonc-parser": "^3.0.0"
|
|
1169
1176
|
},
|
|
1170
1177
|
devDependencies: {
|
|
@@ -1194,7 +1201,7 @@ var DEFAULT_CONFIG = `{
|
|
|
1194
1201
|
"turnEnd": "prompts/turn-end.md"
|
|
1195
1202
|
},
|
|
1196
1203
|
"knowledge": {
|
|
1197
|
-
"dir": "
|
|
1204
|
+
"dir": ".context/memory",
|
|
1198
1205
|
"sources": ["AGENTS.md"]
|
|
1199
1206
|
},
|
|
1200
1207
|
"omx": {
|
|
@@ -1217,6 +1224,8 @@ var DEFAULT_TURN_START = `## Knowledge Context
|
|
|
1217
1224
|
|
|
1218
1225
|
### \uC791\uC5C5 \uC804 \uD544\uC218
|
|
1219
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)
|
|
1220
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
|
|
1221
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
|
|
1222
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
|
|
@@ -1235,43 +1244,19 @@ var DEFAULT_TURN_START = `## Knowledge Context
|
|
|
1235
1244
|
- \uC9C0\uC2DD \uB178\uD2B8\uC758 \uACB0\uC815\uC0AC\uD56D > \uC77C\uBC18\uC801 \uAD00\uD589
|
|
1236
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
|
|
1237
1246
|
`;
|
|
1238
|
-
var DEFAULT_TURN_END = `## \uC791\uC5C5 \
|
|
1239
|
-
|
|
1240
|
-
\
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
- \
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
- \uC791\uC5C5\uC774 \
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
\uC791\uC5C5 \uC911 \uAE30\uB85D\uD560 \uB9CC\uD55C \uBC1C\uACAC\uC774 \uC788\uC5C8\uB2E4\uBA74 \uC9C1\uC811 \uC815\uB9AC\uD558\uC138\uC694.
|
|
1253
|
-
|
|
1254
|
-
**\uAE30\uB85D \uB300\uC0C1 \uD310\uB2E8 \uAE30\uC900:**
|
|
1255
|
-
|
|
1256
|
-
| \uC0C1\uD669 | \uD15C\uD50C\uB9BF | \uD30C\uC77C\uBA85 \uD328\uD134 |
|
|
1257
|
-
| ------------------------------- | --------------------------------------------------- | --------------------------- |
|
|
1258
|
-
| \uC544\uD0A4\uD14D\uCC98/\uAE30\uC220 \uC2A4\uD0DD \uC911\uB300 \uACB0\uC815 | [ADR](.context/templates/adr.md) | \`adr-NNN-\uC81C\uBAA9.md\` |
|
|
1259
|
-
| \uBC18\uBCF5 \uC0AC\uC6A9\uD560 \uCF54\uB4DC \uD328\uD134 \uBC1C\uACAC | [Pattern](.context/templates/pattern.md) | \`pattern-\uC81C\uBAA9.md\` |
|
|
1260
|
-
| \uBE44\uC790\uBA85\uD55C \uBC84\uADF8 \uD574\uACB0 | [Bug](.context/templates/bug.md) | \`bug-\uC81C\uBAA9.md\` |
|
|
1261
|
-
| \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\` |
|
|
1262
|
-
| \uC791\uC740 \uAE30\uC220\uC801 \uC120\uD0DD | [Decision](.context/templates/decision.md) | \`decision-\uC81C\uBAA9.md\` |
|
|
1263
|
-
| \uBAA8\uB4C8/\uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694 \uD544\uC694 | [Context](.context/templates/context.md) | \`context-\uC81C\uBAA9.md\` |
|
|
1264
|
-
| \uBC18\uBCF5 \uAC00\uB2A5\uD55C \uD504\uB85C\uC138\uC2A4 \uC815\uB9BD | [Runbook](.context/templates/runbook.md) | \`runbook-\uC81C\uBAA9.md\` |
|
|
1265
|
-
| \uC2E4\uD5D8/\uB514\uBC84\uAE45 \uC911 \uD559\uC2B5 | [Insight](.context/templates/insight.md) | \`insight-\uC81C\uBAA9.md\` |
|
|
1266
|
-
|
|
1267
|
-
\uD574\uB2F9 \uC0AC\uD56D\uC774 \uC5C6\uC73C\uBA74 \uC774 \uB2E8\uACC4\uB294 \uAC74\uB108\uB6F0\uC138\uC694.
|
|
1268
|
-
|
|
1269
|
-
- \uAD00\uB828 \uD15C\uD50C\uB9BF \uD30C\uC77C\uC744 \uC77D\uACE0 \uADF8 \uAD6C\uC870\uC5D0 \uB9DE\uCDB0 \uB0B4\uC6A9\uC744 \uC815\uB9AC\uD558\uC138\uC694
|
|
1270
|
-
- \uB178\uD2B8 \uCCAB \uC904\uC740 \uBA85\uD655\uD55C \uC81C\uBAA9(\`# Title\`)\uC73C\uB85C \uC2DC\uC791\uD558\uC138\uC694
|
|
1271
|
-
- \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
|
|
1272
|
-
- 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
|
|
1273
|
-
|
|
1274
|
-
\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
|
+
\uC774 \uC9C0\uCE68\uC740 \uC5D0\uC774\uC804\uD2B8\uB97C \uC704\uD55C \uAC83\uC774\uBA70, \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uC9C1\uC811\uC801\uC73C\uB85C \uB178\uCD9C\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
|
|
1249
|
+
\uC544\uB798 \uBA54\uB274 \uC911 \uD558\uB098\uB97C \uC120\uD0DD\uD574 \uC9C4\uD589 \uC0C1\uD669\uC5D0 \uB9DE\uAC8C \uC218\uD589\uD558\uC138\uC694.
|
|
1250
|
+
**\uBC18\uB4DC\uC2DC \uB9C1\uD06C\uB41C \uAC00\uC774\uB4DC\uB97C \uCC38\uACE0\uD558\uC5EC \uC815\uD655\uD788 \uC218\uD589\uD574\uC57C \uD569\uB2C8\uB2E4.**
|
|
1251
|
+
|
|
1252
|
+
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.
|
|
1253
|
+
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.
|
|
1254
|
+
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.
|
|
1255
|
+
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.
|
|
1256
|
+
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.
|
|
1257
|
+
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.
|
|
1258
|
+
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.
|
|
1259
|
+
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.
|
|
1275
1260
|
`;
|
|
1276
1261
|
var DEFAULT_ADR_TEMPLATE = `# ADR-NNN: [\uC81C\uBAA9]
|
|
1277
1262
|
|
|
@@ -1479,6 +1464,78 @@ Overview: [1-2 sentence description of this domain]
|
|
|
1479
1464
|
|
|
1480
1465
|
- [[../other-domain/INDEX.md]] -- Description
|
|
1481
1466
|
`;
|
|
1467
|
+
var DEFAULT_WORK_COMPLETE_TEMPLATE = `timestamp={{currentTimestamp}}
|
|
1468
|
+
session_id={{sessionId}}
|
|
1469
|
+
turn_id={{turnId}}
|
|
1470
|
+
`;
|
|
1471
|
+
var DEFAULT_DAILY_NOTE_GUIDE = `# \uB370\uC77C\uB9AC \uB178\uD2B8 \uAE30\uB85D \uAC00\uC774\uB4DC
|
|
1472
|
+
|
|
1473
|
+
- [ ] \`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.
|
|
1474
|
+
- [ ] **\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.
|
|
1475
|
+
- [ ] \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:
|
|
1476
|
+
\`[{{currentTimestamp}}] <\uAE30\uC5B5 \uD560 \uB0B4\uC6A9>\`
|
|
1477
|
+
- [ ] \`<\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.`;
|
|
1478
|
+
var DEFAULT_NOTE_GUIDE = `# \uC9C0\uC2DD \uB178\uD2B8 \uC791\uC131 \uBC0F \uAD00\uB9AC \uAC00\uC774\uB4DC
|
|
1479
|
+
|
|
1480
|
+
- [ ] \uC81C\uD154\uCE74\uC2A4\uD150(Zettelkasten) 3\uB300 \uC6D0\uCE59 \uC900\uC218:
|
|
1481
|
+
- [ ] \uC6D0\uC790\uC131: \uD55C \uB178\uD2B8\uB2F9 \uD55C \uC8FC\uC81C
|
|
1482
|
+
- [ ] \uC5F0\uACB0: \uACE0\uB9BD\uB41C \uB178\uD2B8 \uBC29\uC9C0
|
|
1483
|
+
- [ ] \uC790\uAE30 \uC5B8\uC5B4 \uC11C\uC220: \uD575\uC2EC\uC744 \uC774\uD574\uD558\uACE0 \uAC04\uACB0\uD558\uAC8C \uC11C\uC220
|
|
1484
|
+
- [ ] **\uAE30\uB85D \uB300\uC0C1 \uD310\uB2E8 \uAE30\uC900:**
|
|
1485
|
+
|
|
1486
|
+
| \uC0C1\uD669 | \uD15C\uD50C\uB9BF | \uD30C\uC77C\uBA85 \uD328\uD134 |
|
|
1487
|
+
| --- | --- | --- |
|
|
1488
|
+
| \uC544\uD0A4\uD14D\uCC98/\uAE30\uC220 \uC2A4\uD0DD \uC911\uB300 \uACB0\uC815 | \`.context/templates/adr.md\` | \`adr-NNN-\uC81C\uBAA9.md\` |
|
|
1489
|
+
| \uBC18\uBCF5 \uC0AC\uC6A9\uD560 \uCF54\uB4DC \uD328\uD134 \uBC1C\uACAC | \`.context/templates/pattern.md\` | \`pattern-\uC81C\uBAA9.md\` |
|
|
1490
|
+
| \uBE44\uC790\uBA85\uD55C \uBC84\uADF8 \uD574\uACB0 | \`.context/templates/bug.md\` | \`bug-\uC81C\uBAA9.md\` |
|
|
1491
|
+
| \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\` |
|
|
1492
|
+
| \uC791\uC740 \uAE30\uC220\uC801 \uC120\uD0DD | \`.context/templates/decision.md\` | \`decision-\uC81C\uBAA9.md\` |
|
|
1493
|
+
| \uBAA8\uB4C8/\uD504\uB85C\uC81D\uD2B8 \uAC1C\uC694 \uD544\uC694 | \`.context/templates/context.md\` | \`context-\uC81C\uBAA9.md\` |
|
|
1494
|
+
| \uBC18\uBCF5 \uAC00\uB2A5\uD55C \uD504\uB85C\uC138\uC2A4 \uC815\uB9BD | \`.context/templates/runbook.md\` | \`runbook-\uC81C\uBAA9.md\` |
|
|
1495
|
+
| \uC2E4\uD5D8/\uB514\uBC84\uAE45 \uC911 \uD559\uC2B5 | \`.context/templates/insight.md\` | \`insight-\uC81C\uBAA9.md\` |
|
|
1496
|
+
|
|
1497
|
+
- [ ] \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.
|
|
1498
|
+
- [ ] **\uC9C0\uC2DD \uC815\uB9AC \uBC0F \uC720\uC9C0\uBCF4\uC218 \uC6CC\uD06C\uD50C\uB85C\uC6B0:**
|
|
1499
|
+
- [ ] **\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.
|
|
1500
|
+
- [ ] **\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.
|
|
1501
|
+
- [ ] **\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.`;
|
|
1502
|
+
var DEFAULT_SEARCH_GUIDE = `# \uB178\uD2B8/\uC2A4\uD0AC \uAC80\uC0C9 \uBC0F \uC77D\uAE30 \uAC00\uC774\uB4DC
|
|
1503
|
+
|
|
1504
|
+
- [ ] \uAD00\uB828 \uD0A4\uC6CC\uB4DC \uAC80\uC0C9
|
|
1505
|
+
- [ ] INDEX.md \uD655\uC778
|
|
1506
|
+
- [ ] \uAD00\uB828 \uB178\uD2B8 \uD0D0\uC0C9`;
|
|
1507
|
+
var DEFAULT_QUALITY_CHECK_GUIDE = `# \uD004\uB9AC\uD2F0 \uAC80\uC99D \uAC00\uC774\uB4DC
|
|
1508
|
+
|
|
1509
|
+
- [ ] Lint/Format \uD655\uC778
|
|
1510
|
+
- [ ] \uD14C\uC2A4\uD2B8 \uC2E4\uD589
|
|
1511
|
+
- [ ] \uBE4C\uB4DC \uD655\uC778
|
|
1512
|
+
- [ ] \uCF54\uB4DC \uB9AC\uBDF0 \uC694\uCCAD \uBC0F \uD1B5\uACFC`;
|
|
1513
|
+
var DEFAULT_SCOPE_REVIEW_GUIDE = `# \uC791\uC5C5 \uACBD\uB85C \uB9AC\uBDF0 \uAC00\uC774\uB4DC
|
|
1514
|
+
|
|
1515
|
+
- [ ] \uD604\uC7AC \uC791\uC5C5 \uBC94\uC704 \uD655\uC778
|
|
1516
|
+
- [ ] \uC2A4\uCF54\uD504 \uC774\uD0C8 \uC5EC\uBD80 \uAC80\uD1A0`;
|
|
1517
|
+
var DEFAULT_COMMIT_GUIDE = `# \uCCB4\uD06C\uD3EC\uC778\uD2B8 \uCEE4\uBC0B \uAC00\uC774\uB4DC
|
|
1518
|
+
|
|
1519
|
+
- [ ] \uC791\uC5C5 \uB0B4\uC6A9 \uC2A4\uD14C\uC774\uC9D5
|
|
1520
|
+
- [ ] \uC6D0\uC790\uC801 \uCEE4\uBC0B \uBA54\uC2DC\uC9C0 \uC791\uC131`;
|
|
1521
|
+
var DEFAULT_COMPLETE_GUIDE = `# \uC791\uC5C5 \uC644\uB8CC \uAC00\uC774\uB4DC
|
|
1522
|
+
|
|
1523
|
+
- [ ] \uBAA8\uB4E0 \uCEE4\uBC0B \uBC0F \uD478\uC2DC \uC791\uC5C5 \uC644\uB8CC \uD6C4 \uC218\uD589\uD558\uC138\uC694.
|
|
1524
|
+
- [ ] \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8\uC5D0 \`.context/.work-complete\` \uD30C\uC77C\uC744 \uC0DD\uC131\uD558\uAC70\uB098 \uB36E\uC5B4\uC4F0\uC138\uC694.
|
|
1525
|
+
- [ ] \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):
|
|
1526
|
+
timestamp={{currentTimestamp}}
|
|
1527
|
+
session_id={{sessionId}}
|
|
1528
|
+
turn_id={{turnId}}
|
|
1529
|
+
- [ ] \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.`;
|
|
1530
|
+
var GUIDE_FILES = {
|
|
1531
|
+
"daily-note-guide.md": DEFAULT_DAILY_NOTE_GUIDE,
|
|
1532
|
+
"note-guide.md": DEFAULT_NOTE_GUIDE,
|
|
1533
|
+
"search-guide.md": DEFAULT_SEARCH_GUIDE,
|
|
1534
|
+
"quality-check.md": DEFAULT_QUALITY_CHECK_GUIDE,
|
|
1535
|
+
"scope-review.md": DEFAULT_SCOPE_REVIEW_GUIDE,
|
|
1536
|
+
"commit-guide.md": DEFAULT_COMMIT_GUIDE,
|
|
1537
|
+
"complete-guide.md": DEFAULT_COMPLETE_GUIDE
|
|
1538
|
+
};
|
|
1482
1539
|
var TEMPLATE_FILES = {
|
|
1483
1540
|
"adr.md": DEFAULT_ADR_TEMPLATE,
|
|
1484
1541
|
"pattern.md": DEFAULT_PATTERN_TEMPLATE,
|
|
@@ -1488,7 +1545,8 @@ var TEMPLATE_FILES = {
|
|
|
1488
1545
|
"context.md": DEFAULT_CONTEXT_TEMPLATE,
|
|
1489
1546
|
"runbook.md": DEFAULT_RUNBOOK_TEMPLATE,
|
|
1490
1547
|
"insight.md": DEFAULT_INSIGHT_TEMPLATE,
|
|
1491
|
-
"index.md": DEFAULT_INDEX_TEMPLATE
|
|
1548
|
+
"index.md": DEFAULT_INDEX_TEMPLATE,
|
|
1549
|
+
"work-complete.txt": DEFAULT_WORK_COMPLETE_TEMPLATE
|
|
1492
1550
|
};
|
|
1493
1551
|
function scaffoldIfNeeded(projectDir) {
|
|
1494
1552
|
const contextDir = join4(projectDir, resolveContextDir(projectDir));
|
|
@@ -1500,12 +1558,17 @@ function scaffoldIfNeeded(projectDir) {
|
|
|
1500
1558
|
mkdirSync(promptsDir, { recursive: true });
|
|
1501
1559
|
const templatesDir = join4(contextDir, "templates");
|
|
1502
1560
|
mkdirSync(templatesDir, { recursive: true });
|
|
1561
|
+
const guidesDir = join4(contextDir, "guides");
|
|
1562
|
+
mkdirSync(guidesDir, { recursive: true });
|
|
1503
1563
|
writeFileSync(join4(contextDir, "config.jsonc"), DEFAULT_CONFIG, "utf-8");
|
|
1504
1564
|
writeFileSync(join4(promptsDir, DEFAULTS.turnStartFile), DEFAULT_TURN_START, "utf-8");
|
|
1505
1565
|
writeFileSync(join4(promptsDir, DEFAULTS.turnEndFile), DEFAULT_TURN_END, "utf-8");
|
|
1506
1566
|
for (const [filename, content] of Object.entries(TEMPLATE_FILES)) {
|
|
1507
1567
|
writeFileSync(join4(templatesDir, filename), content, "utf-8");
|
|
1508
1568
|
}
|
|
1569
|
+
for (const [filename, content] of Object.entries(GUIDE_FILES)) {
|
|
1570
|
+
writeFileSync(join4(guidesDir, filename), content, "utf-8");
|
|
1571
|
+
}
|
|
1509
1572
|
writeVersion(contextDir, PLUGIN_VERSION);
|
|
1510
1573
|
return true;
|
|
1511
1574
|
} catch {
|
|
@@ -1529,17 +1592,25 @@ function autoUpdateTemplates(projectDir) {
|
|
|
1529
1592
|
const stored = getStoredVersion(projectDir);
|
|
1530
1593
|
if (stored === PLUGIN_VERSION)
|
|
1531
1594
|
return [];
|
|
1595
|
+
mkdirSync(join4(contextDir, "prompts"), { recursive: true });
|
|
1532
1596
|
mkdirSync(join4(contextDir, "templates"), { recursive: true });
|
|
1597
|
+
mkdirSync(join4(contextDir, "guides"), { recursive: true });
|
|
1598
|
+
const filesToUpdate = {
|
|
1599
|
+
[`prompts/${DEFAULTS.turnStartFile}`]: DEFAULT_TURN_START,
|
|
1600
|
+
[`prompts/${DEFAULTS.turnEndFile}`]: DEFAULT_TURN_END,
|
|
1601
|
+
...Object.fromEntries(Object.entries(TEMPLATE_FILES).map(([f, c]) => [`templates/${f}`, c])),
|
|
1602
|
+
...Object.fromEntries(Object.entries(GUIDE_FILES).map(([f, c]) => [`guides/${f}`, c]))
|
|
1603
|
+
};
|
|
1533
1604
|
const updated = [];
|
|
1534
|
-
for (const [
|
|
1535
|
-
const filePath = join4(contextDir,
|
|
1605
|
+
for (const [path, content] of Object.entries(filesToUpdate)) {
|
|
1606
|
+
const filePath = join4(contextDir, path);
|
|
1536
1607
|
try {
|
|
1537
1608
|
const existing = readFileSync4(filePath, "utf-8");
|
|
1538
1609
|
if (existing === content)
|
|
1539
1610
|
continue;
|
|
1540
1611
|
} catch {}
|
|
1541
1612
|
writeFileSync(filePath, content, "utf-8");
|
|
1542
|
-
updated.push(
|
|
1613
|
+
updated.push(path);
|
|
1543
1614
|
}
|
|
1544
1615
|
writeVersion(contextDir, PLUGIN_VERSION);
|
|
1545
1616
|
return updated;
|
|
@@ -1580,28 +1651,61 @@ var plugin = async ({ directory, client }) => {
|
|
|
1580
1651
|
const config = loadConfig(directory);
|
|
1581
1652
|
return {
|
|
1582
1653
|
"experimental.chat.messages.transform": async (_input, output) => {
|
|
1654
|
+
if (process.env.OMX_HOOK_PLUGINS)
|
|
1655
|
+
return;
|
|
1656
|
+
let skipTurnStart = false;
|
|
1657
|
+
const agentsMdPath = join5(directory, "AGENTS.md");
|
|
1658
|
+
if (existsSync4(agentsMdPath)) {
|
|
1659
|
+
const content = readFileSync5(agentsMdPath, "utf-8");
|
|
1660
|
+
if (content.includes("<!-- context:start -->") && content.includes("<!-- context:end -->")) {
|
|
1661
|
+
skipTurnStart = true;
|
|
1662
|
+
}
|
|
1663
|
+
}
|
|
1583
1664
|
if (output.messages.length === 0)
|
|
1584
1665
|
return;
|
|
1585
1666
|
const lastUserMsg = output.messages.filter((m) => m.info.role === "user").at(-1);
|
|
1586
1667
|
if (!lastUserMsg)
|
|
1587
1668
|
return;
|
|
1588
|
-
const
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
const
|
|
1593
|
-
|
|
1594
|
-
|
|
1669
|
+
const isTurnEndMessage = lastUserMsg.parts.some((p) => p.type === "text" && p.text.includes("<system-reminder>") && p.text.includes("TURN END"));
|
|
1670
|
+
if (isTurnEndMessage) {
|
|
1671
|
+
return;
|
|
1672
|
+
}
|
|
1673
|
+
const promptVars = {
|
|
1674
|
+
knowledgeDir: config.knowledge.dir ?? "docs",
|
|
1675
|
+
sessionId: lastUserMsg.info.sessionID
|
|
1676
|
+
};
|
|
1677
|
+
if (!skipTurnStart) {
|
|
1678
|
+
const turnStartPath = resolvePromptPath(directory, contextDir, config.prompts.turnStart ?? join5(DEFAULTS.promptDir, DEFAULTS.turnStartFile));
|
|
1679
|
+
const turnStartRaw = readPromptFile(turnStartPath) ?? "";
|
|
1680
|
+
const turnStart = resolvePromptVariables(turnStartRaw, promptVars);
|
|
1681
|
+
const knowledgeIndex = buildKnowledgeIndexV2(directory, config.knowledge);
|
|
1682
|
+
const indexContent = knowledgeIndex.mode === "flat" ? formatKnowledgeIndex(knowledgeIndex.individualFiles) : formatDomainIndex(knowledgeIndex);
|
|
1683
|
+
const combinedContent = [turnStart, indexContent].filter(Boolean).join(`
|
|
1595
1684
|
|
|
1596
1685
|
`);
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1686
|
+
if (combinedContent) {
|
|
1687
|
+
lastUserMsg.parts.push({
|
|
1688
|
+
id: `context-turn-start-${Date.now()}`,
|
|
1689
|
+
sessionID: lastUserMsg.info.sessionID,
|
|
1690
|
+
messageID: lastUserMsg.info.id,
|
|
1691
|
+
type: "text",
|
|
1692
|
+
text: combinedContent
|
|
1693
|
+
});
|
|
1694
|
+
}
|
|
1695
|
+
}
|
|
1696
|
+
const signalPath = join5(directory, DEFAULTS.workCompleteFile);
|
|
1697
|
+
if (existsSync4(signalPath)) {
|
|
1698
|
+
const content = readFileSync5(signalPath, "utf-8");
|
|
1699
|
+
const match = content.match(/^session_id=(.*)$/m);
|
|
1700
|
+
const fileSessionId = match ? match[1].trim() : undefined;
|
|
1701
|
+
if (fileSessionId && fileSessionId !== lastUserMsg.info.sessionID) {} else {
|
|
1702
|
+
const { mtimeMs } = statSync2(signalPath);
|
|
1703
|
+
const userCreatedAt = lastUserMsg.info.time.created;
|
|
1704
|
+
if (mtimeMs >= userCreatedAt) {
|
|
1705
|
+
return;
|
|
1706
|
+
}
|
|
1707
|
+
unlinkSync(signalPath);
|
|
1708
|
+
}
|
|
1605
1709
|
}
|
|
1606
1710
|
const turnEndPath = resolvePromptPath(directory, contextDir, config.prompts.turnEnd ?? join5(DEFAULTS.promptDir, DEFAULTS.turnEndFile));
|
|
1607
1711
|
const turnEndRaw = readPromptFile(turnEndPath);
|
package/dist/omx/index.mjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// src/omx/index.ts
|
|
2
|
+
import { existsSync as existsSync5, readFileSync as readFileSync6, unlinkSync } from "node:fs";
|
|
2
3
|
import { isAbsolute, join as join5 } from "node:path";
|
|
3
4
|
|
|
4
5
|
// src/constants.ts
|
|
@@ -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,
|
|
@@ -310,7 +313,10 @@ function readPromptFile(filePath) {
|
|
|
310
313
|
}
|
|
311
314
|
function resolvePromptVariables(content, vars) {
|
|
312
315
|
const normalized = (vars.knowledgeDir || "docs").replace(/\\/g, "/").replace(/\/+$/, "");
|
|
313
|
-
|
|
316
|
+
let resolved = content.replaceAll("{{knowledgeDir}}", normalized);
|
|
317
|
+
resolved = resolved.replaceAll("{{sessionId}}", vars.sessionId ?? "");
|
|
318
|
+
resolved = resolved.replaceAll("{{turnId}}", vars.turnId ?? "");
|
|
319
|
+
return resolved;
|
|
314
320
|
}
|
|
315
321
|
|
|
316
322
|
// src/lib/scaffold.ts
|
|
@@ -319,7 +325,7 @@ import { join as join4 } from "node:path";
|
|
|
319
325
|
// package.json
|
|
320
326
|
var package_default = {
|
|
321
327
|
name: "@ksm0709/context",
|
|
322
|
-
version: "0.0.
|
|
328
|
+
version: "0.0.22",
|
|
323
329
|
author: {
|
|
324
330
|
name: "TaehoKang",
|
|
325
331
|
email: "ksm07091@gmail.com"
|
|
@@ -361,6 +367,7 @@ var package_default = {
|
|
|
361
367
|
"@opencode-ai/plugin": ">=1.0.0"
|
|
362
368
|
},
|
|
363
369
|
dependencies: {
|
|
370
|
+
"@ksm0709/context": "^0.0.21",
|
|
364
371
|
"jsonc-parser": "^3.0.0"
|
|
365
372
|
},
|
|
366
373
|
devDependencies: {
|
|
@@ -390,7 +397,7 @@ var DEFAULT_CONFIG = `{
|
|
|
390
397
|
"turnEnd": "prompts/turn-end.md"
|
|
391
398
|
},
|
|
392
399
|
"knowledge": {
|
|
393
|
-
"dir": "
|
|
400
|
+
"dir": ".context/memory",
|
|
394
401
|
"sources": ["AGENTS.md"]
|
|
395
402
|
},
|
|
396
403
|
"omx": {
|
|
@@ -413,6 +420,8 @@ var DEFAULT_TURN_START = `## Knowledge Context
|
|
|
413
420
|
|
|
414
421
|
### 작업 전 필수
|
|
415
422
|
|
|
423
|
+
- **데일리 노트 확인**: 가장 최근의 데일리 노트(\`{{knowledgeDir}}/daily/YYYY-MM-DD.md\`)를 읽고 이전 세션의 컨텍스트와 미해결 이슈를 파악하세요
|
|
424
|
+
- **작업 의도 선언**: 작업 시작 전, 현재 세션의 목표와 작업 의도를 명확히 파악하고 선언하세요 (추후 작업 경로 검증 시 기준이 됩니다)
|
|
416
425
|
- 메인 에이전트가 아래 **Available Knowledge** 목록에서 현재 작업과 관련된 문서를 **직접 먼저** 읽으세요
|
|
417
426
|
- 도메인 폴더 구조가 있다면 INDEX.md의 요약을 참고하여 필요한 노트만 선택적으로 읽으세요
|
|
418
427
|
- 문서 내 [[링크]]를 따라가며 관련 노트를 탐색하세요 -- 링크를 놓치면 중요한 맥락을 잃습니다
|
|
@@ -431,43 +440,19 @@ var DEFAULT_TURN_START = `## Knowledge Context
|
|
|
431
440
|
- 지식 노트의 결정사항 > 일반적 관행
|
|
432
441
|
- 지식 노트에 없는 새로운 결정이나 반복 가치가 있는 발견은 작업 메모나 지식 노트 후보로 기록하세요
|
|
433
442
|
`;
|
|
434
|
-
var DEFAULT_TURN_END = `## 작업
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
-
|
|
441
|
-
-
|
|
442
|
-
-
|
|
443
|
-
-
|
|
444
|
-
- 작업이
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
작업 중 기록할 만한 발견이 있었다면 직접 정리하세요.
|
|
449
|
-
|
|
450
|
-
**기록 대상 판단 기준:**
|
|
451
|
-
|
|
452
|
-
| 상황 | 템플릿 | 파일명 패턴 |
|
|
453
|
-
| ------------------------------- | --------------------------------------------------- | --------------------------- |
|
|
454
|
-
| 아키텍처/기술 스택 중대 결정 | [ADR](.context/templates/adr.md) | \`adr-NNN-제목.md\` |
|
|
455
|
-
| 반복 사용할 코드 패턴 발견 | [Pattern](.context/templates/pattern.md) | \`pattern-제목.md\` |
|
|
456
|
-
| 비자명한 버그 해결 | [Bug](.context/templates/bug.md) | \`bug-제목.md\` |
|
|
457
|
-
| 외부 API/라이브러리 예상외 동작 | [Gotcha](.context/templates/gotcha.md) | \`gotcha-라이브러리-제목.md\` |
|
|
458
|
-
| 작은 기술적 선택 | [Decision](.context/templates/decision.md) | \`decision-제목.md\` |
|
|
459
|
-
| 모듈/프로젝트 개요 필요 | [Context](.context/templates/context.md) | \`context-제목.md\` |
|
|
460
|
-
| 반복 가능한 프로세스 정립 | [Runbook](.context/templates/runbook.md) | \`runbook-제목.md\` |
|
|
461
|
-
| 실험/디버깅 중 학습 | [Insight](.context/templates/insight.md) | \`insight-제목.md\` |
|
|
462
|
-
|
|
463
|
-
해당 사항이 없으면 이 단계는 건너뛰세요.
|
|
464
|
-
|
|
465
|
-
- 관련 템플릿 파일을 읽고 그 구조에 맞춰 내용을 정리하세요
|
|
466
|
-
- 노트 첫 줄은 명확한 제목(\`# Title\`)으로 시작하세요
|
|
467
|
-
- 핵심 내용을 자기 언어로 간결하게 서술하고, 관련 노트는 \`[[relative/path/file.md]]\` 형태로 연결하세요
|
|
468
|
-
- knowledge 디렉토리(\`{{knowledgeDir}}/\`) 또는 적절한 도메인 폴더에 저장하고, 필요한 경우 기존 INDEX.md나 관련 노트를 함께 갱신하세요
|
|
469
|
-
|
|
470
|
-
기존 설치의 사용자 프롬프트 파일은 자동으로 바뀌지 않습니다. 새 기본 프롬프트가 필요하면 \`context update prompt\`로 명시적으로 새로고침하세요.
|
|
443
|
+
var DEFAULT_TURN_END = `## TURN END 작업 지침
|
|
444
|
+
이 지침은 에이전트를 위한 것이며, 사용자에게 직접적으로 노출하지 않습니다.
|
|
445
|
+
아래 메뉴 중 하나를 선택해 진행 상황에 맞게 수행하세요.
|
|
446
|
+
**반드시 링크된 가이드를 참고하여 정확히 수행해야 합니다.**
|
|
447
|
+
|
|
448
|
+
1. **계속 작업**: 기존 작업이 완료되지 않았고 아직 아래 액션을 취할 단계가 아니라면 작업 속개.
|
|
449
|
+
2. **데일리 노트 기록**: [.context/guides/daily-note-guide.md] 데일리 노트에 중요한 컨텍스트를 기록하여 다음 세션이나 에이전트 팀이 참고할 수 있도록 하세요. 기존 내용 수정은 불가하며, 새로운 메모를 추가 하는것만 가능합니다. 간략한 한 두 문장으로 작성하여 핵심 컨텍스트가 명확히 전달되도록 하세요.
|
|
450
|
+
3. **지식 노트 작성**: [.context/guides/note-guide.md] 작업기억(데일리노트, 세션 컨텍스트)보다 오래 기억되어야 하는 중요한 결정, 패턴, 실수, 발견은 지식 노트로 기록하여 프로젝트의 집단 지식으로 남기세요.
|
|
451
|
+
4. **노트/스킬 검색 및 읽기**: [.context/guides/search-guide.md] 어려움에 처했다면 현재 진행 상황에 필요한 지식이나 스킬이 있는지 확인하고, 관련 노트를 읽어보세요. 새로운 아이디어나 해결책이 떠오를 수 있습니다.
|
|
452
|
+
5. **작업 경로 리뷰**: [.context/guides/scope-review.md] 사용자가 의도한 작업 범위를 벗어나지 않았는지, 작업이 너무 크거나 복잡해지지는 않았는지 검토하세요.
|
|
453
|
+
6. **체크포인트 커밋**: [.context/guides/commit-guide.md] 작업이 길어질 경우, 중요한 단계마다 체크포인트 커밋을 하여 작업 내용을 안전하게 저장하고, 필요 시 이전 상태로 돌아갈 수 있도록 하세요.
|
|
454
|
+
7. **퀄리티 검증**: [.context/guides/quality-check.md] **작업 완료 전에 반드시 수행하세요**. 코드 린트, 포맷터, 테스트, 빌드, 코드리뷰를 실행하여 작업 결과물이 프로젝트의 품질 기준을 충족하는지 확인하세요.
|
|
455
|
+
8. **작업 완료**: [.context/guides/complete-guide.md] 모든 작업이 완료되었다면, 이 가이드를 따르세요. 이 작업 지침이 더이상 트리거되지 않을 것입니다.
|
|
471
456
|
`;
|
|
472
457
|
var DEFAULT_ADR_TEMPLATE = `# ADR-NNN: [제목]
|
|
473
458
|
|
|
@@ -675,6 +660,78 @@ Overview: [1-2 sentence description of this domain]
|
|
|
675
660
|
|
|
676
661
|
- [[../other-domain/INDEX.md]] -- Description
|
|
677
662
|
`;
|
|
663
|
+
var DEFAULT_WORK_COMPLETE_TEMPLATE = `timestamp={{currentTimestamp}}
|
|
664
|
+
session_id={{sessionId}}
|
|
665
|
+
turn_id={{turnId}}
|
|
666
|
+
`;
|
|
667
|
+
var DEFAULT_DAILY_NOTE_GUIDE = `# 데일리 노트 기록 가이드
|
|
668
|
+
|
|
669
|
+
- [ ] \`docs/daily/YYYY-MM-DD.md\` 파일(오늘 날짜 기준)을 생성하거나 업데이트하세요.
|
|
670
|
+
- [ ] **주의**: 데일리 노트의 기존 내용은 절대 수정하거나 삭제하지 마세요.
|
|
671
|
+
- [ ] 파일 맨 마지막 줄에 다음과 같은 형식으로만 기록을 추가(Append)하세요:
|
|
672
|
+
\`[{{currentTimestamp}}] <기억 할 내용>\`
|
|
673
|
+
- [ ] \`<기억 할 내용>\`에는 완벽한 컨텍스트 인계를 위해 오늘 완료한 핵심 작업 요약, 미해결 이슈(TODO), 중요 메모, 지식 노트 \`[[wikilink]]\` 등을 포함하세요.`;
|
|
674
|
+
var DEFAULT_NOTE_GUIDE = `# 지식 노트 작성 및 관리 가이드
|
|
675
|
+
|
|
676
|
+
- [ ] 제텔카스텐(Zettelkasten) 3대 원칙 준수:
|
|
677
|
+
- [ ] 원자성: 한 노트당 한 주제
|
|
678
|
+
- [ ] 연결: 고립된 노트 방지
|
|
679
|
+
- [ ] 자기 언어 서술: 핵심을 이해하고 간결하게 서술
|
|
680
|
+
- [ ] **기록 대상 판단 기준:**
|
|
681
|
+
|
|
682
|
+
| 상황 | 템플릿 | 파일명 패턴 |
|
|
683
|
+
| --- | --- | --- |
|
|
684
|
+
| 아키텍처/기술 스택 중대 결정 | \`.context/templates/adr.md\` | \`adr-NNN-제목.md\` |
|
|
685
|
+
| 반복 사용할 코드 패턴 발견 | \`.context/templates/pattern.md\` | \`pattern-제목.md\` |
|
|
686
|
+
| 비자명한 버그 해결 | \`.context/templates/bug.md\` | \`bug-제목.md\` |
|
|
687
|
+
| 외부 API/라이브러리 예상외 동작 | \`.context/templates/gotcha.md\` | \`gotcha-라이브러리-제목.md\` |
|
|
688
|
+
| 작은 기술적 선택 | \`.context/templates/decision.md\` | \`decision-제목.md\` |
|
|
689
|
+
| 모듈/프로젝트 개요 필요 | \`.context/templates/context.md\` | \`context-제목.md\` |
|
|
690
|
+
| 반복 가능한 프로세스 정립 | \`.context/templates/runbook.md\` | \`runbook-제목.md\` |
|
|
691
|
+
| 실험/디버깅 중 학습 | \`.context/templates/insight.md\` | \`insight-제목.md\` |
|
|
692
|
+
|
|
693
|
+
- [ ] 새로 작성한 노트는 고립되지 않도록 반드시 기존 관련 노트나 \`INDEX.md\`와 \`[[wikilink]]\`로 양방향 연결하세요.
|
|
694
|
+
- [ ] **지식 정리 및 유지보수 워크플로우:**
|
|
695
|
+
- [ ] **불필요해진 지식 제거**: 더 이상 유효하지 않거나 잘못된 정보가 담긴 과거 노트는 과감히 삭제하거나 상단에 Deprecated 표시를 하여 혼란을 방지하세요.
|
|
696
|
+
- [ ] **중복 노트 합병(Merge)**: 비슷한 주제를 다루는 여러 개의 노트(redundant notes)가 발견되면, 하나의 핵심 노트로 내용을 통합하고 나머지 노트는 삭제하세요.
|
|
697
|
+
- [ ] **연결성 점검**: 지식을 갱신하거나 합병할 때 끊어진 링크(Dead link)가 발생하지 않도록, 이 노트를 참조하던 다른 노트나 \`INDEX.md\`의 링크들도 함께 업데이트하세요.`;
|
|
698
|
+
var DEFAULT_SEARCH_GUIDE = `# 노트/스킬 검색 및 읽기 가이드
|
|
699
|
+
|
|
700
|
+
- [ ] 관련 키워드 검색
|
|
701
|
+
- [ ] INDEX.md 확인
|
|
702
|
+
- [ ] 관련 노트 탐색`;
|
|
703
|
+
var DEFAULT_QUALITY_CHECK_GUIDE = `# 퀄리티 검증 가이드
|
|
704
|
+
|
|
705
|
+
- [ ] Lint/Format 확인
|
|
706
|
+
- [ ] 테스트 실행
|
|
707
|
+
- [ ] 빌드 확인
|
|
708
|
+
- [ ] 코드 리뷰 요청 및 통과`;
|
|
709
|
+
var DEFAULT_SCOPE_REVIEW_GUIDE = `# 작업 경로 리뷰 가이드
|
|
710
|
+
|
|
711
|
+
- [ ] 현재 작업 범위 확인
|
|
712
|
+
- [ ] 스코프 이탈 여부 검토`;
|
|
713
|
+
var DEFAULT_COMMIT_GUIDE = `# 체크포인트 커밋 가이드
|
|
714
|
+
|
|
715
|
+
- [ ] 작업 내용 스테이징
|
|
716
|
+
- [ ] 원자적 커밋 메시지 작성`;
|
|
717
|
+
var DEFAULT_COMPLETE_GUIDE = `# 작업 완료 가이드
|
|
718
|
+
|
|
719
|
+
- [ ] 모든 커밋 및 푸시 작업 완료 후 수행하세요.
|
|
720
|
+
- [ ] 프로젝트 루트에 \`.context/.work-complete\` 파일을 생성하거나 덮어쓰세요.
|
|
721
|
+
- [ ] 파일 내용은 \`.context/templates/work-complete.txt\` 템플릿을 복사하여 작성해야 합니다. (정확히 아래 3줄 형식이어야 합니다):
|
|
722
|
+
timestamp={{currentTimestamp}}
|
|
723
|
+
session_id={{sessionId}}
|
|
724
|
+
turn_id={{turnId}}
|
|
725
|
+
- [ ] 이 동작은 작업 완료를 시스템에 알리고 프롬프트 주입 루프를 종료시키는 트리거입니다.`;
|
|
726
|
+
var GUIDE_FILES = {
|
|
727
|
+
"daily-note-guide.md": DEFAULT_DAILY_NOTE_GUIDE,
|
|
728
|
+
"note-guide.md": DEFAULT_NOTE_GUIDE,
|
|
729
|
+
"search-guide.md": DEFAULT_SEARCH_GUIDE,
|
|
730
|
+
"quality-check.md": DEFAULT_QUALITY_CHECK_GUIDE,
|
|
731
|
+
"scope-review.md": DEFAULT_SCOPE_REVIEW_GUIDE,
|
|
732
|
+
"commit-guide.md": DEFAULT_COMMIT_GUIDE,
|
|
733
|
+
"complete-guide.md": DEFAULT_COMPLETE_GUIDE
|
|
734
|
+
};
|
|
678
735
|
var TEMPLATE_FILES = {
|
|
679
736
|
"adr.md": DEFAULT_ADR_TEMPLATE,
|
|
680
737
|
"pattern.md": DEFAULT_PATTERN_TEMPLATE,
|
|
@@ -684,7 +741,8 @@ var TEMPLATE_FILES = {
|
|
|
684
741
|
"context.md": DEFAULT_CONTEXT_TEMPLATE,
|
|
685
742
|
"runbook.md": DEFAULT_RUNBOOK_TEMPLATE,
|
|
686
743
|
"insight.md": DEFAULT_INSIGHT_TEMPLATE,
|
|
687
|
-
"index.md": DEFAULT_INDEX_TEMPLATE
|
|
744
|
+
"index.md": DEFAULT_INDEX_TEMPLATE,
|
|
745
|
+
"work-complete.txt": DEFAULT_WORK_COMPLETE_TEMPLATE
|
|
688
746
|
};
|
|
689
747
|
function scaffoldIfNeeded(projectDir) {
|
|
690
748
|
const contextDir = join4(projectDir, resolveContextDir(projectDir));
|
|
@@ -696,12 +754,17 @@ function scaffoldIfNeeded(projectDir) {
|
|
|
696
754
|
mkdirSync(promptsDir, { recursive: true });
|
|
697
755
|
const templatesDir = join4(contextDir, "templates");
|
|
698
756
|
mkdirSync(templatesDir, { recursive: true });
|
|
757
|
+
const guidesDir = join4(contextDir, "guides");
|
|
758
|
+
mkdirSync(guidesDir, { recursive: true });
|
|
699
759
|
writeFileSync(join4(contextDir, "config.jsonc"), DEFAULT_CONFIG, "utf-8");
|
|
700
760
|
writeFileSync(join4(promptsDir, DEFAULTS.turnStartFile), DEFAULT_TURN_START, "utf-8");
|
|
701
761
|
writeFileSync(join4(promptsDir, DEFAULTS.turnEndFile), DEFAULT_TURN_END, "utf-8");
|
|
702
762
|
for (const [filename, content] of Object.entries(TEMPLATE_FILES)) {
|
|
703
763
|
writeFileSync(join4(templatesDir, filename), content, "utf-8");
|
|
704
764
|
}
|
|
765
|
+
for (const [filename, content] of Object.entries(GUIDE_FILES)) {
|
|
766
|
+
writeFileSync(join4(guidesDir, filename), content, "utf-8");
|
|
767
|
+
}
|
|
705
768
|
writeVersion(contextDir, PLUGIN_VERSION);
|
|
706
769
|
return true;
|
|
707
770
|
} catch {
|
|
@@ -807,6 +870,27 @@ async function sendTmuxSubmitSequence(target, attempts = 3) {
|
|
|
807
870
|
// src/omx/index.ts
|
|
808
871
|
var TURN_END_STATE_KEY = "last_turn_end_turn_id";
|
|
809
872
|
var TURN_END_PENDING_SKIP_KEY = "turn_end_pending_followup_scopes";
|
|
873
|
+
function parseWorkComplete(content) {
|
|
874
|
+
const result = {};
|
|
875
|
+
for (const line of content.split(`
|
|
876
|
+
`)) {
|
|
877
|
+
const trimmed = line.trim();
|
|
878
|
+
if (trimmed.startsWith("session_id=")) {
|
|
879
|
+
result.sessionId = trimmed.substring("session_id=".length).trim();
|
|
880
|
+
} else if (trimmed.startsWith("turn_id=")) {
|
|
881
|
+
result.turnId = trimmed.substring("turn_id=".length).trim();
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
return result;
|
|
885
|
+
}
|
|
886
|
+
function clearCurrentFollowupScope(pendingScopes, scopeKey) {
|
|
887
|
+
if (!scopeKey || !pendingScopes[scopeKey]) {
|
|
888
|
+
return pendingScopes;
|
|
889
|
+
}
|
|
890
|
+
const nextScopes = { ...pendingScopes };
|
|
891
|
+
delete nextScopes[scopeKey];
|
|
892
|
+
return nextScopes;
|
|
893
|
+
}
|
|
810
894
|
function resolveProjectDir(event) {
|
|
811
895
|
return event.context?.projectDir ?? event.context?.directory ?? process.cwd();
|
|
812
896
|
}
|
|
@@ -883,7 +967,37 @@ async function onTurnComplete(event, sdk) {
|
|
|
883
967
|
return;
|
|
884
968
|
}
|
|
885
969
|
const followupScopeKey = resolveFollowupScopeKey(event);
|
|
886
|
-
|
|
970
|
+
let pendingFollowupScopes = typeof sdk.state?.read === "function" ? await sdk.state.read(TURN_END_PENDING_SKIP_KEY, {}) ?? {} : {};
|
|
971
|
+
const workCompleteFile = join5(projectDir, DEFAULTS.workCompleteFile);
|
|
972
|
+
if (existsSync5(workCompleteFile)) {
|
|
973
|
+
const content = readFileSync6(workCompleteFile, "utf-8");
|
|
974
|
+
const { sessionId: fileSessionId, turnId: fileTurnId } = parseWorkComplete(content);
|
|
975
|
+
const currentScopeId = event.session_id ?? event.thread_id ?? "";
|
|
976
|
+
if (!fileSessionId || fileSessionId === currentScopeId) {
|
|
977
|
+
pendingFollowupScopes = clearCurrentFollowupScope(pendingFollowupScopes, followupScopeKey);
|
|
978
|
+
if (fileTurnId === event.turn_id) {
|
|
979
|
+
if (typeof sdk.state?.write === "function") {
|
|
980
|
+
await sdk.state.write(TURN_END_PENDING_SKIP_KEY, pendingFollowupScopes);
|
|
981
|
+
}
|
|
982
|
+
await sdk.log.info("turn_end_skipped_work_complete", {
|
|
983
|
+
event: event.event,
|
|
984
|
+
session_id: event.session_id,
|
|
985
|
+
turn_id: event.turn_id
|
|
986
|
+
});
|
|
987
|
+
return;
|
|
988
|
+
}
|
|
989
|
+
unlinkSync(workCompleteFile);
|
|
990
|
+
if (typeof sdk.state?.write === "function") {
|
|
991
|
+
await sdk.state.write(TURN_END_PENDING_SKIP_KEY, pendingFollowupScopes);
|
|
992
|
+
}
|
|
993
|
+
await sdk.log.info("turn_end_work_complete_cleared", {
|
|
994
|
+
event: event.event,
|
|
995
|
+
session_id: event.session_id,
|
|
996
|
+
turn_id: event.turn_id,
|
|
997
|
+
cleared_turn_id: fileTurnId
|
|
998
|
+
});
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
887
1001
|
if (followupScopeKey && pendingFollowupScopes[followupScopeKey]) {
|
|
888
1002
|
const nextPendingScopes = { ...pendingFollowupScopes };
|
|
889
1003
|
delete nextPendingScopes[followupScopeKey];
|
|
@@ -908,9 +1022,13 @@ async function onTurnComplete(event, sdk) {
|
|
|
908
1022
|
});
|
|
909
1023
|
return;
|
|
910
1024
|
}
|
|
911
|
-
const promptVars =
|
|
1025
|
+
const promptVars = {
|
|
1026
|
+
...buildPromptVars(config),
|
|
1027
|
+
sessionId: event.session_id ?? event.thread_id ?? "unknown",
|
|
1028
|
+
turnId: event.turn_id ?? ""
|
|
1029
|
+
};
|
|
912
1030
|
const turnEndPath = resolvePromptPath(projectDir, contextDir, config.prompts.turnEnd ?? join5(DEFAULTS.promptDir, DEFAULTS.turnEndFile));
|
|
913
|
-
|
|
1031
|
+
let turnEndRaw = readPromptFile(turnEndPath);
|
|
914
1032
|
if (!turnEndRaw) {
|
|
915
1033
|
await sdk.log.info("turn_end_skipped_empty_prompt", {
|
|
916
1034
|
event: event.event,
|
|
@@ -919,6 +1037,13 @@ async function onTurnComplete(event, sdk) {
|
|
|
919
1037
|
});
|
|
920
1038
|
return;
|
|
921
1039
|
}
|
|
1040
|
+
if (turnEndRaw.includes("<!-- context:start -->") || turnEndRaw.includes("## Knowledge Context")) {
|
|
1041
|
+
const defaultTurnEndPath = join5(projectDir, DEFAULTS.promptDir, DEFAULTS.turnEndFile);
|
|
1042
|
+
turnEndRaw = readPromptFile(defaultTurnEndPath);
|
|
1043
|
+
if (!turnEndRaw) {
|
|
1044
|
+
return;
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
922
1047
|
if (typeof sdk.tmux?.sendKeys !== "function") {
|
|
923
1048
|
await logWarn(sdk, "turn_end_sendkeys_failed", {
|
|
924
1049
|
event: event.event,
|
|
@@ -928,11 +1053,13 @@ async function onTurnComplete(event, sdk) {
|
|
|
928
1053
|
});
|
|
929
1054
|
return;
|
|
930
1055
|
}
|
|
931
|
-
const turnEnd = resolvePromptVariables(turnEndRaw, promptVars);
|
|
1056
|
+
const turnEnd = resolvePromptVariables(turnEndRaw, promptVars).trim();
|
|
932
1057
|
const reminderText = `<system-reminder>
|
|
933
1058
|
${turnEnd}
|
|
934
1059
|
</system-reminder>`;
|
|
935
1060
|
const sessionName = typeof event.context?.session_name === "string" && event.context.session_name.trim().length > 0 ? event.context.session_name.trim() : undefined;
|
|
1061
|
+
await new Promise((resolve) => globalThis.setTimeout(resolve, 500));
|
|
1062
|
+
if (typeof sdk.tmux?.sendKeys === "function") {}
|
|
936
1063
|
const result = await sdk.tmux.sendKeys({
|
|
937
1064
|
sessionName,
|
|
938
1065
|
text: reminderText,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ksm0709/context",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.22",
|
|
4
4
|
"author": {
|
|
5
5
|
"name": "TaehoKang",
|
|
6
6
|
"email": "ksm07091@gmail.com"
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
"@opencode-ai/plugin": ">=1.0.0"
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
+
"@ksm0709/context": "^0.0.21",
|
|
45
46
|
"jsonc-parser": "^3.0.0"
|
|
46
47
|
},
|
|
47
48
|
"devDependencies": {
|