@ksm0709/context 0.0.23 → 0.0.26

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
@@ -27,7 +27,7 @@ function resolveContextDir(projectDir) {
27
27
  // package.json
28
28
  var package_default = {
29
29
  name: "@ksm0709/context",
30
- version: "0.0.23",
30
+ version: "0.0.26",
31
31
  author: {
32
32
  name: "TaehoKang",
33
33
  email: "ksm07091@gmail.com"
@@ -318,13 +318,14 @@ turn_id={{turnId}}
318
318
  `;
319
319
  var DEFAULT_DAILY_NOTE_GUIDE = `# \uB370\uC77C\uB9AC \uB178\uD2B8 \uAE30\uB85D \uAC00\uC774\uB4DC
320
320
 
321
- - [ ] \`docs/daily/YYYY-MM-DD.md\` \uD30C\uC77C(\uC624\uB298 \uB0A0\uC9DC \uAE30\uC900)\uC744 \uC0DD\uC131\uD558\uAC70\uB098 \uC5C5\uB370\uC774\uD2B8\uD558\uC138\uC694.
321
+ - [ ] \`context-mcp_append_daily_note\` \uB3C4\uAD6C\uB97C \uC0AC\uC6A9\uD558\uC5EC \uAE30\uB85D\uC744 \uCD94\uAC00\uD558\uC138\uC694.
322
322
  - [ ] **\uC8FC\uC758**: \uB370\uC77C\uB9AC \uB178\uD2B8\uC758 \uAE30\uC874 \uB0B4\uC6A9\uC740 \uC808\uB300 \uC218\uC815\uD558\uAC70\uB098 \uC0AD\uC81C\uD558\uC9C0 \uB9C8\uC138\uC694.
323
- - [ ] \uD30C\uC77C \uB9E8 \uB9C8\uC9C0\uB9C9 \uC904\uC5D0 \uB2E4\uC74C\uACFC \uAC19\uC740 \uD615\uC2DD\uC73C\uB85C\uB9CC \uAE30\uB85D\uC744 \uCD94\uAC00(Append)\uD558\uC138\uC694:
323
+ - [ ] \uAE30\uB85D\uC740 \uB2E4\uC74C\uACFC \uAC19\uC740 \uD615\uC2DD\uC73C\uB85C \uCD94\uAC00\uB429\uB2C8\uB2E4:
324
324
  \`[{{currentTimestamp}}] <\uAE30\uC5B5 \uD560 \uB0B4\uC6A9>\`
325
325
  - [ ] \`<\uAE30\uC5B5 \uD560 \uB0B4\uC6A9>\`\uC5D0\uB294 \uC644\uBCBD\uD55C \uCEE8\uD14D\uC2A4\uD2B8 \uC778\uACC4\uB97C \uC704\uD574 \uC624\uB298 \uC644\uB8CC\uD55C \uD575\uC2EC \uC791\uC5C5 \uC694\uC57D, \uBBF8\uD574\uACB0 \uC774\uC288(TODO), \uC911\uC694 \uBA54\uBAA8, \uC9C0\uC2DD \uB178\uD2B8 \`[[wikilink]]\` \uB4F1\uC744 \uD3EC\uD568\uD558\uC138\uC694.`;
326
326
  var DEFAULT_NOTE_GUIDE = `# \uC9C0\uC2DD \uB178\uD2B8 \uC791\uC131 \uBC0F \uAD00\uB9AC \uAC00\uC774\uB4DC
327
327
 
328
+ - [ ] **\uB178\uD2B8 \uC0DD\uC131**: \`context-mcp_create_knowledge_note\` \uB3C4\uAD6C\uB97C \uC0AC\uC6A9\uD558\uC5EC \uC0DD\uC131\uD558\uC138\uC694.
328
329
  - [ ] \uC81C\uD154\uCE74\uC2A4\uD150(Zettelkasten) 3\uB300 \uC6D0\uCE59 \uC900\uC218:
329
330
  - [ ] \uC6D0\uC790\uC131: \uD55C \uB178\uD2B8\uB2F9 \uD55C \uC8FC\uC81C
330
331
  - [ ] \uC5F0\uACB0: \uACE0\uB9BD\uB41C \uB178\uD2B8 \uBC29\uC9C0
package/dist/index.js CHANGED
@@ -25,7 +25,7 @@ import { join as join2 } from "path";
25
25
  // package.json
26
26
  var package_default = {
27
27
  name: "@ksm0709/context",
28
- version: "0.0.23",
28
+ version: "0.0.26",
29
29
  author: {
30
30
  name: "TaehoKang",
31
31
  email: "ksm07091@gmail.com"
@@ -316,13 +316,14 @@ turn_id={{turnId}}
316
316
  `;
317
317
  var DEFAULT_DAILY_NOTE_GUIDE = `# \uB370\uC77C\uB9AC \uB178\uD2B8 \uAE30\uB85D \uAC00\uC774\uB4DC
318
318
 
319
- - [ ] \`docs/daily/YYYY-MM-DD.md\` \uD30C\uC77C(\uC624\uB298 \uB0A0\uC9DC \uAE30\uC900)\uC744 \uC0DD\uC131\uD558\uAC70\uB098 \uC5C5\uB370\uC774\uD2B8\uD558\uC138\uC694.
319
+ - [ ] \`context-mcp_append_daily_note\` \uB3C4\uAD6C\uB97C \uC0AC\uC6A9\uD558\uC5EC \uAE30\uB85D\uC744 \uCD94\uAC00\uD558\uC138\uC694.
320
320
  - [ ] **\uC8FC\uC758**: \uB370\uC77C\uB9AC \uB178\uD2B8\uC758 \uAE30\uC874 \uB0B4\uC6A9\uC740 \uC808\uB300 \uC218\uC815\uD558\uAC70\uB098 \uC0AD\uC81C\uD558\uC9C0 \uB9C8\uC138\uC694.
321
- - [ ] \uD30C\uC77C \uB9E8 \uB9C8\uC9C0\uB9C9 \uC904\uC5D0 \uB2E4\uC74C\uACFC \uAC19\uC740 \uD615\uC2DD\uC73C\uB85C\uB9CC \uAE30\uB85D\uC744 \uCD94\uAC00(Append)\uD558\uC138\uC694:
321
+ - [ ] \uAE30\uB85D\uC740 \uB2E4\uC74C\uACFC \uAC19\uC740 \uD615\uC2DD\uC73C\uB85C \uCD94\uAC00\uB429\uB2C8\uB2E4:
322
322
  \`[{{currentTimestamp}}] <\uAE30\uC5B5 \uD560 \uB0B4\uC6A9>\`
323
323
  - [ ] \`<\uAE30\uC5B5 \uD560 \uB0B4\uC6A9>\`\uC5D0\uB294 \uC644\uBCBD\uD55C \uCEE8\uD14D\uC2A4\uD2B8 \uC778\uACC4\uB97C \uC704\uD574 \uC624\uB298 \uC644\uB8CC\uD55C \uD575\uC2EC \uC791\uC5C5 \uC694\uC57D, \uBBF8\uD574\uACB0 \uC774\uC288(TODO), \uC911\uC694 \uBA54\uBAA8, \uC9C0\uC2DD \uB178\uD2B8 \`[[wikilink]]\` \uB4F1\uC744 \uD3EC\uD568\uD558\uC138\uC694.`;
324
324
  var DEFAULT_NOTE_GUIDE = `# \uC9C0\uC2DD \uB178\uD2B8 \uC791\uC131 \uBC0F \uAD00\uB9AC \uAC00\uC774\uB4DC
325
325
 
326
+ - [ ] **\uB178\uD2B8 \uC0DD\uC131**: \`context-mcp_create_knowledge_note\` \uB3C4\uAD6C\uB97C \uC0AC\uC6A9\uD558\uC5EC \uC0DD\uC131\uD558\uC138\uC694.
326
327
  - [ ] \uC81C\uD154\uCE74\uC2A4\uD150(Zettelkasten) 3\uB300 \uC6D0\uCE59 \uC900\uC218:
327
328
  - [ ] \uC6D0\uC790\uC131: \uD55C \uB178\uD2B8\uB2F9 \uD55C \uC8FC\uC81C
328
329
  - [ ] \uC5F0\uACB0: \uACE0\uB9BD\uB41C \uB178\uD2B8 \uBC29\uC9C0
package/dist/mcp.js CHANGED
@@ -32650,12 +32650,13 @@ function startMcpServer() {
32650
32650
  server.registerTool("search_knowledge", {
32651
32651
  description: "Search .md files in docs/ and .context/ directories for a keyword or regex",
32652
32652
  inputSchema: {
32653
- query: exports_external.string().describe("The keyword or regex to search for")
32653
+ query: exports_external.string().describe("The keyword or regex to search for"),
32654
+ limit: exports_external.number().optional().default(50).describe("Maximum number of results to return")
32654
32655
  }
32655
- }, async ({ query }) => {
32656
+ }, async ({ query, limit = 50 }) => {
32656
32657
  const searchDirs = ["docs", ".context"];
32657
32658
  const results = [];
32658
- const maxResults = 10;
32659
+ const maxResults = limit;
32659
32660
  const snippetLength = 100;
32660
32661
  try {
32661
32662
  const regex = new RegExp(query, "i");
@@ -32769,11 +32770,18 @@ Snippet: ${r.snippet}`).join(`
32769
32770
  const year = date6.getFullYear();
32770
32771
  const month = String(date6.getMonth() + 1).padStart(2, "0");
32771
32772
  const day = String(date6.getDate()).padStart(2, "0");
32773
+ const hours = String(date6.getHours()).padStart(2, "0");
32774
+ const minutes = String(date6.getMinutes()).padStart(2, "0");
32775
+ const seconds = String(date6.getSeconds()).padStart(2, "0");
32772
32776
  const dateString = `${year}-${month}-${day}`;
32777
+ const timestamp = `[${year}-${month}-${day} ${hours}:${minutes}:${seconds}]`;
32773
32778
  const dirPath = path.resolve(process.cwd(), ".context/memory/daily");
32774
32779
  const filePath = path.join(dirPath, `${dateString}.md`);
32775
32780
  await fs.mkdir(dirPath, { recursive: true });
32776
32781
  let textToAppend = content;
32782
+ if (!content.startsWith(`[${year}-${month}-${day}`)) {
32783
+ textToAppend = `${timestamp} ${content}`;
32784
+ }
32777
32785
  try {
32778
32786
  const existingContent = await fs.readFile(filePath, "utf-8");
32779
32787
  if (existingContent.length > 0 && !existingContent.endsWith(`
@@ -32781,7 +32789,7 @@ Snippet: ${r.snippet}`).join(`
32781
32789
  textToAppend = `
32782
32790
  ` + textToAppend;
32783
32791
  }
32784
- } catch (err) {}
32792
+ } catch {}
32785
32793
  if (!textToAppend.endsWith(`
32786
32794
  `)) {
32787
32795
  textToAppend += `
@@ -32866,40 +32874,57 @@ Snippet: ${r.snippet}`).join(`
32866
32874
  }
32867
32875
  });
32868
32876
  server.registerTool("create_knowledge_note", {
32869
- description: "Create a new Zettelkasten knowledge note with frontmatter and wikilinks",
32877
+ description: "Create a new Zettelkasten knowledge note with frontmatter and wikilinks. You can optionally use a template by providing the `template` parameter. Available templates: adr (Architecture Decision Records), pattern (Design patterns), bug (Bug reports and analysis), gotcha (Pitfalls and gotchas), decision (General decisions), context (General context and background), runbook (Procedures and runbooks), insight (Insights and learnings).",
32870
32878
  inputSchema: {
32871
32879
  title: exports_external.string().describe("The title of the note"),
32872
32880
  content: exports_external.string().describe("The main content of the note"),
32873
32881
  tags: exports_external.array(exports_external.string()).optional().describe("Optional tags for the note"),
32874
- linked_notes: exports_external.array(exports_external.string()).optional().describe("Optional list of related note titles to link to")
32882
+ linked_notes: exports_external.array(exports_external.string()).optional().describe("Optional list of related note titles to link to"),
32883
+ template: exports_external.enum(["adr", "pattern", "bug", "gotcha", "decision", "context", "runbook", "insight"]).optional().describe("Optional template to use for the note")
32875
32884
  }
32876
- }, async ({ title, content, tags, linked_notes }) => {
32885
+ }, async ({ title, content, tags, linked_notes, template }) => {
32877
32886
  try {
32878
32887
  const filename = title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/(^-|-$)/g, "") + ".md";
32879
32888
  const dirPath = path.resolve(process.cwd(), ".context/memory");
32880
32889
  const filePath = path.join(dirPath, filename);
32881
32890
  await fs.mkdir(dirPath, { recursive: true });
32882
32891
  const date6 = new Date().toISOString().split("T")[0];
32883
- let fileContent = `---
32892
+ let fileContent = "";
32893
+ if (template) {
32894
+ const templatePath = path.resolve(process.cwd(), `.context/templates/${template}.md`);
32895
+ try {
32896
+ fileContent = await fs.readFile(templatePath, "utf-8");
32897
+ fileContent = fileContent.replace(/\[\uC81C\uBAA9\]/g, title);
32898
+ fileContent += `
32899
+
32900
+ ${content}`;
32901
+ } catch (err) {
32902
+ fileContent = `Error loading template: ${err instanceof Error ? err.message : String(err)}
32903
+
32904
+ ${content}`;
32905
+ }
32906
+ } else {
32907
+ fileContent = `---
32884
32908
  `;
32885
- fileContent += `title: ${title}
32909
+ fileContent += `title: ${title}
32886
32910
  `;
32887
- fileContent += `date: ${date6}
32911
+ fileContent += `date: ${date6}
32888
32912
  `;
32889
- if (tags && tags.length > 0) {
32890
- fileContent += `tags:
32913
+ if (tags && tags.length > 0) {
32914
+ fileContent += `tags:
32891
32915
  ${tags.map((t) => ` - ${t}`).join(`
32892
32916
  `)}
32893
32917
  `;
32894
- }
32895
- fileContent += `---
32918
+ }
32919
+ fileContent += `---
32896
32920
 
32897
32921
  `;
32898
- fileContent += `# ${title}
32922
+ fileContent += `# ${title}
32899
32923
 
32900
32924
  `;
32901
- fileContent += `${content}
32925
+ fileContent += `${content}
32902
32926
  `;
32927
+ }
32903
32928
  if (linked_notes && linked_notes.length > 0) {
32904
32929
  fileContent += `
32905
32930
  ## Related Notes
@@ -32957,7 +32982,7 @@ ${tags.map((t) => ` - ${t}`).join(`
32957
32982
  textToAppend = `
32958
32983
  ` + textToAppend;
32959
32984
  }
32960
- } catch (err) {}
32985
+ } catch {}
32961
32986
  if (!textToAppend.endsWith(`
32962
32987
  `)) {
32963
32988
  textToAppend += `
@@ -32990,36 +33015,43 @@ ${tags.map((t) => ` - ${t}`).join(`
32990
33015
  server.registerTool("submit_turn_complete", {
32991
33016
  description: "Mark the current turn as complete after verifying all required steps",
32992
33017
  inputSchema: {
32993
- daily_note_updated: exports_external.boolean().describe("\uB370\uC77C\uB9AC \uB178\uD2B8\uC5D0 \uC911\uC694\uD55C \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uAE30\uB85D\uD558\uC5EC \uB2E4\uC74C \uC138\uC158\uC774\uB098 \uC5D0\uC774\uC804\uD2B8 \uD300\uC774 \uCC38\uACE0\uD560 \uC218 \uC788\uB3C4\uB85D \uD558\uC138\uC694. \uAE30\uC874 \uB0B4\uC6A9 \uC218\uC815\uC740 \uBD88\uAC00\uD558\uBA70, \uC0C8\uB85C\uC6B4 \uBA54\uBAA8\uB97C \uCD94\uAC00 \uD558\uB294\uAC83\uB9CC \uAC00\uB2A5\uD569\uB2C8\uB2E4. Did you use the append_daily_note tool?"),
32994
- knowledge_note_created: exports_external.boolean().describe("\uC791\uC5C5\uAE30\uC5B5(\uB370\uC77C\uB9AC\uB178\uD2B8, \uC138\uC158 \uCEE8\uD14D\uC2A4\uD2B8)\uBCF4\uB2E4 \uC624\uB798 \uAE30\uC5B5\uB418\uC5B4\uC57C \uD558\uB294 \uC911\uC694\uD55C \uACB0\uC815, \uD328\uD134, \uC2E4\uC218, \uBC1C\uACAC\uC740 \uC9C0\uC2DD \uB178\uD2B8\uB85C \uAE30\uB85D\uD558\uC5EC \uD504\uB85C\uC81D\uD2B8\uC758 \uC9D1\uB2E8 \uC9C0\uC2DD\uC73C\uB85C \uB0A8\uAE30\uC138\uC694. Did you use the create_knowledge_note tool if needed?"),
32995
- quality_check_passed: exports_external.boolean().describe("\uC791\uC5C5 \uC644\uB8CC \uC804\uC5D0 \uBC18\uB4DC\uC2DC \uC218\uD589\uD558\uC138\uC694. \uCF54\uB4DC \uB9B0\uD2B8, \uD3EC\uB9F7\uD130, \uD14C\uC2A4\uD2B8, \uBE4C\uB4DC, \uCF54\uB4DC\uB9AC\uBDF0\uB97C \uC2E4\uD589\uD558\uC5EC \uC791\uC5C5 \uACB0\uACFC\uBB3C\uC774 \uD504\uB85C\uC81D\uD2B8\uC758 \uD488\uC9C8 \uAE30\uC900\uC744 \uCDA9\uC871\uD558\uB294\uC9C0 \uD655\uC778\uD558\uC138\uC694."),
32996
- checkpoints_committed: exports_external.boolean().describe("\uC791\uC5C5\uC774 \uAE38\uC5B4\uC9C8 \uACBD\uC6B0, \uC911\uC694\uD55C \uB2E8\uACC4\uB9C8\uB2E4 \uCCB4\uD06C\uD3EC\uC778\uD2B8 \uCEE4\uBC0B\uC744 \uD558\uC5EC \uC791\uC5C5 \uB0B4\uC6A9\uC744 \uC548\uC804\uD558\uAC8C \uC800\uC7A5\uD558\uACE0, \uD544\uC694 \uC2DC \uC774\uC804 \uC0C1\uD0DC\uB85C \uB3CC\uC544\uAC08 \uC218 \uC788\uB3C4\uB85D \uD558\uC138\uC694."),
32997
- scope_reviewed: exports_external.boolean().describe("\uC0AC\uC6A9\uC790\uAC00 \uC758\uB3C4\uD55C \uC791\uC5C5 \uBC94\uC704\uB97C \uBC97\uC5B4\uB098\uC9C0 \uC54A\uC558\uB294\uC9C0, \uC791\uC5C5\uC774 \uB108\uBB34 \uD06C\uAC70\uB098 \uBCF5\uC7A1\uD574\uC9C0\uC9C0\uB294 \uC54A\uC558\uB294\uC9C0 \uAC80\uD1A0\uD558\uC138\uC694.")
33018
+ daily_note_update_proof: exports_external.string().min(5).optional().describe("Provide the file path of the updated daily note, or explicitly write 'skipped' if no update was needed."),
33019
+ knowledge_note_proof: exports_external.string().min(5).optional().describe("Provide the file path of the created knowledge note, or explicitly write 'skipped' if no note was created."),
33020
+ quality_check_output: exports_external.string().min(20).describe("Provide the last 5 lines of the `mise run lint && mise run test` execution output to prove quality checks passed."),
33021
+ checkpoint_commit_hashes: exports_external.string().min(7).describe("Provide the output of `git log -1 --oneline` or an explanation if the task was too small for checkpoints."),
33022
+ scope_review_notes: exports_external.string().min(10).describe("Provide a brief sentence confirming the scope check and that the work did not exceed the intended boundaries.")
32998
33023
  }
32999
33024
  }, async ({
33000
- daily_note_updated,
33001
- knowledge_note_created,
33002
- quality_check_passed,
33003
- checkpoints_committed,
33004
- scope_reviewed
33025
+ daily_note_update_proof,
33026
+ knowledge_note_proof,
33027
+ quality_check_output,
33028
+ checkpoint_commit_hashes,
33029
+ scope_review_notes
33005
33030
  }) => {
33006
33031
  const missingSteps = [];
33007
- if (!daily_note_updated)
33008
- missingSteps.push("daily_note_updated");
33009
- if (!knowledge_note_created)
33010
- missingSteps.push("knowledge_note_created");
33011
- if (!quality_check_passed)
33012
- missingSteps.push("quality_check_passed");
33013
- if (!checkpoints_committed)
33014
- missingSteps.push("checkpoints_committed");
33015
- if (!scope_reviewed)
33016
- missingSteps.push("scope_reviewed");
33032
+ const warnings = [];
33033
+ if (!daily_note_update_proof || daily_note_update_proof.toLowerCase() === "skipped") {
33034
+ warnings.push("Warning: Daily note was skipped. This is allowed, but ensure no important context is lost.");
33035
+ } else if (daily_note_update_proof.length < 5) {
33036
+ missingSteps.push("daily_note_update_proof (too short)");
33037
+ }
33038
+ if (!knowledge_note_proof || knowledge_note_proof.toLowerCase() === "skipped") {
33039
+ warnings.push("Warning: Knowledge note was skipped. This is allowed, but ensure no important context is lost.");
33040
+ } else if (knowledge_note_proof.length < 5) {
33041
+ missingSteps.push("knowledge_note_proof (too short)");
33042
+ }
33043
+ if (!quality_check_output || quality_check_output.length < 20)
33044
+ missingSteps.push("quality_check_output");
33045
+ if (!checkpoint_commit_hashes || checkpoint_commit_hashes.length < 7)
33046
+ missingSteps.push("checkpoint_commit_hashes");
33047
+ if (!scope_review_notes || scope_review_notes.length < 10)
33048
+ missingSteps.push("scope_review_notes");
33017
33049
  if (missingSteps.length > 0) {
33018
33050
  return {
33019
33051
  content: [
33020
33052
  {
33021
33053
  type: "text",
33022
- text: `Error: The following required steps were not completed: ${missingSteps.join(", ")}. You must complete all steps before finishing the turn.`
33054
+ text: `Error: The following required steps were not completed or provided insufficient proof: ${missingSteps.join(", ")}. You must provide valid proof for all steps before finishing the turn.`
33023
33055
  }
33024
33056
  ],
33025
33057
  isError: true
@@ -33036,7 +33068,10 @@ ${tags.map((t) => ` - ${t}`).join(`
33036
33068
  content: [
33037
33069
  {
33038
33070
  type: "text",
33039
- text: "Turn successfully marked as complete."
33071
+ text: `Turn successfully marked as complete.${warnings.length > 0 ? `
33072
+
33073
+ ` + warnings.join(`
33074
+ `) : ""}`
33040
33075
  }
33041
33076
  ]
33042
33077
  };
@@ -95,7 +95,7 @@ import { join as join3 } from "node:path";
95
95
  // package.json
96
96
  var package_default = {
97
97
  name: "@ksm0709/context",
98
- version: "0.0.23",
98
+ version: "0.0.26",
99
99
  author: {
100
100
  name: "TaehoKang",
101
101
  email: "ksm07091@gmail.com"
@@ -386,13 +386,14 @@ turn_id={{turnId}}
386
386
  `;
387
387
  var DEFAULT_DAILY_NOTE_GUIDE = `# 데일리 노트 기록 가이드
388
388
 
389
- - [ ] \`docs/daily/YYYY-MM-DD.md\` 파일(오늘 날짜 기준)을 생성하거나 업데이트하세요.
389
+ - [ ] \`context-mcp_append_daily_note\` 도구를 사용하여 기록을 추가하세요.
390
390
  - [ ] **주의**: 데일리 노트의 기존 내용은 절대 수정하거나 삭제하지 마세요.
391
- - [ ] 파일 맨 마지막 줄에 다음과 같은 형식으로만 기록을 추가(Append)하세요:
391
+ - [ ] 기록은 다음과 같은 형식으로 추가됩니다:
392
392
  \`[{{currentTimestamp}}] <기억 할 내용>\`
393
393
  - [ ] \`<기억 할 내용>\`에는 완벽한 컨텍스트 인계를 위해 오늘 완료한 핵심 작업 요약, 미해결 이슈(TODO), 중요 메모, 지식 노트 \`[[wikilink]]\` 등을 포함하세요.`;
394
394
  var DEFAULT_NOTE_GUIDE = `# 지식 노트 작성 및 관리 가이드
395
395
 
396
+ - [ ] **노트 생성**: \`context-mcp_create_knowledge_note\` 도구를 사용하여 생성하세요.
396
397
  - [ ] 제텔카스텐(Zettelkasten) 3대 원칙 준수:
397
398
  - [ ] 원자성: 한 노트당 한 주제
398
399
  - [ ] 연결: 고립된 노트 방지
@@ -636,10 +637,15 @@ var STATIC_KNOWLEDGE_CONTEXT = `## Knowledge Context
636
637
  2. **연결** -- 모든 노트는 [[wikilink]]로 관련 노트에 연결. 고립된 노트는 발견되지 않습니다.
637
638
  3. **자기 언어** -- 복사-붙여넣기가 아닌, 핵심을 이해하고 간결하게 서술하세요.
638
639
 
640
+ ### MCP Tools
641
+ - **지식 관리**: \`context-mcp_search_knowledge\`, \`context-mcp_read_knowledge\`, \`context-mcp_create_knowledge_note\`, \`context-mcp_update_knowledge_note\`
642
+ - **데일리 노트**: \`context-mcp_read_daily_note\`, \`context-mcp_append_daily_note\`
643
+ - **작업 완료**: \`context-mcp_submit_turn_complete\` (작업 종료 시 필수 호출)
644
+
639
645
  ### 작업 전 필수
640
- - **데일리 노트 확인**: 가장 최근의 데일리 노트를 읽고 이전 세션의 컨텍스트와 미해결 이슈를 파악하세요. (Use \`read_daily_note\` tool)
646
+ - **데일리 노트 확인**: 가장 최근의 데일리 노트를 읽고 이전 세션의 컨텍스트와 미해결 이슈를 파악하세요.
641
647
  - **작업 의도 선언**: 작업 시작 전, 현재 세션의 목표와 작업 의도를 명확히 파악하고 선언하세요.
642
- - **지식 검색**: 작업과 관련된 문서를 **직접 먼저** 검색하고 읽으세요. (Use \`search_knowledge\` and \`read_knowledge\` tools)
648
+ - **지식 검색**: 작업과 관련된 문서를 **직접 먼저** 검색하고 읽으세요.
643
649
  - 지식 파일에 기록된 아키텍처 결정, 패턴, 제약사항을 반드시 따르세요.
644
650
 
645
651
  ### 개발 원칙
@@ -650,7 +656,7 @@ var STATIC_KNOWLEDGE_CONTEXT = `## Knowledge Context
650
656
  ### 우선순위
651
657
  - AGENTS.md의 지시사항이 항상 최우선
652
658
  - 지식 노트의 결정사항 > 일반적 관행
653
- - 지식 노트에 없는 새로운 결정이나 반복 가치가 있는 발견은 작업 메모나 지식 노트 후보로 기록하세요. (Use \`create_knowledge_note\` tool)`;
659
+ - 지식 노트에 없는 새로운 결정이나 반복 가치가 있는 발견은 작업 메모나 지식 노트 후보로 기록하세요.`;
654
660
  async function onSessionStart(event, sdk) {
655
661
  const projectDir = resolveProjectDir(event);
656
662
  scaffoldIfNeeded(projectDir);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ksm0709/context",
3
- "version": "0.0.23",
3
+ "version": "0.0.26",
4
4
  "author": {
5
5
  "name": "TaehoKang",
6
6
  "email": "ksm07091@gmail.com"