@ksm0709/context 0.0.1 → 0.0.2
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 +102 -13
- 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,70 @@ 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
1076
|
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
1077
|
const turnStart = readPromptFile(turnStartPath);
|
|
1021
|
-
const
|
|
1022
|
-
const entries = buildKnowledgeIndex(directory,
|
|
1078
|
+
const knowledgeSources = [config.knowledge.dir, ...config.knowledge.sources].filter((s) => Boolean(s));
|
|
1079
|
+
const entries = buildKnowledgeIndex(directory, knowledgeSources);
|
|
1023
1080
|
const indexContent = formatKnowledgeIndex(entries);
|
|
1024
1081
|
if (turnStart)
|
|
1025
1082
|
output.system.push(turnStart);
|
|
1026
1083
|
if (indexContent)
|
|
1027
1084
|
output.system.push(indexContent);
|
|
1028
|
-
|
|
1029
|
-
|
|
1085
|
+
},
|
|
1086
|
+
"experimental.chat.messages.transform": async (_input, output) => {
|
|
1087
|
+
const turnEndPath = join4(directory, config.prompts.turnEnd ?? join4(DEFAULTS.promptDir, DEFAULTS.turnEndFile));
|
|
1088
|
+
const turnEnd = readPromptFile(turnEndPath);
|
|
1089
|
+
if (!turnEnd)
|
|
1090
|
+
return;
|
|
1091
|
+
if (output.messages.length === 0)
|
|
1092
|
+
return;
|
|
1093
|
+
const lastUserMsg = output.messages.filter((m) => m.info.role === "user").at(-1);
|
|
1094
|
+
if (!lastUserMsg)
|
|
1095
|
+
return;
|
|
1096
|
+
const msgId = `context-turn-end-${Date.now()}`;
|
|
1097
|
+
output.messages.push({
|
|
1098
|
+
info: {
|
|
1099
|
+
id: msgId,
|
|
1100
|
+
sessionID: lastUserMsg.info.sessionID,
|
|
1101
|
+
role: "user",
|
|
1102
|
+
time: { created: Date.now() },
|
|
1103
|
+
agent: lastUserMsg.info.agent,
|
|
1104
|
+
model: lastUserMsg.info.model
|
|
1105
|
+
},
|
|
1106
|
+
parts: [
|
|
1107
|
+
{
|
|
1108
|
+
id: `context-turn-end-part-${Date.now()}`,
|
|
1109
|
+
sessionID: lastUserMsg.info.sessionID,
|
|
1110
|
+
messageID: msgId,
|
|
1111
|
+
type: "text",
|
|
1112
|
+
text: `<system-reminder>
|
|
1113
|
+
${turnEnd}
|
|
1114
|
+
</system-reminder>`,
|
|
1115
|
+
synthetic: true
|
|
1116
|
+
}
|
|
1117
|
+
]
|
|
1118
|
+
});
|
|
1030
1119
|
}
|
|
1031
1120
|
};
|
|
1032
1121
|
};
|