@ksm0709/context 0.0.14 → 0.0.15

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 CHANGED
@@ -16,7 +16,6 @@ var DEFAULTS = {
16
16
  promptDir: ".opencode/context/prompts",
17
17
  turnStartFile: "turn-start.md",
18
18
  turnEndFile: "turn-end.md",
19
- subagentTurnEndFile: "subagent-turn-end.md",
20
19
  blockedToolPatterns: ["^task$", "^background_", "agent"],
21
20
  knowledgeSources: ["AGENTS.md"],
22
21
  templateDir: ".opencode/context/templates",
@@ -74,18 +73,19 @@ var package_default = {
74
73
  "jsonc-parser": "^3.0.0"
75
74
  },
76
75
  devDependencies: {
77
- "@opencode-ai/plugin": "^1.2.10",
78
76
  "@eslint/js": "^9.39.1",
77
+ "@opencode-ai/plugin": "^1.2.10",
79
78
  "@types/node": "^20.11.5",
80
79
  "@typescript-eslint/eslint-plugin": "8.47.0",
81
80
  "@typescript-eslint/parser": "8.47.0",
81
+ "@vitest/coverage-v8": "^4.0.18",
82
82
  "bun-types": "latest",
83
83
  eslint: "^9.39.1",
84
84
  "eslint-config-prettier": "10.1.8",
85
85
  "eslint-plugin-prettier": "^5.1.3",
86
86
  prettier: "^3.2.4",
87
87
  "typescript-eslint": "^8.47.0",
88
- vitest: "^3.2.4"
88
+ vitest: "^4.0.18"
89
89
  }
90
90
  };
91
91
 
@@ -96,8 +96,7 @@ var DEFAULT_CONFIG = `{
96
96
  // See: https://github.com/ksm0709/context
97
97
  "prompts": {
98
98
  "turnStart": ".opencode/context/prompts/turn-start.md",
99
- "turnEnd": ".opencode/context/prompts/turn-end.md",
100
- "subagentTurnEnd": ".opencode/context/prompts/subagent-turn-end.md"
99
+ "turnEnd": ".opencode/context/prompts/turn-end.md"
101
100
  },
102
101
  "subagentConfig": {
103
102
  "blockedToolPatterns": ["^task$", "^background_", "agent"]
@@ -121,11 +120,17 @@ var DEFAULT_TURN_START = `## Knowledge Context
121
120
  ### \uC791\uC5C5 \uC804 \uD544\uC218
122
121
 
123
122
  - \uC544\uB798 **Available Knowledge** \uBAA9\uB85D\uC5D0\uC11C \uD604\uC7AC \uC791\uC5C5\uACFC \uAD00\uB828\uB41C \uBB38\uC11C\uB97C **\uBA3C\uC800** \uC77D\uC73C\uC138\uC694
123
+ ${"<"}!-- primary-only -->
124
124
  - \uC9C1\uC811 \uC77D\uAE30 \uC804\uC5D0 \uC544\uB798\uC640 \uAC19\uC774 **\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8(explore)\uC5D0 \uC704\uC784**\uD558\uC5EC, \uC5F0\uAD00\uB41C \uB178\uD2B8\uB97C \uC9D1\uC911 \uD0D0\uC0C9\uD558\uACE0 \uC791\uC5C5\uC5D0 \uD544\uC694\uD55C \uB0B4\uC6A9\uC744 \uC694\uC57D\uD558\uB3C4\uB85D \uC9C0\uC2DC\uD558\uC138\uC694.
125
+ ${"<"}!-- /primary-only -->
126
+ ${"<"}!-- subagent-only -->
127
+ - \uAD00\uB828 \uBB38\uC11C\uB97C \uC9C1\uC811 \uC77D\uACE0 \uC791\uC5C5\uC5D0 \uC801\uC6A9\uD558\uC138\uC694. \uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8\uB97C \uD638\uCD9C\uD558\uC9C0 \uB9C8\uC138\uC694.
128
+ ${"<"}!-- /subagent-only -->
125
129
  - \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
126
130
  - \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
127
131
  - \uC9C0\uC2DD \uD30C\uC77C\uC5D0 \uAE30\uB85D\uB41C \uC544\uD0A4\uD14D\uCC98 \uACB0\uC815, \uD328\uD134, \uC81C\uC57D\uC0AC\uD56D\uC744 \uBC18\uB4DC\uC2DC \uB530\uB974\uC138\uC694
128
132
 
133
+ ${"<"}!-- primary-only -->
129
134
  ### \uC9C0\uC2DD \uD0D0\uC0C9 (\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8 \uC704\uC784)
130
135
 
131
136
  \uD604\uC7AC \uC791\uC5C5\uACFC \uAD00\uB828\uB41C \uC9C0\uC2DD \uB178\uD2B8\uB97C \uC77D\uACE0 \uC694\uC57D\uD558\uB294 \uC791\uC5C5\uC744 **\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8\uC5D0 \uC704\uC784**\uD558\uC5EC \uCEE8\uD14D\uC2A4\uD2B8 \uD30C\uC545\uC744 \uD6A8\uC728\uD654\uD558\uC138\uC694.
@@ -156,6 +161,8 @@ task(
156
161
  )
157
162
  \`\`\`
158
163
 
164
+ ${"<"}!-- /primary-only -->
165
+
159
166
 
160
167
  - \uC544\uB798 **Available Knowledge** \uBAA9\uB85D\uC5D0\uC11C \uD604\uC7AC \uC791\uC5C5\uACFC \uAD00\uB828\uB41C \uBB38\uC11C\uB97C **\uBA3C\uC800** \uC77D\uC73C\uC138\uC694
161
168
  - \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
@@ -172,9 +179,12 @@ task(
172
179
 
173
180
  - AGENTS.md\uC758 \uC9C0\uC2DC\uC0AC\uD56D\uC774 \uD56D\uC0C1 \uCD5C\uC6B0\uC120
174
181
  - \uC9C0\uC2DD \uB178\uD2B8\uC758 \uACB0\uC815\uC0AC\uD56D > \uC77C\uBC18\uC801 \uAD00\uD589
182
+ ${"<"}!-- primary-only -->
175
183
  - \uC9C0\uC2DD \uB178\uD2B8\uC5D0 \uC5C6\uB294 \uC0C8\uB85C\uC6B4 \uACB0\uC815\uC740 \uC791\uC5C5 \uC644\uB8CC \uC2DC \uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8\uC5D0 \uC704\uC784\uD558\uC5EC \uAE30\uB85D\uD558\uC138\uC694
184
+ ${"<"}!-- /primary-only -->
176
185
  `;
177
- var DEFAULT_TURN_END = `## \uC791\uC5C5 \uB9C8\uBB34\uB9AC
186
+ var DEFAULT_TURN_END = `${"<"}!-- primary-only -->
187
+ ## \uC791\uC5C5 \uB9C8\uBB34\uB9AC
178
188
 
179
189
  \uC791\uC5C5\uC774 \uC644\uB8CC\uB418\uBA74, \uC544\uB798 \uB450 \uAC00\uC9C0\uB97C **\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8\uC5D0 \uC704\uC784**\uD558\uC138\uC694.
180
190
  \uBA54\uC778 \uC5D0\uC774\uC804\uD2B8\uAC00 \uC9C1\uC811 \uC218\uD589\uD558\uC9C0 \uB9C8\uC138\uC694.
@@ -252,13 +262,16 @@ task(
252
262
  """
253
263
  )
254
264
  \`\`\`
255
- `;
256
- var DEFAULT_SUBAGENT_TURN_END = `<environment-constraints>
265
+
266
+ ${"<"}!-- /primary-only -->
267
+ ${"<"}!-- subagent-only -->
268
+ <environment-constraints>
257
269
  \uB2F9\uC2E0\uC740 \uD604\uC7AC \uBA54\uC778 \uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uD130\uAC00 \uD638\uCD9C\uD55C **\uB9D0\uB2E8 \uC6CC\uCEE4(Worker) \uC5D0\uC774\uC804\uD2B8**\uC785\uB2C8\uB2E4.
258
270
  \uD604\uC7AC \uB2F9\uC2E0\uC758 \uC2E4\uD589 \uD658\uACBD(Sandbox)\uC5D0\uC11C\uB294 \uB124\uD2B8\uC6CC\uD06C \uC790\uC6D0 \uBCF4\uD638\uB97C \uC704\uD574 **\uB2E4\uB978 \uC5D0\uC774\uC804\uD2B8\uB97C \uC0DD\uC131, \uD638\uCD9C, \uC704\uC784\uD558\uB294 \uBAA8\uB4E0 \uB3C4\uAD6C(\uC608: task, background_task \uB4F1)\uC758 \uAD8C\uD55C\uC774 \uC2DC\uC2A4\uD15C \uB808\uBCA8\uC5D0\uC11C \uD68C\uC218**\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
259
271
 
260
272
  \uB9CC\uC57D \uC791\uC5C5 \uC911 \uB2E4\uB978 \uC804\uBB38\uAC00(explore, librarian \uB4F1)\uC758 \uB3C4\uC6C0\uC774 \uD544\uC694\uD558\uB2E4\uBA74, \uC9C1\uC811 \uC5D0\uC774\uC804\uD2B8\uB97C \uBD80\uB974\uB824 \uC2DC\uB3C4\uD558\uC9C0 \uB9C8\uC138\uC694. \uB300\uC2E0 \uD604\uC7AC\uAE4C\uC9C0\uC758 \uBD84\uC11D \uACB0\uACFC\uB97C \uC694\uC57D\uD558\uACE0 "OOO \uC5D0\uC774\uC804\uD2B8\uC758 \uB3C4\uC6C0\uC774 \uD544\uC694\uD568"\uC774\uB77C\uB294 \uBA54\uC2DC\uC9C0\uC640 \uD568\uAED8 \uC791\uC5C5\uC744 \uC885\uB8CC(Complete)\uD558\uC5EC \uBA54\uC778 \uC5D0\uC774\uC804\uD2B8\uC5D0\uAC8C \uC81C\uC5B4\uAD8C\uC744 \uBC18\uD658\uD558\uC138\uC694.
261
273
  </environment-constraints>
274
+ ${"<"}!-- /subagent-only -->
262
275
  `;
263
276
  var DEFAULT_ADR_TEMPLATE = `# ADR-NNN: [\uC81C\uBAA9]
264
277
 
@@ -486,7 +499,6 @@ function updateScaffold(projectDir) {
486
499
  "config.jsonc": DEFAULT_CONFIG,
487
500
  [`prompts/${DEFAULTS.turnStartFile}`]: DEFAULT_TURN_START,
488
501
  [`prompts/${DEFAULTS.turnEndFile}`]: DEFAULT_TURN_END,
489
- [`prompts/${DEFAULTS.subagentTurnEndFile}`]: DEFAULT_SUBAGENT_TURN_END,
490
502
  ...templateEntries
491
503
  };
492
504
  const updated = [];
@@ -511,8 +523,7 @@ function updatePrompts(projectDir) {
511
523
  mkdirSync(join(contextDir, "prompts"), { recursive: true });
512
524
  const prompts = {
513
525
  [`prompts/${DEFAULTS.turnStartFile}`]: DEFAULT_TURN_START,
514
- [`prompts/${DEFAULTS.turnEndFile}`]: DEFAULT_TURN_END,
515
- [`prompts/${DEFAULTS.subagentTurnEndFile}`]: DEFAULT_SUBAGENT_TURN_END
526
+ [`prompts/${DEFAULTS.turnEndFile}`]: DEFAULT_TURN_END
516
527
  };
517
528
  const updated = [];
518
529
  for (const [path, content] of Object.entries(prompts)) {
@@ -676,7 +687,7 @@ function runCli(argv) {
676
687
  process.exit(1);
677
688
  }
678
689
  }
679
- if (import.meta.path === Bun.main) {
690
+ if (typeof Bun !== "undefined" && import.meta.path === Bun.main) {
680
691
  runCli(process.argv.slice(2));
681
692
  }
682
693
  export {
package/dist/index.js CHANGED
@@ -816,7 +816,6 @@ var DEFAULTS = {
816
816
  promptDir: ".opencode/context/prompts",
817
817
  turnStartFile: "turn-start.md",
818
818
  turnEndFile: "turn-end.md",
819
- subagentTurnEndFile: "subagent-turn-end.md",
820
819
  blockedToolPatterns: ["^task$", "^background_", "agent"],
821
820
  knowledgeSources: ["AGENTS.md"],
822
821
  templateDir: ".opencode/context/templates",
@@ -837,14 +836,13 @@ function getDefaultConfig() {
837
836
  return {
838
837
  prompts: {
839
838
  turnStart: join(DEFAULTS.promptDir, DEFAULTS.turnStartFile),
840
- turnEnd: join(DEFAULTS.promptDir, DEFAULTS.turnEndFile),
841
- subagentTurnEnd: join(DEFAULTS.promptDir, DEFAULTS.subagentTurnEndFile)
839
+ turnEnd: join(DEFAULTS.promptDir, DEFAULTS.turnEndFile)
842
840
  },
843
841
  subagentConfig: {
844
842
  blockedToolPatterns: [...DEFAULTS.blockedToolPatterns]
845
843
  },
846
844
  knowledge: {
847
- dir: DEFAULTS.knowledgeDir,
845
+ dir: "docs",
848
846
  sources: [...DEFAULTS.knowledgeSources],
849
847
  mode: "auto",
850
848
  indexFilename: DEFAULTS.indexFilename,
@@ -857,8 +855,7 @@ function mergeWithDefaults(partial) {
857
855
  return {
858
856
  prompts: {
859
857
  turnStart: partial.prompts?.turnStart ?? defaults.prompts.turnStart,
860
- turnEnd: partial.prompts?.turnEnd ?? defaults.prompts.turnEnd,
861
- subagentTurnEnd: partial.prompts?.subagentTurnEnd ?? defaults.prompts.subagentTurnEnd
858
+ turnEnd: partial.prompts?.turnEnd ?? defaults.prompts.turnEnd
862
859
  },
863
860
  subagentConfig: {
864
861
  blockedToolPatterns: partial.subagentConfig?.blockedToolPatterns ?? defaults.subagentConfig.blockedToolPatterns
@@ -1103,7 +1100,7 @@ import { join as join3 } from "path";
1103
1100
  // package.json
1104
1101
  var package_default = {
1105
1102
  name: "@ksm0709/context",
1106
- version: "0.0.14",
1103
+ version: "0.0.15",
1107
1104
  author: {
1108
1105
  name: "TaehoKang",
1109
1106
  email: "ksm07091@gmail.com"
@@ -1165,8 +1162,7 @@ var DEFAULT_CONFIG = `{
1165
1162
  // See: https://github.com/ksm0709/context
1166
1163
  "prompts": {
1167
1164
  "turnStart": ".opencode/context/prompts/turn-start.md",
1168
- "turnEnd": ".opencode/context/prompts/turn-end.md",
1169
- "subagentTurnEnd": ".opencode/context/prompts/subagent-turn-end.md"
1165
+ "turnEnd": ".opencode/context/prompts/turn-end.md"
1170
1166
  },
1171
1167
  "subagentConfig": {
1172
1168
  "blockedToolPatterns": ["^task$", "^background_", "agent"]
@@ -1190,11 +1186,17 @@ var DEFAULT_TURN_START = `## Knowledge Context
1190
1186
  ### \uC791\uC5C5 \uC804 \uD544\uC218
1191
1187
 
1192
1188
  - \uC544\uB798 **Available Knowledge** \uBAA9\uB85D\uC5D0\uC11C \uD604\uC7AC \uC791\uC5C5\uACFC \uAD00\uB828\uB41C \uBB38\uC11C\uB97C **\uBA3C\uC800** \uC77D\uC73C\uC138\uC694
1189
+ ${"<"}!-- primary-only -->
1193
1190
  - \uC9C1\uC811 \uC77D\uAE30 \uC804\uC5D0 \uC544\uB798\uC640 \uAC19\uC774 **\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8(explore)\uC5D0 \uC704\uC784**\uD558\uC5EC, \uC5F0\uAD00\uB41C \uB178\uD2B8\uB97C \uC9D1\uC911 \uD0D0\uC0C9\uD558\uACE0 \uC791\uC5C5\uC5D0 \uD544\uC694\uD55C \uB0B4\uC6A9\uC744 \uC694\uC57D\uD558\uB3C4\uB85D \uC9C0\uC2DC\uD558\uC138\uC694.
1191
+ ${"<"}!-- /primary-only -->
1192
+ ${"<"}!-- subagent-only -->
1193
+ - \uAD00\uB828 \uBB38\uC11C\uB97C \uC9C1\uC811 \uC77D\uACE0 \uC791\uC5C5\uC5D0 \uC801\uC6A9\uD558\uC138\uC694. \uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8\uB97C \uD638\uCD9C\uD558\uC9C0 \uB9C8\uC138\uC694.
1194
+ ${"<"}!-- /subagent-only -->
1194
1195
  - \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
1195
1196
  - \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
1196
1197
  - \uC9C0\uC2DD \uD30C\uC77C\uC5D0 \uAE30\uB85D\uB41C \uC544\uD0A4\uD14D\uCC98 \uACB0\uC815, \uD328\uD134, \uC81C\uC57D\uC0AC\uD56D\uC744 \uBC18\uB4DC\uC2DC \uB530\uB974\uC138\uC694
1197
1198
 
1199
+ ${"<"}!-- primary-only -->
1198
1200
  ### \uC9C0\uC2DD \uD0D0\uC0C9 (\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8 \uC704\uC784)
1199
1201
 
1200
1202
  \uD604\uC7AC \uC791\uC5C5\uACFC \uAD00\uB828\uB41C \uC9C0\uC2DD \uB178\uD2B8\uB97C \uC77D\uACE0 \uC694\uC57D\uD558\uB294 \uC791\uC5C5\uC744 **\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8\uC5D0 \uC704\uC784**\uD558\uC5EC \uCEE8\uD14D\uC2A4\uD2B8 \uD30C\uC545\uC744 \uD6A8\uC728\uD654\uD558\uC138\uC694.
@@ -1225,6 +1227,8 @@ task(
1225
1227
  )
1226
1228
  \`\`\`
1227
1229
 
1230
+ ${"<"}!-- /primary-only -->
1231
+
1228
1232
 
1229
1233
  - \uC544\uB798 **Available Knowledge** \uBAA9\uB85D\uC5D0\uC11C \uD604\uC7AC \uC791\uC5C5\uACFC \uAD00\uB828\uB41C \uBB38\uC11C\uB97C **\uBA3C\uC800** \uC77D\uC73C\uC138\uC694
1230
1234
  - \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
@@ -1241,9 +1245,12 @@ task(
1241
1245
 
1242
1246
  - AGENTS.md\uC758 \uC9C0\uC2DC\uC0AC\uD56D\uC774 \uD56D\uC0C1 \uCD5C\uC6B0\uC120
1243
1247
  - \uC9C0\uC2DD \uB178\uD2B8\uC758 \uACB0\uC815\uC0AC\uD56D > \uC77C\uBC18\uC801 \uAD00\uD589
1248
+ ${"<"}!-- primary-only -->
1244
1249
  - \uC9C0\uC2DD \uB178\uD2B8\uC5D0 \uC5C6\uB294 \uC0C8\uB85C\uC6B4 \uACB0\uC815\uC740 \uC791\uC5C5 \uC644\uB8CC \uC2DC \uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8\uC5D0 \uC704\uC784\uD558\uC5EC \uAE30\uB85D\uD558\uC138\uC694
1250
+ ${"<"}!-- /primary-only -->
1245
1251
  `;
1246
- var DEFAULT_TURN_END = `## \uC791\uC5C5 \uB9C8\uBB34\uB9AC
1252
+ var DEFAULT_TURN_END = `${"<"}!-- primary-only -->
1253
+ ## \uC791\uC5C5 \uB9C8\uBB34\uB9AC
1247
1254
 
1248
1255
  \uC791\uC5C5\uC774 \uC644\uB8CC\uB418\uBA74, \uC544\uB798 \uB450 \uAC00\uC9C0\uB97C **\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8\uC5D0 \uC704\uC784**\uD558\uC138\uC694.
1249
1256
  \uBA54\uC778 \uC5D0\uC774\uC804\uD2B8\uAC00 \uC9C1\uC811 \uC218\uD589\uD558\uC9C0 \uB9C8\uC138\uC694.
@@ -1321,13 +1328,16 @@ task(
1321
1328
  """
1322
1329
  )
1323
1330
  \`\`\`
1324
- `;
1325
- var DEFAULT_SUBAGENT_TURN_END = `<environment-constraints>
1331
+
1332
+ ${"<"}!-- /primary-only -->
1333
+ ${"<"}!-- subagent-only -->
1334
+ <environment-constraints>
1326
1335
  \uB2F9\uC2E0\uC740 \uD604\uC7AC \uBA54\uC778 \uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uD130\uAC00 \uD638\uCD9C\uD55C **\uB9D0\uB2E8 \uC6CC\uCEE4(Worker) \uC5D0\uC774\uC804\uD2B8**\uC785\uB2C8\uB2E4.
1327
1336
  \uD604\uC7AC \uB2F9\uC2E0\uC758 \uC2E4\uD589 \uD658\uACBD(Sandbox)\uC5D0\uC11C\uB294 \uB124\uD2B8\uC6CC\uD06C \uC790\uC6D0 \uBCF4\uD638\uB97C \uC704\uD574 **\uB2E4\uB978 \uC5D0\uC774\uC804\uD2B8\uB97C \uC0DD\uC131, \uD638\uCD9C, \uC704\uC784\uD558\uB294 \uBAA8\uB4E0 \uB3C4\uAD6C(\uC608: task, background_task \uB4F1)\uC758 \uAD8C\uD55C\uC774 \uC2DC\uC2A4\uD15C \uB808\uBCA8\uC5D0\uC11C \uD68C\uC218**\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
1328
1337
 
1329
1338
  \uB9CC\uC57D \uC791\uC5C5 \uC911 \uB2E4\uB978 \uC804\uBB38\uAC00(explore, librarian \uB4F1)\uC758 \uB3C4\uC6C0\uC774 \uD544\uC694\uD558\uB2E4\uBA74, \uC9C1\uC811 \uC5D0\uC774\uC804\uD2B8\uB97C \uBD80\uB974\uB824 \uC2DC\uB3C4\uD558\uC9C0 \uB9C8\uC138\uC694. \uB300\uC2E0 \uD604\uC7AC\uAE4C\uC9C0\uC758 \uBD84\uC11D \uACB0\uACFC\uB97C \uC694\uC57D\uD558\uACE0 "OOO \uC5D0\uC774\uC804\uD2B8\uC758 \uB3C4\uC6C0\uC774 \uD544\uC694\uD568"\uC774\uB77C\uB294 \uBA54\uC2DC\uC9C0\uC640 \uD568\uAED8 \uC791\uC5C5\uC744 \uC885\uB8CC(Complete)\uD558\uC5EC \uBA54\uC778 \uC5D0\uC774\uC804\uD2B8\uC5D0\uAC8C \uC81C\uC5B4\uAD8C\uC744 \uBC18\uD658\uD558\uC138\uC694.
1330
1339
  </environment-constraints>
1340
+ ${"<"}!-- /subagent-only -->
1331
1341
  `;
1332
1342
  var DEFAULT_ADR_TEMPLATE = `# ADR-NNN: [\uC81C\uBAA9]
1333
1343
 
@@ -1559,7 +1569,6 @@ function scaffoldIfNeeded(projectDir) {
1559
1569
  writeFileSync(join3(contextDir, "config.jsonc"), DEFAULT_CONFIG, "utf-8");
1560
1570
  writeFileSync(join3(promptsDir, DEFAULTS.turnStartFile), DEFAULT_TURN_START, "utf-8");
1561
1571
  writeFileSync(join3(promptsDir, DEFAULTS.turnEndFile), DEFAULT_TURN_END, "utf-8");
1562
- writeFileSync(join3(promptsDir, DEFAULTS.subagentTurnEndFile), DEFAULT_SUBAGENT_TURN_END, "utf-8");
1563
1572
  for (const [filename, content] of Object.entries(TEMPLATE_FILES)) {
1564
1573
  writeFileSync(join3(templatesDir, filename), content, "utf-8");
1565
1574
  }
@@ -1602,6 +1611,49 @@ function autoUpdateTemplates(projectDir) {
1602
1611
  return updated;
1603
1612
  }
1604
1613
 
1614
+ // src/lib/prompt-filter.ts
1615
+ function filterByAgentType(content, isSubagent) {
1616
+ const process = (text, marker, shouldRemove) => {
1617
+ const startTag = `<!-- ${marker} -->`;
1618
+ const endTag = `<!-- /${marker} -->`;
1619
+ if (!text.includes(startTag))
1620
+ return text;
1621
+ if (!text.includes(endTag))
1622
+ return text;
1623
+ const regex = new RegExp(`${startTag}\\n?([\\s\\S]*?)${endTag}\\n?`, "g");
1624
+ if (shouldRemove) {
1625
+ return text.replace(regex, "");
1626
+ } else {
1627
+ return text.replace(regex, "$1");
1628
+ }
1629
+ };
1630
+ let filtered = content;
1631
+ if (isSubagent) {
1632
+ filtered = process(filtered, "primary-only", true);
1633
+ filtered = process(filtered, "subagent-only", false);
1634
+ } else {
1635
+ filtered = process(filtered, "subagent-only", true);
1636
+ filtered = process(filtered, "primary-only", false);
1637
+ }
1638
+ return filtered;
1639
+ }
1640
+
1641
+ // src/lib/subagent-detector.ts
1642
+ async function isSubagentSession(getSession, sessionID, cache) {
1643
+ if (!sessionID)
1644
+ return false;
1645
+ if (cache.has(sessionID))
1646
+ return cache.get(sessionID);
1647
+ try {
1648
+ const session = await getSession(sessionID);
1649
+ const result = !!session?.parentID;
1650
+ cache.set(sessionID, result);
1651
+ return result;
1652
+ } catch {
1653
+ return false;
1654
+ }
1655
+ }
1656
+
1605
1657
  // src/index.ts
1606
1658
  var plugin = async ({ directory, client }) => {
1607
1659
  const scaffolded = scaffoldIfNeeded(directory);
@@ -1626,14 +1678,13 @@ var plugin = async ({ directory, client }) => {
1626
1678
  }
1627
1679
  }
1628
1680
  const config = loadConfig(directory);
1681
+ const subagentCache = new Map;
1682
+ const getSession = (id) => client.session.get({ path: { id } });
1629
1683
  return {
1630
1684
  "tool.execute.before": async (input) => {
1631
1685
  try {
1632
- const session = await client.session.get({ path: { id: input.sessionID } });
1633
- if (!session)
1634
- return;
1635
- const isSubagent = ["explore", "librarian", "oracle", "Sisyphus-Junior"].includes(session.agent);
1636
- if (isSubagent) {
1686
+ const subagent = await isSubagentSession(getSession, input.sessionID, subagentCache);
1687
+ if (subagent) {
1637
1688
  const patterns = config.subagentConfig?.blockedToolPatterns ?? DEFAULTS.blockedToolPatterns;
1638
1689
  const isBlocked = patterns.some((pattern) => new RegExp(pattern, "i").test(input.tool));
1639
1690
  if (isBlocked) {
@@ -1653,7 +1704,9 @@ var plugin = async ({ directory, client }) => {
1653
1704
  if (!lastUserMsg)
1654
1705
  return;
1655
1706
  const turnStartPath = join4(directory, config.prompts.turnStart ?? join4(DEFAULTS.promptDir, DEFAULTS.turnStartFile));
1656
- const turnStart = readPromptFile(turnStartPath);
1707
+ const sessionID = lastUserMsg.info.sessionID;
1708
+ const subagent = await isSubagentSession(getSession, sessionID, subagentCache);
1709
+ const turnStart = filterByAgentType(readPromptFile(turnStartPath) ?? "", subagent);
1657
1710
  const knowledgeIndex = buildKnowledgeIndexV2(directory, config.knowledge);
1658
1711
  const indexContent = knowledgeIndex.mode === "flat" ? formatKnowledgeIndex(knowledgeIndex.individualFiles) : formatDomainIndex(knowledgeIndex);
1659
1712
  const combinedContent = [turnStart, indexContent].filter(Boolean).join(`
@@ -1668,10 +1721,9 @@ var plugin = async ({ directory, client }) => {
1668
1721
  text: combinedContent
1669
1722
  });
1670
1723
  }
1671
- const agentName = lastUserMsg.info.agent || "default";
1672
- const isSubagent = ["explore", "librarian", "oracle", "Sisyphus-Junior"].includes(agentName);
1673
- const turnEndPath = join4(directory, isSubagent ? config.prompts.subagentTurnEnd ?? join4(DEFAULTS.promptDir, DEFAULTS.subagentTurnEndFile) : config.prompts.turnEnd ?? join4(DEFAULTS.promptDir, DEFAULTS.turnEndFile));
1674
- const turnEnd = readPromptFile(turnEndPath);
1724
+ const turnEndPath = join4(directory, config.prompts.turnEnd ?? join4(DEFAULTS.promptDir, DEFAULTS.turnEndFile));
1725
+ const rawTurnEnd = readPromptFile(turnEndPath);
1726
+ const turnEnd = rawTurnEnd ? filterByAgentType(rawTurnEnd, subagent) : null;
1675
1727
  if (!turnEnd)
1676
1728
  return;
1677
1729
  const msgId = `context-turn-end-${Date.now()}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ksm0709/context",
3
- "version": "0.0.14",
3
+ "version": "0.0.15",
4
4
  "author": {
5
5
  "name": "TaehoKang",
6
6
  "email": "ksm07091@gmail.com"
@@ -1,14 +0,0 @@
1
- export declare const DEFAULTS: {
2
- readonly configPath: ".opencode/context/config.jsonc";
3
- readonly promptDir: ".opencode/context/prompts";
4
- readonly turnStartFile: "turn-start.md";
5
- readonly turnEndFile: "turn-end.md";
6
- readonly knowledgeSources: readonly ["AGENTS.md"];
7
- };
8
- export declare const LIMITS: {
9
- readonly maxPromptFileSize: number;
10
- readonly maxIndexEntries: 100;
11
- readonly maxTotalInjectionSize: number;
12
- readonly maxScanDepth: 3;
13
- readonly maxSummaryLength: 100;
14
- };