@ksm0709/context 0.0.13 → 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
@@ -2,8 +2,9 @@
2
2
  // @bun
3
3
 
4
4
  // src/cli/commands/update.ts
5
- import { resolve } from "path";
5
+ import { resolve, join as join2 } from "path";
6
6
  import { existsSync as existsSync2 } from "fs";
7
+ import { homedir } from "os";
7
8
 
8
9
  // src/lib/scaffold.ts
9
10
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
@@ -15,8 +16,8 @@ var DEFAULTS = {
15
16
  promptDir: ".opencode/context/prompts",
16
17
  turnStartFile: "turn-start.md",
17
18
  turnEndFile: "turn-end.md",
19
+ blockedToolPatterns: ["^task$", "^background_", "agent"],
18
20
  knowledgeSources: ["AGENTS.md"],
19
- knowledgeDir: "docs",
20
21
  templateDir: ".opencode/context/templates",
21
22
  indexFilename: "INDEX.md",
22
23
  maxDomainDepth: 2
@@ -32,7 +33,7 @@ var LIMITS = {
32
33
  // package.json
33
34
  var package_default = {
34
35
  name: "@ksm0709/context",
35
- version: "0.0.12",
36
+ version: "0.0.14",
36
37
  author: {
37
38
  name: "TaehoKang",
38
39
  email: "ksm07091@gmail.com"
@@ -68,22 +69,23 @@ var package_default = {
68
69
  "@opencode-ai/plugin": ">=1.0.0"
69
70
  },
70
71
  dependencies: {
71
- "@ksm0709/context": "^0.0.11",
72
+ "@ksm0709/context": "^0.0.12",
72
73
  "jsonc-parser": "^3.0.0"
73
74
  },
74
75
  devDependencies: {
75
- "@opencode-ai/plugin": "^1.2.10",
76
76
  "@eslint/js": "^9.39.1",
77
+ "@opencode-ai/plugin": "^1.2.10",
77
78
  "@types/node": "^20.11.5",
78
79
  "@typescript-eslint/eslint-plugin": "8.47.0",
79
80
  "@typescript-eslint/parser": "8.47.0",
81
+ "@vitest/coverage-v8": "^4.0.18",
80
82
  "bun-types": "latest",
81
83
  eslint: "^9.39.1",
82
84
  "eslint-config-prettier": "10.1.8",
83
85
  "eslint-plugin-prettier": "^5.1.3",
84
86
  prettier: "^3.2.4",
85
87
  "typescript-eslint": "^8.47.0",
86
- vitest: "^3.2.4"
88
+ vitest: "^4.0.18"
87
89
  }
88
90
  };
89
91
 
@@ -96,6 +98,9 @@ var DEFAULT_CONFIG = `{
96
98
  "turnStart": ".opencode/context/prompts/turn-start.md",
97
99
  "turnEnd": ".opencode/context/prompts/turn-end.md"
98
100
  },
101
+ "subagentConfig": {
102
+ "blockedToolPatterns": ["^task$", "^background_", "agent"]
103
+ },
99
104
  "knowledge": {
100
105
  "dir": "docs",
101
106
  "sources": ["AGENTS.md"]
@@ -115,11 +120,17 @@ var DEFAULT_TURN_START = `## Knowledge Context
115
120
  ### \uC791\uC5C5 \uC804 \uD544\uC218
116
121
 
117
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 -->
118
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 -->
119
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
120
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
121
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
122
132
 
133
+ ${"<"}!-- primary-only -->
123
134
  ### \uC9C0\uC2DD \uD0D0\uC0C9 (\uC11C\uBE0C\uC5D0\uC774\uC804\uD2B8 \uC704\uC784)
124
135
 
125
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.
@@ -150,6 +161,8 @@ task(
150
161
  )
151
162
  \`\`\`
152
163
 
164
+ ${"<"}!-- /primary-only -->
165
+
153
166
 
154
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
155
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
@@ -166,9 +179,12 @@ task(
166
179
 
167
180
  - AGENTS.md\uC758 \uC9C0\uC2DC\uC0AC\uD56D\uC774 \uD56D\uC0C1 \uCD5C\uC6B0\uC120
168
181
  - \uC9C0\uC2DD \uB178\uD2B8\uC758 \uACB0\uC815\uC0AC\uD56D > \uC77C\uBC18\uC801 \uAD00\uD589
182
+ ${"<"}!-- primary-only -->
169
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 -->
170
185
  `;
171
- var DEFAULT_TURN_END = `## \uC791\uC5C5 \uB9C8\uBB34\uB9AC
186
+ var DEFAULT_TURN_END = `${"<"}!-- primary-only -->
187
+ ## \uC791\uC5C5 \uB9C8\uBB34\uB9AC
172
188
 
173
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.
174
190
  \uBA54\uC778 \uC5D0\uC774\uC804\uD2B8\uAC00 \uC9C1\uC811 \uC218\uD589\uD558\uC9C0 \uB9C8\uC138\uC694.
@@ -246,6 +262,16 @@ task(
246
262
  """
247
263
  )
248
264
  \`\`\`
265
+
266
+ ${"<"}!-- /primary-only -->
267
+ ${"<"}!-- subagent-only -->
268
+ <environment-constraints>
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.
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.
271
+
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.
273
+ </environment-constraints>
274
+ ${"<"}!-- /subagent-only -->
249
275
  `;
250
276
  var DEFAULT_ADR_TEMPLATE = `# ADR-NNN: [\uC81C\uBAA9]
251
277
 
@@ -578,18 +604,37 @@ function detectPackageManager() {
578
604
  return "npm";
579
605
  return "bun";
580
606
  }
607
+ function isGloballyInstalled() {
608
+ const globalBin = join2(homedir(), ".bun", "bin", "context");
609
+ return existsSync2(globalBin);
610
+ }
581
611
  function runUpdatePlugin(version) {
582
- const pm = detectPackageManager();
583
612
  const pkg = `@ksm0709/context@${version}`;
584
- process.stdout.write(`Updating ${pkg} using ${pm}...
613
+ const globalInstalled = isGloballyInstalled();
614
+ if (globalInstalled) {
615
+ process.stdout.write(`Updating global ${pkg}...
585
616
  `);
586
- const result = Bun.spawnSync([pm, "add", pkg]);
587
- if (result.exitCode !== 0) {
588
- process.stderr.write(`Failed to update: ${result.stderr.toString()}
617
+ const globalResult = Bun.spawnSync(["bun", "install", "-g", pkg]);
618
+ if (globalResult.exitCode !== 0) {
619
+ process.stderr.write(`Failed to update global: ${globalResult.stderr.toString()}
620
+ `);
621
+ process.exit(1);
622
+ return;
623
+ }
624
+ process.stdout.write(`Successfully updated global ${pkg}.
625
+ `);
626
+ }
627
+ const pm = detectPackageManager();
628
+ process.stdout.write(`Updating local ${pkg} using ${pm}...
629
+ `);
630
+ const localResult = Bun.spawnSync([pm, "add", pkg]);
631
+ if (localResult.exitCode !== 0) {
632
+ process.stderr.write(`Failed to update local: ${localResult.stderr.toString()}
589
633
  `);
590
634
  process.exit(1);
635
+ return;
591
636
  }
592
- process.stdout.write(`Successfully updated to ${pkg}.
637
+ process.stdout.write(`Successfully updated local ${pkg}.
593
638
  `);
594
639
  }
595
640
 
@@ -642,7 +687,7 @@ function runCli(argv) {
642
687
  process.exit(1);
643
688
  }
644
689
  }
645
- if (import.meta.path === Bun.main) {
690
+ if (typeof Bun !== "undefined" && import.meta.path === Bun.main) {
646
691
  runCli(process.argv.slice(2));
647
692
  }
648
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.13",
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.13",
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
- };