Bug fix: Result modal now closes before executing any action (save/insert/
concept/plan). Previously save actions (saveAsNote, saveAsPlan) ran without
closing the modal, allowing duplicate saves.
Plan generation prompt rewritten to produce full documents:
- 目标 (what the plan achieves)
- 背景 (context from source note)
- 行动项 (grouped, with deliverables and time estimates)
- 关键依赖 (prerequisites)
- 风险与注意 (blockers)
- 验收标准 (definition of done)
Before: plan was just a flat checkbox list.
After: plan is a complete actionable document.
Bug fix:
- Modal now closes immediately on any save action (doAction guard
prevents double-save via this.closed flag)
Plan template professionalized:
- 'Save as plan' now creates a structured note with:
frontmatter (type: plan, status: active, source link)
目标 section (user fills)
行动项 section (AI-generated content goes here)
时间线 table
风险与依赖
完成标准 (checkboxes)
复盘 section
- Not just a raw AI dump with checkboxes
Unified plan → artifact:
- 'From current note generate plan' (执行 domain) now opens
Artifact Builder with preset artifactType='plan'
- Removed 70+ lines of duplicated plan generation logic from main.ts
- ArtifactBuilderModal accepts optional presetType parameter
- ArtifactFeatureController.openBuilderWithPreset() supports presets
Result: 'execution plan' and 'execution artifact' are now the same system.
Users interact with one concept: Execution Artifact (which can be a plan,
checklist, routine, SOP, review, etc.)
Production builds now output version as '2.0.0+YYYYMMDDHHmm' in
dist/manifest.json. Source manifest.json stays at '2.0.0'.
This allows identifying exact builds without bumping the semver,
useful during development and beta testing.
Before: 'generate plan' asked AI for JSON of vault operations (create-file,
append-section, etc.) and saved a technical PlanDraftStore note. User saw
internal file paths and operation types — not useful.
After: 'generate plan' asks AI to produce the plan itself — action items,
deadlines, priorities — as readable Markdown with checkboxes. The result
is previewed (like AI assistant), then saved as a normal plan note under
Knowledge/Plans/ with frontmatter type: plan.
The plan note looks like what you'd actually use:
# 本周执行计划
> 来源:[[2026-05-20 项目会议]]
## 高优先级
- [ ] 完成 API 设计文档(周三前)
- [ ] 和前端对齐接口规范
## 常规
- [ ] 更新文档
...
PlanDraftStore/PlanExecutor remain for system-level batch operations
(artifact multi-file saves, scheduler tasks). User-facing 'plans' are
just knowledge notes with checkboxes.
Before:
- Plan draft notes contained raw JSON at the bottom
- No way to execute a pending plan from the UI
- User saw technical payload with no clear next step
After:
- Plan drafts are clean markdown: summary table + operation list + affected
files + detailed preview. No JSON visible.
- Raw plan data cached in PlanDraftStore memory (not in note)
- New action: '确认执行此计划' (icon: play)
- Only visible when current file has type: execution-plan
- Shows confirmation dialog with risk level and file count
- Executes via PlanExecutor, marks draft as 'executed'
- On failure: shows error, draft stays pending
- PlanDraftStore.getPendingPlans() for listing
- PlanDraftStore.markExecuted() updates note status
Execution flow now:
1. Generate plan → save as readable draft note
2. User opens and reviews the plan
3. User triggers '确认执行此计划' from command panel or right-click
4. Confirmation dialog → execute → log written → draft marked done
Limitation: plan cache is in-memory only. If Obsidian restarts between
plan creation and confirmation, user must regenerate. This is acceptable
for v2.0; persistent plan storage comes in v2.1.
Before: 婴儿喂养.md, 新生儿护理.md (random alphabetical order)
After: 01-婴儿喂养.md, 02-新生儿护理.md (natural reading order)
- createChapterNote: filename = '{NN}-{title}.md'
- writeChapterQuestions: uses same pattern to locate files
- createIndexPage: links use [[NN-title|title]] format
This ensures Obsidian's file tree displays chapters in reading order
regardless of the user's sort setting.
- Extracted all artifact orchestration from main.ts into
src/features/artifact/ArtifactFeatureController.ts
(main.ts now has a 3-line delegation method)
- gatherContext() now receives full params (uses target + artifactType
for richer related-vault queries instead of just basename)
- Fixed reading-project path matching: f.path.startsWith(folder + '/')
prevents matching sibling directories with same prefix
- ArtifactPreviewModal now shows 'will create 1-2 files' impact notice
- PlanDraftStore now includes full ExecutionPlan JSON in a code block
(enables future 'confirm and execute from draft' workflow)
- README Status table updated with Execution Artifact Builder row
- main.ts reduced from ~900+ to 874 lines (artifact logic externalized)
P0-1: create-plan-only no longer executes — uses new PlanDraftStore
to persist plans under Knowledge/_ExecutionPlans/ without applying.
PlanExecutor result is now checked for success/failure.
P0-2: Scheduler runtime disabled by default in v2.0 (commented out
startScheduler call). Will be enabled via settings UI in v2.1.
runBaiduBackup now checks cfg.autoBackup.
Task renamed to '每日配置同步' to reflect actual behavior.
P1-1: Vault QA source links use [[path|title]] format for reliable
resolution regardless of H1 vs filename mismatch.
P1-2: NextRunCalculator.getNextRun weekly bug fixed — same-day
targets before due time now resolve to today, not next week.
P1-3: README execution section rewritten to match actual state.
Settings page execution description updated accordingly.
P2-1: 'scheduler' added to PlanSource type.
P2-2: CI triggers on release/** branches.
P2-3: Command panel now renders AI 助手 as pinned entry above grouped actions.