`。
+- ` ...` → 前缀补全 `/img/`。
+
+### 7.4 Gallery 功能
+- 短代码 Regex:`{{
`)。
+- 规划:`caption` 字段可映射为 wikilink alias 或 `
区域,便于复制。
+4. Notice 简要提示(DryRun 或 完成)。
+
+错误处理:
+- try/catch 包裹,失败写入 resultPre 文本 + Notice。
+- run 按钮在执行期间 disabled,防止重复触发。
+
+后续增强设想:
+| 项目 | 说明 |
+|------|------|
+| 进度条 | 删除大批量时显示当前进度/总数 |
+| 失败重试 | 针对 fails 列表单独重试按钮 |
+| 过滤条件 | 增加标题关键词 / 日期起止输入 |
+| 多账号选择 | 下拉列出已配置的 appid 列表 |
+| 日志导出 | 一键复制 JSON 结果 |
+
diff --git a/archives/v1.3.0/diagrams.md b/archives/v1.3.0/diagrams.md
new file mode 100644
index 0000000..113d8c3
--- /dev/null
+++ b/archives/v1.3.0/diagrams.md
@@ -0,0 +1,178 @@
+# Diagrams (Mermaid)
+
+> 动态架构与主要交互可视化。与文字说明对应:`architecture.md` / `image-pipeline.md` / `render-service-blueprint.md`。
+
+## 1. 模块类图 (当前实现概览)
+```mermaid
+classDiagram
+ class NotePreview {
+ +renderMarkdown()
+ +uploadImages()
+ +postArticle()
+ +postImages()
+ +exportHTML()
+ }
+ class ArticleRender {
+ +renderMarkdown(file)
+ +getMetadata()
+ +uploadImages(appid)
+ +postArticle(appid,cover?)
+ +postImages(appid)
+ +exportHTML()
+ +transformGalleryBlock()
+ +applyCustomInlineBlocks()
+ }
+ class LocalImageManager {
+ +setImage(path,info)
+ +uploadLocalImage(token,vault)
+ +uploadRemoteImage(root,token)
+ +replaceImages(root)
+ }
+ class LocalFile {
+ +markedExtension()
+ }
+ class AssetsManager {
+ +loadAssets()
+ +getTheme(name)
+ +getHighlight(name)
+ }
+ class NMPSettings {
+ +wxInfo
+ +authKey
+ +enableMarkdownImageToWikilink
+ +galleryPrePath
+ +galleryNumPic
+ +defaultCoverPic
+ }
+ class WeChatAPI {
+ +wxGetToken()
+ +wxAddDraft()
+ +wxUploadImage()
+ }
+
+ NotePreview --> ArticleRender
+ ArticleRender --> LocalImageManager
+ ArticleRender --> AssetsManager
+ ArticleRender --> NMPSettings
+ ArticleRender --> WeChatAPI
+ ArticleRender --> LocalFile
+ LocalFile --> LocalImageManager
+ NotePreview --> NMPSettings
+ NotePreview --> AssetsManager
+```
+
+## 2. 发布草稿时序图
+```mermaid
+sequenceDiagram
+ participant U as User
+ participant NP as NotePreview
+ participant AR as ArticleRender
+ participant WX as WeChatAPI
+ participant LIM as LocalImageManager
+
+ U->>NP: 点击 发草稿
+ NP->>AR: postArticle(appid)
+ AR->>WX: wxGetToken(authKey, appid)
+ WX-->>AR: token
+ AR->>AR: cachedElementsToImages()
+ AR->>LIM: uploadLocalImage(token)
+ LIM-->>AR: local media_id(s)
+ AR->>LIM: uploadRemoteImage(token)
+ LIM-->>AR: remote media_id(s)
+ AR->>LIM: replaceImages()
+ AR->>AR: resolve cover (frontmatter / first image / default)
+ AR->>WX: wxAddDraft(draft JSON)
+ WX-->>AR: media_id | err
+ AR-->>NP: 结果
+ NP-->>U: 成功 / 失败提示
+```
+
+## 3. 图片上传流程图
+```mermaid
+graph TD
+ A[Start UploadImages] --> B{AuthKey/AppId?}
+ B -- No --> Z[Throw Error]
+ B -- Yes --> C[Get Token]
+ C --> D[cachedElementsToImages]
+ D --> E[uploadLocalImage]
+ E --> F[uploadRemoteImage]
+ F --> G[replaceImages]
+ G --> H[Copy HTML to Clipboard]
+ H --> I[End]
+```
+
+## 4. 自动封面推断逻辑
+```mermaid
+graph TD
+ A[Need Cover?] -->|No| Z[Skip]
+ A -->|Yes| B[Frontmatter cover?]
+ B -- Yes --> H[Use frontmatter]
+ B -- No --> C[Strip Frontmatter]
+ C --> D[Scan Markdown Images]
+ C --> E[Scan Wikilink Images]
+ D --> F[Collect Candidates]
+ E --> F[Collect Candidates]
+ F --> G{Any Body Image?}
+ G -- Yes --> H[Use first body image]
+ G -- No --> I[Gallery Expanded?]
+ I -- Yes --> H[Use first gallery image]
+ I -- No --> J[defaultCoverPic Config?]
+ J -- Yes --> H[Use defaultCoverPic]
+ J -- No --> Z[Cover stays empty]
+```
+
+## 4.1 行级轻语法与日志节流 (补充)
+```mermaid
+graph TD
+ M[Markdown Raw] --> P[Preprocess Gallery Shortcode]
+ P --> GB[Gallery Block Parse]
+ GB --> MD[Marked Parse]
+ MD --> IB[applyCustomInlineBlocks]
+ IB --> R[Render HTML]
+ R --> L{Log Throttle}
+ L --> R1[Path Log]
+ L --> R2[Cover Fallback Log]
+```
+
+## 5. 未来 RenderService Pipeline 图
+```mermaid
+graph TD
+ L[Loader] --> FM[Frontmatter]
+ FM --> PP[Preprocessors]
+ PP --> P[Parser]
+ P --> TR[Transformers]
+ TR --> RI[ResourceIndex]
+ RI --> R[Renderer]
+ R --> PO[Postprocessors]
+ PO --> EX[Exporters]
+```
+
+## 6. 并发上传示意 (未来优化)
+```mermaid
+graph TD
+ A[Images] --> B[Partition]
+ B --> C[Pool]
+ C --> D[Upload]
+ D --> E{Success?}
+ E -->|No| R[Retry]
+ E -->|Yes| F[Collect ids]
+ R --> C
+ F --> G[Done]
+```
+
+## 7. 状态机概览 (发布按钮)
+```mermaid
+stateDiagram-v2
+ [*] --> Idle
+ Idle --> Uploading : 点击 上传/发布
+ Uploading --> Publishing : 草稿模式
+ Uploading --> Completed : 仅上传
+ Publishing --> Completed : 响应成功
+ Publishing --> Failed : 接口错误
+ Uploading --> Failed : 资源错误
+ Failed --> Idle : 用户重试
+ Completed --> Idle : 新文件切换
+```
+
+---
+需要我将这些图嵌入到 README 的一个“开发者”章节吗?可以继续提出。
diff --git a/archives/v1.3.0/manifest.json b/archives/v1.3.0/manifest.json
new file mode 100644
index 0000000..e05f008
--- /dev/null
+++ b/archives/v1.3.0/manifest.json
@@ -0,0 +1,10 @@
+{
+ "id": "note-to-mp",
+ "name": "NoteToMP",
+ "version": "1.3.0",
+ "minAppVersion": "1.4.5",
+ "description": "Send notes to WeChat MP drafts, or copy notes to WeChat MP editor, perfect preservation of note styles, support code highlighting, line numbers in code, and support local image uploads.",
+ "author": "Sun Booshi",
+ "authorUrl": "https://sunboshi.tech",
+ "isDesktopOnly": false
+}
diff --git a/archives/v1.3.0/package.json b/archives/v1.3.0/package.json
new file mode 100644
index 0000000..0cbe0e0
--- /dev/null
+++ b/archives/v1.3.0/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "note-to-mp",
+ "version": "1.3.0",
+ "description": "This is a plugin for Obsidian (https://obsidian.md)",
+ "main": "main.js",
+ "scripts": {
+ "dev": "node esbuild.config.mjs",
+ "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production",
+ "download": "node tools/download.mjs",
+ "version": "node version-bump.mjs && git add manifest.json versions.json"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "MIT",
+ "devDependencies": {
+ "@types/node": "^16.11.6",
+ "@typescript-eslint/eslint-plugin": "5.29.0",
+ "@typescript-eslint/parser": "5.29.0",
+ "builtin-modules": "3.3.0",
+ "esbuild": "0.17.3",
+ "obsidian": "latest",
+ "tslib": "2.4.0",
+ "typescript": "4.7.4"
+ },
+ "dependencies": {
+ "@zip.js/zip.js": "^2.7.43",
+ "highlight.js": "^11.9.0",
+ "html-to-image": "^1.11.11",
+ "marked": "^12.0.1",
+ "marked-highlight": "^2.1.3"
+ }
+}
diff --git a/archives/v1.3.0/source-snapshot-v1.3.0.tar.gz b/archives/v1.3.0/source-snapshot-v1.3.0.tar.gz
new file mode 100644
index 0000000..199d5ae
Binary files /dev/null and b/archives/v1.3.0/source-snapshot-v1.3.0.tar.gz differ
diff --git a/archives/v1.3.0/styles.css b/archives/v1.3.0/styles.css
new file mode 100644
index 0000000..a68f221
--- /dev/null
+++ b/archives/v1.3.0/styles.css
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2024-2025 Sun Booshi
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/* =========================================================== */
+/* UI 样式 */
+/* =========================================================== */
+.note-preview {
+ min-height: 100%;
+ width: 100%;
+ height: 100%;
+ background-color: #fff;
+ display: flex;
+ flex-direction: column;
+}
+
+.render-div {
+ flex: 1;
+ overflow-y: auto;
+ padding: 10px;
+}
+
+.preview-toolbar {
+ position: relative;
+ min-height: 100px;
+ border-bottom: #e4e4e4 1px solid;
+ background-color: var(--background-primary);
+}
+
+.toolbar-line {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ align-items: center;
+ margin: 10px 10px;
+}
+
+.copy-button {
+ margin-right: 10px;
+}
+
+.refresh-button {
+ margin-right: 10px;
+}
+
+.upload-input {
+ margin-left: 10px;
+ visibility: hidden;
+ width: 0px;
+}
+
+.style-label {
+ margin-right: 10px;
+}
+
+.style-select {
+ margin-right: 10px;
+ width: 120px;
+}
+
+.msg-view {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: var(--background-primary);
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ font-size: 18px;
+ z-index: 9999;
+ display: none;
+}
+
+.msg-title {
+ margin-bottom: 20px;
+ max-width: 90%;
+}
+
+.note-mpcard-wrapper {
+ margin: 20px 20px;
+ background-color: rgb(250, 250, 250);
+ padding: 10px 20px;
+ border-radius: 10px;
+}
+.note-mpcard-content {
+ display: flex;
+}
+.note-mpcard-headimg {
+ border: none !important;
+ border-radius: 27px !important;
+ box-shadow: none !important;
+ width: 54px !important;
+ height: 54px !important;
+ margin: 0 !important;
+}
+.note-mpcard-info {
+ margin-left: 10px;
+}
+.note-mpcard-nickname {
+ font-size: 17px;
+ font-weight: 500;
+ color: rgba(0, 0, 0, 0.9);
+}
+
+.note-mpcard-signature {
+ font-size: 14px;
+ color: rgba(0, 0, 0, 0.55);
+}
+.note-mpcard-foot {
+ margin-top: 20px;
+ padding-top: 10px;
+ border-top: 1px solid #ececec;
+ font-size: 14px;
+ color: rgba(0, 0, 0, 0.3);
+}
+
+.loading-wrapper {
+ display: flex;
+ width: 100%;
+ height: 100%;
+ align-items: center;
+ justify-content: center;
+}
+
+.loading-spinner {
+ width: 50px; /* 可调整大小 */
+ height: 50px;
+ border: 4px solid #fcd6ff; /* 底色,浅灰 */
+ border-top: 4px solid #bb0cdf; /* 主色,蓝色顶部产生旋转感 */
+ border-radius: 50%; /* 圆形 */
+ animation: spin 1s linear infinite; /* 旋转动画 */
+}
+
+@keyframes spin {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
\ No newline at end of file