@skj1724/oh-my-opencode 3.17.8 → 3.17.11

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
@@ -6747,10 +6747,10 @@ var init_agent_display_names = __esm(() => {
6747
6747
  "council-member": "council-member"
6748
6748
  };
6749
6749
  AGENT_LIST_SORT_PREFIXES = {
6750
- sisyphus: "\u200B",
6751
- hephaestus: "\u200B\u200B",
6752
- prometheus: "\u200B\u200B\u200B",
6753
- atlas: "\u200B\u200B\u200B\u200B"
6750
+ sisyphus: "",
6751
+ hephaestus: "",
6752
+ prometheus: "",
6753
+ atlas: ""
6754
6754
  };
6755
6755
  INVISIBLE_AGENT_CHARACTERS_REGEX = /[\u200B\u200C\u200D\uFEFF]/g;
6756
6756
  REVERSE_DISPLAY_NAMES = Object.fromEntries(Object.entries(AGENT_DISPLAY_NAMES).map(([key, displayName]) => [displayName.toLowerCase(), key]));
@@ -53324,8 +53324,8 @@ async function showConfigErrorsIfAny(ctx) {
53324
53324
  `);
53325
53325
  await ctx.client.tui.showToast({
53326
53326
  body: {
53327
- title: "Config Load Error",
53328
- message: `Failed to load config:
53327
+ title: "\u914D\u7F6E\u52A0\u8F7D\u9519\u8BEF",
53328
+ message: `\u914D\u7F6E\u52A0\u8F7D\u5931\u8D25:
53329
53329
  ${errorMessages}`,
53330
53330
  variant: "error",
53331
53331
  duration: 1e4
@@ -53360,8 +53360,8 @@ async function updateAndShowConnectedProvidersCacheStatus(ctx) {
53360
53360
  if (!isModelCacheAvailable()) {
53361
53361
  await ctx.client.tui.showToast({
53362
53362
  body: {
53363
- title: "Connected Providers Cache",
53364
- message: "Failed to build provider cache. Restart OpenCode to retry.",
53363
+ title: "\u5DF2\u8FDE\u63A5 Provider \u7F13\u5B58",
53364
+ message: "Provider \u7F13\u5B58\u6784\u5EFA\u5931\u8D25\u3002\u8BF7\u91CD\u542F OpenCode \u91CD\u8BD5\u3002",
53365
53365
  variant: "warning",
53366
53366
  duration: 8000
53367
53367
  }
@@ -53423,8 +53423,8 @@ async function showModelCacheWarningIfNeeded(ctx) {
53423
53423
  return;
53424
53424
  await ctx.client.tui.showToast({
53425
53425
  body: {
53426
- title: "Model Cache Not Found",
53427
- message: "Run 'opencode models --refresh' or restart OpenCode to populate the models cache for optimal agent model selection.",
53426
+ title: "\u672A\u627E\u5230\u6A21\u578B\u7F13\u5B58",
53427
+ message: "\u8BF7\u8FD0\u884C 'opencode models --refresh' \u6216\u91CD\u542F OpenCode \u4EE5\u586B\u5145\u6A21\u578B\u7F13\u5B58\uFF0C\u786E\u4FDD agent \u6A21\u578B\u9009\u62E9\u6700\u4F18\u3002",
53428
53428
  variant: "warning",
53429
53429
  duration: 1e4
53430
53430
  }
@@ -53467,7 +53467,7 @@ async function showVersionToast(ctx, version3, message) {
53467
53467
  }
53468
53468
  async function showLocalDevToast(ctx, version3, isSisyphusEnabled) {
53469
53469
  const displayVersion = version3 ?? "dev";
53470
- const message = isSisyphusEnabled ? "Sisyphus running in local development mode." : "Running in local development mode. oMoMoMo...";
53470
+ const message = isSisyphusEnabled ? "Sisyphus \u6B63\u5728\u672C\u5730\u5F00\u53D1\u6A21\u5F0F\u4E0B\u8FD0\u884C\u3002" : "\u6B63\u5728\u672C\u5730\u5F00\u53D1\u6A21\u5F0F\u4E0B\u8FD0\u884C\u3002oMoMoMo...";
53471
53471
  await showSpinnerToast(ctx, `${displayVersion} (dev)`, message);
53472
53472
  log(`[auto-update-checker] Local dev toast shown: v${displayVersion}`);
53473
53473
  }
@@ -53591,7 +53591,7 @@ var {
53591
53591
  // package.json
53592
53592
  var package_default = {
53593
53593
  name: "@skj1724/oh-my-opencode",
53594
- version: "3.17.8",
53594
+ version: "3.17.11",
53595
53595
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
53596
53596
  main: "./dist/index.js",
53597
53597
  types: "dist/index.d.ts",
@@ -53680,8 +53680,8 @@ var package_default = {
53680
53680
  "oh-my-opencode-linux-x64-baseline": "3.17.4",
53681
53681
  "oh-my-opencode-linux-x64-musl": "3.17.4",
53682
53682
  "oh-my-opencode-linux-x64-musl-baseline": "3.17.4",
53683
- "oh-my-opencode-windows-x64": "3.17.4",
53684
- "oh-my-opencode-windows-x64-baseline": "3.17.4"
53683
+ "oh-my-opencode-windows-x64": "3.17.11",
53684
+ "oh-my-opencode-windows-x64-baseline": "3.17.11"
53685
53685
  },
53686
53686
  overrides: {},
53687
53687
  trustedDependencies: [
@@ -1,4 +1,4 @@
1
1
  export declare const AGENT_USAGE_REMINDER_STORAGE: string;
2
2
  export declare const TARGET_TOOLS: Set<string>;
3
3
  export declare const AGENT_TOOLS: Set<string>;
4
- export declare const REMINDER_MESSAGE = "\n[Agent Usage Reminder]\n\nYou called a search/fetch tool directly without leveraging specialized agents.\n\nRECOMMENDED: Use task with explore/librarian agents for better results:\n\n```\n// Parallel exploration - fire multiple agents simultaneously\ntask(subagent_type=\"explore\", load_skills=[], prompt=\"Find all files matching pattern X\")\ntask(subagent_type=\"explore\", load_skills=[], prompt=\"Search for implementation of Y\")\ntask(subagent_type=\"librarian\", load_skills=[], prompt=\"Lookup documentation for Z\")\n\n// Then continue your work while they run in background\n// System will notify you when each completes\n```\n\nWHY:\n- Agents can perform deeper, more thorough searches\n- Background tasks run in parallel, saving time\n- Specialized agents have domain expertise\n- Reduces context window usage in main session\n\nALWAYS prefer: Multiple parallel task calls > Direct tool calls\n";
4
+ export declare const REMINDER_MESSAGE = "\n[Agent \u4F7F\u7528\u63D0\u9192]\n\n\u4F60\u76F4\u63A5\u8C03\u7528\u4E86\u641C\u7D22/\u6293\u53D6\u5DE5\u5177\uFF0C\u800C\u6CA1\u6709\u5229\u7528\u4E13\u95E8\u7684 agent\u3002\n\n\u63A8\u8350\uFF1A\u4F7F\u7528 task \u914D\u5408 explore/librarian agent \u4EE5\u83B7\u5F97\u66F4\u597D\u7684\u6548\u679C\uFF1A\n\n```\n// \u5E76\u884C\u63A2\u7D22 - \u540C\u65F6\u542F\u52A8\u591A\u4E2A agent\ntask(subagent_type=\"explore\", load_skills=[], prompt=\"\u67E5\u627E\u6240\u6709\u5339\u914D\u6A21\u5F0F X \u7684\u6587\u4EF6\")\ntask(subagent_type=\"explore\", load_skills=[], prompt=\"\u641C\u7D22 Y \u7684\u5B9E\u73B0\")\ntask(subagent_type=\"librarian\", load_skills=[], prompt=\"\u67E5\u627E Z \u7684\u6587\u6863\")\n\n// \u7136\u540E\u7EE7\u7EED\u4F60\u7684\u5DE5\u4F5C\uFF0C\u540C\u65F6\u5B83\u4EEC\u5728\u540E\u53F0\u8FD0\u884C\n// \u7CFB\u7EDF\u4F1A\u5728\u6BCF\u4E2A\u4EFB\u52A1\u5B8C\u6210\u65F6\u901A\u77E5\u4F60\n```\n\n\u539F\u56E0\uFF1A\n- Agent \u53EF\u4EE5\u8FDB\u884C\u66F4\u6DF1\u5165\u3001\u66F4\u5168\u9762\u7684\u641C\u7D22\n- \u540E\u53F0\u4EFB\u52A1\u5E76\u884C\u8FD0\u884C\uFF0C\u8282\u7701\u65F6\u95F4\n- \u4E13\u95E8\u7684 agent \u5177\u6709\u9886\u57DF\u4E13\u4E1A\u77E5\u8BC6\n- \u51CF\u5C11\u4E3B\u4F1A\u8BDD\u4E2D\u7684\u4E0A\u4E0B\u6587\u7A97\u53E3\u5360\u7528\n\n\u4F18\u5148\u4F7F\u7528\uFF1A\u591A\u4E2A\u5E76\u884C task \u8C03\u7528 > \u76F4\u63A5\u5DE5\u5177\u8C03\u7528\n";
@@ -1,5 +1,5 @@
1
1
  export declare const HOOK_NAME = "compaction-context-injector";
2
- export declare const AGENT_RECOVERY_PROMPT = "[restore checkpointed session agent configuration after compaction]";
2
+ export declare const AGENT_RECOVERY_PROMPT = "[compaction \u540E\u6062\u590D checkpointed session agent \u914D\u7F6E]";
3
3
  export declare const NO_TEXT_TAIL_THRESHOLD = 5;
4
4
  export declare const RECOVERY_COOLDOWN_MS = 60000;
5
5
  export declare const RECENT_COMPACTION_WINDOW_MS: number;
@@ -1,2 +1,2 @@
1
1
  export declare const HOOK_NAME = "sisyphus-junior-notepad";
2
- export declare const NOTEPAD_DIRECTIVE = "\n<Work_Context>\n## Notepad Location (for recording learnings)\nNOTEPAD PATH: .sisyphus/notepads/{plan-name}/\n- learnings.md: Record patterns, conventions, successful approaches\n- issues.md: Record problems, blockers, gotchas encountered\n- decisions.md: Record architectural choices and rationales\n- problems.md: Record unresolved issues, technical debt\n\nYou SHOULD append findings to notepad files after completing work.\nIMPORTANT: Always APPEND to notepad files - never overwrite or use Edit tool.\n\n## Plan Location (READ ONLY)\nPLAN PATH: .sisyphus/plans/{plan-name}.md\n\nCRITICAL RULE: NEVER MODIFY THE PLAN FILE\n\nThe plan file (.sisyphus/plans/*.md) is SACRED and READ-ONLY.\n- You may READ the plan to understand tasks\n- You may READ checkbox items to know what to do\n- You MUST NOT edit, modify, or update the plan file\n- You MUST NOT mark checkboxes as complete in the plan\n- Only the Orchestrator manages the plan file\n\nVIOLATION = IMMEDIATE FAILURE. The Orchestrator tracks plan state.\n</Work_Context>\n";
2
+ export declare const NOTEPAD_DIRECTIVE = "\n<Work_Context>\n## \u7B14\u8BB0\u672C\u4F4D\u7F6E\uFF08\u7528\u4E8E\u8BB0\u5F55\u5B66\u4E60\u5185\u5BB9\uFF09\nNOTEPAD PATH: .sisyphus/notepads/{plan-name}/\n- learnings.md\uFF1A\u8BB0\u5F55\u6A21\u5F0F\u3001\u7EA6\u5B9A\u3001\u6210\u529F\u505A\u6CD5\n- issues.md\uFF1A\u8BB0\u5F55\u9047\u5230\u7684\u95EE\u9898\u3001\u963B\u788D\u3001\u5751\n- decisions.md\uFF1A\u8BB0\u5F55\u67B6\u6784\u9009\u62E9\u53CA\u7406\u7531\n- problems.md\uFF1A\u8BB0\u5F55\u672A\u89E3\u51B3\u7684\u95EE\u9898\u3001\u6280\u672F\u503A\n\n\u5B8C\u6210\u5DE5\u4F5C\u540E\uFF0C\u4F60\u5E94\u8BE5\u5C06\u53D1\u73B0\u8FFD\u52A0\u5230\u7B14\u8BB0\u672C\u6587\u4EF6\u4E2D\u3002\n\u91CD\u8981\uFF1A\u59CB\u7EC8 APPEND \u5230\u7B14\u8BB0\u672C\u6587\u4EF6\u2014\u2014\u4E0D\u8981\u8986\u76D6\u6216\u4F7F\u7528 Edit \u5DE5\u5177\u3002\n\n## \u8BA1\u5212\u6587\u4EF6\u4F4D\u7F6E\uFF08\u53EA\u8BFB\uFF09\nPLAN PATH: .sisyphus/plans/{plan-name}.md\n\n\u5173\u952E\u89C4\u5219\uFF1A\u6C38\u4E0D\u4FEE\u6539\u8BA1\u5212\u6587\u4EF6\n\n\u8BA1\u5212\u6587\u4EF6\uFF08.sisyphus/plans/*.md\uFF09\u662F\u795E\u5723\u7684\u53EA\u8BFB\u6587\u4EF6\u3002\n- \u4F60\u53EF\u4EE5 READ \u8BA1\u5212\u6587\u4EF6\u6765\u7406\u89E3\u4EFB\u52A1\n- \u4F60\u53EF\u4EE5 READ \u590D\u9009\u6846\u9879\u6765\u4E86\u89E3\u8981\u505A\u4EC0\u4E48\n- \u4F60\u4E0D\u5F97 edit\u3001modify \u6216 update \u8BA1\u5212\u6587\u4EF6\n- \u4F60\u4E0D\u5F97\u5728\u8BA1\u5212\u4E2D\u5C06\u590D\u9009\u6846\u6807\u8BB0\u4E3A\u5B8C\u6210\n- \u53EA\u6709 Orchestrator \u7BA1\u7406\u8BA1\u5212\u6587\u4EF6\n\n\u8FDD\u53CD = \u7ACB\u5373\u5931\u8D25\u3002Orchestrator \u8DDF\u8E2A\u8BA1\u5212\u72B6\u6001\u3002\n</Work_Context>\n";
@@ -1,3 +1,3 @@
1
1
  export declare const HOOK_NAME = "tasks-todowrite-disabler";
2
2
  export declare const BLOCKED_TOOLS: string[];
3
- export declare const REPLACEMENT_MESSAGE = "TodoRead/TodoWrite are DISABLED because experimental.task_system is enabled.\n\n**ACTION REQUIRED**: RE-REGISTER what you were about to write as Todo using Task tools NOW. Then ASSIGN yourself and START WORKING immediately.\n\n**Use these tools instead:**\n- TaskCreate: Create new task with auto-generated ID\n- TaskUpdate: Update status, assign owner, add dependencies\n- TaskList: List active tasks with dependency info\n- TaskGet: Get full task details\n\n**Workflow:**\n1. TaskCreate({ subject: \"your task description\" })\n2. TaskUpdate({ id: \"T-xxx\", status: \"in_progress\", owner: \"your-thread-id\" })\n3. DO THE WORK\n4. TaskUpdate({ id: \"T-xxx\", status: \"completed\" })\n\nCRITICAL: 1 task = 1 task. Fire independent tasks concurrently.\n\n**STOP! DO NOT START WORKING DIRECTLY - NO MATTER HOW SMALL THE TASK!**\nEven if the task seems trivial (1 line fix, simple edit, quick change), you MUST:\n1. FIRST register it with TaskCreate\n2. THEN mark it in_progress\n3. ONLY THEN do the actual work\n4. FINALLY mark it completed\n\n**WHY?** Task tracking = visibility = accountability. Skipping registration = invisible work = chaos.\n\nDO NOT retry TodoWrite. Convert to TaskCreate NOW.";
3
+ export declare const REPLACEMENT_MESSAGE = "TodoRead/TodoWrite \u5DF2\u7981\u7528\uFF0C\u56E0\u4E3A experimental.task_system \u5DF2\u542F\u7528\u3002\n\n**\u5FC5\u987B\u6267\u884C\u7684\u64CD\u4F5C**\uFF1A\u7ACB\u5373\u4F7F\u7528 Task \u5DE5\u5177\u91CD\u65B0\u6CE8\u518C\u4F60\u539F\u672C\u8981\u7528 Todo \u5199\u5165\u7684\u5185\u5BB9\u3002\u7136\u540E\u5206\u914D\u7ED9\u81EA\u5DF1\u5E76\u7ACB\u5373\u5F00\u59CB\u5DE5\u4F5C\u3002\n\n**\u8BF7\u6539\u7528\u4EE5\u4E0B\u5DE5\u5177\uFF1A**\n- TaskCreate\uFF1A\u521B\u5EFA\u5E26\u6709\u81EA\u52A8\u751F\u6210 ID \u7684\u65B0\u4EFB\u52A1\n- TaskUpdate\uFF1A\u66F4\u65B0\u72B6\u6001\u3001\u5206\u914D\u8D1F\u8D23\u4EBA\u3001\u6DFB\u52A0\u4F9D\u8D56\n- TaskList\uFF1A\u5217\u51FA\u5E26\u6709\u4F9D\u8D56\u4FE1\u606F\u7684\u6240\u6709\u6D3B\u52A8\u4EFB\u52A1\n- TaskGet\uFF1A\u83B7\u53D6\u4EFB\u52A1\u7684\u5B8C\u6574\u8BE6\u60C5\n\n**\u5DE5\u4F5C\u6D41\u7A0B\uFF1A**\n1. TaskCreate({ subject: \"\u4F60\u7684\u4EFB\u52A1\u63CF\u8FF0\" })\n2. TaskUpdate({ id: \"T-xxx\", status: \"in_progress\", owner: \"\u4F60\u7684\u7EBF\u7A0B ID\" })\n3. \u6267\u884C\u5DE5\u4F5C\n4. TaskUpdate({ id: \"T-xxx\", status: \"completed\" })\n\n\u5173\u952E\u539F\u5219\uFF1A1 \u4E2A\u4EFB\u52A1 = 1 \u4E2A\u4EFB\u52A1\u3002\u72EC\u7ACB\u4EFB\u52A1\u5E76\u53D1\u6267\u884C\u3002\n\n**\u505C\uFF01\u4E0D\u8981\u76F4\u63A5\u5F00\u59CB\u5DE5\u4F5C\u2014\u2014\u65E0\u8BBA\u4EFB\u52A1\u591A\u5C0F\uFF01**\n\u5373\u4F7F\u4EFB\u52A1\u770B\u8D77\u6765\u5F88\u7B80\u5355\uFF08\u4E00\u884C\u4FEE\u590D\u3001\u7B80\u5355\u7F16\u8F91\u3001\u5FEB\u901F\u66F4\u6539\uFF09\uFF0C\u4F60\u4E5F\u5FC5\u987B\uFF1A\n1. \u9996\u5148\u7528 TaskCreate \u6CE8\u518C\u4EFB\u52A1\n2. \u7136\u540E\u6807\u8BB0\u4E3A in_progress\n3. \u53EA\u6709\u5728\u8FD9\u4E4B\u540E\u624D\u80FD\u6267\u884C\u5B9E\u9645\u5DE5\u4F5C\n4. \u6700\u540E\u6807\u8BB0\u4E3A completed\n\n**\u539F\u56E0\uFF1F**\u4EFB\u52A1\u8DDF\u8E2A = \u53EF\u89C6\u6027 = \u8D23\u4EFB\u5F52\u5C5E\u3002\u8DF3\u8FC7\u6CE8\u518C = \u9690\u5F62\u5DE5\u4F5C = \u6DF7\u4E71\u3002\n\n\u4E0D\u8981\u91CD\u8BD5 TodoWrite\u3002\u7ACB\u5373\u8F6C\u6362\u4E3A TaskCreate\u3002";
@@ -1 +1 @@
1
- export declare const TODOWRITE_DESCRIPTION = "Use this tool to create and manage a structured task list for tracking progress on multi-step work.\n\n## Todo Format (MANDATORY)\n\nEach todo title MUST encode four elements: WHERE, WHY, HOW, and EXPECTED RESULT.\n\nFormat: \"[WHERE] [HOW] to [WHY] - expect [RESULT]\"\n\nGOOD:\n- \"src/utils/validation.ts: Add validateEmail() for input sanitization - returns boolean\"\n- \"UserService.create(): Call validateEmail() before DB insert - rejects invalid emails with 400\"\n- \"validation.test.ts: Add test for missing @ sign - expect validateEmail('foo') to return false\"\n\nBAD:\n- \"Implement email validation\" (where? how? what result?)\n- \"Add dark mode\" (feature, not a todo)\n- \"Fix auth\" (what file? what changes? what's expected?)\n\n## Granularity Rules\n\nEach todo MUST be a single atomic action completable in 1-3 tool calls. If it needs more, split it.\n\n**Size test**: Can you complete this todo by editing one file or running one command? If not, it's too big.\n\n## Task Management\n- One in_progress at a time. Complete it before starting the next.\n- Mark completed immediately after finishing each item.\n- Skip this tool for single trivial tasks (one-step, obvious action).";
1
+ export declare const TODOWRITE_DESCRIPTION = "\u4F7F\u7528\u6B64\u5DE5\u5177\u521B\u5EFA\u548C\u7BA1\u7406\u7ED3\u6784\u5316\u4EFB\u52A1\u5217\u8868\uFF0C\u4EE5\u8DDF\u8E2A\u591A\u6B65\u9AA4\u5DE5\u4F5C\u7684\u8FDB\u5EA6\u3002\n\n## Todo \u683C\u5F0F\uFF08\u5F3A\u5236\uFF09\n\n\u6BCF\u4E2A todo \u6807\u9898\u5FC5\u987B\u5305\u542B\u56DB\u4E2A\u8981\u7D20\uFF1A\u4F4D\u7F6E\uFF08WHERE\uFF09\u3001\u539F\u56E0\uFF08WHY\uFF09\u3001\u65B9\u6CD5\uFF08HOW\uFF09\u548C\u9884\u671F\u7ED3\u679C\uFF08EXPECTED RESULT\uFF09\u3002\n\n\u683C\u5F0F\uFF1A\"[\u4F4D\u7F6E] [\u65B9\u6CD5] \u4EE5 [\u539F\u56E0] - \u9884\u671F [\u7ED3\u679C]\"\n\n\u6B63\u786E\u793A\u4F8B\uFF1A\n- \"src/utils/validation.ts: \u6DFB\u52A0 validateEmail() \u7528\u4E8E\u8F93\u5165\u6E05\u7406 - \u8FD4\u56DE boolean\"\n- \"UserService.create(): \u5728 DB \u63D2\u5165\u524D\u8C03\u7528 validateEmail() - \u62D2\u7EDD\u65E0\u6548\u90AE\u4EF6\u5E76\u8FD4\u56DE 400\"\n- \"validation.test.ts: \u6DFB\u52A0\u7F3A\u5C11 @ \u7B26\u53F7\u7684\u6D4B\u8BD5 - \u9884\u671F validateEmail('foo') \u8FD4\u56DE false\"\n\n\u9519\u8BEF\u793A\u4F8B\uFF1A\n- \"\u5B9E\u73B0\u90AE\u4EF6\u9A8C\u8BC1\"\uFF08\u4F4D\u7F6E\uFF1F\u65B9\u6CD5\uFF1F\u9884\u671F\u7ED3\u679C\uFF1F\uFF09\n- \"\u6DFB\u52A0\u6DF1\u8272\u6A21\u5F0F\"\uFF08\u529F\u80FD\uFF0C\u4E0D\u662F todo\uFF09\n- \"\u4FEE\u590D\u8BA4\u8BC1\"\uFF08\u54EA\u4E2A\u6587\u4EF6\uFF1F\u4EC0\u4E48\u6539\u52A8\uFF1F\u9884\u671F\u7ED3\u679C\uFF1F\uFF09\n\n## \u7C92\u5EA6\u89C4\u5219\n\n\u6BCF\u4E2A todo \u5FC5\u987B\u662F\u4E00\u4E2A\u5355\u4E00\u539F\u5B50\u64CD\u4F5C\uFF0C\u53EF\u5728 1-3 \u6B21\u5DE5\u5177\u8C03\u7528\u5185\u5B8C\u6210\u3002\u5982\u679C\u9700\u8981\u66F4\u591A\u8C03\u7528\uFF0C\u8BF7\u62C6\u5206\u3002\n\n**\u89C4\u6A21\u6D4B\u8BD5**\uFF1A\u4F60\u53EF\u4EE5\u901A\u8FC7\u7F16\u8F91\u4E00\u4E2A\u6587\u4EF6\u6216\u8FD0\u884C\u4E00\u4E2A\u547D\u4EE4\u6765\u5B8C\u6210\u8FD9\u4E2A todo \u5417\uFF1F\u5982\u679C\u4E0D\u80FD\uFF0C\u8BF4\u660E\u5B83\u592A\u5927\u4E86\u3002\n\n## \u4EFB\u52A1\u7BA1\u7406\n- \u4E00\u6B21\u53EA\u80FD\u6709\u4E00\u4E2A in_progress\u3002\u5B8C\u6210\u540E\u518D\u5F00\u59CB\u4E0B\u4E00\u4E2A\u3002\n- \u6BCF\u9879\u5B8C\u6210\u540E\u7ACB\u5373\u6807\u8BB0\u4E3A completed\u3002\n- \u5355\u4E00\u7410\u788E\u4EFB\u52A1\uFF08\u4E00\u6B65\u3001\u660E\u663E\u64CD\u4F5C\uFF09\u8DF3\u8FC7\u6B64\u5DE5\u5177\u3002";