@ksm0709/context 0.0.23 → 0.0.25

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.25",
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.25",
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(`
@@ -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
@@ -32990,24 +33015,25 @@ ${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_updated: exports_external.boolean().optional().default(false).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. \uCC38\uACE0 \uAC00\uC774\uB4DC: .context/guides/daily-note-guide.md \uD30C\uC77C\uC744 \uC77D\uACE0 \uC9C0\uCE68\uC744 \uB530\uB974\uC138\uC694. \uC2E4\uC81C\uB85C \uB3C4\uAD6C\uB97C \uC0AC\uC6A9\uD574 \uB178\uD2B8\uB97C \uC791\uC131\uD588\uAC70\uB098 \uAC80\uC99D\uC744 \uC218\uD589\uD55C \uACBD\uC6B0\uC5D0\uB9CC true\uB85C \uC124\uC815\uD558\uC138\uC694. \uAC70\uC9D3\uC73C\uB85C true\uB97C \uC785\uB825\uD558\uC9C0 \uB9C8\uC138\uC694. (Set to true ONLY if you actually performed this action. Do not fake it.)"),
33019
+ knowledge_note_created: exports_external.boolean().optional().default(false).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. \uCC38\uACE0 \uAC00\uC774\uB4DC: .context/guides/note-guide.md \uD30C\uC77C\uC744 \uC77D\uACE0 \uC9C0\uCE68\uC744 \uB530\uB974\uC138\uC694. \uC2E4\uC81C\uB85C \uB3C4\uAD6C\uB97C \uC0AC\uC6A9\uD574 \uB178\uD2B8\uB97C \uC791\uC131\uD588\uAC70\uB098 \uAC80\uC99D\uC744 \uC218\uD589\uD55C \uACBD\uC6B0\uC5D0\uB9CC true\uB85C \uC124\uC815\uD558\uC138\uC694. \uAC70\uC9D3\uC73C\uB85C true\uB97C \uC785\uB825\uD558\uC9C0 \uB9C8\uC138\uC694. (Set to true ONLY if you actually performed this action. Do not fake it.)"),
33020
+ 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. \uCC38\uACE0 \uAC00\uC774\uB4DC: .context/guides/quality-check.md \uD30C\uC77C\uC744 \uC77D\uACE0 \uC9C0\uCE68\uC744 \uB530\uB974\uC138\uC694. \uC2E4\uC81C\uB85C \uB3C4\uAD6C\uB97C \uC0AC\uC6A9\uD574 \uB178\uD2B8\uB97C \uC791\uC131\uD588\uAC70\uB098 \uAC80\uC99D\uC744 \uC218\uD589\uD55C \uACBD\uC6B0\uC5D0\uB9CC true\uB85C \uC124\uC815\uD558\uC138\uC694. \uAC70\uC9D3\uC73C\uB85C true\uB97C \uC785\uB825\uD558\uC9C0 \uB9C8\uC138\uC694. (Set to true ONLY if you actually performed this action. Do not fake it.)"),
33021
+ 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. \uCC38\uACE0 \uAC00\uC774\uB4DC: .context/guides/commit-guide.md \uD30C\uC77C\uC744 \uC77D\uACE0 \uC9C0\uCE68\uC744 \uB530\uB974\uC138\uC694. \uC2E4\uC81C\uB85C \uB3C4\uAD6C\uB97C \uC0AC\uC6A9\uD574 \uB178\uD2B8\uB97C \uC791\uC131\uD588\uAC70\uB098 \uAC80\uC99D\uC744 \uC218\uD589\uD55C \uACBD\uC6B0\uC5D0\uB9CC true\uB85C \uC124\uC815\uD558\uC138\uC694. \uAC70\uC9D3\uC73C\uB85C true\uB97C \uC785\uB825\uD558\uC9C0 \uB9C8\uC138\uC694. (Set to true ONLY if you actually performed this action. Do not fake it.)"),
33022
+ 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. \uCC38\uACE0 \uAC00\uC774\uB4DC: .context/guides/scope-review.md \uD30C\uC77C\uC744 \uC77D\uACE0 \uC9C0\uCE68\uC744 \uB530\uB974\uC138\uC694. \uC2E4\uC81C\uB85C \uB3C4\uAD6C\uB97C \uC0AC\uC6A9\uD574 \uB178\uD2B8\uB97C \uC791\uC131\uD588\uAC70\uB098 \uAC80\uC99D\uC744 \uC218\uD589\uD55C \uACBD\uC6B0\uC5D0\uB9CC true\uB85C \uC124\uC815\uD558\uC138\uC694. \uAC70\uC9D3\uC73C\uB85C true\uB97C \uC785\uB825\uD558\uC9C0 \uB9C8\uC138\uC694. (Set to true ONLY if you actually performed this action. Do not fake it.)")
32998
33023
  }
32999
33024
  }, async ({
33000
- daily_note_updated,
33001
- knowledge_note_created,
33025
+ daily_note_updated = false,
33026
+ knowledge_note_created = false,
33002
33027
  quality_check_passed,
33003
33028
  checkpoints_committed,
33004
33029
  scope_reviewed
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");
33032
+ const warnings = [];
33033
+ if (daily_note_updated === false)
33034
+ warnings.push("Warning: Daily note was skipped. This is allowed, but ensure no important context is lost.");
33035
+ if (knowledge_note_created === false)
33036
+ warnings.push("Warning: Knowledge note was skipped. This is allowed, but ensure no important context is lost.");
33011
33037
  if (!quality_check_passed)
33012
33038
  missingSteps.push("quality_check_passed");
33013
33039
  if (!checkpoints_committed)
@@ -33036,7 +33062,10 @@ ${tags.map((t) => ` - ${t}`).join(`
33036
33062
  content: [
33037
33063
  {
33038
33064
  type: "text",
33039
- text: "Turn successfully marked as complete."
33065
+ text: `Turn successfully marked as complete.${warnings.length > 0 ? `
33066
+
33067
+ ` + warnings.join(`
33068
+ `) : ""}`
33040
33069
  }
33041
33070
  ]
33042
33071
  };
@@ -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.25",
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.25",
4
4
  "author": {
5
5
  "name": "TaehoKang",
6
6
  "email": "ksm07091@gmail.com"