@ksm0709/context 0.0.1 → 0.0.3

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.
Files changed (2) hide show
  1. package/dist/index.js +112 -17
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -816,7 +816,8 @@ var DEFAULTS = {
816
816
  promptDir: ".opencode/context/prompts",
817
817
  turnStartFile: "turn-start.md",
818
818
  turnEndFile: "turn-end.md",
819
- knowledgeSources: ["AGENTS.md"]
819
+ knowledgeSources: ["AGENTS.md"],
820
+ knowledgeDir: "docs"
820
821
  };
821
822
  var LIMITS = {
822
823
  maxPromptFileSize: 64 * 1024,
@@ -834,6 +835,7 @@ function getDefaultConfig() {
834
835
  turnEnd: join(DEFAULTS.promptDir, DEFAULTS.turnEndFile)
835
836
  },
836
837
  knowledge: {
838
+ dir: DEFAULTS.knowledgeDir,
837
839
  sources: [...DEFAULTS.knowledgeSources]
838
840
  }
839
841
  };
@@ -846,6 +848,7 @@ function mergeWithDefaults(partial) {
846
848
  turnEnd: partial.prompts?.turnEnd ?? defaults.prompts.turnEnd
847
849
  },
848
850
  knowledge: {
851
+ dir: partial.knowledge?.dir ?? defaults.knowledge.dir,
849
852
  sources: partial.knowledge?.sources ?? defaults.knowledge.sources
850
853
  }
851
854
  };
@@ -951,7 +954,7 @@ function readPromptFile(filePath) {
951
954
  }
952
955
 
953
956
  // src/lib/scaffold.ts
954
- import { existsSync as existsSync2, mkdirSync, writeFileSync } from "fs";
957
+ import { existsSync as existsSync2, mkdirSync, readFileSync as readFileSync4, writeFileSync } from "fs";
955
958
  import { join as join3 } from "path";
956
959
  var DEFAULT_CONFIG = `{
957
960
  // Context Plugin Configuration
@@ -961,15 +964,23 @@ var DEFAULT_CONFIG = `{
961
964
  "turnEnd": ".opencode/context/prompts/turn-end.md"
962
965
  },
963
966
  "knowledge": {
967
+ "dir": "docs",
964
968
  "sources": ["AGENTS.md"]
965
969
  }
966
970
  }`;
967
971
  var DEFAULT_TURN_START = `## Knowledge Context
968
972
 
969
- \uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \uC9C0\uC2DD \uBCA0\uC774\uC2A4\uB97C \uCC38\uACE0\uD558\uC5EC \uC791\uC5C5\uD558\uC138\uC694.
970
- - \uC791\uC5C5\uACFC \uAD00\uB828\uB41C \uC9C0\uC2DD \uD30C\uC77C\uC774 \uC788\uC73C\uBA74 \uBA3C\uC800 \uC77D\uACE0 \uCC38\uC870\uD558\uC138\uC694
971
- - \uC9C0\uC2DD \uAC04 [[\uB9C1\uD06C]]\uB97C \uB530\uB77C\uAC00\uBA70 \uAD00\uB828 \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uD30C\uC545\uD558\uC138\uC694
972
- - AGENTS.md\uC758 \uC9C0\uC2DC\uC0AC\uD56D\uC744 \uC900\uC218\uD558\uC138\uC694
973
+ \uC774 \uD504\uB85C\uC81D\uD2B8\uB294 \uC81C\uD154\uCE74\uC2A4\uD150(Zettelkasten) \uBC29\uC2DD\uC73C\uB85C \uC9C0\uC2DD\uC744 \uAD00\uB9AC\uD558\uC5EC \uC791\uC5C5 \uAC04 \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uBCF4\uC874\uD569\uB2C8\uB2E4.
974
+
975
+ ### \uC791\uC5C5 \uC804 \uD544\uC218
976
+ - \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
977
+ - \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
978
+ - \uBB38\uC11C \uB0B4 [[\uB9C1\uD06C]]\uB97C \uB530\uB77C\uAC00\uBA70 \uAD00\uB828 \uB178\uD2B8\uB97C \uD0D0\uC0C9\uD558\uC138\uC694 \u2014 \uB9C1\uD06C\uB97C \uB193\uCE58\uBA74 \uC911\uC694\uD55C \uB9E5\uB77D\uC744 \uC783\uC2B5\uB2C8\uB2E4
979
+
980
+ ### \uC6B0\uC120\uC21C\uC704
981
+ - AGENTS.md\uC758 \uC9C0\uC2DC\uC0AC\uD56D\uC774 \uD56D\uC0C1 \uCD5C\uC6B0\uC120
982
+ - \uC9C0\uC2DD \uB178\uD2B8\uC758 \uACB0\uC815\uC0AC\uD56D > \uC77C\uBC18\uC801 \uAD00\uD589
983
+ - \uC9C0\uC2DD \uB178\uD2B8\uC5D0 \uC5C6\uB294 \uC0C8\uB85C\uC6B4 \uACB0\uC815\uC740 \uC791\uC5C5 \uC644\uB8CC \uC2DC \uAE30\uB85D\uD558\uC138\uC694
973
984
  `;
974
985
  var DEFAULT_TURN_END = `## \uC791\uC5C5 \uB9C8\uBB34\uB9AC \uCCB4\uD06C\uB9AC\uC2A4\uD2B8
975
986
 
@@ -980,8 +991,14 @@ var DEFAULT_TURN_END = `## \uC791\uC5C5 \uB9C8\uBB34\uB9AC \uCCB4\uD06C\uB9AC\uC
980
991
  - [ ] \uD0C0\uC785 \uC5D0\uB7EC \uD655\uC778
981
992
  - [ ] \uAE30\uC874 \uD14C\uC2A4\uD2B8 \uD1B5\uACFC \uD655\uC778
982
993
 
983
- ### \uC9C0\uC2DD \uC815\uB9AC
984
- - [ ] \uC0C8\uB85C \uC54C\uAC8C \uB41C \uC911\uC694\uD55C \uD328\uD134/\uACB0\uC815\uC774 \uC788\uC73C\uBA74 \uC9C0\uC2DD \uD30C\uC77C\uB85C \uC815\uB9AC
994
+ ### \uC9C0\uC2DD \uC815\uB9AC (Zettelkasten)
995
+ - [ ] \uC0C8\uB85C\uC6B4 \uACB0\uC815/\uD328\uD134/\uAC1C\uB150\uC744 \uBC1C\uACAC\uD558\uBA74 **\uC6D0\uC790\uC801 \uB178\uD2B8**(\uD558\uB098\uC758 \uB178\uD2B8 = \uD558\uB098\uC758 \uC8FC\uC81C)\uB85C \uC791\uC131
996
+ - [ ] \uAD00\uB828 \uAE30\uC874 \uB178\uD2B8\uC5D0 [[\uB9C1\uD06C]]\uB97C \uCD94\uAC00\uD558\uC5EC \uC5F0\uACB0 \u2014 \uACE0\uB9BD\uB41C \uB178\uD2B8\uB294 \uAC00\uCE58\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4
997
+ - [ ] \uAE30\uC874 \uB178\uD2B8\uC758 \uB0B4\uC6A9\uC774 \uBCC0\uACBD\uC0AC\uD56D\uACFC \uBD88\uC77C\uCE58\uD558\uBA74 \uC5C5\uB370\uC774\uD2B8
998
+ - [ ] \uB178\uD2B8 \uC791\uC131 \uADDC\uCE59:
999
+ - \uCCAB \uC904: \uBA85\uD655\uD55C \uC81C\uBAA9 (# Title)
1000
+ - \uD575\uC2EC \uB0B4\uC6A9\uC744 \uC790\uC2E0\uC758 \uC5B8\uC5B4\uB85C \uAC04\uACB0\uD558\uAC8C \uC11C\uC220
1001
+ - \uAD00\uB828 \uB178\uD2B8\uB97C [[wikilink]]\uB85C \uC5F0\uACB0
985
1002
  `;
986
1003
  function scaffoldIfNeeded(projectDir) {
987
1004
  const contextDir = join3(projectDir, ".opencode", "context");
@@ -999,6 +1016,27 @@ function scaffoldIfNeeded(projectDir) {
999
1016
  return false;
1000
1017
  }
1001
1018
  }
1019
+ function updateScaffold(projectDir) {
1020
+ const contextDir = join3(projectDir, ".opencode", "context");
1021
+ mkdirSync(join3(contextDir, "prompts"), { recursive: true });
1022
+ const templates = {
1023
+ "config.jsonc": DEFAULT_CONFIG,
1024
+ [`prompts/${DEFAULTS.turnStartFile}`]: DEFAULT_TURN_START,
1025
+ [`prompts/${DEFAULTS.turnEndFile}`]: DEFAULT_TURN_END
1026
+ };
1027
+ const updated = [];
1028
+ for (const [path, content] of Object.entries(templates)) {
1029
+ const filePath = join3(contextDir, path);
1030
+ try {
1031
+ const existing = readFileSync4(filePath, "utf-8");
1032
+ if (existing === content)
1033
+ continue;
1034
+ } catch {}
1035
+ writeFileSync(filePath, content, "utf-8");
1036
+ updated.push(path);
1037
+ }
1038
+ return updated;
1039
+ }
1002
1040
 
1003
1041
  // src/index.ts
1004
1042
  var plugin = async ({ directory, client }) => {
@@ -1014,19 +1052,76 @@ var plugin = async ({ directory, client }) => {
1014
1052
  }
1015
1053
  const config = loadConfig(directory);
1016
1054
  return {
1055
+ config: async (cfg) => {
1056
+ cfg.command ??= {};
1057
+ cfg.command["context-update"] = {
1058
+ template: "",
1059
+ description: "Update context scaffold files to latest plugin version"
1060
+ };
1061
+ },
1062
+ "command.execute.before": async (input, output) => {
1063
+ if (input.command !== "context-update")
1064
+ return;
1065
+ const updated = updateScaffold(directory);
1066
+ if (updated.length === 0) {
1067
+ output.parts = [{ type: "text", text: "All scaffold files are already up to date." }];
1068
+ } else {
1069
+ const lines = updated.map((f) => `- ${f}`).join(`
1070
+ `);
1071
+ output.parts = [{ type: "text", text: `Updated ${updated.length} file(s):
1072
+ ${lines}` }];
1073
+ }
1074
+ },
1017
1075
  "experimental.chat.system.transform": async (_input, output) => {
1018
- const turnStartPath = join4(directory, config.prompts.turnStart ?? join4(DEFAULTS.promptDir, DEFAULTS.turnStartFile));
1019
- const turnEndPath = join4(directory, config.prompts.turnEnd ?? join4(DEFAULTS.promptDir, DEFAULTS.turnEndFile));
1020
- const turnStart = readPromptFile(turnStartPath);
1021
- const turnEnd = readPromptFile(turnEndPath);
1022
- const entries = buildKnowledgeIndex(directory, config.knowledge.sources);
1076
+ const knowledgeSources = [config.knowledge.dir, ...config.knowledge.sources].filter((s) => Boolean(s));
1077
+ const entries = buildKnowledgeIndex(directory, knowledgeSources);
1023
1078
  const indexContent = formatKnowledgeIndex(entries);
1024
- if (turnStart)
1025
- output.system.push(turnStart);
1026
1079
  if (indexContent)
1027
1080
  output.system.push(indexContent);
1028
- if (turnEnd)
1029
- output.system.push(turnEnd);
1081
+ },
1082
+ "experimental.chat.messages.transform": async (_input, output) => {
1083
+ if (output.messages.length === 0)
1084
+ return;
1085
+ const lastUserMsg = output.messages.filter((m) => m.info.role === "user").at(-1);
1086
+ if (!lastUserMsg)
1087
+ return;
1088
+ const turnStartPath = join4(directory, config.prompts.turnStart ?? join4(DEFAULTS.promptDir, DEFAULTS.turnStartFile));
1089
+ const turnStart = readPromptFile(turnStartPath);
1090
+ if (turnStart) {
1091
+ lastUserMsg.parts.push({
1092
+ id: `context-turn-start-${Date.now()}`,
1093
+ sessionID: lastUserMsg.info.sessionID,
1094
+ messageID: lastUserMsg.info.id,
1095
+ type: "text",
1096
+ text: turnStart
1097
+ });
1098
+ }
1099
+ const turnEndPath = join4(directory, config.prompts.turnEnd ?? join4(DEFAULTS.promptDir, DEFAULTS.turnEndFile));
1100
+ const turnEnd = readPromptFile(turnEndPath);
1101
+ if (!turnEnd)
1102
+ return;
1103
+ const msgId = `context-turn-end-${Date.now()}`;
1104
+ output.messages.push({
1105
+ info: {
1106
+ id: msgId,
1107
+ sessionID: lastUserMsg.info.sessionID,
1108
+ role: "user",
1109
+ time: { created: Date.now() },
1110
+ agent: lastUserMsg.info.agent,
1111
+ model: lastUserMsg.info.model
1112
+ },
1113
+ parts: [
1114
+ {
1115
+ id: `context-turn-end-part-${Date.now()}`,
1116
+ sessionID: lastUserMsg.info.sessionID,
1117
+ messageID: msgId,
1118
+ type: "text",
1119
+ text: `<system-reminder>
1120
+ ${turnEnd}
1121
+ </system-reminder>`
1122
+ }
1123
+ ]
1124
+ });
1030
1125
  }
1031
1126
  };
1032
1127
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ksm0709/context",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "Intent tools for Bun",
5
5
  "author": {
6
6
  "name": "TaehoKang",