@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.
- package/dist/index.js +112 -17
- 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\
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
-
|
|
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 \
|
|
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
|
|
1019
|
-
const
|
|
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
|
-
|
|
1029
|
-
|
|
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
|
};
|