chore: untrack agent local metadata
This commit is contained in:
@@ -1,47 +0,0 @@
|
|||||||
# Result: <title>
|
|
||||||
|
|
||||||
## Metadata
|
|
||||||
|
|
||||||
- Run ID: `<run-id>`
|
|
||||||
- Lane: `<lane>`
|
|
||||||
- Worktree: `<absolute-worktree-path>`
|
|
||||||
- Branch: `<branch-name>`
|
|
||||||
- Worker: `codex-<lane>`
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
|
|
||||||
Briefly state what changed.
|
|
||||||
|
|
||||||
## Completed work
|
|
||||||
|
|
||||||
- [ ] ...
|
|
||||||
|
|
||||||
## Modified files
|
|
||||||
|
|
||||||
- `path`: reason
|
|
||||||
|
|
||||||
## Validation performed
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# command
|
|
||||||
```
|
|
||||||
|
|
||||||
Result:
|
|
||||||
|
|
||||||
```text
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
## Suggested smoke test
|
|
||||||
|
|
||||||
- URL:
|
|
||||||
- Actions:
|
|
||||||
- Expected result:
|
|
||||||
|
|
||||||
## Risks / unfinished items
|
|
||||||
|
|
||||||
- ...
|
|
||||||
|
|
||||||
## Notes for reviewer
|
|
||||||
|
|
||||||
- ...
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
# Review: <title>
|
|
||||||
|
|
||||||
## Metadata
|
|
||||||
|
|
||||||
- Run ID: `<run-id>`
|
|
||||||
- Reviewer: `Hermes`
|
|
||||||
- Main repo: `/mnt/Data1T/mnote`
|
|
||||||
- Related worktrees:
|
|
||||||
- `...`
|
|
||||||
|
|
||||||
## Inputs reviewed
|
|
||||||
|
|
||||||
- PLAN.md:
|
|
||||||
- RESULT.md files:
|
|
||||||
- SMOKE.md:
|
|
||||||
- Git diffs:
|
|
||||||
|
|
||||||
## Integration decision
|
|
||||||
|
|
||||||
MERGE / REQUEST_FIX / REJECT / HOLD
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
|
|
||||||
Short decision summary.
|
|
||||||
|
|
||||||
## Diff review
|
|
||||||
|
|
||||||
- File/path:
|
|
||||||
- Observation:
|
|
||||||
- Risk:
|
|
||||||
- Decision:
|
|
||||||
|
|
||||||
## Smoke review
|
|
||||||
|
|
||||||
- Smoke result:
|
|
||||||
- Evidence sufficient: yes/no
|
|
||||||
- Gaps:
|
|
||||||
|
|
||||||
## Validation run by reviewer
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# command
|
|
||||||
```
|
|
||||||
|
|
||||||
Result:
|
|
||||||
|
|
||||||
```text
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
## Follow-up tasks
|
|
||||||
|
|
||||||
- [ ] ...
|
|
||||||
|
|
||||||
## Cleanup / recycle
|
|
||||||
|
|
||||||
- Worktrees kept:
|
|
||||||
- Worktrees moved to recycle:
|
|
||||||
- Branches kept/deleted:
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
# Smoke: <title>
|
|
||||||
|
|
||||||
## Metadata
|
|
||||||
|
|
||||||
- Run ID: `<run-id>`
|
|
||||||
- Tester: `reasonix-flash`
|
|
||||||
- Target worktree / branch: `<branch-or-main>`
|
|
||||||
- Evidence directory: `<absolute-evidence-dir>`
|
|
||||||
- URL: `<url>`
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
What this smoke test validates.
|
|
||||||
|
|
||||||
## Browser actions
|
|
||||||
|
|
||||||
- [ ] Navigate to `<url>`
|
|
||||||
- [ ] Login / setup state if needed
|
|
||||||
- [ ] Click: ...
|
|
||||||
- [ ] Hover: ...
|
|
||||||
- [ ] Drag: ...
|
|
||||||
- [ ] Select: ...
|
|
||||||
|
|
||||||
## Result
|
|
||||||
|
|
||||||
PASS / FAIL / BLOCKED
|
|
||||||
|
|
||||||
## Evidence
|
|
||||||
|
|
||||||
- Final URL:
|
|
||||||
- Screenshot:
|
|
||||||
- Console errors:
|
|
||||||
- Network errors:
|
|
||||||
- Visible text sample:
|
|
||||||
|
|
||||||
## Findings
|
|
||||||
|
|
||||||
### Issue 1
|
|
||||||
|
|
||||||
- Expected:
|
|
||||||
- Actual:
|
|
||||||
- Reproduction:
|
|
||||||
- Evidence:
|
|
||||||
|
|
||||||
## Cleanup
|
|
||||||
|
|
||||||
- Test data created:
|
|
||||||
- Test data cleaned:
|
|
||||||
- Residual state:
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
# Task: <title>
|
|
||||||
|
|
||||||
## Metadata
|
|
||||||
|
|
||||||
- Run ID: `<run-id>`
|
|
||||||
- Lane: `<lane>`
|
|
||||||
- Worker: `codex-<lane>`
|
|
||||||
- Main repo: `/mnt/Data1T/mnote`
|
|
||||||
- Worktree: `<absolute-worktree-path>`
|
|
||||||
- Branch: `<branch-name>`
|
|
||||||
- Result path: `<run-dir>/codex-<lane>/RESULT.md`
|
|
||||||
|
|
||||||
## Goal
|
|
||||||
|
|
||||||
Describe the concrete outcome expected from this worker.
|
|
||||||
|
|
||||||
## Context
|
|
||||||
|
|
||||||
- Relevant design docs:
|
|
||||||
- `...`
|
|
||||||
- Relevant code paths:
|
|
||||||
- `...`
|
|
||||||
|
|
||||||
## Allowed edit scope
|
|
||||||
|
|
||||||
- `path/or/dir/**`
|
|
||||||
|
|
||||||
## Forbidden scope
|
|
||||||
|
|
||||||
- Do not edit files outside allowed scope.
|
|
||||||
- Do not edit user data.
|
|
||||||
- Do not modify unrelated recycle/history directories.
|
|
||||||
- Do not commit, push, reset, or revert unless explicitly instructed.
|
|
||||||
|
|
||||||
## Requirements
|
|
||||||
|
|
||||||
- ...
|
|
||||||
|
|
||||||
## Validation commands
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# command 1
|
|
||||||
# command 2
|
|
||||||
```
|
|
||||||
|
|
||||||
## Expected deliverable
|
|
||||||
|
|
||||||
Write `RESULT.md` with:
|
|
||||||
|
|
||||||
- completed work
|
|
||||||
- modified files
|
|
||||||
- validation commands and outputs
|
|
||||||
- risks / unfinished items
|
|
||||||
- suggested smoke scope
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,52 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"content": "审计真实 documents.content/documents.save/Convex content contract",
|
|
||||||
"activeForm": "审计真实 documents.content/documents.save/Convex content contract",
|
|
||||||
"status": "completed"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"content": "把 LeptosTiptapEditorHost 从 query-string 初始化改成 bootstrap postMessage",
|
|
||||||
"activeForm": "把 LeptosTiptapEditorHost 从 query-string 初始化改成 bootstrap postMessage",
|
|
||||||
"status": "in_progress"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"content": "让 8123 runtime 支持 bootstrap/reset 并避免跨文档复用错误状态",
|
|
||||||
"activeForm": "让 8123 runtime 支持 bootstrap/reset 并避免跨文档复用错误状态",
|
|
||||||
"status": "in_progress"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"content": "补 iframe 高度同步",
|
|
||||||
"activeForm": "补 iframe 高度同步",
|
|
||||||
"status": "in_progress"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"content": "建立 stored content 到 tiptap doc 的正式 adapter",
|
|
||||||
"activeForm": "建立 stored content 到 tiptap doc 的正式 adapter",
|
|
||||||
"status": "pending"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"content": "建立 tiptap doc 到 stored content 的正式 adapter",
|
|
||||||
"activeForm": "建立 tiptap doc 到 stored content 的正式 adapter",
|
|
||||||
"status": "pending"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"content": "接通真实保存与 persisted meta 回写",
|
|
||||||
"activeForm": "接通真实保存与 persisted meta 回写",
|
|
||||||
"status": "pending"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"content": "固定 /documents/[id] 默认直接编辑态",
|
|
||||||
"activeForm": "固定 /documents/[id] 默认直接编辑态",
|
|
||||||
"status": "pending"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"content": "固定 EditorHost 主路径为 tiptap 并把 BlockNote 退到 compat",
|
|
||||||
"activeForm": "固定 EditorHost 主路径为 tiptap 并把 BlockNote 退到 compat",
|
|
||||||
"status": "pending"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"content": "补验收脚本并完成主编辑器人工验收准备",
|
|
||||||
"activeForm": "补验收脚本并完成主编辑器人工验收准备",
|
|
||||||
"status": "pending"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
# CodeGraph data files
|
|
||||||
# These are local to each machine and should not be committed
|
|
||||||
|
|
||||||
# Database
|
|
||||||
*.db
|
|
||||||
*.db-wal
|
|
||||||
*.db-shm
|
|
||||||
|
|
||||||
# Cache
|
|
||||||
cache/
|
|
||||||
|
|
||||||
# Logs
|
|
||||||
*.log
|
|
||||||
|
|
||||||
# Hook markers
|
|
||||||
.dirty
|
|
||||||
@@ -1,161 +0,0 @@
|
|||||||
{
|
|
||||||
"version": 1,
|
|
||||||
"include": [
|
|
||||||
"**/*.ts",
|
|
||||||
"**/*.tsx",
|
|
||||||
"**/*.js",
|
|
||||||
"**/*.jsx",
|
|
||||||
"**/*.py",
|
|
||||||
"**/*.go",
|
|
||||||
"**/*.rs",
|
|
||||||
"**/*.java",
|
|
||||||
"**/*.c",
|
|
||||||
"**/*.h",
|
|
||||||
"**/*.cpp",
|
|
||||||
"**/*.hpp",
|
|
||||||
"**/*.cc",
|
|
||||||
"**/*.cxx",
|
|
||||||
"**/*.cs",
|
|
||||||
"**/*.php",
|
|
||||||
"**/*.rb",
|
|
||||||
"**/*.swift",
|
|
||||||
"**/*.kt",
|
|
||||||
"**/*.kts",
|
|
||||||
"**/*.dart",
|
|
||||||
"**/*.svelte",
|
|
||||||
"**/*.vue",
|
|
||||||
"**/*.liquid",
|
|
||||||
"**/*.pas",
|
|
||||||
"**/*.dpr",
|
|
||||||
"**/*.dpk",
|
|
||||||
"**/*.lpr",
|
|
||||||
"**/*.dfm",
|
|
||||||
"**/*.fmx",
|
|
||||||
"**/*.scala",
|
|
||||||
"**/*.sc"
|
|
||||||
],
|
|
||||||
"exclude": [
|
|
||||||
"**/.git/**",
|
|
||||||
"**/node_modules/**",
|
|
||||||
"**/vendor/**",
|
|
||||||
"**/Pods/**",
|
|
||||||
"**/dist/**",
|
|
||||||
"**/build/**",
|
|
||||||
"**/out/**",
|
|
||||||
"**/bin/**",
|
|
||||||
"**/obj/**",
|
|
||||||
"**/target/**",
|
|
||||||
"**/*.min.js",
|
|
||||||
"**/*.bundle.js",
|
|
||||||
"**/.next/**",
|
|
||||||
"**/.nuxt/**",
|
|
||||||
"**/.svelte-kit/**",
|
|
||||||
"**/.output/**",
|
|
||||||
"**/.turbo/**",
|
|
||||||
"**/.cache/**",
|
|
||||||
"**/.parcel-cache/**",
|
|
||||||
"**/.vite/**",
|
|
||||||
"**/.astro/**",
|
|
||||||
"**/.docusaurus/**",
|
|
||||||
"**/.gatsby/**",
|
|
||||||
"**/.webpack/**",
|
|
||||||
"**/.nx/**",
|
|
||||||
"**/.yarn/cache/**",
|
|
||||||
"**/.pnpm-store/**",
|
|
||||||
"**/storybook-static/**",
|
|
||||||
"**/.expo/**",
|
|
||||||
"**/web-build/**",
|
|
||||||
"**/ios/Pods/**",
|
|
||||||
"**/ios/build/**",
|
|
||||||
"**/android/build/**",
|
|
||||||
"**/android/.gradle/**",
|
|
||||||
"**/__pycache__/**",
|
|
||||||
"**/.venv/**",
|
|
||||||
"**/venv/**",
|
|
||||||
"**/site-packages/**",
|
|
||||||
"**/dist-packages/**",
|
|
||||||
"**/.pytest_cache/**",
|
|
||||||
"**/.mypy_cache/**",
|
|
||||||
"**/.ruff_cache/**",
|
|
||||||
"**/.tox/**",
|
|
||||||
"**/.nox/**",
|
|
||||||
"**/*.egg-info/**",
|
|
||||||
"**/.eggs/**",
|
|
||||||
"**/go/pkg/mod/**",
|
|
||||||
"**/target/debug/**",
|
|
||||||
"**/target/release/**",
|
|
||||||
"**/.gradle/**",
|
|
||||||
"**/.m2/**",
|
|
||||||
"**/generated-sources/**",
|
|
||||||
"**/.kotlin/**",
|
|
||||||
"**/.dart_tool/**",
|
|
||||||
"**/.vs/**",
|
|
||||||
"**/.nuget/**",
|
|
||||||
"**/artifacts/**",
|
|
||||||
"**/publish/**",
|
|
||||||
"**/cmake-build-*/**",
|
|
||||||
"**/CMakeFiles/**",
|
|
||||||
"**/bazel-*/**",
|
|
||||||
"**/vcpkg_installed/**",
|
|
||||||
"**/.conan/**",
|
|
||||||
"**/Debug/**",
|
|
||||||
"**/Release/**",
|
|
||||||
"**/x64/**",
|
|
||||||
"**/.pio/**",
|
|
||||||
"**/release/**",
|
|
||||||
"**/*.app/**",
|
|
||||||
"**/*.asar",
|
|
||||||
"**/DerivedData/**",
|
|
||||||
"**/.build/**",
|
|
||||||
"**/.swiftpm/**",
|
|
||||||
"**/xcuserdata/**",
|
|
||||||
"**/Carthage/Build/**",
|
|
||||||
"**/SourcePackages/**",
|
|
||||||
"**/__history/**",
|
|
||||||
"**/__recovery/**",
|
|
||||||
"**/*.dcu",
|
|
||||||
"**/.composer/**",
|
|
||||||
"**/storage/framework/**",
|
|
||||||
"**/bootstrap/cache/**",
|
|
||||||
"**/.bundle/**",
|
|
||||||
"**/tmp/cache/**",
|
|
||||||
"**/public/assets/**",
|
|
||||||
"**/public/packs/**",
|
|
||||||
"**/.yardoc/**",
|
|
||||||
"**/coverage/**",
|
|
||||||
"**/htmlcov/**",
|
|
||||||
"**/.nyc_output/**",
|
|
||||||
"**/test-results/**",
|
|
||||||
"**/.coverage/**",
|
|
||||||
"**/.playwright-mcp/**",
|
|
||||||
"**/.idea/**",
|
|
||||||
"**/logs/**",
|
|
||||||
"**/tmp/**",
|
|
||||||
"**/temp/**",
|
|
||||||
"**/_build/**",
|
|
||||||
"**/docs/_build/**",
|
|
||||||
"**/site/**",
|
|
||||||
"recycle/**",
|
|
||||||
"tmp/**",
|
|
||||||
"test/results/**",
|
|
||||||
"test-results/**",
|
|
||||||
"references/**",
|
|
||||||
"LightRAG/**",
|
|
||||||
"home/lix/.hermes/skills/note-taking/mnote-block-ai/**",
|
|
||||||
"home/**",
|
|
||||||
".sandbox-home/**",
|
|
||||||
".sandbox-tmp/**",
|
|
||||||
".convex-tmp/**",
|
|
||||||
"graphify-out/**",
|
|
||||||
"design/old/**",
|
|
||||||
"design/**/reference-code/**",
|
|
||||||
"reference-code/**",
|
|
||||||
"rust/spikes/**/generated/**",
|
|
||||||
"rust/spikes/**/dist/**"
|
|
||||||
],
|
|
||||||
"languages": [],
|
|
||||||
"frameworks": [],
|
|
||||||
"maxFileSize": 1048576,
|
|
||||||
"extractDocstrings": true,
|
|
||||||
"trackCallSites": true
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
tmp/
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"hooks": {
|
|
||||||
"PreToolUse": []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,339 +0,0 @@
|
|||||||
# Proposal: MNote Main Tab 键盘导航与 MRU 行为
|
|
||||||
|
|
||||||
> 日期:2026-05-21
|
|
||||||
>
|
|
||||||
> 状态:proposed
|
|
||||||
>
|
|
||||||
> 来源:[Reasonix Worker B](../../.codex/reasonix-tasks/2026-05-21-sidex-worker-b-tab-keyboard-mru.md)
|
|
||||||
>
|
|
||||||
> 参考:Sidex `MultiEditorTabsControl`、MNote `activateMainEditorTab` / `bindMainEditorPageTab` / `resourceTabMru`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 1. 目标
|
|
||||||
|
|
||||||
在现有主编辑区 tab strip 上增加轻量键盘导航和 MRU 回退行为,不引入完整 VSCode tab control 体系。
|
|
||||||
|
|
||||||
| 行为 | Sidex 做法 | MNote 对应 |
|
|
||||||
|------|-----------|-----------|
|
|
||||||
| 左右箭头 roving focus | `KEY_UP` → `ArrowLeft/Right` 计算相邻 editorIndex | tab strip `keydown` → 循环 `resourceTabRegistry` + page tab |
|
|
||||||
| Enter/Space 激活 | `KEY_UP` → `groupView.openEditor(editor)` | `activateMainEditorTab(objectIdentity)` |
|
|
||||||
| Home/End 跳转 | 计算 `editorIndex=0` 或 `count-1` | 跳转到 page tab (Home) 或最后一个 resource tab (End) |
|
|
||||||
| 关闭后 MRU 回退 | VSCode 的 `MRU` 排序 | 已有 `lastActiveResourceTabKey()`,需确认行为正确 |
|
|
||||||
| 关闭 active tab 后 focus 迁移 | 激活 MRU 中下一个 tab | `closeResourceTab` 最后调用 `activateMainEditorTab(lastActiveResourceTabKey())` |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2. 需要修改的源码函数
|
|
||||||
|
|
||||||
所有修改均位于 `rust/crates/mnote-web/src/routes/web_shell.rs`。
|
|
||||||
|
|
||||||
### 2.1 新增函数:`bindMainEditorTabStrip()`
|
|
||||||
|
|
||||||
**位置**:紧接 `bindMainEditorPageTab`(约 line 3450)。
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
const bindMainEditorTabStrip = () => {
|
|
||||||
const nodes = resourceTabHostNodes();
|
|
||||||
if (!(nodes.strip instanceof HTMLElement)) return;
|
|
||||||
if (nodes.strip.getAttribute('data-mnote-tab-strip-bound') === 'true') return;
|
|
||||||
nodes.strip.setAttribute('data-mnote-tab-strip-bound', 'true');
|
|
||||||
|
|
||||||
// Helper: collect all tab buttons in DOM order (page tab first, then resource tabs)
|
|
||||||
const collectTabs = () => {
|
|
||||||
const tabs = [];
|
|
||||||
if (nodes.pageTab instanceof HTMLElement && nodes.pageTab.isConnected) tabs.push(nodes.pageTab);
|
|
||||||
resourceTabRegistry.forEach((entry) => {
|
|
||||||
if (entry.tab instanceof HTMLElement && entry.tab.isConnected) tabs.push(entry.tab);
|
|
||||||
});
|
|
||||||
return tabs;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Helper: find currently focused tab index
|
|
||||||
const findFocusedIndex = (tabs) => {
|
|
||||||
const active = document.activeElement;
|
|
||||||
return tabs.findIndex((tab) => tab === active);
|
|
||||||
};
|
|
||||||
|
|
||||||
nodes.strip.addEventListener('keydown', (event) => {
|
|
||||||
const tabs = collectTabs();
|
|
||||||
if (tabs.length === 0) return;
|
|
||||||
const focusedIndex = findFocusedIndex(tabs);
|
|
||||||
let targetIndex = -1;
|
|
||||||
|
|
||||||
switch (event.key) {
|
|
||||||
case 'ArrowRight': {
|
|
||||||
event.preventDefault();
|
|
||||||
targetIndex = focusedIndex >= 0
|
|
||||||
? (focusedIndex + 1) % tabs.length
|
|
||||||
: tabs.findIndex((t) => t.getAttribute('aria-selected') === 'true');
|
|
||||||
if (targetIndex < 0) targetIndex = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'ArrowLeft': {
|
|
||||||
event.preventDefault();
|
|
||||||
targetIndex = focusedIndex >= 0
|
|
||||||
? (focusedIndex - 1 + tabs.length) % tabs.length
|
|
||||||
: tabs.findIndex((t) => t.getAttribute('aria-selected') === 'true');
|
|
||||||
if (targetIndex < 0) targetIndex = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'Home': {
|
|
||||||
event.preventDefault();
|
|
||||||
targetIndex = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'End': {
|
|
||||||
event.preventDefault();
|
|
||||||
targetIndex = tabs.length - 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'Enter':
|
|
||||||
case ' ': { // Space
|
|
||||||
event.preventDefault();
|
|
||||||
const activeTab = tabs[focusedIndex >= 0 ? focusedIndex
|
|
||||||
: tabs.findIndex((t) => t.getAttribute('aria-selected') === 'true')];
|
|
||||||
if (activeTab) activeTab.click();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return; // don't re-focus
|
|
||||||
}
|
|
||||||
|
|
||||||
if (targetIndex >= 0 && targetIndex < tabs.length) {
|
|
||||||
tabs[targetIndex].focus();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
**设计理由**:
|
|
||||||
|
|
||||||
- 使用 `keydown` 而非 `keyup`(Sidex 用 `KEY_UP` 是为了与 `StandardKeyboardEvent` 兼容,但 MNote 无此抽象):`keydown` 捕获更快、防止浏览器默认滚动。
|
|
||||||
- `collectTabs()` 每次实时查询 DOM 顺序,避免缓存过期。
|
|
||||||
- `Enter`/`Space` 复用已有 `click` 事件处理(`createResourceTabDom` 中已有 click handler)。
|
|
||||||
- 只处理 `strip` 上的事件,利用事件冒泡获取已在 DOM 内的所有 tab。
|
|
||||||
|
|
||||||
### 2.2 修改 `bindMainEditorPageTab()`(约 line 3450)
|
|
||||||
|
|
||||||
当前函数只绑定 page tab 的 `click`。需在末尾追加:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
// 同时也绑定 tab strip 键盘导航
|
|
||||||
bindMainEditorTabStrip();
|
|
||||||
```
|
|
||||||
|
|
||||||
或在 `bindMainEditorPageTab` 返回前调用一次。
|
|
||||||
|
|
||||||
### 2.3 修改 `createResourceTabDom()`(约 line 3507)
|
|
||||||
|
|
||||||
新创建的 resource tab 已有 `tabindex="-1"` 初始值。**无需额外修改**,因为 `activateMainEditorTab` 已正确设置 active tab 的 `tabindex="0"`,其他 tab `tabindex="-1"`。
|
|
||||||
|
|
||||||
但需要确认:`activateMainEditorTab` 遍历 `resourceTabRegistry` 时,**page tab 和 resource tab 的 `tabindex` 一致性**。当前实现:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
// activateMainEditorTab 中(line 3428-3442)
|
|
||||||
if (nodes.pageTab instanceof HTMLElement) {
|
|
||||||
nodes.pageTab.setAttribute('tabindex', activePage ? '0' : '-1');
|
|
||||||
}
|
|
||||||
// resource tabs:
|
|
||||||
entry.tab.setAttribute('tabindex', active ? '0' : '-1');
|
|
||||||
```
|
|
||||||
|
|
||||||
→ 已满足 roving tabindex 的前置条件。**无需修改**。
|
|
||||||
|
|
||||||
### 2.4 修改 `closeResourceTab()`(约 line 3461)
|
|
||||||
|
|
||||||
当前关闭后通过 `activateMainEditorTab(lastActiveResourceTabKey())` 回退。但 focus 未迁移到新激活的 tab。需在 `activateMainEditorTab` 调用后**追加 focus**:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
// closeResourceTab 末尾,将 focus 移到新激活的 tab
|
|
||||||
const nextKey = lastActiveResourceTabKey();
|
|
||||||
activateMainEditorTab(nextKey);
|
|
||||||
// 新激活 tab 获得 focus
|
|
||||||
const nextTab = nextKey
|
|
||||||
? resourceTabRegistry.get(nextKey)?.tab
|
|
||||||
: nodes.pageTab;
|
|
||||||
if (nextTab instanceof HTMLElement) nextTab.focus();
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2.5 确认 MRU 行为(`touchResourceTabMru` + `lastActiveResourceTabKey`)
|
|
||||||
|
|
||||||
现有 MRU 实现已足够:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
// touchResourceTabMru (line 3289-3295)
|
|
||||||
const touchResourceTabMru = (key) => {
|
|
||||||
const id = String(key || '').trim();
|
|
||||||
if (!id) return;
|
|
||||||
const index = resourceTabMru.indexOf(id);
|
|
||||||
if (index >= 0) resourceTabMru.splice(index, 1);
|
|
||||||
resourceTabMru.unshift(id);
|
|
||||||
if (resourceTabMru.length > resourceTabMruMax) resourceTabMru.length = resourceTabMruMax;
|
|
||||||
};
|
|
||||||
|
|
||||||
// lastActiveResourceTabKey (line 3309-3313)
|
|
||||||
const lastActiveResourceTabKey = () => {
|
|
||||||
for (const key of resourceTabMru) {
|
|
||||||
if (resourceTabRegistry.has(key)) return key;
|
|
||||||
}
|
|
||||||
return '';
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
**行为验证**:
|
|
||||||
- 激活一个 tab → `touchResourceTabMru(key)` 将其移到队列头部
|
|
||||||
- 关闭当前 tab → `removeFromResourceTabMru(key)` 移除 → `lastActiveResourceTabKey()` 返回 MRU 中第一个仍存在 registry 的 key
|
|
||||||
- 如果没有任何 resource tab 存活 → 返回 `''` → `activateMainEditorTab('')` 激活 page tab
|
|
||||||
|
|
||||||
→ **可用,无需修改 MRU 核心逻辑**。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. 需新增的 CSS(`styles.rs`)
|
|
||||||
|
|
||||||
### 3.1 Focus 可见样式
|
|
||||||
|
|
||||||
当前 `mnote-main-tab` 没有 `:focus-visible` 样式。添加:
|
|
||||||
|
|
||||||
```css
|
|
||||||
.mnote-main-tab:focus-visible {
|
|
||||||
outline: 2px solid var(--atelier-primary, #006E28);
|
|
||||||
outline-offset: -2px;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3.2 可选:resource tab DOM 顺序保证
|
|
||||||
|
|
||||||
如果 resource tab 需要在 DOM 中保持 MRU 可见顺序(而非插入顺序),则 `createResourceTabDom` 中 `nodes.strip.append(tab)` 需改为按 MRU 顺序插入。但**当前不要求**——tabs 按打开顺序排列,MRU 只控制回退。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 4. 需要更新的 contract test
|
|
||||||
|
|
||||||
文件:`rust/crates/mnote-web/src/routes/web_shell.rs` 末尾的 Rust 单元测试(约 line 4528+)。
|
|
||||||
|
|
||||||
### 4.1 新增 assert
|
|
||||||
|
|
||||||
```rust
|
|
||||||
assert!(html.contains("data-mnote-tab-strip-bound"));
|
|
||||||
assert!(html.contains("bindMainEditorTabStrip"));
|
|
||||||
```
|
|
||||||
|
|
||||||
即检查生成的 JS 中包含 `bindMainEditorTabStrip` 函数的定义字符串和 `data-mnote-tab-strip-bound` guard attribute。
|
|
||||||
|
|
||||||
### 4.2 已有断言确认
|
|
||||||
|
|
||||||
以下已有断言确保关键 tab DOM 结构存在:
|
|
||||||
|
|
||||||
```rust
|
|
||||||
assert!(html.contains("data-mnote-main-tab-strip")); // line 4538
|
|
||||||
assert!(html.contains("[data-mnote-main-tab=\"page\"] .mnote-main-tab-title")); // line 4541
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 5. 需要新增的 smoke test
|
|
||||||
|
|
||||||
新建 `scripts/task475-editor-tab-keyboard-mru-smoke.js`(参考 `task457` 的 Playwright harness 写法)。
|
|
||||||
|
|
||||||
### 5.1 测试断言
|
|
||||||
|
|
||||||
| # | 断言 | 方法 |
|
|
||||||
|---|------|------|
|
|
||||||
| 1 | tab strip 可接收 keyboard focus | 在 strip 上 `page.keyboard.press('ArrowRight')` 后检查 `document.activeElement` 属于 `[data-mnote-main-tab]` |
|
|
||||||
| 2 | ArrowRight 循环聚焦 | focus page tab → ArrowRight → focused tab 应为第一个 resource tab |
|
|
||||||
| 3 | ArrowLeft 反向循环 | focus 第二个 resource tab → ArrowLeft → focused tab 应为第一个 resource tab |
|
|
||||||
| 4 | Home 跳到第一个 tab | focus 任意 resource tab → Home → focused 应为 page tab |
|
|
||||||
| 5 | End 跳到最后一个 tab | focus page tab → End → focused 应为最后一个 resource tab |
|
|
||||||
| 6 | Enter 激活 focused tab | ArrowRight 到 resource tab → Enter → 该 tab 应 `aria-selected="true"` |
|
|
||||||
| 7 | Space 激活 focused tab | 同上,使用 Space |
|
|
||||||
| 8 | 关闭 active tab 后 focus 迁移 | 打开 2 个 resource tab,激活第二个 → close → focus 应回到 MRU 中的第一个 |
|
|
||||||
| 9 | 关闭最后一个 resource tab 后回退 page tab | 打开 1 个 resource tab → close → page tab 应激活且 focused |
|
|
||||||
| 10 | `resourceTabMru` 顺序正确 | 打开 tab A、B、C,激活 B → 检查 MRU 数组头部是 B |
|
|
||||||
|
|
||||||
### 5.2 辅助函数
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
// 获取当前 focused tab 的 identity
|
|
||||||
const getActiveTabId = () => page.evaluate(() => {
|
|
||||||
const active = document.activeElement;
|
|
||||||
return active?.getAttribute('data-mnote-main-tab') || null;
|
|
||||||
});
|
|
||||||
|
|
||||||
// 检查 aria-selected
|
|
||||||
const getSelectedTabId = () => page.evaluate(() => {
|
|
||||||
const selected = document.querySelector('[data-mnote-main-tab][aria-selected="true"]');
|
|
||||||
return selected?.getAttribute('data-mnote-main-tab') || null;
|
|
||||||
});
|
|
||||||
|
|
||||||
// 获取 MRU 队列
|
|
||||||
const getMruQueue = () => page.evaluate(() => {
|
|
||||||
// 通过 window 对象暴露(需在 web_shell.rs 中给 window.__mnoteResourceTabMru 赋值)
|
|
||||||
return window.__mnoteResourceTabMru || [];
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 6. DOM 状态总结
|
|
||||||
|
|
||||||
执行后,main tab 的 DOM 状态契约:
|
|
||||||
|
|
||||||
| Attribute / Property | 用途 | 取值 |
|
|
||||||
|----------------------|------|------|
|
|
||||||
| `data-mnote-main-tab-strip` | tab strip 根元素 | `"true"` |
|
|
||||||
| `data-mnote-tab-strip-bound` | 防止重复绑定 keyboard handler | `"true"`(JS 运行时设置) |
|
|
||||||
| `aria-selected="true"` | 当前激活 tab | 仅一个 tab 有 |
|
|
||||||
| `tabindex="0"` | 当前可聚焦 tab(roving) | 与 `aria-selected` 同步 |
|
|
||||||
| `tabindex="-1"` | 不可直接聚焦 tab | 其他所有 tab |
|
|
||||||
| `data-mnote-main-tab="page"` | page tab 标识 | SSR 初始 |
|
|
||||||
| `data-mnote-main-tab="<identity>"` | resource tab 标识 | JS 创建 |
|
|
||||||
| `class="mnote-main-tab"` | 所有 tab 共享 class | 全部 |
|
|
||||||
| `class="is-active"` | 当前激活 tab | 与 `aria-selected` 同步 |
|
|
||||||
| `role="tab"` | ARIA tab role | 全部 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 7. 风险与边界情况
|
|
||||||
|
|
||||||
| 风险 | 影响 | 缓解 |
|
|
||||||
|------|------|------|
|
|
||||||
| keyboard 事件与编辑器快捷键冲突 | ArrowLeft/Right 被编辑区拦截 | 事件只在 `focus` 位于 tab strip 内时触发(`document.activeElement` 检查) |
|
|
||||||
| `resourceTabRegistry` 遍历顺序不确定 | `collectTabs()` 中 tab 顺序可能乱序 | `collectTabs()` 顺序:page tab 固定首位 + `resourceTabRegistry.forEach`(V8 中 `Map.forEach` 按插入顺序) |
|
|
||||||
| 关闭 tab 时 DOM 元素刚被 remove | `isConnected` 检查失败 | `closeResourceTab` 需要先查 nextTab,再删当前 tab 或重新查询 |
|
|
||||||
| 多个 resource tab 同时关闭 | MRU 队列清空后无回退 | `lastActiveResourceTabKey()` 返回 `''` 已正确处理 |
|
|
||||||
| 与 Worker A 的并行修改冲突 | `web_shell.rs` 中函数顺序和行号漂移 | 本 proposal 以函数名定位,不依赖行号 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 8. 实现顺序(最小安全步骤)
|
|
||||||
|
|
||||||
```
|
|
||||||
Step 1: 在 bindMainEditorPageTab 后新增 bindMainEditorTabStrip 函数
|
|
||||||
实现 keydown 事件委托 + collectTabs + 箭头/Home/End/Enter/Space
|
|
||||||
|
|
||||||
Step 2: 修改 closeResourceTab 末尾
|
|
||||||
在 activateMainEditorTab 后将 focus 移到新激活 tab
|
|
||||||
|
|
||||||
Step 3: 在 styles.rs 中补 :focus-visible 样式
|
|
||||||
|
|
||||||
Step 4: 更新 Rust contract test(新增 bindMainEditorTabStrip / data-mnote-tab-strip-bound 断言)
|
|
||||||
|
|
||||||
Step 5: 新建 scripts/task475-editor-tab-keyboard-mru-smoke.js
|
|
||||||
实现 10 个测试断言
|
|
||||||
|
|
||||||
Step 6: 验收
|
|
||||||
cargo test -p mnote-web web_shell -- --test-threads=1
|
|
||||||
node scripts/task475-editor-tab-keyboard-mru-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 9. 非目标(明确不做的)
|
|
||||||
|
|
||||||
- 不实现 tab 拖拽排序
|
|
||||||
- 不实现 `Ctrl+Tab` / `Ctrl+Shift+Tab` 的 MRU 循环(那是全局快捷键,不是 tab strip keyboard 行为)
|
|
||||||
- 不实现 close others / close right 菜单
|
|
||||||
- 不改变 page/resource tab identity 机制
|
|
||||||
- 不添加 tab overflow 滚动
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
# Reasonix Batch A Worker A: task430 Explorer / Open Editors Smoke
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
用户要求按 `design/01-tree-first-graph-kernel/process/1-8-mvp-post-process-execution-order-v1.md` 分阶段推进。当前执行 Batch A / P0:先清 FileTree action、Open Editors lifecycle、Trash no-refresh 的验证红灯。
|
|
||||||
|
|
||||||
事实源:
|
|
||||||
|
|
||||||
- 阶段 checklist:`design/04-tree-domain/process/4-46-batch-a-filetree-action-trash-smoke-execution-checklist-v1.md`
|
|
||||||
- 上游:`design/04-tree-domain/process/4-45-filetree-open-editors-lifecycle-link-checklist-v1.md`
|
|
||||||
- 相关 smoke:`scripts/task430-vscode-explorer-stage7-smoke.js`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你负责:
|
|
||||||
|
|
||||||
- `scripts/task430-vscode-explorer-stage7-smoke.js`
|
|
||||||
- `design/04-tree-domain/process/4-45-filetree-open-editors-lifecycle-link-checklist-v1.md`
|
|
||||||
- 必要时只追加 `.codex/reasonix-tasks/results/batch-a-worker-a-task430.md`
|
|
||||||
|
|
||||||
你不是独自在代码库中工作;不要回滚、覆盖、格式化或清理其他人的改动。不要提交 git。
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 检查 `task430` 当前是否仍有 workspace bootstrap 前置问题。
|
|
||||||
2. 如能小范围修复脚本前置,修复它;优先通过 `/api/tree/commands` create action 触发 workspace bootstrap,而不是硬编码旧 fixture。
|
|
||||||
3. 补充或确认 FileTree active row / Open Editors / lifecycle 的可观测断言。目标是让失败能区分:
|
|
||||||
- 3000 / Convex / auth 环境不可用
|
|
||||||
- workspace bootstrap 不成立
|
|
||||||
- FileTree / Open Editors 业务回归
|
|
||||||
4. 更新 `4-45` 的本轮执行记录,不能把未实跑成功的项标为完成。
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 不修改 `rust/crates/mnote-web/src/**`。
|
|
||||||
- 不改 delete 默认语义。
|
|
||||||
- 不把环境失败伪装成通过。
|
|
||||||
- 不移动 design 文件到 done。
|
|
||||||
|
|
||||||
## 验证
|
|
||||||
|
|
||||||
至少运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /mnt/Data1T/mnote
|
|
||||||
node --check scripts/task430-vscode-explorer-stage7-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
如本机 3000 / Convex 可用,再运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /mnt/Data1T/mnote
|
|
||||||
node scripts/task430-vscode-explorer-stage7-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
如果不能实跑,必须在报告里写明缺失服务、失败命令和错误摘要。
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
- 修改文件列表
|
|
||||||
- 完成的 checklist 项
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项 / 风险
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
# Reasonix Batch A Worker B: task471 Local Folder Bulk Resource Trash
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
用户要求按 `1-8` 分阶段推进。当前执行 Batch A / P0:清 FileTree action 与 Trash smoke 红灯。
|
|
||||||
|
|
||||||
事实源:
|
|
||||||
|
|
||||||
- 阶段 checklist:`design/04-tree-domain/process/4-46-batch-a-filetree-action-trash-smoke-execution-checklist-v1.md`
|
|
||||||
- 上游:`design/04-tree-domain/process/4-44-filetree-action-layer-paste-drop-delete-v1.md`
|
|
||||||
- 相关 smoke:`scripts/task471-local-folder-bulk-resource-trash-smoke.js`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你负责:
|
|
||||||
|
|
||||||
- `scripts/task471-local-folder-bulk-resource-trash-smoke.js`
|
|
||||||
- `design/04-tree-domain/process/4-44-filetree-action-layer-paste-drop-delete-v1.md`
|
|
||||||
- 必要时只追加 `.codex/reasonix-tasks/results/batch-a-worker-b-task471.md`
|
|
||||||
|
|
||||||
你不是独自在代码库中工作;不要回滚、覆盖、格式化或清理其他人的改动。不要提交 git。
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 实跑或修复 `task471`,确认 local folder 多选资源删除行为:
|
|
||||||
- 两个资源行可通过 Ctrl/Meta 多选。
|
|
||||||
- Delete 后确认文案包含附件数量。
|
|
||||||
- 两个资源都通过 `/api/tree/commands` archive。
|
|
||||||
- 文件进入 `.mnote/trash`,原路径消失。
|
|
||||||
- DOM action 状态记录 `bulk-delete` / `archived` / 触发 row。
|
|
||||||
2. 如果 3000 / auth 环境不可用,记录为环境阻塞,不改业务语义。
|
|
||||||
3. 更新 `4-44` 的执行记录,不能把未实跑成功的浏览器项标为完成。
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 不修改 Rust 核心业务文件。
|
|
||||||
- 不把默认 delete 改为 purge。
|
|
||||||
- 不绕过 readonly / confirmation。
|
|
||||||
- 不移动 design 文件到 done。
|
|
||||||
|
|
||||||
## 验证
|
|
||||||
|
|
||||||
至少运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /mnt/Data1T/mnote
|
|
||||||
node --check scripts/task471-local-folder-bulk-resource-trash-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
如本机 3000 可用,再运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /mnt/Data1T/mnote
|
|
||||||
node scripts/task471-local-folder-bulk-resource-trash-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
- 修改文件列表
|
|
||||||
- 完成的 checklist 项
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项 / 风险
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
# Reasonix Batch A Worker C: Local Folder No-refresh / Restore Focus Gap
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
用户要求按 `1-8` 分阶段推进。当前执行 Batch A / P0:清 Trash no-refresh 和 restore focus 的验证红灯。
|
|
||||||
|
|
||||||
事实源:
|
|
||||||
|
|
||||||
- 阶段 checklist:`design/04-tree-domain/process/4-46-batch-a-filetree-action-trash-smoke-execution-checklist-v1.md`
|
|
||||||
- 上游:
|
|
||||||
- `design/04-tree-domain/process/4-34-filetree-trash-dual-browser-no-refresh-v1.md`
|
|
||||||
- `design/04-tree-domain/process/4-28-trash-restore-location-reveal-focus-v1.md`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你负责:
|
|
||||||
|
|
||||||
- `design/04-tree-domain/process/4-34-filetree-trash-dual-browser-no-refresh-v1.md`
|
|
||||||
- `design/04-tree-domain/process/4-28-trash-restore-location-reveal-focus-v1.md`
|
|
||||||
- 可新增一个聚焦 smoke,例如 `scripts/task472-local-folder-restore-focus-smoke.js` 或 `scripts/task472-local-folder-no-refresh-gap-smoke.js`
|
|
||||||
- 必要时只追加 `.codex/reasonix-tasks/results/batch-a-worker-c-local-folder-restore-no-refresh.md`
|
|
||||||
|
|
||||||
你不是独自在代码库中工作;不要回滚、覆盖、格式化或清理其他人的改动。不要提交 git。
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 盘点当前 local folder 非 md 资源 trash / restore / purge 的真实 UI 支持状态。
|
|
||||||
2. 盘点 restore 后 DOM reveal / focus 的现有证据缺口。
|
|
||||||
3. 如能新增小型 browser smoke,则新增脚本,优先只验证现有行为,不引入业务重构。
|
|
||||||
4. 如果能力尚未实现或环境不可用,更新 `4-34` / `4-28` 的待补记录,明确:
|
|
||||||
- 已有证据
|
|
||||||
- 缺口
|
|
||||||
- 下一步脚本或实现点
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 不直接修改 `rust/crates/mnote-web/src/**`,如发现必须改 Rust,只在报告里给建议。
|
|
||||||
- 不把 reload 型刷新写成 no-refresh 完成。
|
|
||||||
- 不移动 design 文件到 done。
|
|
||||||
|
|
||||||
## 验证
|
|
||||||
|
|
||||||
如果新增或修改脚本,至少运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /mnt/Data1T/mnote
|
|
||||||
node --check scripts/task472-local-folder-restore-focus-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
或对应新增脚本的 `node --check`。
|
|
||||||
|
|
||||||
如本机 3000 可用,可实跑并把结果写入 `tmp/task472-*/result.json`。
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
- 修改文件列表
|
|
||||||
- 完成的 checklist 项
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项 / 风险
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
# Reasonix Batch A2 Worker A:04-tree 已完成文档归档审查
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
审查 Batch A 当前 04-tree 文档,判断哪些已经有真实 smoke / 测试证据,可以从 `process/` 移到 `done/`。你只做文档状态与归档,不改 Rust / JS 业务代码。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `design/04-tree-domain/process/4-44-filetree-action-layer-paste-drop-delete-v1.md`
|
|
||||||
- `design/04-tree-domain/process/4-45-filetree-open-editors-lifecycle-link-checklist-v1.md`
|
|
||||||
- 如确认完成,可移动到 `design/04-tree-domain/done/`
|
|
||||||
- `.codex/reasonix-tasks/results/batch-a2-worker-a-doc-archive.md`
|
|
||||||
|
|
||||||
只读参考:
|
|
||||||
|
|
||||||
- `design/01-tree-first-graph-kernel/process/1-8-mvp-post-process-execution-order-v1.md`
|
|
||||||
- `design/04-tree-domain/process/4-46-batch-a-filetree-action-trash-smoke-execution-checklist-v1.md`
|
|
||||||
- `tmp/task430-vscode-explorer-stage7-smoke/result.json`
|
|
||||||
- `tmp/task471-local-folder-bulk-resource-trash-smoke/result.json`
|
|
||||||
- `tmp/reasonix-batch-a-browser-task430-2026-05-21/result.json`
|
|
||||||
- `tmp/reasonix-batch-a-browser-task471-2026-05-21/result.json`
|
|
||||||
|
|
||||||
## 要求
|
|
||||||
|
|
||||||
1. 核对 `4-44` / `4-45` 的 checklist 是否都已有可复核证据。
|
|
||||||
2. 对仍是已知缺口但不属于该文档完成条件的项,写入“后续边界”,不要把它们当成未完成 blocker。
|
|
||||||
3. 如果确认完成,移动到 `done/`,并把顶部状态改为 `done`。
|
|
||||||
4. 不移动 `4-28`、`4-34`、`4-46`。
|
|
||||||
5. 不提交 git,不回滚任何文件。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git diff --name-status
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终输出
|
|
||||||
|
|
||||||
写入 `.codex/reasonix-tasks/results/batch-a2-worker-a-doc-archive.md`,包含:
|
|
||||||
|
|
||||||
- 修改/移动的文件
|
|
||||||
- 归档依据
|
|
||||||
- 未归档文档及原因
|
|
||||||
- 风险或需要 Codex 复核的点
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
# Reasonix Batch A2 Worker B:local folder restore 后 FileTree focus/reveal
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
修复 `task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js` 记录的缺口:local folder 非 md 资源从 trash workbench restore 后,FileTree 恢复行应有 `data-selected="true"` 或 `data-active="true"` 或 `data-focused="true"`,且不触发页面 reload。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/gateway.rs`
|
|
||||||
- `scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js`
|
|
||||||
- `design/04-tree-domain/process/4-28-trash-restore-location-reveal-focus-v1.md`
|
|
||||||
- `design/04-tree-domain/process/4-46-batch-a-filetree-action-trash-smoke-execution-checklist-v1.md`
|
|
||||||
- `.codex/reasonix-tasks/results/batch-a2-worker-b-restore-focus.md`
|
|
||||||
|
|
||||||
禁止:
|
|
||||||
|
|
||||||
- 不改 delete 默认进入 trash 的语义。
|
|
||||||
- 不把 browser reload 当成 no-refresh。
|
|
||||||
- 不引入跨窗口 postMessage 或复杂新服务。
|
|
||||||
- 不提交 git。
|
|
||||||
|
|
||||||
## 推荐实现方向
|
|
||||||
|
|
||||||
短路径即可:
|
|
||||||
|
|
||||||
1. trash workbench local restore 成功后,把恢复对象的 filetree row-id 写入 `sessionStorage`。
|
|
||||||
- 对非 md local resource,row-id 是 `local:asset:${original_relative_path}`。
|
|
||||||
- 当前 row HTML 有 `data-trash-entry-id`,通常是 `local-file:${relative_path}`;可在 HTML 中新增 `data-filetree-row-id`,避免前端猜。
|
|
||||||
2. `refreshLocalFolderSidebarSnapshot()` 渲染后消费这个 pending row-id,选择/聚焦对应 filetree row。
|
|
||||||
3. 复用现有 `selectSidebarFileTreeRow(row, {})` 或新增小 helper,不要只改 DOM 属性导致 selection store 不一致。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web layout -- --test-threads=1
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web gateway -- --test-threads=1
|
|
||||||
node --check scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
如本机 3000 可用,运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终输出
|
|
||||||
|
|
||||||
写入 `.codex/reasonix-tasks/results/batch-a2-worker-b-restore-focus.md`,包含:
|
|
||||||
|
|
||||||
- 修改文件
|
|
||||||
- 实现策略
|
|
||||||
- 验证命令和结果
|
|
||||||
- 未完成项/风险
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
# Reasonix Batch A2 Worker C:task473 语义与 4-34/4-46 文档收口
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
配合 Batch A2 收口,审查 `task473` 当前 smoke 语义是否能在 restore focus 修复后作为正向回归测试,并更新 `4-34` / `4-46` 中 local folder no-refresh 与 restore focus 的执行记录。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js`
|
|
||||||
- `design/04-tree-domain/process/4-34-filetree-trash-dual-browser-no-refresh-v1.md`
|
|
||||||
- `design/04-tree-domain/process/4-46-batch-a-filetree-action-trash-smoke-execution-checklist-v1.md`
|
|
||||||
- `.codex/reasonix-tasks/results/batch-a2-worker-c-smoke-docs.md`
|
|
||||||
|
|
||||||
只读参考:
|
|
||||||
|
|
||||||
- `design/04-tree-domain/process/4-28-trash-restore-location-reveal-focus-v1.md`
|
|
||||||
- `tmp/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke/result.json`
|
|
||||||
- `tmp/task435-local-folder-watch-no-reload-smoke/result.json`
|
|
||||||
- `tmp/task437-local-folder-asset-trash-lifecycle-smoke/result.json`
|
|
||||||
- `tmp/task464-local-folder-resource-trash-ui-smoke/result.json`
|
|
||||||
|
|
||||||
## 要求
|
|
||||||
|
|
||||||
1. 不改 Rust。
|
|
||||||
2. 如果 `task473` 仍把“无 focus”当作 `ok:true` 的已知缺口,请改为:脚本整体仍允许记录诊断,但完成条件必须要求 `hasFocusEvidence === true`。
|
|
||||||
3. `4-34` 应写实:Convex 双浏览器矩阵已经有 `task432/433/434`;local folder 非 md create/rename/delete、resource trash lifecycle、trash UI、restore no-refresh/focus 分别由 task435/437/464/473 覆盖。仍未覆盖的项要明确保留。
|
|
||||||
4. `4-46` 应追加 Batch A2 执行记录占位,说明本轮目标是关闭 `task473` 的 focus gap。
|
|
||||||
5. 不提交 git,不回滚任何文件。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node --check scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js
|
|
||||||
git diff --name-status
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终输出
|
|
||||||
|
|
||||||
写入 `.codex/reasonix-tasks/results/batch-a2-worker-c-smoke-docs.md`,包含:
|
|
||||||
|
|
||||||
- 修改文件
|
|
||||||
- smoke 语义变化
|
|
||||||
- 文档状态变化
|
|
||||||
- 仍未覆盖项
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
# Reasonix Batch A3 Worker A:local folder empty-trash UI smoke
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
补齐 `4-34` 中 local folder empty-trash UI 证据:本地文件夹垃圾箱页面能分别清空页面垃圾箱和资源垃圾箱,且不触发非预期浏览器导航。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- 新增 `scripts/task474-local-folder-empty-trash-ui-smoke.js`
|
|
||||||
- `design/04-tree-domain/process/4-34-filetree-trash-dual-browser-no-refresh-v1.md`
|
|
||||||
- `.codex/reasonix-tasks/results/batch-a3-worker-a-empty-trash.md`
|
|
||||||
|
|
||||||
禁止:
|
|
||||||
|
|
||||||
- 不修改 Rust 源码。
|
|
||||||
- 不修改 `4-46` 或移动任何 design 文件。
|
|
||||||
- 不提交 git。
|
|
||||||
- 不把 reload 型刷新标为 no-refresh。
|
|
||||||
|
|
||||||
## 要求
|
|
||||||
|
|
||||||
1. 新增 browser smoke,参考 `task464` / `task473` 的登录、local root、trash workbench 写法。
|
|
||||||
2. 创建临时 local folder root:
|
|
||||||
- 至少一个 Markdown 页面进入本地垃圾箱。
|
|
||||||
- 至少一个非 md 资源进入本地垃圾箱。
|
|
||||||
3. 打开 `/trash?sourceKind=local_folder&rootUri=file://...`。
|
|
||||||
4. 点击“清空页面垃圾箱”,接受 confirm,断言页面类 trash row 消失、trash index 对应 entry 清理、trash 文件/目录不存在。
|
|
||||||
5. 点击“清空资源垃圾箱”,接受 confirm,断言资源类 trash row 消失、trash index 对应 entry 清理、trash 文件不存在。
|
|
||||||
6. 记录 main frame navigation delta,清空按钮操作不得触发非预期导航。
|
|
||||||
7. 结果写入 `tmp/task474-local-folder-empty-trash-ui-smoke/result.json`。
|
|
||||||
8. 更新 `4-34` 对 local folder empty-trash 覆盖状态,但不要移动文件。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node --check scripts/task474-local-folder-empty-trash-ui-smoke.js
|
|
||||||
PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task474-local-folder-empty-trash-ui-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
如果 3000 不是最新,可只做 `node --check` 并说明需要 Codex 用临时端口复跑。
|
|
||||||
|
|
||||||
## 最终输出
|
|
||||||
|
|
||||||
写入 `.codex/reasonix-tasks/results/batch-a3-worker-a-empty-trash.md`,包含:
|
|
||||||
|
|
||||||
- 修改文件
|
|
||||||
- smoke 覆盖内容
|
|
||||||
- 验证命令和结果
|
|
||||||
- 未完成项 / 风险
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
# Reasonix Batch A3 Worker B:local folder Markdown trash lifecycle smoke
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
补齐 `4-34` 中 local folder Markdown 自身 trash lifecycle 独立 smoke:Markdown 页面通过 `/api/tree/commands` 完成 archive / restore / purge,文件系统与 trash index 均一致。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- 新增 `scripts/task475-local-folder-markdown-trash-lifecycle-smoke.js`
|
|
||||||
- `design/04-tree-domain/process/4-34-filetree-trash-dual-browser-no-refresh-v1.md`
|
|
||||||
- `.codex/reasonix-tasks/results/batch-a3-worker-b-markdown-lifecycle.md`
|
|
||||||
|
|
||||||
禁止:
|
|
||||||
|
|
||||||
- 不修改 Rust 源码。
|
|
||||||
- 不修改 `4-46` 或移动任何 design 文件。
|
|
||||||
- 不提交 git。
|
|
||||||
- 不把非 md 资源生命周期代替 Markdown 页面生命周期。
|
|
||||||
|
|
||||||
## 要求
|
|
||||||
|
|
||||||
1. 新增 API smoke,可参考 `task437-local-folder-asset-trash-lifecycle-smoke.js`。
|
|
||||||
2. 构造临时 local folder root 和 `.mnote/workspace.json`。
|
|
||||||
3. 至少覆盖 loose Markdown 页面:
|
|
||||||
- `delete` 后 canonical command 应是页面或资源 lifecycle 中当前实现返回的真实值。
|
|
||||||
- 源 `.md` 消失,`.mnote/trash` 中出现对应文件,`trash-index.json` 记录 `local-md:*`。
|
|
||||||
- `restore` 后 `.md` 回原路径,trash 文件消失,index 清理。
|
|
||||||
- 再次 `delete` 后 `purge`,源路径与 trash 路径均不存在,index 清理。
|
|
||||||
4. 如 bundled Markdown 页面当前实现也容易覆盖,可加一个 bundled case;否则在结果中说明只覆盖 loose Markdown,bundled 由 Rust 单测覆盖或待后续。
|
|
||||||
5. 结果写入 `tmp/task475-local-folder-markdown-trash-lifecycle-smoke/result.json`。
|
|
||||||
6. 更新 `4-34` 对 local folder Markdown trash lifecycle 覆盖状态,但不要移动文件。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node --check scripts/task475-local-folder-markdown-trash-lifecycle-smoke.js
|
|
||||||
node scripts/task475-local-folder-markdown-trash-lifecycle-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终输出
|
|
||||||
|
|
||||||
写入 `.codex/reasonix-tasks/results/batch-a3-worker-b-markdown-lifecycle.md`,包含:
|
|
||||||
|
|
||||||
- 修改文件
|
|
||||||
- smoke 覆盖内容
|
|
||||||
- 验证命令和结果
|
|
||||||
- 未完成项 / 风险
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
# Reasonix Batch A3 Worker C:4-34 / 4-46 归档审查
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
审查 Batch A / P0 剩余文档是否能归档。你只做文档审查和状态更新,不写 smoke、不改 Rust、不提交 git。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `design/04-tree-domain/process/4-34-filetree-trash-dual-browser-no-refresh-v1.md`
|
|
||||||
- `design/04-tree-domain/process/4-46-batch-a-filetree-action-trash-smoke-execution-checklist-v1.md`
|
|
||||||
- 如确认完成,可移动到 `design/04-tree-domain/done/`
|
|
||||||
- `.codex/reasonix-tasks/results/batch-a3-worker-c-doc-archive.md`
|
|
||||||
|
|
||||||
只读参考:
|
|
||||||
|
|
||||||
- `design/04-tree-domain/process/4-47-batch-a3-local-folder-trash-final-smoke-checklist-v1.md`
|
|
||||||
- `tmp/task474-local-folder-empty-trash-ui-smoke/result.json`
|
|
||||||
- `tmp/task475-local-folder-markdown-trash-lifecycle-smoke/result.json`
|
|
||||||
- `tmp/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke/result.json`
|
|
||||||
- `.codex/reasonix-tasks/results/batch-a3-worker-a-empty-trash.md`
|
|
||||||
- `.codex/reasonix-tasks/results/batch-a3-worker-b-markdown-lifecycle.md`
|
|
||||||
|
|
||||||
## 要求
|
|
||||||
|
|
||||||
1. 如果 Worker A/B 结果文件或 smoke result 不存在,不要归档,写明 blocker。
|
|
||||||
2. 如果 `task474` 和 `task475` 都有可复核通过证据:
|
|
||||||
- 更新 `4-34` 覆盖矩阵和边界。
|
|
||||||
- 判断 `4-34` 是否满足归档条件。
|
|
||||||
- 判断 `4-46` 是否满足 Batch A P0 归档条件。
|
|
||||||
- 满足时移动到 `done/` 并把顶部状态改为 `done`。
|
|
||||||
3. 如果仍有真实缺口,保留在 `process/`,写明下一步。
|
|
||||||
4. 不把 Reasonix 文字总结当事实源,必须读 result.json。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git diff --name-status
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终输出
|
|
||||||
|
|
||||||
写入 `.codex/reasonix-tasks/results/batch-a3-worker-c-doc-archive.md`,包含:
|
|
||||||
|
|
||||||
- 修改/移动的文件
|
|
||||||
- 归档依据或 blocker
|
|
||||||
- 未完成项
|
|
||||||
- 需要 Codex 复核的点
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
# Batch B Worker A:Resource Open Resolver Convergence
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是单独在代码库里工作,可能有其他 worker 并行执行。不要回滚、覆盖或格式化与你任务无关的文件;不要提交 git。
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
推进 `design/05-editor-mainline/process/5-26-resource-open-resolver-convergence-checklist-v1.md`:
|
|
||||||
|
|
||||||
- 审查并尽量收敛正文附件与 FileTree asset 的资源打开分流。
|
|
||||||
- 重点看 `rust/crates/mnote-web/src/routes/web_shell.rs` 中:
|
|
||||||
- `resolveResourceOpen`
|
|
||||||
- 正文附件编辑 / 新窗口编辑相关函数
|
|
||||||
- FileTree asset open / edit-mode 相关路径
|
|
||||||
- 保持当前已验证行为:
|
|
||||||
- 正文附件“弹窗编辑”应在 main resource tab 打开。
|
|
||||||
- 正文附件“新窗口编辑”应在浏览器新窗口打开。
|
|
||||||
- `.md` / text / code 继续走 tiptap / text/code 路径,不要改成 OnlyOffice。
|
|
||||||
|
|
||||||
## 允许修改范围
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
||||||
- `design/05-editor-mainline/process/5-26-resource-open-resolver-convergence-checklist-v1.md`
|
|
||||||
- 如确有必要,可新增或修改 `scripts/task48*-resource-open-resolver-*.js`。
|
|
||||||
|
|
||||||
不要修改其他 Rust 核心文件;如发现需要修改,请在 final.md 中提出建议。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
至少运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test -p mnote-web sidebar_tree_runtime_opens_office_assets_through_resource_shell -- --test-threads=1
|
|
||||||
node --check scripts/task463-onlyoffice-resolver-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
如果新增 smoke,运行 `node --check`。
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
最终说明:
|
|
||||||
|
|
||||||
- 修改了哪些文件。
|
|
||||||
- 是否实际实现了 helper / resolver 收敛,还是只给出审查结论。
|
|
||||||
- 验证命令和结果。
|
|
||||||
- 保留的风险和未完成项。
|
|
||||||
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
# Batch B Worker B:BufferStore Save Refresh Visible Readback Gap
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是单独在代码库里工作,可能有其他 worker 并行执行。不要回滚、覆盖或格式化与你任务无关的文件;不要提交 git。
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
推进 `design/01-tree-first-graph-kernel/process/1-6-next-phase-gap-closure-checklist-v1.md` 的 Gap A2:
|
|
||||||
|
|
||||||
> 保存后磁盘 `.md` 与 PageAggregate 已更新,但刷新后编辑器 DOM/截图未显示正文。
|
|
||||||
|
|
||||||
请复现、定位并尽量最小修复。优先让刷新后的主编辑器可见 DOM 消费最新 Page Aggregate / blockDocument。
|
|
||||||
|
|
||||||
## 允许修改范围
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- `design/01-tree-first-graph-kernel/process/1-6-next-phase-gap-closure-checklist-v1.md`
|
|
||||||
- 如确有必要,可新增或修改 `scripts/task48*-bufferstore-*.js`。
|
|
||||||
|
|
||||||
不要修改 OnlyOffice、Convex schema、AI 工具链;如发现需要跨域修改,请先在 final.md 中说明。
|
|
||||||
|
|
||||||
## 建议排查入口
|
|
||||||
|
|
||||||
- `#__MNOTE_PAGE_AGGREGATE__`
|
|
||||||
- `data-page-aggregate-snapshot`
|
|
||||||
- `mnote-leptos-tiptap-editor-root`
|
|
||||||
- `blockDocument`
|
|
||||||
- `refreshPageAggregate`
|
|
||||||
- `initializePageUiSurfaces`
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
至少运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test -p mnote-web document_buffer -- --test-threads=1
|
|
||||||
cargo test -p mnote-web page_aggregate -- --test-threads=1
|
|
||||||
```
|
|
||||||
|
|
||||||
如新增 smoke,运行 `node --check`;能实跑则实跑并记录结果。
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
最终说明:
|
|
||||||
|
|
||||||
- 复现路径和根因判断。
|
|
||||||
- 修改文件。
|
|
||||||
- 验证命令和结果。
|
|
||||||
- 如果没有安全修复,明确 `FAIL/BLOCKED` 和下一步最小修复点。
|
|
||||||
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
# Batch B Worker C:A0/A2/B2/C1 Baseline Smoke Evidence
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你是 smoke 执行 worker,不是业务代码修改员。不要修改源码、不要提交 git、不要回滚文件。
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
为 `design/01-tree-first-graph-kernel/process/1-6-next-phase-gap-closure-checklist-v1.md` 补齐 browser smoke 证据。
|
|
||||||
|
|
||||||
## 允许修改范围
|
|
||||||
|
|
||||||
- `.codex/reasonix-tasks/results/batch-b-worker-c-baseline-smokes.md`
|
|
||||||
- `design/01-tree-first-graph-kernel/process/1-6-next-phase-gap-closure-checklist-v1.md` 仅追加执行记录,不要把失败项打勾。
|
|
||||||
|
|
||||||
## 需要运行或尝试运行的 smoke
|
|
||||||
|
|
||||||
```bash
|
|
||||||
PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task451-local-markdown-conflict-resolution-ui-smoke.js
|
|
||||||
PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task452-local-search-index-browser-smoke.js
|
|
||||||
PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task453-local-folder-page-ai-changed-files-smoke.js
|
|
||||||
PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task443-filetree-mindmap-click-active-row-smoke.js
|
|
||||||
PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task445-filetree-mindmap-switch-no-flicker-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
如果脚本不存在或依赖环境不可用,记录为 `BLOCKED`,不要改业务代码。
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
在结果报告中列出每个 smoke:
|
|
||||||
|
|
||||||
- `PASS` / `FAIL` / `BLOCKED`
|
|
||||||
- 命令
|
|
||||||
- stdout 摘要
|
|
||||||
- `tmp/.../result.json` 或日志路径
|
|
||||||
- 失败归因:环境 / 脚本过时 / 业务回归 / 不确定
|
|
||||||
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
# Batch B Worker D:Page Aggregate / GFM AST Tail Audit
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你是审查与文档收口 worker。默认不修改核心代码,不提交 git,不移动设计文档到 done。
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
审查并梳理以下两个 process 文档的尾项:
|
|
||||||
|
|
||||||
- `design/05-editor-mainline/process/5-6-page-aggregate-alignment-checklist-v1.md`
|
|
||||||
- `design/03-rust-web/process/3-13-rust-web-local-markdown-gfm-ast-parser-migration-v1.md`
|
|
||||||
|
|
||||||
重点判断:
|
|
||||||
|
|
||||||
1. 哪些未勾选项已经被后续实现覆盖,可以追认或追加证据。
|
|
||||||
2. 哪些仍需代码修复。
|
|
||||||
3. 哪些其实是 reference / future,不应继续干扰当前 P1 执行。
|
|
||||||
4. 下一步最小执行包应该如何拆。
|
|
||||||
|
|
||||||
## 允许修改范围
|
|
||||||
|
|
||||||
- `design/05-editor-mainline/process/5-6-page-aggregate-alignment-checklist-v1.md`
|
|
||||||
- `design/03-rust-web/process/3-13-rust-web-local-markdown-gfm-ast-parser-migration-v1.md`
|
|
||||||
- `.codex/reasonix-tasks/results/batch-b-worker-d-pageaggregate-gfm-tail.md`
|
|
||||||
|
|
||||||
不要修改 Rust / JS 业务代码。如发现必须改代码,请只写建议。
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
结果报告必须包含表格:
|
|
||||||
|
|
||||||
- `已完成可追认`
|
|
||||||
- `仍需代码修复`
|
|
||||||
- `仅参考保留 / future`
|
|
||||||
- `建议拆出的下一个 checklist`
|
|
||||||
|
|
||||||
如果修改文档,只能追加审查记录或纠正状态说明,不要把未验证项直接打勾。
|
|
||||||
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
# Batch B2 Worker E:Mindmap ResourceTab Smoke Update
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是单独在代码库里工作,可能有其他 worker 并行执行。不要回滚、覆盖或格式化与你任务无关的文件;不要提交 git。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
Batch B Worker C 运行:
|
|
||||||
|
|
||||||
- `scripts/task443-filetree-mindmap-click-active-row-smoke.js`
|
|
||||||
- `scripts/task445-filetree-mindmap-switch-no-flicker-smoke.js`
|
|
||||||
|
|
||||||
两个 smoke 均失败于历史 URL 断言:脚本等待 `/mindmap/${docId}/${mindmapId}`,但当前真实行为已经改为 `/documents/${docId}?workspaceId=...&resourceTab=resource%3Amindmap%3A...`。
|
|
||||||
|
|
||||||
这是 smoke 过时,不是直接证明功能失败。
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
更新 `task443` / `task445`,让它们验证当前 ResourceTab 路由:
|
|
||||||
|
|
||||||
- 点击 file tree 中的 mindmap asset 后,URL 应保持在 `/documents/${docId}`。
|
|
||||||
- URL search params 中必须有 `resourceTab`。
|
|
||||||
- `decodeURIComponent(resourceTab)` 后应包含 `resource:mindmap:${docId}:${mindmapId}`。
|
|
||||||
- asset row 应保持 `data-selected="true"`。
|
|
||||||
- 不应闪回父页面 row 选中。
|
|
||||||
|
|
||||||
## 允许修改范围
|
|
||||||
|
|
||||||
- `scripts/task443-filetree-mindmap-click-active-row-smoke.js`
|
|
||||||
- `scripts/task445-filetree-mindmap-switch-no-flicker-smoke.js`
|
|
||||||
- 可新增 `.codex/reasonix-tasks/results/batch-b2-worker-e-mindmap-smoke-resource-tab.md`
|
|
||||||
|
|
||||||
不要修改 Rust 业务代码、设计文档或其他 smoke。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
至少运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node --check scripts/task443-filetree-mindmap-click-active-row-smoke.js
|
|
||||||
node --check scripts/task445-filetree-mindmap-switch-no-flicker-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
如果本地 `http://127.0.0.1:3000` 可用,请实跑:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task443-filetree-mindmap-click-active-row-smoke.js
|
|
||||||
PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task445-filetree-mindmap-switch-no-flicker-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
最终说明:
|
|
||||||
|
|
||||||
- 修改了哪些文件。
|
|
||||||
- 是否实跑 smoke;PASS/FAIL 结果和 `tmp/.../result.json` 路径。
|
|
||||||
- 如果 `task445` 仍有 400,请说明请求线索,不要掩盖。
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
# Batch B2 Worker F:Local Search Index Page Settings Panel
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是单独在代码库里工作,可能有其他 worker 并行执行。不要回滚、覆盖或格式化与你任务无关的文件;不要提交 git。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
Batch B Worker C 运行 `scripts/task452-local-search-index-browser-smoke.js`:
|
|
||||||
|
|
||||||
- `/api/search/documents` 返回 200,结果包含 `LOCAL-SEARCH-*` token。
|
|
||||||
- 失败点在 page-settings 索引页签:`wolai-page-settings-local-index-backlinks` / `wolai-page-settings-local-index-tags` 30 秒内没有渲染出 `"Search Smoke"` 和 `"#alpha"`。
|
|
||||||
- 结果文件:`tmp/task452-local-search-index-browser-smoke/result.json`。
|
|
||||||
|
|
||||||
初步入口:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- `pageSettingsLocalIndexScopeKey`
|
|
||||||
- `pageSettingsLocalIndexIsAvailable`
|
|
||||||
- `renderPageSettingsLocalIndex`
|
|
||||||
- `loadPageSettingsLocalIndex`
|
|
||||||
- `setActivePageSettingsTab`
|
|
||||||
- Rust API 单测在 `rust/crates/mnote-web/src/routes/search.rs` 已覆盖 `/api/search/local-index/backlinks` 和 `/api/search/local-index/tags` 授权读取。
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
系统化排查并最小修复 `task452`:
|
|
||||||
|
|
||||||
1. 先复现或读取 `tmp/task452.../result.json`,确认不是搜索 API 问题。
|
|
||||||
2. 明确 root cause:例如 `currentRootUri()`、`currentDocumentId()`、`resolveWorkspaceId(document.body)`、tab 激活、fetch 失败、payload shape、或 UI render 条件。
|
|
||||||
3. 用最小补丁修复 page-settings 本地索引 panel 的渲染。
|
|
||||||
4. 保持 local-first 口径:本地索引 panel 只在 `sourceKind=local_folder` + `rootUri` + 当前文档可识别时工作。
|
|
||||||
|
|
||||||
## 允许修改范围
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- `scripts/task452-local-search-index-browser-smoke.js`(仅允许增加诊断或同步当前真实 UI 语义;不要弱化核心断言)
|
|
||||||
- 可新增 `.codex/reasonix-tasks/results/batch-b2-worker-f-local-index-panel.md`
|
|
||||||
|
|
||||||
不要修改搜索后端、Convex、OnlyOffice、AI 工具链。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
至少运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node --check scripts/task452-local-search-index-browser-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
如果本地 `http://127.0.0.1:3000` 可用,请实跑:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task452-local-search-index-browser-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
如改动 `layout.rs` 影响 Rust 编译,请运行相关 targeted test 或至少:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test -p mnote-web search_local_index_backlinks_and_tags_read_authorized_root -- --test-threads=1
|
|
||||||
```
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
最终说明:
|
|
||||||
|
|
||||||
- 根因判断,必须指向具体函数或数据流。
|
|
||||||
- 修改了哪些文件。
|
|
||||||
- 验证命令和结果。
|
|
||||||
- `task452` 仍失败时,说明新的失败点,不要把失败写成完成。
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
# Batch C Worker A:Resource Open Resolver 最小收敛
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是单独在代码库里工作,可能有其他 worker 并行执行。不要回滚、覆盖或格式化与你任务无关的文件;不要提交 git。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
Batch B 中 `design/05-editor-mainline/process/5-26-resource-open-resolver-convergence-checklist-v1.md` 仍未完成。当前重复判断主要涉及:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- `buildLocalOnlyOfficeOpenUrl`
|
|
||||||
- `openEditorAttachmentEditTab`
|
|
||||||
- `openEditorAttachmentNewWindow`
|
|
||||||
- `openConvexAssetFromFileTree`
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
||||||
- `resolveResourceOpen`
|
|
||||||
|
|
||||||
本次优先只改 `layout.rs` 和 `scripts/task463-onlyoffice-resolver-smoke.js`,不要大重构。
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
1. 审查正文附件和 FileTree asset 打开 office/resource 时的重复判断。
|
|
||||||
2. 如果安全,抽出最小 helper,使正文附件“弹窗编辑”与 FileTree active tab 打开共用同一套 local Office URL 构造或打开目标判断。
|
|
||||||
3. 保持现有行为:
|
|
||||||
- 正文附件“弹窗编辑”进入主编辑器 resource tab。
|
|
||||||
- 正文附件“新窗口编辑”进入浏览器新窗口。
|
|
||||||
- md/text/code 继续走 tiptap/text/code 渲染路径,不改成 OnlyOffice 或新窗口默认打开。
|
|
||||||
4. 更新 `5-26` checklist 的执行记录;通过后可勾选已完成项。
|
|
||||||
|
|
||||||
## 允许修改范围
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- `scripts/task463-onlyoffice-resolver-smoke.js`
|
|
||||||
- `design/05-editor-mainline/process/5-26-resource-open-resolver-convergence-checklist-v1.md`
|
|
||||||
- 可新增 `.codex/reasonix-tasks/results/batch-c-worker-a-resource-open-resolver.md`
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
|
|
||||||
- OnlyOffice callback / 保存链路
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`,除非只改测试断言注释且非常必要
|
|
||||||
- 其它 worker ownership 文件
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web sidebar_tree_runtime_opens_office_assets_through_resource_shell -- --test-threads=1
|
|
||||||
node --check scripts/task463-onlyoffice-resolver-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
如果 `http://127.0.0.1:3000` 可用,再运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node scripts/task463-onlyoffice-resolver-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
最终写入 `.codex/reasonix-tasks/results/batch-c-worker-a-resource-open-resolver.md`,包含:
|
|
||||||
|
|
||||||
- 修改文件列表。
|
|
||||||
- 实际收敛了哪些重复判断。
|
|
||||||
- 验证命令和结果。
|
|
||||||
- 未完成项和风险。
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
# Batch C Worker B:GFM AST 尾项小包
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是单独在代码库里工作,可能有其他 worker 并行执行。不要回滚、覆盖或格式化与你任务无关的文件;不要提交 git。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
`design/03-rust-web/process/3-13-rust-web-local-markdown-gfm-ast-parser-migration-v1.md` 仍有尾项:
|
|
||||||
|
|
||||||
- 空段落 / 空表格单元格 / 空引用块处理规则未固定。
|
|
||||||
- legacy block -> Tiptap -> legacy marks 缺测试。
|
|
||||||
- 保存失败前端状态保留缺测试。
|
|
||||||
- 写侧手写 Markdown 函数未标记为过渡实现。
|
|
||||||
- `web_shell.rs` legacy JS 适配分支仍无过渡说明。
|
|
||||||
|
|
||||||
本次只做低风险小包,不修复 frontmatter title 优先级。
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
1. 补一个或多个 Rust 单测,固定空表格单元格 / 空引用块等当前行为。
|
|
||||||
2. 补 web_shell 相关测试或断言,证明 legacy->Tiptap inline marks 转换至少不会丢核心 marks。
|
|
||||||
3. 给写侧手写 Markdown 回写函数和 web_shell legacy 适配分支加简短中文过渡注释。
|
|
||||||
4. 更新 `3-13` 执行记录和 checklist 状态。
|
|
||||||
|
|
||||||
## 允许修改范围
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/local_folder_source.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
||||||
- `design/03-rust-web/process/3-13-rust-web-local-markdown-gfm-ast-parser-migration-v1.md`
|
|
||||||
- 可新增 `.codex/reasonix-tasks/results/batch-c-worker-b-gfm-tail.md`
|
|
||||||
|
|
||||||
禁止事项:
|
|
||||||
|
|
||||||
- 不修改 frontmatter title > H1 > 文件名行为。
|
|
||||||
- 不删除 legacy 适配函数。
|
|
||||||
- 不改 Page Aggregate 读取主链。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web local_markdown -- --test-threads=1
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web web_shell -- --test-threads=1
|
|
||||||
```
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
最终写入 `.codex/reasonix-tasks/results/batch-c-worker-b-gfm-tail.md`,包含:
|
|
||||||
|
|
||||||
- 修改文件列表。
|
|
||||||
- 关闭/追认了哪些 `3-13` 尾项。
|
|
||||||
- 验证命令和结果。
|
|
||||||
- 未完成项和风险。
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
# Batch C Worker C:Convex Export 产品化补 Smoke
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是单独在代码库里工作,可能有其他 worker 并行执行。不要回滚、覆盖或格式化与你任务无关的文件;不要提交 git。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
`design/01-tree-first-graph-kernel/process/1-6-next-phase-gap-closure-checklist-v1.md` 的 Gap C1 已确认 export 脚本支持:
|
|
||||||
|
|
||||||
- `--dry-run`
|
|
||||||
- `--manifest`
|
|
||||||
- `--conflict-report`
|
|
||||||
- `--rollback`
|
|
||||||
|
|
||||||
但仍缺独立 smoke 验证:
|
|
||||||
|
|
||||||
- dry run 不写文件
|
|
||||||
- 同名冲突不覆盖
|
|
||||||
- rollback 恢复导出前状态
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
1. 新增或扩展 smoke,覆盖 dry-run / conflict / rollback 三个行为。
|
|
||||||
2. 优先复用 `scripts/task444-convex-workspace-export-local-fixture-smoke.js` 和 `scripts/export-convex-workspace-to-local.js`。
|
|
||||||
3. smoke 必须可离线运行,不依赖真实 Convex 服务。
|
|
||||||
4. 更新 `1-6` Gap C1 与本轮 Batch C checklist。
|
|
||||||
|
|
||||||
## 允许修改范围
|
|
||||||
|
|
||||||
- `scripts/task444-convex-workspace-export-local-fixture-smoke.js`
|
|
||||||
- 可新增 `scripts/task48*-convex-export-*.js`
|
|
||||||
- `design/01-tree-first-graph-kernel/process/1-6-next-phase-gap-closure-checklist-v1.md`
|
|
||||||
- `design/01-tree-first-graph-kernel/process/1-10-batch-c-p1-resource-buffer-gfm-convex-checklist-v1.md`
|
|
||||||
- 可新增 `.codex/reasonix-tasks/results/batch-c-worker-c-convex-export-smokes.md`
|
|
||||||
|
|
||||||
禁止事项:
|
|
||||||
|
|
||||||
- 不修改 Convex runtime / schema。
|
|
||||||
- 不改变 local-first 架构口径。
|
|
||||||
- 不让 smoke 写入仓库内非 tmp 目录。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node --check scripts/task444-convex-workspace-export-local-fixture-smoke.js
|
|
||||||
node scripts/task444-convex-workspace-export-local-fixture-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
如果新增 smoke:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node --check scripts/<new-smoke>.js
|
|
||||||
node scripts/<new-smoke>.js
|
|
||||||
```
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
最终写入 `.codex/reasonix-tasks/results/batch-c-worker-c-convex-export-smokes.md`,包含:
|
|
||||||
|
|
||||||
- 修改文件列表。
|
|
||||||
- dry-run / conflict / rollback 的验证方式。
|
|
||||||
- 验证命令和结果。
|
|
||||||
- 未完成项和风险。
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
# Reasonix Batch D Worker A:资源打开 resolver 小收敛
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
P1 阶段仍有 `5-26 Resource Open Resolver Convergence Checklist` 未完成。当前重点不是重写 resolver,而是最小化收敛 `layout.rs` 中正文附件与 FileTree local Office 打开的重复分支。
|
|
||||||
|
|
||||||
事实源:
|
|
||||||
|
|
||||||
- `design/01-tree-first-graph-kernel/process/1-8-mvp-post-process-execution-order-v1.md`
|
|
||||||
- `design/01-tree-first-graph-kernel/process/1-11-batch-d-p1-small-tail-execution-checklist-v1.md`
|
|
||||||
- `design/05-editor-mainline/process/5-26-resource-open-resolver-convergence-checklist-v1.md`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你可以修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- `scripts/task463-onlyoffice-resolver-smoke.js`
|
|
||||||
- `design/05-editor-mainline/process/5-26-resource-open-resolver-convergence-checklist-v1.md`
|
|
||||||
|
|
||||||
不要修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/onlyoffice.rs`
|
|
||||||
- ACP / Hermes 相关文件
|
|
||||||
- Markdown parser / local_folder_source
|
|
||||||
|
|
||||||
你不是独自在代码库中工作。不要回滚、覆盖、格式化或清理其他 worker 的改动。不要提交 git。
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 审查这些函数的重复判断:
|
|
||||||
- `buildLocalOnlyOfficeOpenUrl`
|
|
||||||
- `openConvexAssetFromFileTree`
|
|
||||||
- `openEditorAttachmentDetail`
|
|
||||||
- `openEditorAttachmentNewWindow`
|
|
||||||
- `openEditorAttachmentEditTab`
|
|
||||||
2. 如果可以安全实现,提炼一个最小 helper,例如 `openLocalOfficeFileInActiveTab(detail, mode)` 或等价命名,用于正文附件 `弹窗编辑` 和 FileTree edit-mode active tab 的 local Office 打开。
|
|
||||||
3. 保持当前已验证行为:
|
|
||||||
- 正文附件 `弹窗编辑` 进入 main resource tab,不弹新浏览器窗口。
|
|
||||||
- 正文附件 `新窗口编辑` 进入浏览器新窗口。
|
|
||||||
- FileTree edit-mode active tab 继续可用。
|
|
||||||
- `md/text/code` 继续走 tiptap / 内建编辑器,不改成 OnlyOffice。
|
|
||||||
4. 更新 `5-26` 执行记录。只有真实代码和验证完成的项才打勾。
|
|
||||||
5. 如现有 `task463` 不能覆盖分流,请补最小断言。
|
|
||||||
|
|
||||||
## 验证
|
|
||||||
|
|
||||||
至少运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /mnt/Data1T/mnote/rust
|
|
||||||
cargo test -p mnote-web sidebar_tree_runtime_opens_office_assets_through_resource_shell -- --test-threads=1
|
|
||||||
```
|
|
||||||
|
|
||||||
以及:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /mnt/Data1T/mnote
|
|
||||||
node scripts/task463-onlyoffice-resolver-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
- 修改文件列表
|
|
||||||
- 收敛了哪些重复分支
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项/风险
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
# Reasonix Batch D Worker B:本地 Markdown 标题优先级收口
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
P1 阶段 `3-13 Rust Web 本地 Markdown GFM AST 解析器迁移方案` 仍有标题优先级尾项未完成。当前 `parse_markdown_page` 固定使用文件名 stem 作为标题,需要收口到:
|
|
||||||
|
|
||||||
`frontmatter title > 第一条 H1 > 文件名`
|
|
||||||
|
|
||||||
事实源:
|
|
||||||
|
|
||||||
- `design/01-tree-first-graph-kernel/process/1-8-mvp-post-process-execution-order-v1.md`
|
|
||||||
- `design/01-tree-first-graph-kernel/process/1-11-batch-d-p1-small-tail-execution-checklist-v1.md`
|
|
||||||
- `design/03-rust-web/process/3-13-rust-web-local-markdown-gfm-ast-parser-migration-v1.md`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你可以修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/local_markdown_parser.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/local_folder_source.rs`
|
|
||||||
- `design/03-rust-web/process/3-13-rust-web-local-markdown-gfm-ast-parser-migration-v1.md`
|
|
||||||
|
|
||||||
不要修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
||||||
- resource trash / open resolver / OnlyOffice / ACP / Hermes 相关文件
|
|
||||||
|
|
||||||
你不是独自在代码库中工作。不要回滚、覆盖、格式化或清理其他 worker 的改动。不要提交 git。
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 修改 `parse_markdown_page` 标题解析规则:
|
|
||||||
- frontmatter 中 `title: ...` 非空时优先使用。
|
|
||||||
- frontmatter 无 title 时,使用正文中的第一条 H1。
|
|
||||||
- 仍无标题时,回退 `file_stem_title(file_name)`。
|
|
||||||
2. 解析 frontmatter title 时保持简单、可测:
|
|
||||||
- 支持普通 `title: value`。
|
|
||||||
- 支持简单引号包裹值。
|
|
||||||
- 不需要引入新的 YAML 依赖,除非仓库已有稳定依赖可直接复用。
|
|
||||||
3. 保持 `mnote_id`、document_id、path-id 规则不变。
|
|
||||||
4. 更新现有测试 `local_markdown_page_title_comes_from_file_name_not_body_heading`,不要再断言“有 H1 也只取文件名”。
|
|
||||||
5. 补最小测试覆盖 frontmatter / H1 / filename 三层优先级。
|
|
||||||
6. 更新 `3-13` 执行记录,只标记本轮真实完成的标题优先级项。
|
|
||||||
|
|
||||||
## 验证
|
|
||||||
|
|
||||||
至少运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /mnt/Data1T/mnote/rust
|
|
||||||
cargo test -p mnote-web local_markdown -- --test-threads=1
|
|
||||||
```
|
|
||||||
|
|
||||||
如果你新增了更精确测试名,也请单独运行对应测试。
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
- 修改文件列表
|
|
||||||
- 标题优先级实现方式
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项/风险
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
# Reasonix Worker A:GFM AST 保存失败与降级策略尾项
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是唯一 worker。不要回滚、覆盖或整理他人改动;只处理本任务 ownership 范围。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
上位 checklist:`design/01-tree-first-graph-kernel/process/1-12-batch-e-p1-p2-tail-execution-checklist-v1.md`
|
|
||||||
|
|
||||||
当前 `design/03-rust-web/process/3-13-rust-web-local-markdown-gfm-ast-parser-migration-v1.md` 仍保留几个尾项:
|
|
||||||
|
|
||||||
- 保存失败时保留编辑器状态并给出可解释错误。
|
|
||||||
- 表格带 mark 单元格 / 不支持结构的降级策略测试仍不足。
|
|
||||||
- `web_shell.rs` 中 `legacyStylesToTiptapMarks` 等临时适配分支是否可移除尚未判定。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `design/03-rust-web/process/3-13-rust-web-local-markdown-gfm-ast-parser-migration-v1.md`
|
|
||||||
- `rust/crates/mnote-web/src/routes/local_folder_source.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/local_markdown_parser.rs`
|
|
||||||
- 可新增或修改一个 `scripts/task48*-local-markdown-save-error-*.js`
|
|
||||||
|
|
||||||
只读审查,不允许修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
|
|
||||||
- AI / Hermes / OnlyOffice 文件
|
|
||||||
- FileTree action / trash 代码
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`(只读审查即可,避免与 Worker B 冲突)
|
|
||||||
- git commit、git reset、git checkout
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 先审查代码,确认保存失败状态保留是否已有行为和测试。
|
|
||||||
2. 尽量补一个最小单测或 smoke,覆盖保存失败时编辑器仍保留当前内容,并能显示可解释错误。
|
|
||||||
3. 补表格带 mark 单元格或不支持结构降级策略的最小测试;如果已有测试足够,更新文档证据。
|
|
||||||
4. 只读审查 `web_shell.rs` 临时 legacy marks 分支;不能安全移除就把 `3-13` 的“必须移除”改为“保留兼容层 + 明确退出条件”。不要修改 `web_shell.rs`。
|
|
||||||
5. 更新 `3-13` 的本轮执行记录,不把未验证项标完成。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
- `cargo test -p mnote-web local_markdown -- --test-threads=1`
|
|
||||||
- `cargo test -p mnote-web web_shell -- --test-threads=1`
|
|
||||||
- 如新增 smoke:`node --check scripts/task48*-local-markdown-save-error-*.js`,并尽量实跑。
|
|
||||||
|
|
||||||
## 最终回复
|
|
||||||
|
|
||||||
请列出:
|
|
||||||
|
|
||||||
- 修改文件
|
|
||||||
- 运行的命令和结果
|
|
||||||
- 未完成项
|
|
||||||
- 风险或需要 Codex 再判断的点
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
# Reasonix Worker B:BufferStore conflict UI 数据源
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是唯一 worker。不要回滚、覆盖或整理他人改动;只处理本任务 ownership 范围。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
上位 checklist:`design/01-tree-first-graph-kernel/process/1-12-batch-e-p1-p2-tail-execution-checklist-v1.md`
|
|
||||||
|
|
||||||
`1-6` Gap A2 中 BufferStore 基础设施和保存后刷新读回已完成,但 conflict UI 数据源尚未接入 buffer state。当前 conflict UI 已存在,`task451-local-markdown-conflict-resolution-ui-smoke.js` 能验证 accept disk / keep current / merge,但文档仍指出它主要靠 session/local state。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `design/01-tree-first-graph-kernel/process/1-6-next-phase-gap-closure-checklist-v1.md`
|
|
||||||
- `rust/crates/mnote-web/src/document_buffer_store.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/documents.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
||||||
- `scripts/task451-local-markdown-conflict-resolution-ui-smoke.js`
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
|
|
||||||
- GFM parser 代码
|
|
||||||
- FileTree action / command context 代码
|
|
||||||
- AI / Hermes / OnlyOffice 文件
|
|
||||||
- git commit、git reset、git checkout
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 审查 `BufferStore` 当前 API 与 conflict UI 事件链。
|
|
||||||
2. 为当前打开文档暴露最小 buffer state 查询能力,或把已有 Page Aggregate / session conflict envelope 明确桥接到 BufferStore 状态。
|
|
||||||
3. conflict UI 应可验证 editor base version、disk/current version、source actor 或等价字段来自 buffer state / conflict envelope,不是临时纯前端猜测。
|
|
||||||
4. 保持 `task451` 三条交互不回退;必要时扩展该 smoke 读取新的 DOM/data 属性。
|
|
||||||
5. 更新 `1-6` Gap A2 记录,不把未覆盖项标完成。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
- `cargo test -p mnote-web document_buffer -- --test-threads=1`
|
|
||||||
- `cargo test -p mnote-web local_folder -- --test-threads=1`
|
|
||||||
- `PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task451-local-markdown-conflict-resolution-ui-smoke.js`
|
|
||||||
|
|
||||||
## 最终回复
|
|
||||||
|
|
||||||
请列出:
|
|
||||||
|
|
||||||
- 修改文件
|
|
||||||
- 运行的命令和结果
|
|
||||||
- 未完成项
|
|
||||||
- 风险或需要 Codex 再判断的点
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
# Reasonix Worker C:CommandContext FileTree 菜单 / 快捷键最小接入
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是唯一 worker。不要回滚、覆盖或整理他人改动;只处理本任务 ownership 范围。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
上位 checklist:`design/01-tree-first-graph-kernel/process/1-12-batch-e-p1-p2-tail-execution-checklist-v1.md`
|
|
||||||
|
|
||||||
`core-protocol` 已有 `CommandContext` / `when` evaluator / `is_command_enabled`,但 `1-6` Gap A7 仍显示 FileTree 右键菜单、快捷键、AI 写入能力未消费统一 enablement。本轮只做 FileTree 菜单和 Delete/Backspace 快捷键最小接入。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `design/01-tree-first-graph-kernel/process/1-6-next-phase-gap-closure-checklist-v1.md`
|
|
||||||
- `rust/crates/core-protocol/src/command.rs`
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- `scripts/task476-filetree-editor-context-menu-download-smoke.js`
|
|
||||||
- `scripts/task471-local-folder-bulk-resource-trash-smoke.js`
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
|
|
||||||
- GFM parser / web_shell conflict UI
|
|
||||||
- AI / Hermes / OnlyOffice 文件
|
|
||||||
- git commit、git reset、git checkout
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 审查 `core-protocol` 的 CommandContext 测试口径。
|
|
||||||
2. 在 SSR sidebar JS 中引入最小 `CommandContext` 等价 enablement helper,先覆盖 FileTree 右键菜单和 Delete/Backspace 快捷键。
|
|
||||||
3. readonly / sourceKind / selectionCount / resourceKind 的禁用语义应与 Rust `CommandContext` 现有测试一致;本轮不要求把 Rust evaluator 直接编译到 JS。
|
|
||||||
4. 保持下载、多选删除、粘贴、只读阻断 smoke 不回退。
|
|
||||||
5. 更新 `1-6` Gap A7 记录,不把 AI 写入能力标完成。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
- `cargo test -p mnote-web sidebar_filetree -- --test-threads=1`
|
|
||||||
- `cargo test -p core-protocol command_context -- --test-threads=1`
|
|
||||||
- `node scripts/task471-local-folder-bulk-resource-trash-smoke.js`
|
|
||||||
- `node scripts/task476-filetree-editor-context-menu-download-smoke.js`
|
|
||||||
|
|
||||||
## 最终回复
|
|
||||||
|
|
||||||
请列出:
|
|
||||||
|
|
||||||
- 修改文件
|
|
||||||
- 运行的命令和结果
|
|
||||||
- 未完成项
|
|
||||||
- 风险或需要 Codex 再判断的点
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
# Reasonix Worker A:GFM AST 降级策略与 process 收口
|
|
||||||
|
|
||||||
Project root:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是唯一 worker。不要回滚、覆盖或清理他人的改动;只修改本任务 ownership 范围内的文件。不要提交 git。
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
收口 `design/03-rust-web/process/3-13-rust-web-local-markdown-gfm-ast-parser-migration-v1.md` 的真实尾项:
|
|
||||||
|
|
||||||
1. 表格/不支持结构降级策略是否已有测试证据。
|
|
||||||
2. `web_shell.rs` 中 `legacyStylesToTiptapMarks` 等 legacy marks 适配分支是否仍被当前 bootstrap 使用。
|
|
||||||
3. 如果剩余项已可解释且测试通过,把 `3-13` 移动到 `design/03-rust-web/done/`;否则只更新未完成项和证据,不要强行归档。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `design/03-rust-web/process/3-13-rust-web-local-markdown-gfm-ast-parser-migration-v1.md`
|
|
||||||
- `design/03-rust-web/done/3-13-rust-web-local-markdown-gfm-ast-parser-migration-v1.md`(仅当归档)
|
|
||||||
- `rust/crates/mnote-web/src/routes/local_folder_source.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/local_markdown_parser.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
|
|
||||||
- AI / Hermes 工具文件
|
|
||||||
- tree realtime / websocket 文件
|
|
||||||
- 任何 `design/01-tree-first-graph-kernel/process/1-13-*` 之外的 batch 文件,除非只是记录本任务结果
|
|
||||||
|
|
||||||
## 执行要求
|
|
||||||
|
|
||||||
- 先审查现有测试:搜索 `local_markdown_save_writes_table_inline_marks`、`local_markdown_save_round_trips_tiptap_table_marks`、`local_markdown_save_table_handles_colspan_degradation`、`document_shell_bootstrap_preserves_inline_mark_conversion`。
|
|
||||||
- 若降级策略已有足够测试,更新 `3-13` 的表格状态即可。
|
|
||||||
- 若缺少最小测试,优先补 Rust 单测,不新增浏览器 smoke。
|
|
||||||
- 不要直接删除 `legacyStylesToTiptapMarks`,除非你能证明当前 web shell 不再需要 legacy block -> Tiptap marks bootstrap,并且 `web_shell` 测试通过。
|
|
||||||
- 若决定保留该分支,把 `3-13` 中“必须移除”改为“保留兼容层 + 退出条件”,然后归档。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test -p mnote-web local_markdown -- --test-threads=1
|
|
||||||
cargo test -p mnote-web web_shell -- --test-threads=1
|
|
||||||
git diff --check
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
- 修改文件列表
|
|
||||||
- 归档/未归档判断
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项或风险
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
# Reasonix Worker B:Tree realtime live cache 可归档性复核
|
|
||||||
|
|
||||||
Project root:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是唯一 worker。不要回滚、覆盖或清理他人的改动;只修改本任务 ownership 范围内的文件。不要提交 git。
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
复核 `design/03-rust-web/process/3-3-rust-web-tree-realtime-event-stream-v1.md` 是否仍应留在 process。
|
|
||||||
|
|
||||||
重点判断:
|
|
||||||
|
|
||||||
1. sidebar、page subtree、filetree 是否已经统一到当前 3000 主界面的 WS push + SSE fallback live cache。
|
|
||||||
2. preferred snapshot 补偿链是否仍是阻塞,还是已成为 live cache 的正常 freshness 仲裁。
|
|
||||||
3. 现有 smoke 是否足以覆盖 create / rename / move / archive / restore / purge / resync / reconnect 的双浏览器 no-refresh 行为。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `design/03-rust-web/process/3-3-rust-web-tree-realtime-event-stream-v1.md`
|
|
||||||
- `design/03-rust-web/done/3-3-rust-web-tree-realtime-event-stream-v1.md`(仅当归档)
|
|
||||||
- `design/03-rust-web/process/3-1-rust-web-long-term-checklist-v2.md`(只做状态/证据同步)
|
|
||||||
|
|
||||||
只读审查:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/ws.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/tree_events.rs`
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- `scripts/task123-rust-web-tree-live-stream-consumer-smoke.js`
|
|
||||||
- `scripts/task165-*`
|
|
||||||
- `scripts/task432-filetree-trash-page-dual-browser-no-refresh-smoke.js`
|
|
||||||
- `scripts/task446-tree-rename-dual-browser-live-smoke.js`
|
|
||||||
- `scripts/task447-tree-move-order-dual-browser-live-smoke.js`
|
|
||||||
- `scripts/task448-tree-resync-recovery-dual-browser-smoke.js`
|
|
||||||
- `scripts/task449-tree-sse-reconnect-snapshot-recovery-smoke.js`
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
|
|
||||||
- Rust runtime 代码
|
|
||||||
- smoke 脚本,除非只是明显的 node syntax 修复且需要说明
|
|
||||||
- AI / markdown parser 文件
|
|
||||||
|
|
||||||
## 执行要求
|
|
||||||
|
|
||||||
- 使用 `rg` / CodeGraph / 文件读取审查当前 live cache 证据。
|
|
||||||
- 至少运行相关 smoke 的 `node --check`。
|
|
||||||
- 如果 `http://127.0.0.1:3000` 当前可用,优先实跑 1-2 个代表性 smoke:建议 `task446` 和 `task448` 或 `task449`。
|
|
||||||
- 如果当前环境无法实跑,不能声称功能通过;只记录“文档证据足够/不足”和阻塞。
|
|
||||||
- 若证据足够,把 `3-3` 移到 `done/` 并把 9.2 改为已完成记录。
|
|
||||||
- 若证据不足,保留 `process`,写出最小剩余 checklist。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node --check scripts/task123-rust-web-tree-live-stream-consumer-smoke.js
|
|
||||||
node --check scripts/task432-filetree-trash-page-dual-browser-no-refresh-smoke.js
|
|
||||||
node --check scripts/task446-tree-rename-dual-browser-live-smoke.js
|
|
||||||
node --check scripts/task447-tree-move-order-dual-browser-live-smoke.js
|
|
||||||
node --check scripts/task448-tree-resync-recovery-dual-browser-smoke.js
|
|
||||||
node --check scripts/task449-tree-sse-reconnect-snapshot-recovery-smoke.js
|
|
||||||
git diff --check
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
- 修改文件列表
|
|
||||||
- `3-3` 是否归档及理由
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 仍缺的 smoke / 代码缺口
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
# Reasonix Worker C:AI 写入 CommandContext 守卫
|
|
||||||
|
|
||||||
Project root:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是唯一 worker。不要回滚、覆盖或清理他人的改动;只修改本任务 ownership 范围内的文件。不要提交 git。
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
收口 `1-6` Gap A7 中最后的 `ai.canWrite` 消费缺口:
|
|
||||||
|
|
||||||
1. 复核 `CommandContext.ai.canWrite` 是否已经被 Hermes / AI 写入路径实际消费。
|
|
||||||
2. 若未消费,补最小守卫:只读 workspace、无写权限或 AI 写入未授权时,正文/页面写入类 Hermes tool 返回明确拒绝,不进入文件写入。
|
|
||||||
3. 补最小 Rust 单测,避免只停留在 `core-protocol` evaluator 层。
|
|
||||||
4. 更新 `design/01-tree-first-graph-kernel/process/1-6-next-phase-gap-closure-checklist-v1.md` 与必要的 `1-5` 状态。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `design/01-tree-first-graph-kernel/process/1-6-next-phase-gap-closure-checklist-v1.md`
|
|
||||||
- `design/01-tree-first-graph-kernel/process/1-5-next-phase-sequential-execution-checklist-v1.md`
|
|
||||||
- `rust/crates/core-protocol/src/command.rs`
|
|
||||||
- `rust/crates/mnote-web/src/hermes_tools/doc.rs`
|
|
||||||
- `rust/crates/mnote-web/src/hermes_tools/page.rs`
|
|
||||||
- 相关同文件测试
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
|
|
||||||
- GFM parser / web_shell legacy marks
|
|
||||||
- tree realtime / websocket 文件
|
|
||||||
- OnlyOffice 文件
|
|
||||||
|
|
||||||
## 执行要求
|
|
||||||
|
|
||||||
- 先搜索现有写权限模型,不要凭空新增一套权限真相。
|
|
||||||
- 如果已有 `AiAccessScope`、allowed roots、readonly workspace 或 local access policy helper,应复用。
|
|
||||||
- `ai.canWrite` 是 command context 口径;如果 runtime 现有权限模型名称不同,可以用桥接 helper,但不要把 evaluator 复制到多个地方。
|
|
||||||
- 拒绝响应必须可解释,不能 panic,不能静默成功。
|
|
||||||
- 不要扩大 AI 功能面,只守卫已有写入路径。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test -p core-protocol command_context -- --test-threads=1
|
|
||||||
cargo test -p mnote-web hermes_tools -- --test-threads=1
|
|
||||||
git diff --check
|
|
||||||
```
|
|
||||||
|
|
||||||
如果 `hermes_tools` 过滤器过大或无匹配,请运行你新增测试的精确过滤命令,并在最终回复说明。
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
- 修改文件列表
|
|
||||||
- 是否实现运行时守卫
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项或风险
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
# Reasonix Worker A:Local Folder Tree Live 后端事件流
|
|
||||||
|
|
||||||
Project root:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是唯一 worker。不要回滚、覆盖或清理他人的改动;只修改本任务 ownership 范围内的文件。不要提交 git。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
`design/01-tree-first-graph-kernel/process/1-8-mvp-post-process-execution-order-v1.md` 仍未整体完成,当前阻塞在 `3-3`:local_folder 默认路径的 Sidebar / FileTree 仍通过 `startLocalFolderSidebarWatch()` 轮询 `/api/tree/local-folder-watch` 后补拉 projection,没有进入统一 tree live consumer。
|
|
||||||
|
|
||||||
新 checklist:`design/03-rust-web/process/3-18-local-folder-tree-live-consumer-convergence-checklist-v1.md`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/local_folder_events.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/stream_support.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/mod.rs`
|
|
||||||
- 同文件测试
|
|
||||||
|
|
||||||
只读参考:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/local_folder_watcher_registry.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/local_folder_source.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/kernel.rs`
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- `scripts/*.js`
|
|
||||||
- 其他 design 文档
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
1. 给 local_folder 提供 tree live 事件形状,至少支持 snapshot / resync。
|
|
||||||
2. payload 中必须携带:
|
|
||||||
- `kind: "snapshot"` 或 `kind: "resync"`
|
|
||||||
- `stream: "workspace"`
|
|
||||||
- `projection: "sidebar_tree"`
|
|
||||||
- `sourceKind: "local_folder"`
|
|
||||||
- `rootUri`
|
|
||||||
- `workspaceId`
|
|
||||||
- `revision`
|
|
||||||
- `data.dataset.kernel_sidebar_projection`
|
|
||||||
- `data.dataset.kernel_file_tree_projection`
|
|
||||||
3. 复用 `LocalFolderWatcherRegistry`,不要新增第二套 watcher。
|
|
||||||
4. 如果不能可靠生成细粒度 delta,本阶段允许 watcher change 后发 resync snapshot。
|
|
||||||
5. 不把 local_folder 变化写回 Convex command log。
|
|
||||||
|
|
||||||
## 建议实现
|
|
||||||
|
|
||||||
- 可以扩展 `/api/local-folder/events`,让它在 query 中带 `treeLive=1` 或 `scope=tree` 时输出 `snapshot` / `resync` 事件;保留原有 `ready` / `change` 给 web_shell 编辑器外部变更使用。
|
|
||||||
- snapshot 可复用 `load_local_folder_page_tree_snapshot(rootUri)` 和 `load_local_folder_file_tree_snapshot(rootUri)` 组装 dataset。
|
|
||||||
- 事件 id 可继续使用 revision。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web local_folder_events -- --test-threads=1
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web stream_support -- --test-threads=1
|
|
||||||
git diff --check
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
- 修改文件列表
|
|
||||||
- 新增/变更的 API 行为
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项或风险
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
# Reasonix Worker B:Local Folder Tree Live 前端 consumer 接入
|
|
||||||
|
|
||||||
Project root:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是唯一 worker。不要回滚、覆盖或清理他人的改动;只修改本任务 ownership 范围内的文件。不要提交 git。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
`3-3` 暂不能归档,因为 `sourceKind=local_folder` 当前在 `TREE_LIVE_CONTROLLER_JS` 中直接设置 `data-mnote-tree-live-transport="local-folder-static"` 并 return;Sidebar / FileTree 依赖 `startLocalFolderSidebarWatch()` 轮询 `/api/tree/local-folder-watch` 后补拉 projection。
|
|
||||||
|
|
||||||
新 checklist:`design/03-rust-web/process/3-18-local-folder-tree-live-consumer-convergence-checklist-v1.md`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
|
|
||||||
- Rust route 后端文件
|
|
||||||
- `scripts/*.js`
|
|
||||||
- 其他 design 文档
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
1. local_folder 默认路径应进入 tree live controller,不再直接 `local-folder-static` return。
|
|
||||||
2. 使用 Worker A 新增/扩展的 local_folder tree live SSE,接收到 snapshot/resync 后 dispatch `tree:snapshot` / `tree:resync`,复用已有 `renderSidebarSnapshot()` consumer。
|
|
||||||
3. `startLocalFolderSidebarWatch()` 可保留为 fallback,但不再是默认主链。
|
|
||||||
4. 不破坏 web_shell/tiptap 的 `/api/local-folder/events` 文档外部变更通道。
|
|
||||||
5. DOM 状态应能区分新主链,例如 `data-mnote-tree-live-transport="local-folder-events"`,并在应用成功后设置 `data-mnote-tree-live-applied="snapshot"` 或 `"resync"`。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web sidebar_tree_runtime -- --test-threads=1
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web web_shell -- --test-threads=1
|
|
||||||
git diff --check
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
- 修改文件列表
|
|
||||||
- local_folder tree live 主链变化
|
|
||||||
- fallback 保留情况
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项或风险
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
# Reasonix Worker C:Local Folder Tree Live 浏览器 smoke
|
|
||||||
|
|
||||||
Project root:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是唯一 worker。不要回滚、覆盖或清理他人的改动;只修改本任务 ownership 范围内的文件。不要提交 git。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
`3-3` 的归档条件要求 `3000` 当前主界面的 Sidebar / page subtree / FileTree / preferred snapshot 补偿链统一到正式 live cache。当前 local_folder 仍是轮询补拉 projection。Worker A/B 会尝试把 local_folder 接入 tree live consumer;本任务负责 smoke 证据。
|
|
||||||
|
|
||||||
新 checklist:`design/03-rust-web/process/3-18-local-folder-tree-live-consumer-convergence-checklist-v1.md`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `scripts/task435-local-folder-watch-no-reload-smoke.js`
|
|
||||||
- 可新增:`scripts/task487-local-folder-tree-live-consumer-smoke.js`
|
|
||||||
- `design/03-rust-web/process/3-18-local-folder-tree-live-consumer-convergence-checklist-v1.md`
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
|
|
||||||
- Rust route / layout runtime 代码
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
1. 增加或更新 smoke,验证 local_folder 文档页不再把 `local-folder-static` 当默认 tree live 主链。
|
|
||||||
2. 验证 local_folder 外部文件变化后,Sidebar / FileTree 刷新最终留下 tree live consumer 证据,例如:
|
|
||||||
- `data-mnote-tree-live-transport="local-folder-events"`
|
|
||||||
- `data-mnote-tree-live-applied="snapshot"` 或 `"resync"`
|
|
||||||
- `data-mnote-local-folder-watch-applied` 不再是唯一证据
|
|
||||||
3. smoke 结果写入 `tmp/.../result.json`,如可行保存截图。
|
|
||||||
4. 若当前代码尚未满足断言,允许先写 RED smoke,但必须在文档执行记录中说明它当前预期失败。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node --check scripts/task435-local-folder-watch-no-reload-smoke.js
|
|
||||||
node --check scripts/task487-local-folder-tree-live-consumer-smoke.js
|
|
||||||
git diff --check
|
|
||||||
```
|
|
||||||
|
|
||||||
如果没有新增 task487,则说明原因。
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
- 修改文件列表
|
|
||||||
- smoke 覆盖点
|
|
||||||
- 当前是否 RED / GREEN
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项或风险
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
# Reasonix Worker A:3-3 live cache 可归档性复核
|
|
||||||
|
|
||||||
## 项目
|
|
||||||
|
|
||||||
- Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `design/03-rust-web/process/3-3-rust-web-tree-realtime-event-stream-v1.md`
|
|
||||||
- 如确认可归档,可移动到:
|
|
||||||
- `design/03-rust-web/done/3-3-rust-web-tree-realtime-event-stream-v1.md`
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
|
|
||||||
- 不改 Rust / JS runtime 代码。
|
|
||||||
- 不改 `1-8`、`1-13`、`1-14`。
|
|
||||||
- 不提交 git。
|
|
||||||
- 不删除任何 `tmp/` 证据。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
`1-8` Batch D 仍把 `3-3` 作为 live cache 入口。旧 `3-3` 文档 9.2 说 sidebar / page subtree / filetree 没有全部统一 live cache、WS 只证明骨架、不能移动到 done。
|
|
||||||
|
|
||||||
但后续已有:
|
|
||||||
|
|
||||||
- `design/03-rust-web/done/3-14-rust-web-tree-realtime-ws-push-v1.md`
|
|
||||||
- `design/03-rust-web/done/3-18-local-folder-tree-live-consumer-convergence-checklist-v1.md`
|
|
||||||
- `scripts/task123-rust-web-tree-live-stream-consumer-smoke.js`
|
|
||||||
- `scripts/task432-filetree-trash-page-dual-browser-no-refresh-smoke.js`
|
|
||||||
- `scripts/task446-tree-rename-dual-browser-live-smoke.js`
|
|
||||||
- `scripts/task447-tree-move-order-dual-browser-live-smoke.js`
|
|
||||||
- `scripts/task448-tree-resync-recovery-dual-browser-smoke.js`
|
|
||||||
- `scripts/task449-tree-sse-reconnect-snapshot-recovery-smoke.js`
|
|
||||||
- `scripts/task487-local-folder-tree-live-consumer-smoke.js`
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 读取 `3-3`、`3-14`、`3-18`,判断 `3-3` 的 9.2 未完成项是否已经过期。
|
|
||||||
2. 如果证据足够,更新 `3-3` 状态为 done,并移动到 `design/03-rust-web/done/`。
|
|
||||||
3. 如果证据不足,不移动,只在 `3-3` 里写明最小剩余缺口。
|
|
||||||
4. 运行最小语法检查:
|
|
||||||
- `node --check scripts/task123-rust-web-tree-live-stream-consumer-smoke.js`
|
|
||||||
- `node --check scripts/task487-local-folder-tree-live-consumer-smoke.js`
|
|
||||||
- `git diff --check`
|
|
||||||
|
|
||||||
## 最终回复
|
|
||||||
|
|
||||||
用简体中文列出:
|
|
||||||
|
|
||||||
1. 修改文件
|
|
||||||
2. 归档或不归档的理由
|
|
||||||
3. 验证命令和结果
|
|
||||||
4. 未完成项 / 风险
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
# Reasonix Worker B:1-5 / 1-6 command context 状态收口
|
|
||||||
|
|
||||||
## 项目
|
|
||||||
|
|
||||||
- Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `design/01-tree-first-graph-kernel/process/1-5-next-phase-sequential-execution-checklist-v1.md`
|
|
||||||
- `design/01-tree-first-graph-kernel/process/1-6-next-phase-gap-closure-checklist-v1.md`
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
|
|
||||||
- 不改 Rust / JS runtime 代码。
|
|
||||||
- 不改 `1-8`、`1-13`、`1-14`。
|
|
||||||
- 不提交 git。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
当前代码和 `1-6` 的部分段落已经显示:
|
|
||||||
|
|
||||||
- `core-protocol/src/command.rs` 有 `CommandContext` / `when` evaluator。
|
|
||||||
- FileTree 右键菜单和 Delete/Backspace 已接入等价 context 判断。
|
|
||||||
- Hermes tools 写入守卫已消费 `args.commandContext` / `args.command_context` 的 `ai.canWrite` 与 `workspace.readonly`。
|
|
||||||
|
|
||||||
但 `1-5` Phase A7 和 `1-6` 顶部/汇总处仍有一些未更新的未完成表述。
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 只围绕 command context / context key 状态更新 `1-5` 与 `1-6`。
|
|
||||||
2. 把已经有证据的项改为完成,并写入验证命令。
|
|
||||||
3. 保留真实未完成项,例如更完整的 editor/object tab context 或未实跑的 DnD readonly smoke。
|
|
||||||
4. 不夸大为“所有 command context 完全完成”。
|
|
||||||
5. 运行:
|
|
||||||
- `cargo test --manifest-path rust/Cargo.toml -p core-protocol command_context -- --test-threads=1`
|
|
||||||
- `cargo test --manifest-path rust/Cargo.toml -p mnote-web ensure_write_authorized -- --test-threads=1`
|
|
||||||
- `node --check scripts/task471-local-folder-bulk-resource-trash-smoke.js`
|
|
||||||
- `node --check scripts/task476-filetree-editor-context-menu-download-smoke.js`
|
|
||||||
- `git diff --check`
|
|
||||||
|
|
||||||
## 最终回复
|
|
||||||
|
|
||||||
用简体中文列出:
|
|
||||||
|
|
||||||
1. 修改文件
|
|
||||||
2. 勾选了哪些项、保留了哪些未完成项
|
|
||||||
3. 验证命令和结果
|
|
||||||
4. 风险
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
# Reasonix Worker C:Batch D 浏览器 smoke 证据整理
|
|
||||||
|
|
||||||
## 项目
|
|
||||||
|
|
||||||
- Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `.codex/reasonix-tasks/results/batch-h-worker-c-browser-smoke-evidence.md`
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
|
|
||||||
- 不改产品代码。
|
|
||||||
- 不改 design 主文档。
|
|
||||||
- 不提交 git。
|
|
||||||
- 不删除或覆盖 `tmp/` 证据。
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
只读检查以下 smoke 脚本和已有证据,整理成一份表格:
|
|
||||||
|
|
||||||
- `scripts/task123-rust-web-tree-live-stream-consumer-smoke.js`
|
|
||||||
- `scripts/task432-filetree-trash-page-dual-browser-no-refresh-smoke.js`
|
|
||||||
- `scripts/task446-tree-rename-dual-browser-live-smoke.js`
|
|
||||||
- `scripts/task447-tree-move-order-dual-browser-live-smoke.js`
|
|
||||||
- `scripts/task448-tree-resync-recovery-dual-browser-smoke.js`
|
|
||||||
- `scripts/task449-tree-sse-reconnect-snapshot-recovery-smoke.js`
|
|
||||||
- `scripts/task471-local-folder-bulk-resource-trash-smoke.js`
|
|
||||||
- `scripts/task476-filetree-editor-context-menu-download-smoke.js`
|
|
||||||
- `scripts/task487-local-folder-tree-live-consumer-smoke.js`
|
|
||||||
|
|
||||||
输出必须区分:
|
|
||||||
|
|
||||||
- 已实跑通过,且有 `tmp/` 结果或截图证据。
|
|
||||||
- 仅 `node --check` 通过,还缺真实浏览器实跑。
|
|
||||||
- 可用于人工网页核查的点。
|
|
||||||
- 仍建议 Codex 主线程复跑的点。
|
|
||||||
|
|
||||||
验收:
|
|
||||||
|
|
||||||
- 运行 `node --check` 检查上述脚本语法,能跑多少跑多少;若脚本不存在或环境阻塞,写明。
|
|
||||||
- 运行 `git diff --check`。
|
|
||||||
|
|
||||||
## 最终回复
|
|
||||||
|
|
||||||
用简体中文列出:
|
|
||||||
|
|
||||||
1. 写入的结果文件
|
|
||||||
2. 证据摘要
|
|
||||||
3. 建议 Codex 复跑的 smoke
|
|
||||||
4. 风险
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
# Reasonix Worker A:7-27 归档性审查
|
|
||||||
|
|
||||||
## 项目
|
|
||||||
|
|
||||||
- Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `design/07-ai/process/7-27-online-markdown-writeback-final-content-truth-v2.md`
|
|
||||||
- 若确认可归档,可移动到:
|
|
||||||
- `design/07-ai/done/7-27-online-markdown-writeback-final-content-truth-v2.md`
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
|
|
||||||
- 不改 Rust / JS runtime 代码。
|
|
||||||
- 不改 `1-8`、`7-29`。
|
|
||||||
- 不提交 git。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
`7-27` 设计目标是让在线 `mnote.doc.markdown_edit` 以最终 markdown 为写回真源,而不是继续从原始 operations 二次推导 block ops。
|
|
||||||
|
|
||||||
当前代码已有:
|
|
||||||
|
|
||||||
- `parse_final_markdown_to_blocks`
|
|
||||||
- `build_page_content`
|
|
||||||
- `build_changed_blocks_summary`
|
|
||||||
- `doc_markdown_edit` 中 `mnote.doc.markdown_edit (7-27)` reason
|
|
||||||
- `markdown_edit` targeted tests 通过
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 对照 `7-27` 步骤 1-6、测试矩阵、开放问题,判断当前代码是否已满足归档条件。
|
|
||||||
2. 如果可归档,更新状态并移动到 `design/07-ai/done/`。
|
|
||||||
3. 如果不可归档,只写明最小剩余缺口,不改代码。
|
|
||||||
4. 运行:
|
|
||||||
- `cargo test --manifest-path rust/Cargo.toml -p mnote-web markdown_edit -- --test-threads=1`
|
|
||||||
- `cargo test --manifest-path rust/Cargo.toml -p mnote-web hermes_tools_manifest_describes_markdown_edit_write_contract -- --test-threads=1`
|
|
||||||
- `git diff --check`
|
|
||||||
|
|
||||||
## 最终回复
|
|
||||||
|
|
||||||
用简体中文列出:
|
|
||||||
|
|
||||||
1. 修改文件
|
|
||||||
2. 可归档或不可归档理由
|
|
||||||
3. 验证命令和结果
|
|
||||||
4. 未完成项 / 风险
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
# Reasonix Worker B:7-27 代码/测试缺口审查
|
|
||||||
|
|
||||||
## 项目
|
|
||||||
|
|
||||||
- Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `.codex/reasonix-tasks/results/batch-i-worker-b-7-27-code-test-gap.md`
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
|
|
||||||
- 不改代码。
|
|
||||||
- 不改 design 主文档。
|
|
||||||
- 不提交 git。
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
只读审查当前 `7-27` 实现,重点文件:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/hermes_tools/doc.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/hermes_tools.rs`
|
|
||||||
- `rust/crates/mnote-web/src/hermes_tools/manifest.rs`
|
|
||||||
|
|
||||||
检查这些点:
|
|
||||||
|
|
||||||
1. `blocks_to_markdown` 是否能从 legacy `content` / `contentNodes` 读取文本,而不是只读 `text`。
|
|
||||||
2. 注释格式是否与 `7-27` 文档一致,是否真的保留 `revisionRef`。
|
|
||||||
3. `full_content` 是否不再被拒绝,是否会保留复杂块。
|
|
||||||
4. `dryRun` 是否不写入。
|
|
||||||
5. selection / allowedTargetBlockIds 是否阻止越界写入。
|
|
||||||
6. 是否还有 `build_block_ops_from_markdown_edit` 旧推导路径。
|
|
||||||
7. 测试覆盖是否足以归档。
|
|
||||||
|
|
||||||
输出到结果文件,按三类分级:
|
|
||||||
|
|
||||||
- 必须修复才能归档
|
|
||||||
- 可作为后续增强
|
|
||||||
- 已满足
|
|
||||||
|
|
||||||
验收:
|
|
||||||
|
|
||||||
- 运行 `git diff --check`
|
|
||||||
- 结果文件引用具体函数名或测试名。
|
|
||||||
|
|
||||||
## 最终回复
|
|
||||||
|
|
||||||
用简体中文列出结果文件路径和最高风险结论。
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
# Reasonix Worker C:7-15 / 7-12 后续拆分审查
|
|
||||||
|
|
||||||
## 项目
|
|
||||||
|
|
||||||
- Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
|
|
||||||
- `.codex/reasonix-tasks/results/batch-i-worker-c-acp-review-tail.md`
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
|
|
||||||
- 不改代码。
|
|
||||||
- 不改 design 主文档。
|
|
||||||
- 不提交 git。
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
只读审查:
|
|
||||||
|
|
||||||
- `design/07-ai/process/7-15-page-ai-acp-agent-runtime-unified-layer-v1.md`
|
|
||||||
- `design/07-ai/process/7-12-page-ai-hermes-tool-routing-and-review-surface-v1.md`
|
|
||||||
- `rust/crates/mnote-web/src/acp_client.rs`
|
|
||||||
- `rust/crates/mnote-web/src/acp_session_manager.rs`
|
|
||||||
- `rust/crates/mnote-web/src/acp_runtime.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/hermes_client.rs`
|
|
||||||
- `rust/crates/mnote-web/src/hermes_tools/manifest.rs`
|
|
||||||
|
|
||||||
目标:
|
|
||||||
|
|
||||||
1. 判断 `7-15` Step 15-17 是否仍是当前应执行项,或是否应拆成独立 checklist。
|
|
||||||
2. 判断 `7-12` Phase B-F 哪些已被当前 manifest/runtime/tool guard 覆盖。
|
|
||||||
3. 明确 Phase C Review Mode 仍冻结,不要建议本轮实现。
|
|
||||||
4. 给出下一批 P0/P1/P2 顺序。
|
|
||||||
|
|
||||||
验收:
|
|
||||||
|
|
||||||
- 运行 `git diff --check`
|
|
||||||
- 结果文件必须有 P0/P1/P2 表格。
|
|
||||||
|
|
||||||
## 最终回复
|
|
||||||
|
|
||||||
用简体中文列出结果文件路径、P0 建议和风险。
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
# Batch J Worker A:旧 HTTP proxy / page AI fallback 调用链审查
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
只读审查 `7-34` 的 P0-1 / P0-2:
|
|
||||||
|
|
||||||
1. 查清 `hermes_client.rs` 中旧 Hermes HTTP proxy 路径是否仍有默认入口。
|
|
||||||
2. 查清 `page_ai_workflow.rs` 是否仍会在 local-first 默认口径下绕过 ACP / shared tool executor,重新走旧 block-edit fallback。
|
|
||||||
|
|
||||||
## 允许范围
|
|
||||||
|
|
||||||
只读以下文件,不修改代码:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/hermes_client.rs`
|
|
||||||
- `rust/crates/mnote-web/src/page_ai_workflow.rs`
|
|
||||||
- `rust/crates/mnote-web/src/acp_runtime.rs`
|
|
||||||
- `rust/crates/mnote-web/src/acp_session_manager.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/mod.rs`
|
|
||||||
- 必要时可只读 `rust/crates/mnote-web/src/routes/*.rs` 里和 route 注册相关的文件
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 不修改任何源码、设计文档或测试。
|
|
||||||
- 不提交 git。
|
|
||||||
- 不移动文件。
|
|
||||||
- 不运行破坏性命令。
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
把结果写入 `.codex/reasonix-tasks/results/batch-j-worker-a-http-proxy-fallback.md`。
|
|
||||||
|
|
||||||
必须包含:
|
|
||||||
|
|
||||||
1. 旧 HTTP proxy / page AI fallback 的真实调用链。
|
|
||||||
2. 每个入口的分类:`default` / `compat` / `debug-only` / `未被调用`。
|
|
||||||
3. 是否存在必须在本轮修复的 P0 缺口。
|
|
||||||
4. 若需要后续代码修改,给出最小修改范围和建议测试命令。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
只需要运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git diff --check
|
|
||||||
```
|
|
||||||
|
|
||||||
最终回复中列出读取过的关键文件、结论、风险和未完成项。
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
# Batch J Worker B:tool availability 三处一致性审查
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
只读审查 `7-34` 的 P1-1:
|
|
||||||
|
|
||||||
确认 profile-level tool availability / capability 是否在三处保持一致:
|
|
||||||
|
|
||||||
1. Hermes tool manifest:工具是否标明 enabled / disabled / capability / annotations。
|
|
||||||
2. UI:页面 AI 或 tool list 是否根据同一能力判断展示 disabled / hidden。
|
|
||||||
3. Execute guard:真正执行工具时是否复用同一能力判断,而不是只靠 UI 阻止。
|
|
||||||
|
|
||||||
## 允许范围
|
|
||||||
|
|
||||||
只读以下文件,不修改代码:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/hermes_tools/manifest.rs`
|
|
||||||
- `rust/crates/mnote-web/src/hermes_tools/*.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/hermes_tools.rs`
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- 必要时可只读 `rust/crates/mnote-web/src/routes/hermes_client.rs`
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 不修改任何源码、设计文档或测试。
|
|
||||||
- 不提交 git。
|
|
||||||
- 不移动文件。
|
|
||||||
- 不运行破坏性命令。
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
把结果写入 `.codex/reasonix-tasks/results/batch-j-worker-b-tool-availability.md`。
|
|
||||||
|
|
||||||
必须包含:
|
|
||||||
|
|
||||||
1. manifest / UI / execute guard 各自当前能力判断来源。
|
|
||||||
2. 三处是否同源;如果不同源,指出具体文件和函数。
|
|
||||||
3. P0/P1/P2 分级缺口。
|
|
||||||
4. 建议的最小测试名或现有 targeted test。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
只需要运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git diff --check
|
|
||||||
```
|
|
||||||
|
|
||||||
最终回复中列出读取过的关键文件、结论、风险和未完成项。
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
# Batch J Worker C:ACP 稳定性与 benchmark checklist 草案
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
只读审查 `7-34` 的 P1-2 / P1-3:
|
|
||||||
|
|
||||||
为 ACP 多会话稳定性测试和 Reasonix cache benchmark 拆出最小可执行方案,供 Codex 后续实现或派发实现 worker。
|
|
||||||
|
|
||||||
## 允许范围
|
|
||||||
|
|
||||||
只读以下文件和目录,不修改代码:
|
|
||||||
|
|
||||||
- `design/07-ai/process/7-15-page-ai-acp-agent-runtime-unified-layer-v1.md`
|
|
||||||
- `design/07-ai/done/7-25-acp-session-runtime-enhancement-plan-v1.md`
|
|
||||||
- `design/07-ai/done/7-30-acp-session-load-resume-checklist-v1.md`
|
|
||||||
- `design/07-ai/done/7-31-acp-permission-decision-loop-checklist-v1.md`
|
|
||||||
- `design/07-ai/done/7-32-acp-tool-location-and-open-action-checklist-v1.md`
|
|
||||||
- `design/07-ai/done/7-33-acp-session-info-plan-ui-checklist-v1.md`
|
|
||||||
- `scripts/`
|
|
||||||
- `rust/crates/mnote-web/src/acp_*.rs`
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 不修改任何源码、设计文档或测试。
|
|
||||||
- 不提交 git。
|
|
||||||
- 不移动文件。
|
|
||||||
- 不运行破坏性命令。
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
把结果写入 `.codex/reasonix-tasks/results/batch-j-worker-c-acp-stability-benchmark.md`。
|
|
||||||
|
|
||||||
必须包含:
|
|
||||||
|
|
||||||
1. ACP 多会话稳定性 smoke 的最小脚本方案:输入、操作、断言、证据文件。
|
|
||||||
2. Reasonix cache benchmark 的最小脚本方案:Hermes / Reasonix 对比维度、样本数、输出格式。
|
|
||||||
3. 浏览器可见验证点和截图/JSON 证据建议。
|
|
||||||
4. 哪些属于 P0 稳定性验证,哪些只是 P2 度量。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
只需要运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git diff --check
|
|
||||||
```
|
|
||||||
|
|
||||||
最终回复中列出读取过的关键文件、结论、风险和未完成项。
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
# Reasonix Browser Test: Batch A task430 Explorer/Open Editors Smoke
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
请先阅读并遵守:`/home/lix/.codex/skills/reasonix-browser-tester/SKILL.md`
|
|
||||||
|
|
||||||
## 角色
|
|
||||||
|
|
||||||
你是浏览器测试员,不是代码修改员。
|
|
||||||
|
|
||||||
禁止修改源码、禁止 git commit、禁止回滚文件。只允许创建测试输出目录、临时测试数据和截图。
|
|
||||||
|
|
||||||
## 测试目标
|
|
||||||
|
|
||||||
验证 Batch A 的 `task430-vscode-explorer-stage7-smoke.js` 是否能在当前真实 3000/3210 环境实跑,并输出可复核浏览器证据。
|
|
||||||
|
|
||||||
## 前置
|
|
||||||
|
|
||||||
- 被测入口:`http://127.0.0.1:3000`
|
|
||||||
- Convex:`http://127.0.0.1:3210`
|
|
||||||
- 使用真实浏览器或 Playwright。
|
|
||||||
- 使用全新的 isolated browser context / userDataDir;测试开始前清空 cookies、localStorage、sessionStorage、IndexedDB、Cache Storage。
|
|
||||||
|
|
||||||
## 操作
|
|
||||||
|
|
||||||
1. 运行:`node --check scripts/task430-vscode-explorer-stage7-smoke.js`
|
|
||||||
2. 运行:`node scripts/task430-vscode-explorer-stage7-smoke.js`
|
|
||||||
3. 读取 `tmp/task430-vscode-explorer-stage7-smoke/result.json`。
|
|
||||||
4. 使用浏览器打开 result 中的 `workspaceId` / `fixture.resourceDoc` 对应页面,或复用脚本末态重新打开页面,截图 FileTree 可见状态。
|
|
||||||
5. 记录 `result.phases`、`checks`、`skipped`,尤其是:
|
|
||||||
- `workspace-bootstrap`
|
|
||||||
- `filetree-active-row`
|
|
||||||
- `filetree-selected-row`
|
|
||||||
- `open-editors-section`
|
|
||||||
- `context-menu-minimum`
|
|
||||||
|
|
||||||
## 输出目录
|
|
||||||
|
|
||||||
`/mnt/Data1T/mnote/tmp/reasonix-batch-a-browser-task430-2026-05-21/`
|
|
||||||
|
|
||||||
必须输出:
|
|
||||||
|
|
||||||
- `result.json`
|
|
||||||
- `final.md`
|
|
||||||
- 至少 1 张截图;失败时必须截图。
|
|
||||||
|
|
||||||
## 判定
|
|
||||||
|
|
||||||
- `PASS`:语法检查和 smoke 实跑 exit 0,`result.json.ok=true`,并有截图证明浏览器 UI 可打开。
|
|
||||||
- `PASS_WITH_KNOWN_GAPS`:smoke ok,但 `data-active` / Open Editors 等被记录为已知缺口;必须把缺口写入 result。
|
|
||||||
- `FAIL`:脚本退出非 0 或 result 缺失。
|
|
||||||
- `BLOCKED`:3000/3210 不可达或登录/Convex 环境不可用。
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
# Reasonix Browser Test: Batch A task471 Local Folder Bulk Trash
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
请先阅读并遵守:`/home/lix/.codex/skills/reasonix-browser-tester/SKILL.md`
|
|
||||||
|
|
||||||
## 角色
|
|
||||||
|
|
||||||
你是浏览器测试员,不是代码修改员。
|
|
||||||
|
|
||||||
禁止修改源码、禁止 git commit、禁止回滚文件。只允许创建测试输出目录、临时测试数据和截图。
|
|
||||||
|
|
||||||
## 测试目标
|
|
||||||
|
|
||||||
验证 `task471-local-folder-bulk-resource-trash-smoke.js` 的 local folder 多选资源删除进入垃圾箱链路,输出浏览器证据。
|
|
||||||
|
|
||||||
## 前置
|
|
||||||
|
|
||||||
- 被测入口:`http://127.0.0.1:3000`
|
|
||||||
- 使用真实浏览器或 Playwright。
|
|
||||||
- 使用全新的 isolated browser context / userDataDir;测试开始前清空 cookies、localStorage、sessionStorage、IndexedDB、Cache Storage。
|
|
||||||
|
|
||||||
## 操作
|
|
||||||
|
|
||||||
1. 运行:`node --check scripts/task471-local-folder-bulk-resource-trash-smoke.js`
|
|
||||||
2. 运行:`node scripts/task471-local-folder-bulk-resource-trash-smoke.js`
|
|
||||||
3. 读取脚本 stdout 与相关临时 root。
|
|
||||||
4. 如脚本保留了足够路径,打开等价 local folder filetree 或根据脚本输出重新创建一个小临时 local folder,用 UI 展示两个资源行可多选和删除确认状态,截图。
|
|
||||||
5. 记录是否观测到:
|
|
||||||
- 两个资源行 `data-selected="true"`
|
|
||||||
- 删除确认文案包含资源数量
|
|
||||||
- `data-mnote-filetree-last-action="bulk-delete"`
|
|
||||||
- `data-mnote-filetree-last-action-status="archived"`
|
|
||||||
- `.mnote/trash-index.json` 包含两个资源 ID
|
|
||||||
|
|
||||||
## 输出目录
|
|
||||||
|
|
||||||
`/mnt/Data1T/mnote/tmp/reasonix-batch-a-browser-task471-2026-05-21/`
|
|
||||||
|
|
||||||
必须输出:
|
|
||||||
|
|
||||||
- `result.json`
|
|
||||||
- `final.md`
|
|
||||||
- 至少 1 张截图;失败时必须截图。
|
|
||||||
|
|
||||||
## 判定
|
|
||||||
|
|
||||||
- `PASS`:语法检查和 smoke 实跑 exit 0,stdout 显示 `ok:true`,并有截图或 JSON 证据证明 bulk delete 状态。
|
|
||||||
- `FAIL`:脚本退出非 0 或关键断言失败。
|
|
||||||
- `BLOCKED`:3000 不可达或浏览器无法启动。
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
# Reasonix Browser Test: Batch A task473 Local Folder Restore No-refresh Focus Gap
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
请先阅读并遵守:`/home/lix/.codex/skills/reasonix-browser-tester/SKILL.md`
|
|
||||||
|
|
||||||
## 角色
|
|
||||||
|
|
||||||
你是浏览器测试员,不是代码修改员。
|
|
||||||
|
|
||||||
禁止修改源码、禁止 git commit、禁止回滚文件。只允许创建测试输出目录、临时测试数据和截图。
|
|
||||||
|
|
||||||
## 测试目标
|
|
||||||
|
|
||||||
验证新增 `task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js` 的 local folder trash restore no-refresh 行为,并确认 restore 后 focus/active/selected 仍是明确缺口。
|
|
||||||
|
|
||||||
## 前置
|
|
||||||
|
|
||||||
- 被测入口:`http://127.0.0.1:3000`
|
|
||||||
- 使用真实浏览器或 Playwright。
|
|
||||||
- 使用全新的 isolated browser context / userDataDir;测试开始前清空 cookies、localStorage、sessionStorage、IndexedDB、Cache Storage。
|
|
||||||
|
|
||||||
## 操作
|
|
||||||
|
|
||||||
1. 运行:`node --check scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js`
|
|
||||||
2. 运行:`node scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js`
|
|
||||||
3. 读取 `tmp/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke/result.json`。
|
|
||||||
4. 截图 local folder trash workbench 或复现流程中的 filetree 恢复后状态。
|
|
||||||
5. 记录:
|
|
||||||
- `restoreNavFree.delta`
|
|
||||||
- `fileReappearsInFiletree`
|
|
||||||
- `focusAfterRestore`
|
|
||||||
- 步骤 9 是否显示 `data-active=false` / `data-selected=false`
|
|
||||||
|
|
||||||
## 输出目录
|
|
||||||
|
|
||||||
`/mnt/Data1T/mnote/tmp/reasonix-batch-a-browser-task473-2026-05-21/`
|
|
||||||
|
|
||||||
必须输出:
|
|
||||||
|
|
||||||
- `result.json`
|
|
||||||
- `final.md`
|
|
||||||
- 至少 1 张截图;失败时必须截图。
|
|
||||||
|
|
||||||
## 判定
|
|
||||||
|
|
||||||
- `PASS_WITH_KNOWN_GAP`:语法检查和 smoke 实跑 exit 0,`result.json.ok=true`,`restoreNavFree.delta=0`,文件行恢复,但 `focusAfterRestore` 显示没有 active/selected/focused。
|
|
||||||
- `FAIL`:脚本退出非 0 或 no-refresh / 文件恢复断言失败。
|
|
||||||
- `BLOCKED`:3000 不可达或浏览器无法启动。
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
# Reasonix Browser Test: Batch A2 task473 Local Folder Restore Focus Closed
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
请先阅读并遵守:`/home/lix/.codex/skills/reasonix-browser-tester/SKILL.md`
|
|
||||||
|
|
||||||
## 角色
|
|
||||||
|
|
||||||
你是浏览器测试员,不是代码修改员。
|
|
||||||
|
|
||||||
禁止修改源码、禁止 git commit、禁止回滚文件。只允许创建测试输出目录、临时测试数据、截图和测试结果文件。
|
|
||||||
|
|
||||||
## 测试目标
|
|
||||||
|
|
||||||
验证 `task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js` 在当前最新 `mnote-web` 上已经关闭 local folder trash restore focus gap:
|
|
||||||
|
|
||||||
- restore 不触发浏览器 reload / navigation。
|
|
||||||
- restore 后文件恢复到原路径。
|
|
||||||
- 回到 filetree 后恢复行重新出现。
|
|
||||||
- 恢复行最终出现 focus 证据:`data-active="true"` 或 `data-selected="true"` 或 `data-focused="true"`。
|
|
||||||
|
|
||||||
## 前置
|
|
||||||
|
|
||||||
- 被测入口:`http://127.0.0.1:3012`
|
|
||||||
- 3012 是 Codex 为本轮验证启动的最新 mnote-web 临时进程。
|
|
||||||
- 使用真实浏览器或 Playwright。
|
|
||||||
- 使用全新的 isolated browser context / userDataDir;测试开始前清空 cookies、localStorage、sessionStorage、IndexedDB、Cache Storage。
|
|
||||||
|
|
||||||
## 操作
|
|
||||||
|
|
||||||
1. 运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /mnt/Data1T/mnote
|
|
||||||
node --check scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js
|
|
||||||
MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3012 PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
2. 读取 `tmp/task473-local-folder-trash-restore-no-refresh-focus-gap-smoke/result.json`。
|
|
||||||
3. 截图恢复后 filetree 状态,截图中应能看到恢复行或至少 filetree 区域。
|
|
||||||
4. 记录:
|
|
||||||
- `ok`
|
|
||||||
- `restoreNavFree.delta`
|
|
||||||
- `fileReappearsInFiletree`
|
|
||||||
- `focusAfterRestore`
|
|
||||||
- `restoreFocusDebug.focusStatusAfterFiletreeLoad`
|
|
||||||
|
|
||||||
## 输出目录
|
|
||||||
|
|
||||||
`/mnt/Data1T/mnote/tmp/reasonix-batch-a2-browser-task473-focus-closed-2026-05-21/`
|
|
||||||
|
|
||||||
必须输出:
|
|
||||||
|
|
||||||
- `result.json`
|
|
||||||
- `final.md`
|
|
||||||
- 至少 1 张截图;失败时必须截图。
|
|
||||||
|
|
||||||
## 判定
|
|
||||||
|
|
||||||
- `PASS`:语法检查和 smoke 实跑 exit 0,`result.json.ok=true`,`restoreNavFree.delta=0`,文件行恢复,且 `focusAfterRestore` 显示至少一个 active/selected/focused 证据为 true。
|
|
||||||
- `FAIL`:脚本退出非 0,或 no-refresh / 文件恢复 / focus 断言失败。
|
|
||||||
- `BLOCKED`:3012 不可达或浏览器无法启动。
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
# Reasonix Browser Test: Batch A3 task474 Local Folder Empty Trash UI
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
请先阅读并遵守:`/home/lix/.codex/skills/reasonix-browser-tester/SKILL.md`
|
|
||||||
|
|
||||||
## 角色
|
|
||||||
|
|
||||||
你是浏览器测试员,不是代码修改员。
|
|
||||||
|
|
||||||
禁止修改源码、禁止 git commit、禁止回滚文件。只允许创建测试输出目录、临时测试数据、截图和测试结果文件。
|
|
||||||
|
|
||||||
## 测试目标
|
|
||||||
|
|
||||||
验证 `task474-local-folder-empty-trash-ui-smoke.js` 在当前最新 `mnote-web` 上覆盖 local folder 垃圾箱清空 UI:
|
|
||||||
|
|
||||||
- 清空页面垃圾箱按钮可点击并触发 confirm。
|
|
||||||
- 清空后 Markdown trash row 消失。
|
|
||||||
- 清空资源垃圾箱按钮可点击并触发 confirm。
|
|
||||||
- 清空后资源 trash row 消失。
|
|
||||||
- 两次清空操作都不触发非预期 main frame navigation。
|
|
||||||
- `trash-index.json` 最终为空,trash 文件已删除。
|
|
||||||
|
|
||||||
## 前置
|
|
||||||
|
|
||||||
- 被测入口:`http://127.0.0.1:3014`
|
|
||||||
- 3014 是 Codex 为本轮验证启动的最新 mnote-web 临时进程。
|
|
||||||
- 使用真实浏览器或 Playwright。
|
|
||||||
- 使用全新的 isolated browser context / userDataDir;测试开始前清空 cookies、localStorage、sessionStorage、IndexedDB、Cache Storage。
|
|
||||||
|
|
||||||
## 操作
|
|
||||||
|
|
||||||
1. 运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /mnt/Data1T/mnote
|
|
||||||
node --check scripts/task474-local-folder-empty-trash-ui-smoke.js
|
|
||||||
MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3014 PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable MNOTE_KEEP_SMOKE_TMP=1 node scripts/task474-local-folder-empty-trash-ui-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
2. 读取 `tmp/task474-local-folder-empty-trash-ui-smoke/result.json`。
|
|
||||||
3. 打开 result 中的 `root` 对应 `/trash?sourceKind=local_folder&rootUri=file://...` 页面,截图清空后的 trash workbench 状态。
|
|
||||||
4. 记录:
|
|
||||||
- `ok`
|
|
||||||
- `emptyDocuments.navDelta`
|
|
||||||
- `emptyResources.navDelta`
|
|
||||||
- `emptyDocuments.mdEntryClean`
|
|
||||||
- `emptyResources.assetEntryClean`
|
|
||||||
- `steps.length`
|
|
||||||
- 最终页面是否显示页面垃圾箱 / 资源垃圾箱为空状态或对应按钮 disabled
|
|
||||||
|
|
||||||
## 输出目录
|
|
||||||
|
|
||||||
`/mnt/Data1T/mnote/tmp/reasonix-batch-a3-browser-task474-empty-trash-2026-05-21/`
|
|
||||||
|
|
||||||
必须输出:
|
|
||||||
|
|
||||||
- `result.json`
|
|
||||||
- `final.md`
|
|
||||||
- 至少 1 张截图;失败时必须截图。
|
|
||||||
|
|
||||||
## 判定
|
|
||||||
|
|
||||||
- `PASS`:语法检查和 smoke 实跑 exit 0,`result.json.ok=true`,两个 navDelta 都为 0,页面与资源 entry 均清理,且截图显示清空后的 trash workbench。
|
|
||||||
- `FAIL`:脚本退出非 0,或 no-navigation / entry 清理 / UI 清空断言失败。
|
|
||||||
- `BLOCKED`:3014 不可达或浏览器无法启动。
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
你是浏览器测试员,不是代码修改员。
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
被测入口:`http://127.0.0.1:3000`
|
|
||||||
输出目录:`/mnt/Data1T/mnote/tmp/reasonix-filetree-editor-context-menu-2026-05-21`
|
|
||||||
|
|
||||||
## 硬性约束
|
|
||||||
|
|
||||||
- 禁止修改源码、禁止 git commit、禁止回滚文件。
|
|
||||||
- 使用真实浏览器或 Playwright 验证。
|
|
||||||
- 使用全新的 isolated browser context / userDataDir;测试开始前清空 cookies、localStorage、sessionStorage、IndexedDB 和 Cache Storage。
|
|
||||||
- 所有截图和 `result.json` 写入输出目录。
|
|
||||||
- 失败时保留 console/network 摘要。
|
|
||||||
- 最终只汇报测试证据,不提出未经验证的代码结论。
|
|
||||||
|
|
||||||
## 登录
|
|
||||||
|
|
||||||
- 打开 `/auth`。
|
|
||||||
- 优先点击“测试账号快速登录”。
|
|
||||||
- 默认测试账号:`mnote.e2e@example.com` / `MnoteE2E123!`。
|
|
||||||
|
|
||||||
## 测试目标
|
|
||||||
|
|
||||||
验证当前 MNote 的:
|
|
||||||
|
|
||||||
1. 文件树右键菜单实际显示哪些动作,尤其是文件/asset 行是否有“下载”。
|
|
||||||
2. 文件树右键菜单点击后是否有可观测状态变化:
|
|
||||||
- `data-mnote-filetree-last-action`
|
|
||||||
- `data-mnote-filetree-last-action-status`
|
|
||||||
- `data-mnote-filetree-readonly-blocked`
|
|
||||||
- 是否发生新 tab / 下载 / network 请求。
|
|
||||||
3. 主编辑器附件 hover 菜单与更多菜单:
|
|
||||||
- hover 附件后是否出现 `[data-testid="mnote-attachment-actions"]`。
|
|
||||||
- 点击更多菜单后是否出现 `[data-testid="mnote-tree-context-menu"][data-kind="attachment"]`。
|
|
||||||
- attachment 菜单是否有“下载 / 弹窗预览 / 弹窗编辑 / 新窗口编辑”等动作。
|
|
||||||
|
|
||||||
## 推荐操作步骤
|
|
||||||
|
|
||||||
1. 打开主页面或任意 `/documents/...` 页面,确保侧边栏和文件树可见。
|
|
||||||
2. 如果当前没有明显文件/asset 行,可上传或使用页面内已有附件;也可以创建一个临时 `.txt` / `.md` / `.docx` 资源,但必须记录文件名。
|
|
||||||
3. 右键文件树中的 page/document 行,截图菜单并记录所有 menu item 文案与 `data-action`。
|
|
||||||
4. 右键文件树中的 asset/resource 文件行,截图菜单并记录所有 menu item 文案与 `data-action`;重点确认是否有 `download`。
|
|
||||||
5. 如菜单里有“下载”,点击并记录 download 事件或 network;如没有,标记为 `FAIL:filetree_asset_download_action_missing`。
|
|
||||||
6. 在主编辑器找到附件块或上传一个小附件,hover 后截图附件 hover actions。
|
|
||||||
7. 点击附件 hover actions 的更多按钮,截图 attachment context menu 并记录 actions。
|
|
||||||
|
|
||||||
## result.json 格式
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"ok": false,
|
|
||||||
"url": "",
|
|
||||||
"assertions": [
|
|
||||||
{"name": "filetree_doc_context_menu_visible", "status": "pass|fail|blocked", "details": ""},
|
|
||||||
{"name": "filetree_asset_context_menu_visible", "status": "pass|fail|blocked", "details": ""},
|
|
||||||
{"name": "filetree_asset_download_action", "status": "pass|fail|blocked", "details": ""},
|
|
||||||
{"name": "editor_attachment_hover_actions", "status": "pass|fail|blocked", "details": ""},
|
|
||||||
{"name": "editor_attachment_context_menu", "status": "pass|fail|blocked", "details": ""}
|
|
||||||
],
|
|
||||||
"menus": {
|
|
||||||
"filetreeDocument": [],
|
|
||||||
"filetreeAsset": [],
|
|
||||||
"editorAttachment": []
|
|
||||||
},
|
|
||||||
"screenshots": [],
|
|
||||||
"consoleErrors": [],
|
|
||||||
"networkFailures": [],
|
|
||||||
"downloads": []
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终回复
|
|
||||||
|
|
||||||
请只汇报:
|
|
||||||
|
|
||||||
- `result.json` 路径
|
|
||||||
- 截图路径
|
|
||||||
- 每个断言的 pass/fail/blocked
|
|
||||||
- 关键失败证据
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
# Reasonix Browser Tester:Office 只读打开、编辑入口与插件噪音验证
|
|
||||||
|
|
||||||
你是浏览器测试员,不是代码修改员。
|
|
||||||
|
|
||||||
禁止修改源码、禁止 git commit、禁止回滚文件。使用真实浏览器或 Playwright 验证。所有截图和 `result.json` 写入指定输出目录。失败时保留 console/network 摘要。最终只汇报测试证据,不提出未经验证的代码结论。
|
|
||||||
|
|
||||||
## Project Root
|
|
||||||
|
|
||||||
`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 输出目录
|
|
||||||
|
|
||||||
`/mnt/Data1T/mnote/tmp/reasonix-office-view-edit-plugin-2026-05-21`
|
|
||||||
|
|
||||||
## 前置
|
|
||||||
|
|
||||||
- 被测入口:`http://127.0.0.1:3000`
|
|
||||||
- 使用全新的 isolated browser context / userDataDir。
|
|
||||||
- 测试开始前清空 cookies、localStorage、sessionStorage、IndexedDB、Cache Storage。
|
|
||||||
- 默认登录:访问 `/auth`,点击“测试账号快速登录”;如失败,使用邮箱 `mnote.e2e@example.com`、密码 `MnoteE2E123!`。
|
|
||||||
- 测试文件:`/home/lix/Downloads/重庆发展特殊化妆品可行性报告_政府汇报版.docx`
|
|
||||||
|
|
||||||
## 测试目标
|
|
||||||
|
|
||||||
1. 上传该 docx 后,默认打开到主编辑器右侧 resource tab,而不是浏览器 popup。
|
|
||||||
2. 默认 OnlyOffice 是只读/view 模式。
|
|
||||||
3. 三点菜单或右键菜单存在“使用编辑模式打开”入口。
|
|
||||||
4. 点击编辑入口后,记录 guard 或 `mode=edit` 的可观察证据。
|
|
||||||
5. 记录 `/api/media/sign` 对 local asset 是否还出现 404。
|
|
||||||
6. 记录 annotation/plugin 404/pageerror 是否存在;如果存在,判断是否影响主文档可见渲染。
|
|
||||||
|
|
||||||
## PASS 标准
|
|
||||||
|
|
||||||
- 截图必须显示 OnlyOffice 文档内容区或明确的 OnlyOffice 编辑器界面。
|
|
||||||
- `errorCode=-18`、WebSocket handshake failed、polling failed、连接失败、主 iframe 空白必须标记 FAIL/BLOCKED。
|
|
||||||
- 插件 404 只有在主文档已渲染且 WebSocket 正常时,才可标记为 non-critical。
|
|
||||||
|
|
||||||
## 输出格式
|
|
||||||
|
|
||||||
写入 `result.json`,至少包含:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"status": "PASS|FAIL|BLOCKED",
|
|
||||||
"steps": [],
|
|
||||||
"assertions": [],
|
|
||||||
"screenshots": [],
|
|
||||||
"consoleErrors": [],
|
|
||||||
"networkFailures": [],
|
|
||||||
"onlyoffice": {
|
|
||||||
"iframeSrc": "",
|
|
||||||
"modeEvidence": "",
|
|
||||||
"documentKeyEvidence": "",
|
|
||||||
"mediaSignLocal404": false,
|
|
||||||
"plugin404NonCritical": null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
同时输出简短 `final.md`,列出复现步骤、观察结果和截图路径。
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
# Reasonix Browser Test: Tab / Office / Upload Bugs
|
|
||||||
|
|
||||||
项目根目录:`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
请先阅读并遵守:`/home/lix/.codex/skills/reasonix-browser-tester/SKILL.md`
|
|
||||||
|
|
||||||
## 角色
|
|
||||||
|
|
||||||
你是独立浏览器测试员,不是代码修改员。
|
|
||||||
|
|
||||||
禁止修改源码、禁止 git commit、禁止回滚文件。只允许创建测试输出目录、临时测试数据和截图。
|
|
||||||
|
|
||||||
## 测试目标
|
|
||||||
|
|
||||||
验证以下 MNote UI 行为是否真实存在,并输出可复核证据:
|
|
||||||
|
|
||||||
1. 在主 resource tab 打开时,点击左侧文件树中的主 Markdown 页面,是否能切回 page tab。
|
|
||||||
2. 点击左侧“新建页面”后,是否能切到新页面的主 Markdown page tab;文件树焦点/选中是否落在新建页面。
|
|
||||||
3. 上传并打开真实文件:
|
|
||||||
`/home/lix/Downloads/重庆发展特殊化妆品可行性报告_政府汇报版.docx`
|
|
||||||
验证是否进入主 resource tab、是否出现 `/onlyoffice` iframe、是否出现错误提示或卡死。
|
|
||||||
4. 观察上传中文文件名时浏览器是否卡死;记录 console、network、页面是否还能响应。
|
|
||||||
|
|
||||||
## 建议测试方式
|
|
||||||
|
|
||||||
- 默认入口:`http://127.0.0.1:3000`
|
|
||||||
- 使用 Playwright/Chrome。
|
|
||||||
- 优先使用 local-first 临时 workspace:
|
|
||||||
- 创建临时 root。
|
|
||||||
- 写入 `.mnote/workspace.json`。
|
|
||||||
- 创建 `Alpha.md`、`Beta.md` 等测试页面。
|
|
||||||
- 可通过 `/auth` 的“测试账号快速登录”登录。
|
|
||||||
|
|
||||||
## 断言证据
|
|
||||||
|
|
||||||
请记录:
|
|
||||||
|
|
||||||
- 当前 URL。
|
|
||||||
- `.mnote-main-tab.is-active` 的文本、`data-mnote-main-tab`、`data-mnote-tab-kind`。
|
|
||||||
- `[data-mnote-main-tab="page"]` 是否 active。
|
|
||||||
- 左侧 filetree 行的 `data-selected` / `data-focused` / `data-active`。
|
|
||||||
- Office iframe `src`。
|
|
||||||
- 上传 API 响应状态和 body。
|
|
||||||
- console error/warning。
|
|
||||||
- network failed 请求。
|
|
||||||
|
|
||||||
## 输出目录
|
|
||||||
|
|
||||||
写入:
|
|
||||||
|
|
||||||
`/mnt/Data1T/mnote/tmp/reasonix-browser-test-2026-05-21-tab-office-upload/`
|
|
||||||
|
|
||||||
必须输出:
|
|
||||||
|
|
||||||
- `result.json`
|
|
||||||
- `final.md`
|
|
||||||
- 至少 3 张截图:切换前 resource tab、点击 md 后状态、docx 打开状态。失败时额外截图。
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
只汇报:
|
|
||||||
|
|
||||||
- 输出目录。
|
|
||||||
- 每个测试目标 pass/fail。
|
|
||||||
- 关键失败证据。
|
|
||||||
- 未能验证的原因。
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
# Reasonix Worker A:design 01/02/03 审查
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
审查以下范围内的 `process/` 文档,判断哪些应继续执行、哪些应标为参考、哪些应归档到 `done/` 或 `old/process/`:
|
|
||||||
|
|
||||||
- `design/01-tree-first-graph-kernel/process/`
|
|
||||||
- `design/02-convex-rust-long-term-architecture/process/`
|
|
||||||
- `design/03-rust-web/process/`
|
|
||||||
|
|
||||||
## 当前统一口径
|
|
||||||
|
|
||||||
MNote 已进入 local-first MVP 后阶段。本地 workspace folder 是默认数据真相,本地 `.md` 是页面正文真相,Rust kernel / projection / command 持有语义,`mnote-web` 是 3000 主入口,Convex 只是 auth/share/sync/ACP/cloud/compat 控制面。旧 Next / BlockNote / Convex 默认主存储口径只能作为 legacy / compat 背景。
|
|
||||||
|
|
||||||
## 只读要求
|
|
||||||
|
|
||||||
- 不要移动、修改或删除 `design/` 文件。
|
|
||||||
- 只创建或更新你的报告文件:`.codex/reasonix-tasks/results/design-governance-worker-a-01-03.md`。
|
|
||||||
- 不要提交 git,不要回滚任何文件。
|
|
||||||
|
|
||||||
## 审查输出格式
|
|
||||||
|
|
||||||
对每个 process 文档给出:
|
|
||||||
|
|
||||||
```text
|
|
||||||
文件:
|
|
||||||
建议状态:keep-process | mark-process-reference | archive-done | archive-old-process | needs-human-confirmation
|
|
||||||
证据:
|
|
||||||
归档/保留原因:
|
|
||||||
建议补充说明:
|
|
||||||
```
|
|
||||||
|
|
||||||
重点检查:
|
|
||||||
|
|
||||||
- 是否仍用旧 Convex 默认存储 / Next 主入口 / BlockNote 默认编辑器口径。
|
|
||||||
- 是否已被 `design/01-05-current-priority-overview.md`、`ARCHITECTURE.md`、`CURRENT_ARCHITECTURE.md` 或同域 done 文档覆盖。
|
|
||||||
- 若建议 `archive-done`,必须指出文档内或仓库中可见的完成证据。
|
|
||||||
- 若建议 `archive-old-process`,必须指出覆盖它的新文档。
|
|
||||||
|
|
||||||
## 验证命令
|
|
||||||
|
|
||||||
可运行只读命令:
|
|
||||||
|
|
||||||
- `find design/01-tree-first-graph-kernel/process design/02-convex-rust-long-term-architecture/process design/03-rust-web/process -maxdepth 1 -type f -name '*.md' | sort`
|
|
||||||
- `rg -n "Convex|Next|BlockNote|MVP|当前状态|状态|待完成|未完成|已完成|smoke|done|process" <files>`
|
|
||||||
|
|
||||||
最终回复只说明报告路径和最高风险项。
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
# Reasonix Worker B:design 04 tree-domain 审查
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
审查 `design/04-tree-domain/process/` 下所有 process 文档,判断哪些仍需继续执行,哪些已经可归档到 `done/`,哪些应降级到 `old/process/`。
|
|
||||||
|
|
||||||
## 当前统一口径
|
|
||||||
|
|
||||||
MNote 已进入 local-first MVP 后阶段。树域长期口径是 Resource Tree -> File Tree -> Page Tree,Rust kernel / projection / command 是语义 owner。新增能力优先走 `tree.*` / `tree.resource.*`,文件树不能重新制造第二份资源真相。旧 Convex 主存储口径只作为 compat/cloud 背景。
|
|
||||||
|
|
||||||
## 只读要求
|
|
||||||
|
|
||||||
- 不要移动、修改或删除 `design/` 文件。
|
|
||||||
- 只创建或更新你的报告文件:`.codex/reasonix-tasks/results/design-governance-worker-b-04-tree.md`。
|
|
||||||
- 不要提交 git,不要回滚任何文件。
|
|
||||||
|
|
||||||
## 审查输出格式
|
|
||||||
|
|
||||||
对每个 process 文档给出:
|
|
||||||
|
|
||||||
```text
|
|
||||||
文件:
|
|
||||||
建议状态:keep-process | mark-process-reference | archive-done | archive-old-process | needs-human-confirmation
|
|
||||||
证据:
|
|
||||||
归档/保留原因:
|
|
||||||
建议补充说明:
|
|
||||||
```
|
|
||||||
|
|
||||||
重点检查:
|
|
||||||
|
|
||||||
- `4-27` 到 `4-45` 是否已被近期 bug done、smoke 或代码改动覆盖。
|
|
||||||
- open target、trash、resource lifecycle、bulk delete、download、drop upload、open editors lifecycle 是否仍有未完成项。
|
|
||||||
- 若建议 `archive-done`,必须指出对应 done bug/smoke 或文件内完成证据。
|
|
||||||
- 若证据只来自当前未提交文件,标明“依赖未提交变更”,不要直接判定已稳定。
|
|
||||||
|
|
||||||
## 验证命令
|
|
||||||
|
|
||||||
可运行只读命令:
|
|
||||||
|
|
||||||
- `find design/04-tree-domain/process -maxdepth 1 -type f -name '*.md' | sort`
|
|
||||||
- `rg -n "状态|待完成|未完成|已完成|smoke|task|bugs/04|tree.resource|download|drop|open target|trash|bulk" design/04-tree-domain/process bugs/04-tree-domain scripts`
|
|
||||||
|
|
||||||
最终回复只说明报告路径和最高风险项。
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
# Reasonix Worker C:design 05/06/08/09 审查
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
审查以下范围内的 process 文档:
|
|
||||||
|
|
||||||
- `design/05-editor-mainline/process/`
|
|
||||||
- `design/06-mindmap/process/`
|
|
||||||
- `design/08-wolai-aline-test-flow/process/`
|
|
||||||
- `design/09-siyuan-reference/process/`
|
|
||||||
|
|
||||||
判断哪些仍需继续执行,哪些应归档到 `done/`,哪些应降级到 `old/process/`,哪些只应标为参考流程。
|
|
||||||
|
|
||||||
## 当前统一口径
|
|
||||||
|
|
||||||
MNote 已进入 local-first MVP 后阶段。文档页默认主编辑器是 `leptos-tiptap` island,但本地 `.md` 才是正文真相。主编辑器 tab / resource open / OnlyOffice / mindmap 都应服从 Resource Tree 和 Page Aggregate,不恢复 BlockNote 或 Next App Router 主链。
|
|
||||||
|
|
||||||
## 只读要求
|
|
||||||
|
|
||||||
- 不要移动、修改或删除 `design/` 文件。
|
|
||||||
- 只创建或更新你的报告文件:`.codex/reasonix-tasks/results/design-governance-worker-c-05-06-08-09.md`。
|
|
||||||
- 不要提交 git,不要回滚任何文件。
|
|
||||||
|
|
||||||
## 审查输出格式
|
|
||||||
|
|
||||||
对每个 process 文档给出:
|
|
||||||
|
|
||||||
```text
|
|
||||||
文件:
|
|
||||||
建议状态:keep-process | mark-process-reference | archive-done | archive-old-process | needs-human-confirmation
|
|
||||||
证据:
|
|
||||||
归档/保留原因:
|
|
||||||
建议补充说明:
|
|
||||||
```
|
|
||||||
|
|
||||||
重点检查:
|
|
||||||
|
|
||||||
- `5-15` 到 `5-26` 是否仍是当前 tab/resource/OnlyOffice/mindmap 主执行清单,还是已被近期代码和 smoke 覆盖。
|
|
||||||
- `5-2 / 5-7 / 5-9` 是否仍应保留为 Wolai/tiptap 体验持续参考,而非当前执行 checklist。
|
|
||||||
- `06-mindmap` 是否有已完成项应进入 done,是否仍有内核化/adapter 未完成。
|
|
||||||
- `08-wolai` 和 `09-siyuan` 是否应保持 process 作为流程/参考,还是需要改为 reference/done。
|
|
||||||
|
|
||||||
## 验证命令
|
|
||||||
|
|
||||||
可运行只读命令:
|
|
||||||
|
|
||||||
- `find design/05-editor-mainline/process design/06-mindmap/process design/08-wolai-aline-test-flow/process design/09-siyuan-reference/process -maxdepth 1 -type f -name '*.md' | sort`
|
|
||||||
- `rg -n "BlockNote|Next|leptos|tiptap|OnlyOffice|mindmap|tab|resource|状态|待完成|未完成|已完成|smoke|task" design/05-editor-mainline/process design/06-mindmap/process design/08-wolai-aline-test-flow/process design/09-siyuan-reference/process bugs scripts`
|
|
||||||
|
|
||||||
最终回复只说明报告路径和最高风险项。
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
# Reasonix Worker D:design 07/10 审查
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
审查以下范围内的 process 文档:
|
|
||||||
|
|
||||||
- `design/07-ai/process/`
|
|
||||||
- `design/10-review/process/`
|
|
||||||
|
|
||||||
判断哪些仍需继续执行,哪些应归档到 `done/`,哪些应降级到 `old/process/`,哪些只应保留为参考审查。
|
|
||||||
|
|
||||||
## 当前统一口径
|
|
||||||
|
|
||||||
MNote 已进入 local-first MVP 后阶段。local-first 普通 Markdown 编辑主路径是 `currentFile + selection + allowedRoots / aiAccessScope + agent 原生 patch/diff + watcher 同步`。`mnote.doc.*` / `mnote.block.*` 是 cloud、remote、compat 或复杂结构辅助。Hermes/Reasonix 是 agent runtime;不要恢复 page-ai fast-path 或 BlockNote AI 主链作为默认方向。
|
|
||||||
|
|
||||||
## 只读要求
|
|
||||||
|
|
||||||
- 不要移动、修改或删除 `design/` 文件。
|
|
||||||
- 只创建或更新你的报告文件:`.codex/reasonix-tasks/results/design-governance-worker-d-07-10.md`。
|
|
||||||
- 不要提交 git,不要回滚任何文件。
|
|
||||||
|
|
||||||
## 审查输出格式
|
|
||||||
|
|
||||||
对每个 process 文档给出:
|
|
||||||
|
|
||||||
```text
|
|
||||||
文件:
|
|
||||||
建议状态:keep-process | mark-process-reference | archive-done | archive-old-process | needs-human-confirmation
|
|
||||||
证据:
|
|
||||||
归档/保留原因:
|
|
||||||
建议补充说明:
|
|
||||||
```
|
|
||||||
|
|
||||||
重点检查:
|
|
||||||
|
|
||||||
- `7-10 / 7-12 / 7-14 / 7-15 / 7-16 / 7-17 / 7-27` 是否仍代表活跃 AI 主线,或已被 local-first 文件编辑与 ACP runtime 完成态覆盖。
|
|
||||||
- `7-30` 到 `7-33` 是否是当前 ACP session 后续产品化 checklist。
|
|
||||||
- `10-review/process/12-14` 是否已被后续执行/bug 修复覆盖,应归档到 done 或保留为 gap review。
|
|
||||||
- 标出任何仍把 `mnote.doc.markdown_edit`、`page-ai/block-edit-workflow`、BlockNote AI 或 Convex session 全文当默认主路径的段落。
|
|
||||||
|
|
||||||
## 验证命令
|
|
||||||
|
|
||||||
可运行只读命令:
|
|
||||||
|
|
||||||
- `find design/07-ai/process design/10-review/process -maxdepth 1 -type f -name '*.md' | sort`
|
|
||||||
- `rg -n "mnote\\.doc|mnote\\.block|page-ai|block-edit-workflow|BlockNote|Hermes|Reasonix|ACP|Convex|状态|待完成|未完成|已完成|smoke|task" design/07-ai/process design/10-review/process bugs scripts`
|
|
||||||
|
|
||||||
最终回复只说明报告路径和最高风险项。
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
你是浏览器测试员,不是代码修改员。
|
|
||||||
禁止修改源码、禁止 git commit、禁止回滚文件。
|
|
||||||
使用真实浏览器或 Playwright 验证。
|
|
||||||
所有截图和 result.json 写入指定输出目录。
|
|
||||||
失败时保留 console/network 摘要。
|
|
||||||
最终只汇报测试证据,不提出未经验证的代码结论。
|
|
||||||
|
|
||||||
# Reasonix 浏览器测试任务:Office 中文 docx 上传并打开
|
|
||||||
|
|
||||||
## 输出目录
|
|
||||||
|
|
||||||
`/mnt/Data1T/mnote/tmp/reasonix-office-upload-open-clean-2026-05-21/`
|
|
||||||
|
|
||||||
## 测试入口
|
|
||||||
|
|
||||||
- URL: `http://127.0.0.1:3000`
|
|
||||||
- 登录:访问 `/auth`,点击“测试账号快速登录”
|
|
||||||
- 必须使用全新 isolated browser context / userDataDir。
|
|
||||||
- 测试开始前清空 cookies、localStorage、sessionStorage、IndexedDB、Cache Storage。
|
|
||||||
|
|
||||||
## 测试文件
|
|
||||||
|
|
||||||
上传真实文件:
|
|
||||||
|
|
||||||
`/home/lix/Downloads/重庆发展特殊化妆品可行性报告_政府汇报版.docx`
|
|
||||||
|
|
||||||
## 测试步骤
|
|
||||||
|
|
||||||
1. 创建临时 local-first workspace,至少包含 `Alpha.md` 和 `.mnote/workspace.json`。
|
|
||||||
2. 打开 `Alpha.md` 页面。
|
|
||||||
3. 上传上述 docx 到当前页面,记录上传 API 状态、耗时、返回 asset。
|
|
||||||
4. 点击或派发真实 UI 等价操作打开该 docx 附件到主编辑器资源 tab。
|
|
||||||
5. 等待 OnlyOffice iframe 内部进入稳定状态,最长 90 秒。
|
|
||||||
6. 截图最终打开效果,截图必须显示以下之一:
|
|
||||||
- Office 文档内容区 / 编辑器 UI 已可见。
|
|
||||||
- 明确的 OnlyOffice 错误面板或连接失败信息。
|
|
||||||
7. 记录 console errors、failed requests、OnlyOffice WebSocket / polling URL。
|
|
||||||
8. 检查 WebSocket / polling URL 的 doc key 是否为安全 key,不包含 `/`、`:`、中文字符。
|
|
||||||
|
|
||||||
## 判定规则
|
|
||||||
|
|
||||||
- `PASS` 不能只因为 upload 200、resource tab active 或 iframe 存在。
|
|
||||||
- 如果出现 `errorCode=-18`、`连接失败`、WebSocket handshake failed、polling failed,标记为 `FAIL` 或 `BLOCKED`,并截图。
|
|
||||||
- 如果页面上传后卡死、刷新后无法恢复、需要重新登录,标记为 `FAIL`。
|
|
||||||
- 如果 DocumentServer 未运行或代理不可达,标记为 `BLOCKED`,并记录服务状态和网络错误。
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
- `result.json`:
|
|
||||||
- `overallStatus`: `pass` / `fail` / `blocked`
|
|
||||||
- `freshContext`: 是否使用全新上下文并清空缓存
|
|
||||||
- `upload`: status、elapsedMs、asset
|
|
||||||
- `open`: tabKind、iframeSrc、officeReady、visibleTextOrError
|
|
||||||
- `onlyofficeNetwork`: websocketUrls、pollingUrls、failedRequests
|
|
||||||
- `docKeySafety`: safe、observedKeys、unsafeReasons
|
|
||||||
- `screenshots`: 最终截图路径
|
|
||||||
- `final.md`:简要步骤、观察、结论、截图路径。
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
# Reasonix Worker A:Sidex Open Editors 轻量视图
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
参考 `reference-code/sidex-main` 的 VSCode `OpenEditorsView`,实现 MNote 轻量 open editors snapshot。优先让 page tab + resource tabs 的状态可被统一读取和测试;只有在非常小范围可控时才新增轻量 UI。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你可以修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
||||||
- `rust/crates/mnote-web/src/ssr/styles.rs`
|
|
||||||
- 可新增 `scripts/task47*-open-editors-*.js`
|
|
||||||
- `design/05-editor-mainline/process/5-24-open-editors-lightweight-view-checklist-v1.md`
|
|
||||||
|
|
||||||
不要修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/onlyoffice.rs`
|
|
||||||
- ACP / Hermes 相关文件
|
|
||||||
|
|
||||||
## 参考
|
|
||||||
|
|
||||||
- Sidex:`OpenEditorsView`、`IEditorGroupsService`、`GroupModelChangeKind`
|
|
||||||
- MNote:`resourceTabRegistry`、`activateMainEditorTab`、`createResourceTabDom`、`closeResourceTab`
|
|
||||||
|
|
||||||
## 验收
|
|
||||||
|
|
||||||
- `cargo test -p mnote-web web_shell -- --test-threads=1`
|
|
||||||
- 如新增 smoke,运行对应 `node --check` 和 `node` 命令
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
最终回复列出:
|
|
||||||
|
|
||||||
- 修改文件
|
|
||||||
- 实现的 snapshot/UI 合同
|
|
||||||
- 验证命令结果
|
|
||||||
- 未完成项和风险
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
# Reasonix Worker B:Sidex Tab 键盘与 MRU 对照实现
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
参考 Sidex / VSCode `MultiEditorTabsControl`,为 MNote main tab 增加最小键盘/MRU 行为:左右箭头切换 focus、`Enter`/`Space` 激活、关闭 active resource tab 后按 MRU 或 page tab 回退。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
由于 Worker A 也可能修改 `web_shell.rs`,本 worker **不要直接修改源码**。请输出具体 patch 建议到:
|
|
||||||
|
|
||||||
- `.codex/reasonix-proposals/2026-05-21-tab-keyboard-mru-proposal.md`
|
|
||||||
|
|
||||||
你可以修改:
|
|
||||||
|
|
||||||
- `.codex/reasonix-proposals/2026-05-21-tab-keyboard-mru-proposal.md`
|
|
||||||
- `design/05-editor-mainline/process/5-25-editor-tab-keyboard-and-mru-checklist-v1.md`
|
|
||||||
|
|
||||||
不要修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
||||||
- `rust/crates/mnote-web/src/ssr/styles.rs`
|
|
||||||
- 任何业务源码
|
|
||||||
|
|
||||||
## 参考
|
|
||||||
|
|
||||||
- Sidex:`MultiEditorTabsControl`
|
|
||||||
- MNote:`bindMainEditorPageTab`、`activateMainEditorTab`、`resourceTabMru`
|
|
||||||
|
|
||||||
## 验收
|
|
||||||
|
|
||||||
只需文档级验收:
|
|
||||||
|
|
||||||
- proposal 明确列出要改的函数、事件、DOM 状态和测试断言。
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
最终回复列出:
|
|
||||||
|
|
||||||
- 生成的 proposal 文件
|
|
||||||
- 建议修改点
|
|
||||||
- 认为最小安全实现的步骤
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
# Reasonix Worker C:资源打开 resolver 收敛
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
继续对照 Sidex editor input resolver,收敛 MNote 正文附件、FileTree asset、new-window、active-tab 的资源打开策略。重点检查并尽量减少 `layout.rs` 中正文附件与 FileTree 的重复 Office / local file 分支。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你可以修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- `scripts/task463-onlyoffice-resolver-smoke.js`
|
|
||||||
- `design/05-editor-mainline/process/5-26-resource-open-resolver-convergence-checklist-v1.md`
|
|
||||||
|
|
||||||
不要修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/onlyoffice.rs`
|
|
||||||
- ACP / Hermes 相关文件
|
|
||||||
|
|
||||||
## 约束
|
|
||||||
|
|
||||||
- 文件树 edit-mode active tab 行为已经可用,不能破坏。
|
|
||||||
- 正文附件 `弹窗编辑` 应继续进入 main resource tab。
|
|
||||||
- 正文附件 `新窗口编辑` 应继续打开浏览器新窗口。
|
|
||||||
- md/text/code 仍应走 tiptap / 内建编辑器,不要改成 OnlyOffice。
|
|
||||||
|
|
||||||
## 验收
|
|
||||||
|
|
||||||
- `cargo test -p mnote-web sidebar_tree_runtime_opens_office_assets_through_resource_shell -- --test-threads=1`
|
|
||||||
- `node scripts/task463-onlyoffice-resolver-smoke.js`
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
最终回复列出:
|
|
||||||
|
|
||||||
- 修改文件
|
|
||||||
- 收敛了哪些重复分支
|
|
||||||
- 验证命令结果
|
|
||||||
- 未完成项和风险
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
# Reasonix Worker D:FileTree / Open Editors 生命周期 smoke 收口
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
参考 Sidex Explorer + Open Editors 联动,收口 MNote filetree action smoke 和 checklist 状态。重点跑通或明确阻塞 `task430` / `task471`,并补充 action/open editor state 的断言建议。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你可以修改:
|
|
||||||
|
|
||||||
- `scripts/task430-vscode-explorer-stage7-smoke.js`
|
|
||||||
- `scripts/task471-local-folder-bulk-resource-trash-smoke.js`
|
|
||||||
- `design/04-tree-domain/process/4-44-filetree-action-layer-paste-drop-delete-v1.md`
|
|
||||||
- `design/04-tree-domain/process/4-45-filetree-open-editors-lifecycle-link-checklist-v1.md`
|
|
||||||
|
|
||||||
不要修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/local_folder_source.rs`
|
|
||||||
- 任何 Rust 源码
|
|
||||||
|
|
||||||
## 验收
|
|
||||||
|
|
||||||
- `node --check scripts/task430-vscode-explorer-stage7-smoke.js`
|
|
||||||
- `node --check scripts/task471-local-folder-bulk-resource-trash-smoke.js`
|
|
||||||
- `node scripts/task471-local-folder-bulk-resource-trash-smoke.js`
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
最终回复列出:
|
|
||||||
|
|
||||||
- 修改文件
|
|
||||||
- 实际跑过的 smoke
|
|
||||||
- 哪些失败是环境前置,哪些是真 bug
|
|
||||||
- 对 4-44 / 4-45 checklist 的更新
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
# Reasonix 任务书:1-8 completion hook 验证
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
在 `design/01-tree-first-graph-kernel/process/1-8-mvp-post-process-execution-order-v1.md` 中补一段简短的执行备注,说明:
|
|
||||||
|
|
||||||
1. Reasonix 编码任务默认使用 30 分钟超时。
|
|
||||||
2. Reasonix 完成后应通过 completion hook 主动回传,不再依赖短轮询。
|
|
||||||
3. 这条口径属于当前 1-8 的执行说明,不要扩写成新流程设计。
|
|
||||||
|
|
||||||
## 允许修改范围
|
|
||||||
|
|
||||||
- `design/01-tree-first-graph-kernel/process/1-8-mvp-post-process-execution-order-v1.md`
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 不要修改其他设计文档。
|
|
||||||
- 不要改代码。
|
|
||||||
- 不要提交 git。
|
|
||||||
- 不要删除或重排现有 1-8 结构,只做最小增补。
|
|
||||||
|
|
||||||
## 验收标准
|
|
||||||
|
|
||||||
- 1-8 文档中能看到新增的简短备注。
|
|
||||||
- 备注明确提到:
|
|
||||||
- 默认 30 分钟超时
|
|
||||||
- completion hook 主动回传
|
|
||||||
- 输出最终结果时列出实际修改文件和验证方式。
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
请用简体中文,按下面顺序输出:
|
|
||||||
|
|
||||||
1. 修改了哪些文件
|
|
||||||
2. 具体改动内容
|
|
||||||
3. 验证方式
|
|
||||||
4. 未完成项或风险
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
# Reasonix Worker A: Local Folder Trash + Empty Workspace
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
用户报告:
|
|
||||||
|
|
||||||
- 文件树删除页面后全部跑到资源垃圾箱,页面垃圾箱没有使用。
|
|
||||||
- 会突然出现“初始化的新页面”,删除后还会出现;空白页面应保持空白,不显示任何占位。
|
|
||||||
|
|
||||||
事实源:
|
|
||||||
|
|
||||||
- Review: `bugs/05-editor-mainline/process/2026-05-21-workbench-filetree-office-slash-bugs-review-v1.md`
|
|
||||||
- Checklist: `bugs/04-tree-domain/process/4-45-local-folder-page-trash-and-empty-workspace-v1.md`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你负责:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/local_folder_source.rs`
|
|
||||||
- 必要时 `rust/crates/mnote-web/src/routes/gateway.rs` 中 trash 分类/渲染的小范围补丁
|
|
||||||
- 相关 Rust tests
|
|
||||||
|
|
||||||
你不是独自在代码库中工作。不要回滚、覆盖、格式化或清理其他人/其他 worker 的改动。不要提交 git。
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 移除默认工作区自动创建 `初始化的新页面/初始化的新页面.md` 的行为。
|
|
||||||
2. 更新相关测试,不再断言默认页面存在。
|
|
||||||
3. 修复本地文件树删除页面 bundle 目录时被归类为 `local_directory` 资源的问题:
|
|
||||||
- 若目录内存在同名 `.md`,应按 Markdown 页面生命周期进入 trash。
|
|
||||||
- trash index 应能让页面垃圾箱识别为页面/document,而不是资源 local_directory。
|
|
||||||
4. 空 root / 空 page tree 不应投影出“初始化的新页面”。
|
|
||||||
|
|
||||||
## 关键线索
|
|
||||||
|
|
||||||
- `ensure_default_workspace_home_page` 当前会创建初始化页面。
|
|
||||||
- `trash_local_entry` 现在先解析 `local-dir:*`,导致页面 bundle 目录先走 `trash_local_directory`。
|
|
||||||
- `trash_local_markdown_page` 已能删除 bundle,但需要让入口优先识别 bundle 页面。
|
|
||||||
|
|
||||||
## 验证
|
|
||||||
|
|
||||||
至少运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /mnt/Data1T/mnote/rust
|
|
||||||
cargo test -p mnote-web create_default_local_workspace_for_actor_at_base_creates_manifest_and_root_only -- --test-threads=1
|
|
||||||
cargo test -p mnote-web local_tree_command_manages_loose_markdown_like_regular_file -- --test-threads=1
|
|
||||||
cargo test -p mnote-web local_tree_command_delete_folder_moves_directory_to_trash -- --test-threads=1
|
|
||||||
```
|
|
||||||
|
|
||||||
如新增测试,请一并运行。
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
- 修改文件列表
|
|
||||||
- 完成的 checklist 项
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项/风险
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
# Reasonix Worker A:OnlyOffice local-folder 不再误请求 media/sign
|
|
||||||
|
|
||||||
你是编码 worker,不是审查员。你不独占代码库,可能有其他 worker 同时修改不同文件;不要回滚、覆盖或清理他人的改动。
|
|
||||||
|
|
||||||
## Project Root
|
|
||||||
|
|
||||||
`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
详见:
|
|
||||||
|
|
||||||
- `bugs/05-editor-mainline/process/2026-05-21-office-edit-sign-plugin-gap-review-v1.md`
|
|
||||||
- `bugs/05-editor-mainline/process/5-34-local-folder-media-sign-office-url-contract-v1.md`
|
|
||||||
|
|
||||||
当前 `/onlyoffice` 页面只要有 `assetId` 就请求 `/api/media/sign`。local-folder asset 形如 `local:asset:<path>`,本来应直接使用传入的 local open `fileUrl`,因此这个请求会产生误导性的 404。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你负责:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/onlyoffice.rs`
|
|
||||||
- 与 above 契约直接相关的 `mnote-web` 单测
|
|
||||||
- 更新 `bugs/05-editor-mainline/process/5-34-local-folder-media-sign-office-url-contract-v1.md` 的本轮执行记录
|
|
||||||
|
|
||||||
不要修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- ACP / Hermes 相关文件
|
|
||||||
- git 状态无关文件
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 让 `/onlyoffice` 页面识别 local-folder asset / local fileUrl,并在这种情况下跳过 `/api/media/sign`。
|
|
||||||
2. 保持非 local asset 仍可请求 `/api/media/sign`。
|
|
||||||
3. 保持 doc key 安全化,不引入 `/`、`:`、中文等危险字符。
|
|
||||||
4. 补或调整单测,确保页面脚本包含该判断。
|
|
||||||
|
|
||||||
## 设计约束
|
|
||||||
|
|
||||||
- local 判断应保守:优先基于 `assetId` 前缀 `local:` / `local-file:`,以及 `fileUrl` path 为 `/api/local-folder/files/open`。
|
|
||||||
- 不要把 `/api/media/sign` 改成本地文件签名端点。
|
|
||||||
- 不要改变 callback 或 edit/save 逻辑。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
请至少运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test -p mnote-web onlyoffice -- --test-threads=1
|
|
||||||
```
|
|
||||||
|
|
||||||
如果失败,记录失败原因和相关输出。
|
|
||||||
|
|
||||||
## 最终输出
|
|
||||||
|
|
||||||
在 final 中列出:
|
|
||||||
|
|
||||||
- 修改文件
|
|
||||||
- 关键实现点
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项或风险
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
# Reasonix Worker B: Main Page Tab Title Sync
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
用户报告:主 tab 的标题与实际打开页面标题不一致,不会随实际打开的 tab / 页面变化。
|
|
||||||
|
|
||||||
事实源:
|
|
||||||
|
|
||||||
- Review: `bugs/05-editor-mainline/process/2026-05-21-workbench-filetree-office-slash-bugs-review-v1.md`
|
|
||||||
- Checklist: `bugs/05-editor-mainline/process/5-28-main-page-tab-title-active-sync-v1.md`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你负责小范围修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs` 中 page tab / `updatePaneChrome` / 标题保存同步相关逻辑
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/document.rs` 如需要补 data 属性
|
|
||||||
- 相关 Rust tests
|
|
||||||
|
|
||||||
不要修改 OnlyOffice、文件树菜单、slash 定位、ACP/Hermes 文件。你不是独自在代码库中工作;不要回滚、覆盖、格式化或清理其他 worker 的改动。不要提交 git。
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. `replacePaneDocument` / `updatePaneChrome(primary)` 更新 primary document 后,同步:
|
|
||||||
- `[data-mnote-main-tab="page"] .mnote-main-tab-title`
|
|
||||||
- page tab 上的 document/workspace data 属性(如需要)
|
|
||||||
2. 标题保存控制器 `updateVisibleTitle` 保存标题时,同步当前 page tab 标题。
|
|
||||||
3. 资源 tab 与 page tab 切换时,page tab 标题始终代表当前 primary document。
|
|
||||||
4. 补一个 Rust 字符串测试或现有测试断言。
|
|
||||||
|
|
||||||
## 验证
|
|
||||||
|
|
||||||
至少运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /mnt/Data1T/mnote/rust
|
|
||||||
cargo test -p mnote-web page_layout_renders_main_editor_tab_strip -- --test-threads=1
|
|
||||||
cargo test -p mnote-web document_shell_runtime_renders_resource_tab_runtime -- --test-threads=1
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
- 修改文件列表
|
|
||||||
- 完成的 checklist 项
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项/风险
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
# Reasonix Worker B:Office 编辑模式菜单与 guard
|
|
||||||
|
|
||||||
你是编码 worker,不是审查员。你不独占代码库,可能有其他 worker 同时修改不同文件;不要回滚、覆盖或清理他人的改动。
|
|
||||||
|
|
||||||
## Project Root
|
|
||||||
|
|
||||||
`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
详见:
|
|
||||||
|
|
||||||
- `bugs/05-editor-mainline/process/2026-05-21-office-edit-sign-plugin-gap-review-v1.md`
|
|
||||||
- `bugs/05-editor-mainline/process/5-35-office-edit-mode-menu-and-guard-v1.md`
|
|
||||||
|
|
||||||
产品口径:Office 默认只读打开;三点菜单增加“使用编辑模式打开”。当前 local-folder edit/save callback 没有完整闭环,因此编辑入口不能表现成默认可保存功能。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你负责:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- 与 layout JS 字符串相关的 `mnote-web` 单测
|
|
||||||
- 更新 `bugs/05-editor-mainline/process/5-35-office-edit-mode-menu-and-guard-v1.md` 的本轮执行记录
|
|
||||||
|
|
||||||
不要修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/onlyoffice.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/media.rs`
|
|
||||||
- ACP / Hermes 相关文件
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 确认 Office 默认打开路径使用 `mode=view`,尤其是 local uploaded asset 和编辑器附件点击。
|
|
||||||
2. 在正文附件三点菜单中增加“使用编辑模式打开”。
|
|
||||||
3. 在文件树 Office asset 右键菜单中增加“使用编辑模式打开”。
|
|
||||||
4. 点击编辑入口时打开 `mode=edit` 的 OnlyOffice URL。
|
|
||||||
5. 如果保存闭环未完成,给编辑入口增加 guard:
|
|
||||||
- 可以用 `window.confirm` 或明确状态标记提示“编辑保存仍在实验中,建议先备份文件”;
|
|
||||||
- 必须便于浏览器测试识别,例如设置 `data-mnote-last-office-edit-mode-requested="true"` 和 `data-mnote-last-office-edit-mode-guard="shown"`。
|
|
||||||
|
|
||||||
## 设计约束
|
|
||||||
|
|
||||||
- 不默认 edit。
|
|
||||||
- 不承诺保存已闭环。
|
|
||||||
- 不影响 md/text/code 附件继续走 tiptap 渲染 / 编辑路径。
|
|
||||||
- 尽量复用现有 `buildLocalOnlyOfficeOpenUrl`、`buildOnlyOfficeOpenUrl`、`openConvexAssetFromFileTree` 等函数。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
请至少运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test -p mnote-web sidebar_tree_js -- --test-threads=1
|
|
||||||
cargo test -p mnote-web onlyoffice -- --test-threads=1
|
|
||||||
```
|
|
||||||
|
|
||||||
如果失败,记录失败原因和相关输出。
|
|
||||||
|
|
||||||
## 最终输出
|
|
||||||
|
|
||||||
在 final 中列出:
|
|
||||||
|
|
||||||
- 修改文件
|
|
||||||
- 菜单项位置与 action 名称
|
|
||||||
- 默认 view 与显式 edit 的实现点
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项或风险
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
# Reasonix Worker C: OnlyOffice Docx Upload Open Freeze
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
用户报告:上传 `DHA美黑化妆品监管综述_2026-05-16.docx` 后卡死,docx 打不开,并出现 OnlyOffice 连接失败信息。
|
|
||||||
|
|
||||||
事实源:
|
|
||||||
|
|
||||||
- Review: `bugs/05-editor-mainline/process/2026-05-21-workbench-filetree-office-slash-bugs-review-v1.md`
|
|
||||||
- Checklist: `bugs/05-editor-mainline/process/5-29-onlyoffice-docx-upload-open-freeze-v1.md`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你负责:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/onlyoffice.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/local_folder_source.rs` 中 local file open / upload 的小范围修复
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs` 中 office resource tab 打开/错误 UI 的小范围修复
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs` 中附件 open URL 的小范围修复
|
|
||||||
- OnlyOffice/local upload 相关 tests
|
|
||||||
|
|
||||||
不要修改文件树 trash、默认 workspace、右键菜单结构、slash 定位、ACP/Hermes 文件。你不是独自在代码库中工作;不要回滚、覆盖、格式化或清理其他 worker 的改动。不要提交 git。
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 定位 docx 卡死发生层级:上传、附件插入、主 tab iframe、OnlyOffice DocumentServer 回源或错误处理。
|
|
||||||
2. 确保本地 docx 打开时:
|
|
||||||
- `fileUrl` 指向 `/api/local-folder/files/open?rootUri=...&path=...`
|
|
||||||
- `fileType=docx`
|
|
||||||
- `assetId=local-file:<relativePath>`
|
|
||||||
- 主 tab 打开优先,不默认弹出浏览器窗口。
|
|
||||||
3. OnlyOffice iframe 加载失败时显示非阻塞错误,不让主页面卡死。
|
|
||||||
4. 补 targeted test。
|
|
||||||
|
|
||||||
## 验证
|
|
||||||
|
|
||||||
至少运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /mnt/Data1T/mnote/rust
|
|
||||||
cargo test -p mnote-web local_file_open_sets_pdf_and_office_content_type -- --test-threads=1
|
|
||||||
cargo test -p mnote-web onlyoffice_page_exposes_documentserver_fetch_base_for_local_files -- --test-threads=1
|
|
||||||
cargo test -p mnote-web sidebar_tree_runtime_opens_office_assets_through_resource_shell -- --test-threads=1
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
- 修改文件列表
|
|
||||||
- 完成的 checklist 项
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项/风险
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
# Reasonix Worker C:OnlyOffice local-folder callback 保存契约
|
|
||||||
|
|
||||||
你是编码 worker,但本任务优先做设计与最小安全实现评估。你不独占代码库,可能有其他 worker 同时修改不同文件;不要回滚、覆盖或清理他人的改动。
|
|
||||||
|
|
||||||
## Project Root
|
|
||||||
|
|
||||||
`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
详见:
|
|
||||||
|
|
||||||
- `bugs/05-editor-mainline/process/2026-05-21-office-edit-sign-plugin-gap-review-v1.md`
|
|
||||||
- `bugs/05-editor-mainline/process/5-36-onlyoffice-local-edit-save-callback-contract-v1.md`
|
|
||||||
|
|
||||||
ONLYOFFICE 官方口径:callback `status === 2` 或 `status === 6` 时,后端需要下载 `body.url` 并写回文件,成功返回 `{ "error": 0 }`。当前 `mnote-web` callback 代理 legacy Next,local-folder 写回没有闭环。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你负责:
|
|
||||||
|
|
||||||
- 优先更新 `bugs/05-editor-mainline/process/5-36-onlyoffice-local-edit-save-callback-contract-v1.md`
|
|
||||||
- 如判断安全且改动小,可修改:
|
|
||||||
- `rust/crates/mnote-web/src/routes/onlyoffice.rs`
|
|
||||||
- `rust/crates/adapter-onlyoffice/src/lib.rs`
|
|
||||||
- 相关单测
|
|
||||||
|
|
||||||
不要修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- ACP / Hermes 相关文件
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 梳理当前 callback 能否定位 local-folder 原文件。
|
|
||||||
2. 明确实现 local writeback 还缺哪些输入:rootUri、relative path、workspace/source kind、session。
|
|
||||||
3. 如果现有 URL 参数已经足够安全定位文件,则实现最小 status 2/6 下载写回。
|
|
||||||
4. 如果现有输入不足,先不要硬写实现;更新 checklist,明确缺口,并建议 Worker B 的编辑入口保持 guard。
|
|
||||||
|
|
||||||
## 必须满足的安全条件
|
|
||||||
|
|
||||||
- 写回路径必须落在当前 local root allowed roots 内。
|
|
||||||
- status 非 2/6 不写文件并返回 `{ "error": 0 }`。
|
|
||||||
- 下载 URL 必须经过现有 OnlyOffice internal URL rewrite 逻辑或等价安全处理。
|
|
||||||
- 不允许从 assetId 字符串直接拼任意绝对路径写入。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
如改代码,请至少运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test -p mnote-web onlyoffice_callback -- --test-threads=1
|
|
||||||
```
|
|
||||||
|
|
||||||
如果只更新设计,也请说明为什么本轮不应实现。
|
|
||||||
|
|
||||||
## 最终输出
|
|
||||||
|
|
||||||
在 final 中列出:
|
|
||||||
|
|
||||||
- 修改文件
|
|
||||||
- 是否实现代码,若未实现说明阻塞输入
|
|
||||||
- 安全边界判断
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项或风险
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
# Reasonix Worker D: Filetree Context Menu Sidex Alignment
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
用户报告:文件树右键菜单大多没有实际作用;主页面使用右键菜单“侧边栏显示”提示暂不支持在侧栏打开资源。用户要求核对 Sidex 右键菜单,调整当前可用菜单。
|
|
||||||
|
|
||||||
事实源:
|
|
||||||
|
|
||||||
- Review: `bugs/05-editor-mainline/process/2026-05-21-workbench-filetree-office-slash-bugs-review-v1.md`
|
|
||||||
- Checklist: `bugs/05-editor-mainline/process/5-30-filetree-context-menu-sidex-alignment-v1.md`
|
|
||||||
- Sidex 参考:`reference-code/sidex-main/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你负责:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs` 中文件树右键菜单 items 和 handler 的小范围修改
|
|
||||||
- 必要时 `rust/crates/mnote-web/src/tree_shell/filetree_runtime.rs`
|
|
||||||
- 必要时 `rust/crates/mnote-web/src/routes/local_folder_source.rs` 的 `create_folder` 已有入口接线,不要大改 tree command
|
|
||||||
- 相关 tests
|
|
||||||
|
|
||||||
不要修改 Office、slash 定位、默认 workspace、ACP/Hermes 文件。你不是独自在代码库中工作;不要回滚、覆盖、格式化或清理其他 worker 的改动。不要提交 git。
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 对照 Sidex/VSCode ExplorerContext 的原则:只显示/启用可用动作。
|
|
||||||
2. local_folder 下:
|
|
||||||
- `New File` 继续创建页面。
|
|
||||||
- `New Folder` 接入 `create_folder` 或隐藏/禁用但不能误导。
|
|
||||||
- `Copy Path` 复制真实 relative path / asset path,不是标题。
|
|
||||||
- `Reveal` 至少滚动聚焦并记录状态。
|
|
||||||
- `Duplicate` 若没有真实 copy,隐藏或禁用。
|
|
||||||
- `Open Right` 只对页面显示;资源未支持侧栏时隐藏,避免 unsupported placeholder。
|
|
||||||
3. 更新字符串测试。
|
|
||||||
|
|
||||||
## 验证
|
|
||||||
|
|
||||||
至少运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /mnt/Data1T/mnote/rust
|
|
||||||
cargo test -p mnote-web sidebar_tree_runtime_renders_context_menu_and_scoped_title_updates -- --test-threads=1
|
|
||||||
cargo test -p mnote-web sidebar_tree_runtime_handles_navigation_drag_and_filetree_actions -- --test-threads=1
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
- 修改文件列表
|
|
||||||
- 完成的 checklist 项
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项/风险
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
# Reasonix Worker D:OnlyOffice annotation 插件 404/pageerror 噪音
|
|
||||||
|
|
||||||
你是编码 worker。你不独占代码库,可能有其他 worker 同时修改不同文件;不要回滚、覆盖或清理他人的改动。
|
|
||||||
|
|
||||||
## Project Root
|
|
||||||
|
|
||||||
`/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
详见:
|
|
||||||
|
|
||||||
- `bugs/05-editor-mainline/process/2026-05-21-office-edit-sign-plugin-gap-review-v1.md`
|
|
||||||
- `bugs/05-editor-mainline/process/5-37-onlyoffice-annotation-plugin-noise-policy-v1.md`
|
|
||||||
|
|
||||||
OnlyOffice 自定义 annotation/custom assistant 插件可能产生 404 或 pageerror。需要确认来源,并让测试能区分“插件噪音”和“主文档打开失败”。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你负责:
|
|
||||||
|
|
||||||
- `bugs/05-editor-mainline/process/5-37-onlyoffice-annotation-plugin-noise-policy-v1.md`
|
|
||||||
- 如确认是 MNote 显式注入插件,可修改:
|
|
||||||
- `rust/crates/mnote-web/src/routes/onlyoffice.rs`
|
|
||||||
- `src/components/onlyoffice/` 下直接的自定义插件配置文件
|
|
||||||
- 相关测试
|
|
||||||
|
|
||||||
不要修改:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- ACP / Hermes 相关文件
|
|
||||||
- OnlyOffice 主静态资源目录的大规模文件
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 搜索 annotation / custom assistant / pluginsData / autostart 来源。
|
|
||||||
2. 判断 404 是否由 MNote 显式注入插件引起。
|
|
||||||
3. 如果 MNote 显式注入且当前不依赖该插件,禁用无效注入或加开关。
|
|
||||||
4. 如果是 OnlyOffice 内部可选资源,更新 checklist 说明为 non-critical,但不能吞掉 `errorCode=-18`、WebSocket failed、主 iframe 空白等真正失败。
|
|
||||||
5. 如有必要,补测试或 smoke 文档口径。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
请至少运行与你修改相关的测试;优先:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test -p mnote-web onlyoffice -- --test-threads=1
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终输出
|
|
||||||
|
|
||||||
在 final 中列出:
|
|
||||||
|
|
||||||
- 修改文件
|
|
||||||
- 404/pageerror 来源
|
|
||||||
- 处理策略
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项或风险
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
# Reasonix Worker E: Slash Menu Side Pane Isolation
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
用户报告:虽然侧栏打开不支持,但在主栏打开 slash 菜单时,侧栏也出现一个 slash 菜单。
|
|
||||||
|
|
||||||
事实源:
|
|
||||||
|
|
||||||
- Review: `bugs/05-editor-mainline/process/2026-05-21-workbench-filetree-office-slash-bugs-review-v1.md`
|
|
||||||
- Checklist: `bugs/05-editor-mainline/process/5-31-side-pane-slash-overlay-isolation-v1.md`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你负责:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs` 中 slash menu root 选择、定位、secondary unsupported cleanup
|
|
||||||
- 必要时 `rust/spikes/leptos-tiptap-spike/src/lib.rs` 中 overlay data 属性/host 绑定
|
|
||||||
- 相关 tests
|
|
||||||
|
|
||||||
不要修改 Office、右键菜单、文件树 trash、默认 workspace、ACP/Hermes 文件。你不是独自在代码库中工作;不要回滚、覆盖、格式化或清理其他 worker 的改动。不要提交 git。
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. `positionSlashMenuForRoot(root)` 只能定位当前 root 内的 slash menu;不能 fallback 到全局第一个 slash menu。
|
|
||||||
2. `activeEditorRootForSlashMenu()` 只选择可见且含 selection/focus 的 editor root;hidden / unsupported secondary root 不应参与。
|
|
||||||
3. 打开 unsupported side target 时清理 secondary pane 遗留的 slash overlay。
|
|
||||||
4. 补字符串测试或 Rust 单测,明确覆盖“不使用全局 slash menu fallback”。
|
|
||||||
|
|
||||||
## 验证
|
|
||||||
|
|
||||||
至少运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /mnt/Data1T/mnote/rust
|
|
||||||
cargo test -p mnote-web document_shell_runtime_renders_resource_tab_runtime -- --test-threads=1
|
|
||||||
cargo test -p mnote-web document_shell_runtime_positions_slash_menu_per_editor_host -- --test-threads=1
|
|
||||||
```
|
|
||||||
|
|
||||||
如果第二个测试不存在,请新增相近测试并运行。
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
- 修改文件列表
|
|
||||||
- 完成的 checklist 项
|
|
||||||
- 运行过的命令和结果
|
|
||||||
- 未完成项/风险
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
# Reasonix Worker A:SQLite control-plane store 骨架
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是独自在代码库中工作。其他 worker 可能并行修改 auth、access policy 或迁移脚本。不要还原、覆盖或清理不属于你任务范围的改动。不要提交 git。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
上位设计稿:
|
|
||||||
`design/02-convex-rust-long-term-architecture/process/2-8-convex-replace-with-rust-sqlite-control-plane-v1.md`
|
|
||||||
|
|
||||||
目标是用 Rust + SQLite 完全替换 Convex 控制面。你的任务只负责 SQLite store 骨架,不接运行时 route。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
- 优先新增 `rust/crates/control-plane/**`
|
|
||||||
- 必要时修改 `rust/Cargo.toml`
|
|
||||||
- 必要时新增/修改 `rust/crates/mnote-web/Cargo.toml` 仅用于依赖引用建议
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
- `rust/crates/mnote-web/src/routes/gateway.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/local_folder_source.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/session.rs`
|
|
||||||
- `rust/crates/mnote-web/src/ssr/**`
|
|
||||||
- `infra/convex/**`
|
|
||||||
- `.env*`
|
|
||||||
|
|
||||||
如果发现 workspace crate 接入风险过大,先实现为可编译独立 crate;不要跨模块硬接 runtime。
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 新增 `control-plane` Rust crate 或等价最小模块,优先独立 crate。
|
|
||||||
2. 定义核心 model 与 `ControlPlaneStore` trait。
|
|
||||||
3. 实现 `SqliteControlPlaneStore`,支持临时路径 DB。
|
|
||||||
4. 实现 migration v1,包含至少:
|
|
||||||
- `users`
|
|
||||||
- `auth_identities`
|
|
||||||
- `auth_sessions`
|
|
||||||
- `workspaces`
|
|
||||||
- `workspace_members`
|
|
||||||
- `directory_grants`
|
|
||||||
- `share_links`
|
|
||||||
- `sync_state`
|
|
||||||
- `ai_policies`
|
|
||||||
- `audit_log`
|
|
||||||
- `outbox_events`
|
|
||||||
- `legacy_id_map`
|
|
||||||
5. 实现最小 CRUD:
|
|
||||||
- upsert user
|
|
||||||
- create/get session
|
|
||||||
- ensure default workspace
|
|
||||||
- grant/revoke directory access
|
|
||||||
- append/drain outbox
|
|
||||||
6. 补单测:migration 幂等、默认 workspace、owner grant、outbox drain。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
优先运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p control-plane -- --nocapture
|
|
||||||
cargo fmt --check --all
|
|
||||||
```
|
|
||||||
|
|
||||||
如果没有新增独立 crate,而是放入 mnote-web:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web control_plane -- --nocapture
|
|
||||||
cargo fmt --check --all
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
请列出:
|
|
||||||
- 修改文件
|
|
||||||
- 新增表和核心 API
|
|
||||||
- 实际运行过的命令及结果
|
|
||||||
- 未完成项/风险
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
# Reasonix Worker B:Auth/session SQLite 切换准备
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是独自在代码库中工作。其他 worker 可能并行修改 SQLite store、access policy 或迁移脚本。不要还原、覆盖或清理不属于你任务范围的改动。不要提交 git。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
上位设计稿:
|
|
||||||
`design/02-convex-rust-long-term-architecture/process/2-8-convex-replace-with-rust-sqlite-control-plane-v1.md`
|
|
||||||
|
|
||||||
当前用户报告过新注册账号显示“开发用户的空间”、不能新建页面。根因方向之一是真实 actor/profile/workspace name 没有统一来自控制面。本任务只处理 auth/session 切换准备,不处理 local folder access。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
- `rust/crates/mnote-web/src/routes/session.rs`
|
|
||||||
- 可新增 `rust/crates/mnote-web/src/routes/auth_sqlite.rs`
|
|
||||||
- 可新增 `rust/crates/mnote-web/src/control_plane_auth_adapter.rs`
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/auth.rs` 仅限必要表单字段/测试适配
|
|
||||||
- focused tests in same files
|
|
||||||
|
|
||||||
只读参考但不要直接改,除非确实必要并最小修改:
|
|
||||||
- `rust/crates/mnote-web/src/routes/gateway.rs`
|
|
||||||
- `rust/crates/mnote-web/src/middleware/request_context.rs`
|
|
||||||
- `rust/crates/mnote-web/src/context.rs`
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
- `rust/crates/mnote-web/src/routes/local_folder_source.rs`
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/admin.rs`
|
|
||||||
- `rust/crates/mnote-web/src/ssr/styles.rs`
|
|
||||||
- `infra/convex/**`
|
|
||||||
- `.env*`
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 梳理现有 signIn/signUp/session cookie 链,写在代码注释或测试名中,不写长文档。
|
|
||||||
2. 增加 SQLite session adapter 的 route/helper 骨架:
|
|
||||||
- 从 `mnote_session` 查 session。
|
|
||||||
- 生成/刷新 `mnote_actor_id/name/email/type` display cookies。
|
|
||||||
- `/api/session` 优先使用 SQLite session,缺失时保留现有 fallback。
|
|
||||||
3. 注册/登录 adapter 应明确输出真实 `user_id/email/name/actor_type`。
|
|
||||||
4. 新用户注册测试必须断言不回退到 `DEV_USER_NAME`。
|
|
||||||
5. 不要求本轮完全删除 Convex auth fallback。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web session -- --nocapture
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web auth -- --nocapture
|
|
||||||
cargo fmt --check --all
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
请列出:
|
|
||||||
- 修改文件
|
|
||||||
- 新增/调整的 cookie 与 session 规则
|
|
||||||
- 实际运行过的命令及结果
|
|
||||||
- 未完成项/风险
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
# Reasonix Worker C:Access policy SQLite adapter
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是独自在代码库中工作。其他 worker 可能并行修改 SQLite store、auth/session 或迁移脚本。不要还原、覆盖或清理不属于你任务范围的改动。不要提交 git。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
上位设计稿:
|
|
||||||
`design/02-convex-rust-long-term-architecture/process/2-8-convex-replace-with-rust-sqlite-control-plane-v1.md`
|
|
||||||
|
|
||||||
当前 `access-policy.json` 是本地目录授权事实源,但完全替换 Convex 后,应迁到 SQLite。你的任务是抽象 access policy adapter,保留 JSON fallback,为 SQLite grant 接入打接口。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
- `rust/crates/mnote-web/src/routes/local_folder_source.rs`
|
|
||||||
- 可新增 `rust/crates/mnote-web/src/local_access_sqlite.rs`
|
|
||||||
- 可新增 focused tests
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
- `rust/crates/mnote-web/src/routes/session.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/gateway.rs`
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/admin.rs`
|
|
||||||
- `rust/crates/mnote-web/src/ssr/styles.rs`
|
|
||||||
- `infra/convex/**`
|
|
||||||
- `.env*`
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 找出 `ensure_local_workspace_read_access` / write access / admin access 的现有调用和策略读取点。
|
|
||||||
2. 抽象一个 access policy provider/adapter:
|
|
||||||
- JSON provider 维持现有行为。
|
|
||||||
- SQLite provider 可先是 trait/mock/stub,不要求真实 DB。
|
|
||||||
3. 增加测试覆盖:
|
|
||||||
- 默认 workspace owner 有 write。
|
|
||||||
- read grant 禁写。
|
|
||||||
- write grant 可写。
|
|
||||||
- 未授权拒绝。
|
|
||||||
4. 为后续 SQLite store 接入预留最小接口,不要重写 tree command 或 UI。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web local_access_policy -- --nocapture
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web local_workspace_access -- --nocapture
|
|
||||||
cargo fmt --check --all
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
请列出:
|
|
||||||
- 修改文件
|
|
||||||
- 新增 adapter/trait 设计
|
|
||||||
- 实际运行过的命令及结果
|
|
||||||
- 未完成项/风险
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
# Reasonix Worker D:迁移工具与 Convex 下线 guard
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是独自在代码库中工作。其他 worker 可能并行修改 Rust control-plane、auth/session 或 access policy。不要还原、覆盖或清理不属于你任务范围的改动。不要提交 git。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
上位设计稿:
|
|
||||||
`design/02-convex-rust-long-term-architecture/process/2-8-convex-replace-with-rust-sqlite-control-plane-v1.md`
|
|
||||||
|
|
||||||
目标是给完全替换 Convex 准备迁移 dry-run 工具和 guard,不执行真实破坏性迁移。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
- 新增 `scripts/migrate-control-plane-to-sqlite.js`
|
|
||||||
- 修改 `scripts/check-local-first-convex-guard.js` 仅限增加 SQLite 迁移期 guard 规则或建议输出
|
|
||||||
- 可新增 `scripts/task*-sqlite-control-plane-*.js` focused smoke
|
|
||||||
- 可向设计稿 `2-8` 追加“执行记录”,不得改设计结论
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
- `rust/crates/**`
|
|
||||||
- `infra/convex/docker-compose.yml`
|
|
||||||
- `.env*`
|
|
||||||
- 不删除任何 Convex 数据、Docker volume 或本地数据文件
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 实现 dry-run 迁移工具:
|
|
||||||
- 读取 `/mnt/Data1T/Mnote_data/control-plane/access-policy.json`,路径可用参数覆盖。
|
|
||||||
- 扫描 `/mnt/Data1T/Mnote_data/users/*/workspaces/*/.mnote/workspace.json`,路径可用参数覆盖。
|
|
||||||
- 生成 `migration-report.json`,包含 users/workspaces/grants/legacy_id_map 建议,不写 DB。
|
|
||||||
2. 支持命令:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node scripts/migrate-control-plane-to-sqlite.js --dry-run --out /tmp/mnote-control-plane-migration-report.json
|
|
||||||
```
|
|
||||||
|
|
||||||
3. 更新 guard 或输出建议:新增 Convex 控制面代码应被标记为禁止或迁移例外。
|
|
||||||
4. 补最小 node smoke,断言 dry-run report 可生成。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node scripts/migrate-control-plane-to-sqlite.js --dry-run --out /tmp/mnote-control-plane-migration-report.json
|
|
||||||
npm run check:local-first-convex-guard
|
|
||||||
```
|
|
||||||
|
|
||||||
如新增 smoke:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node scripts/<new-smoke>.js
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
请列出:
|
|
||||||
- 修改文件
|
|
||||||
- dry-run report 字段
|
|
||||||
- 实际运行过的命令及结果
|
|
||||||
- 未完成项/风险
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
# Reasonix Worker E:control-plane share_links / audit / outbox 扩展
|
|
||||||
|
|
||||||
Project root: `/mnt/Data1T/mnote`
|
|
||||||
|
|
||||||
你不是独自在代码库中工作。其他 worker 可能并行修改 `mnote-web` 适配层、auth/session 或 access policy。不要还原、覆盖或清理不属于你任务范围的改动。不要提交 git。
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
上位设计稿:
|
|
||||||
`design/02-convex-rust-long-term-architecture/process/2-8-convex-replace-with-rust-sqlite-control-plane-v1.md`
|
|
||||||
|
|
||||||
当前 `control-plane` crate 已有 users/auth/workspaces/directory_grants/sync_state 的骨架,但 share_links、audit_log、outbox 的能力还不够完整。
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
允许修改:
|
|
||||||
- `rust/crates/control-plane/src/model.rs`
|
|
||||||
- `rust/crates/control-plane/src/store.rs`
|
|
||||||
- `rust/crates/control-plane/src/sqlite.rs`
|
|
||||||
- `rust/crates/control-plane/src/migrations.rs`
|
|
||||||
- `rust/crates/control-plane/migrations/*.sql`
|
|
||||||
- `rust/crates/control-plane/src/error.rs` 仅限必要错误映射
|
|
||||||
|
|
||||||
禁止修改:
|
|
||||||
- `rust/crates/mnote-web/**`
|
|
||||||
- `infra/convex/**`
|
|
||||||
- `.env*`
|
|
||||||
- `scripts/**`
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
1. 补强 `control-plane` 模型与 store trait:
|
|
||||||
- `share_links` 的 create/list/revoke/resolve
|
|
||||||
- `audit_log` append/list 最小能力
|
|
||||||
- `outbox_events` drain/mark-delivered 的稳定方法
|
|
||||||
2. 为 share_links 增加 SQLite 实现与单测:
|
|
||||||
- token 只保存 hash
|
|
||||||
- revoke 后不可再 resolve
|
|
||||||
3. 为 audit_log 增加最小单测:
|
|
||||||
- 创建分享、撤销授权、AI/控制面关键事件可追加
|
|
||||||
4. 保持 schema 迁移幂等。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p control-plane -- --nocapture
|
|
||||||
```
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
请列出:
|
|
||||||
- 修改文件
|
|
||||||
- 新增 API / 表能力
|
|
||||||
- 实际运行过的命令及结果
|
|
||||||
- 未完成项 / 风险
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
# Reasonix Batch A / Worker A:5-29 dom_selection 第一刀
|
|
||||||
|
|
||||||
Project root:由 runner 传入的独立 worktree。
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
实现 `design/05-editor-mainline/process/5-29-editor-runtime-followup-checklist-v1.md` 中 Worker A:新增 `editor_runtime/dom_selection.rs`,从 `rust/spikes/leptos-tiptap-spike/src/lib.rs` 迁出最小 selection helper,保持行为不变。
|
|
||||||
|
|
||||||
## 允许修改
|
|
||||||
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/src/lib.rs`
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/src/editor_runtime/mod.rs`
|
|
||||||
- 新增 `rust/spikes/leptos-tiptap-spike/src/editor_runtime/dom_selection.rs`
|
|
||||||
|
|
||||||
## 候选函数
|
|
||||||
|
|
||||||
优先迁移边界清楚、参数少、与 Leptos signal 无强耦合的函数:
|
|
||||||
|
|
||||||
- `active_editor_text_selection`
|
|
||||||
- `selection_summary`
|
|
||||||
- `has_active_text_selection`
|
|
||||||
- `selection_has_rich_marks`
|
|
||||||
- 如确实必要,可迁出 selection payload 构造 helper,但不要为了迁移扩大参数面。
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 不迁出 block menu DOM、overlay state、host bridge、resource open、local upload。
|
|
||||||
- 不改 shell / `mnote-web` 代码。
|
|
||||||
- 不修改设计文档、AGENTS、git 状态或提交。
|
|
||||||
- 不做大范围格式化。
|
|
||||||
- 不改用户可见文案,除非编译必须。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
至少运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo fmt --manifest-path rust/Cargo.toml --all --check
|
|
||||||
cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml
|
|
||||||
```
|
|
||||||
|
|
||||||
如果时间允许,再运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo build --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml --target wasm32-unknown-unknown --release
|
|
||||||
```
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
最终 handoff 必须列出:
|
|
||||||
|
|
||||||
- 修改文件和迁移函数清单。
|
|
||||||
- 未迁函数及原因。
|
|
||||||
- 验收命令和结果。
|
|
||||||
- 风险,尤其是是否改变 selection / toolbar / shortcut 行为。
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
# Reasonix Batch A / Worker B:5-29 overlay / block menu 只读审计
|
|
||||||
|
|
||||||
Project root:由 runner 传入的独立 worktree。
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
只读审计 `rust/spikes/leptos-tiptap-spike/src/lib.rs` 中 overlay / block menu 相关逻辑,为 `design/05-editor-mainline/process/5-29-editor-runtime-followup-checklist-v1.md` 提供下一刀最小实现建议。
|
|
||||||
|
|
||||||
## 只读范围
|
|
||||||
|
|
||||||
可以读取:
|
|
||||||
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/src/lib.rs`
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/src/editor_runtime/*`
|
|
||||||
- `scripts/task488-local-attachment-link-delete-undo-smoke.js`
|
|
||||||
- `scripts/task489-block-menu-delete-undo-smoke.js`
|
|
||||||
- `scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js`
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 严格只读,禁止修改任何源码、文档、脚本、生成产物或 git 状态。
|
|
||||||
- 不运行会写入源码的格式化、构建生成命令。
|
|
||||||
- 不把 shell resource open / local upload 归入 editor runtime。
|
|
||||||
|
|
||||||
## 审计问题
|
|
||||||
|
|
||||||
请回答:
|
|
||||||
|
|
||||||
1. 哪些 overlay / block menu 函数依赖 `ReadSignal` / `WriteSignal` / `NodeRef` / `Window` 等状态,暂不适合第一刀迁移?
|
|
||||||
2. 是否存在可先迁出的纯 helper?如果有,列出函数名、当前位置、建议目标模块。
|
|
||||||
3. 是否应先引入小型 context struct,还是继续保持函数参数直传?
|
|
||||||
4. 哪些 smoke 能覆盖迁移后风险?
|
|
||||||
5. `apply_html_update` 迁出是否仍被 overlay / bridge event 耦合阻塞?
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
最终 handoff 必须包含:
|
|
||||||
|
|
||||||
- 函数归属表。
|
|
||||||
- 下一刀建议,按 P0/P1/P2 排序。
|
|
||||||
- 明确不可迁项和原因。
|
|
||||||
- 建议的验收命令 / smoke。
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
# Reasonix Batch A / Worker C:3-20 document pane host 只读审计
|
|
||||||
|
|
||||||
Project root:由 runner 传入的独立 worktree。
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
只读审计 `mnote-web` document pane host adapter / document session / conflict panel 相关 inline runtime,为 `design/03-rust-web/process/3-20-browser-runtime-followup-checklist-v1.md` 提供下一刀模块拆分方案。
|
|
||||||
|
|
||||||
## 只读范围
|
|
||||||
|
|
||||||
可以读取:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- `rust/crates/mnote-web/browser/*`
|
|
||||||
- 与 document session / conflict panel 相关的 smoke 脚本
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 严格只读,禁止修改任何源码、文档、脚本、生成产物或 git 状态。
|
|
||||||
- 不迁入 Tiptap 内部命令、history 或 editor DOM overlay。
|
|
||||||
- 不建议把 Page AI panel 混入本切片。
|
|
||||||
|
|
||||||
## 审计问题
|
|
||||||
|
|
||||||
请回答:
|
|
||||||
|
|
||||||
1. document pane host adapter 当前在哪些 Rust raw string / inline module 中?
|
|
||||||
2. 哪些函数适合拆到 `document-pane-host-runtime.js` / `document-session-runtime.js` / `document-conflict-panel-runtime.js`?
|
|
||||||
3. 第一刀最小可迁函数是什么,为什么?
|
|
||||||
4. 哪些行为必须由 browser smoke 覆盖:primary/secondary pane、resource tab、conflict panel unmount、attachment tab、error placeholder?
|
|
||||||
5. 哪些函数属于 `05-editor-mainline`,不能在 `03-rust-web` 里处理?
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
最终 handoff 必须包含:
|
|
||||||
|
|
||||||
- 候选模块表。
|
|
||||||
- 函数位置和迁移优先级。
|
|
||||||
- 不可迁项和边界原因。
|
|
||||||
- 推荐 Worker 实现任务书草案。
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
# Reasonix Batch A / Worker D:3-20 local upload / filetree 下一刀只读审计
|
|
||||||
|
|
||||||
Project root:由 runner 传入的独立 worktree。
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
只读审计 `3-20` 后续切片:local upload 主流程、filetree keyboard / clipboard / DND / context menu DOM。基于已落地的 `filetree-runtime.js`、`filetree-selection-runtime.js`、`filetree-context-menu-runtime.js` 和 `local-upload-runtime.js`,给出下一刀最小实现建议。
|
|
||||||
|
|
||||||
## 只读范围
|
|
||||||
|
|
||||||
可以读取:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- `rust/crates/mnote-web/browser/filetree-runtime.js`
|
|
||||||
- `rust/crates/mnote-web/browser/filetree-selection-runtime.js`
|
|
||||||
- `rust/crates/mnote-web/browser/filetree-context-menu-runtime.js`
|
|
||||||
- `rust/crates/mnote-web/browser/local-upload-runtime.js`
|
|
||||||
- `scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js`
|
|
||||||
- `scripts/task487-local-folder-tree-live-consumer-smoke.js`
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 严格只读,禁止修改任何源码、文档、脚本、生成产物或 git 状态。
|
|
||||||
- 不改变资源归属语义、tree command 语义或 upload API 合同。
|
|
||||||
- 不把 editor internal selection / history 迁入 `mnote-web` browser runtime。
|
|
||||||
|
|
||||||
## 审计问题
|
|
||||||
|
|
||||||
请回答:
|
|
||||||
|
|
||||||
1. local upload 剩余函数中,哪些可迁到 `local-upload-runtime.js`,哪些仍应留在 inline 直到 API / editor 插入边界更清楚?
|
|
||||||
2. filetree keyboard / clipboard / DND / context menu DOM 中,下一刀应优先迁纯 helper 还是 DOM listener?
|
|
||||||
3. 哪个实现切片风险最低,允许文件范围是什么?
|
|
||||||
4. 对应最小测试和浏览器 smoke 是什么?
|
|
||||||
5. 哪些现有 runtime helper 可复用,避免新增第二套 filetree selection 真相?
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
最终 handoff 必须包含:
|
|
||||||
|
|
||||||
- local upload 函数归属表。
|
|
||||||
- filetree 下一刀建议。
|
|
||||||
- 明确禁止迁移项。
|
|
||||||
- 推荐 Worker 实现任务书草案和验收命令。
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
# Reasonix Batch A2 / Worker A:5-29 dom_selection 完成与验证
|
|
||||||
|
|
||||||
Project root:`/mnt/Data1T/mnote-worktrees/0525-5-29-dom-selection`
|
|
||||||
|
|
||||||
## 背景
|
|
||||||
|
|
||||||
该 worktree 可能已有候选 diff:
|
|
||||||
|
|
||||||
- 新增 `rust/spikes/leptos-tiptap-spike/src/editor_runtime/dom_selection.rs`
|
|
||||||
- `mod.rs` 挂载 `dom_selection`
|
|
||||||
- `lib.rs` 从该模块导入 selection helper
|
|
||||||
|
|
||||||
前一轮 runner 未写出 `process-handoff.md/json`,因此本任务要求完成、修正、验证并交接。
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
确保 `dom_selection.rs` 第一刀是可采纳候选 patch:行为同构、编译通过、diff 范围干净。
|
|
||||||
|
|
||||||
## 允许修改
|
|
||||||
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/src/lib.rs`
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/src/editor_runtime/mod.rs`
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/src/editor_runtime/dom_selection.rs`
|
|
||||||
|
|
||||||
可以修正空行、导入顺序、可见性、dead_code 标记。
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 不迁出 block menu DOM、overlay state、host bridge、resource open、local upload。
|
|
||||||
- 不改 shell / `mnote-web`。
|
|
||||||
- 不修改设计文档、AGENTS、git 状态或提交。
|
|
||||||
- 不创建无关 symlink;如果已有无关 `reference-code` untracked,请不要删除,也不要依赖它。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo fmt --manifest-path rust/Cargo.toml --all --check
|
|
||||||
cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml
|
|
||||||
```
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
handoff 必须列出:
|
|
||||||
|
|
||||||
- 最终修改文件。
|
|
||||||
- 迁移函数清单。
|
|
||||||
- 未迁函数及原因。
|
|
||||||
- 验收命令和结果。
|
|
||||||
- 是否有 untracked / unrelated 文件,尤其是 `reference-code`。
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
# Reasonix Batch A2 / Worker B:5-29 block menu legacy HTML helpers 实现
|
|
||||||
|
|
||||||
Project root:`/mnt/Data1T/mnote-worktrees/0525-a2-block-menu-current`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
在独立 worktree 中产出候选 patch:把 `rust/spikes/leptos-tiptap-spike/src/lib.rs` 中 block menu 仍使用 HTML 整文替换的 legacy helper 抽到独立 editor runtime 模块,降低 `lib.rs` 体积,为后续 history-safe command 替换做准备。本批只做同构迁移,不改变用户行为。
|
|
||||||
|
|
||||||
## 允许修改
|
|
||||||
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/src/lib.rs`
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/src/editor_runtime/mod.rs`
|
|
||||||
- 新增 `rust/spikes/leptos-tiptap-spike/src/editor_runtime/block_menu_legacy_html.rs`
|
|
||||||
|
|
||||||
如编译必须,可把 `DropPlacement` 或必要小 helper 调整为 `pub(crate)`;不要扩大到其它模块。
|
|
||||||
|
|
||||||
## 候选函数
|
|
||||||
|
|
||||||
- `duplicate_top_level_block_html`
|
|
||||||
- `reorder_top_level_block_html`
|
|
||||||
|
|
||||||
可以一起迁移其仅服务这两个函数的小型 DOM helper;不要迁移 overlay state、Leptos signal、`apply_html_update` 或 Tiptap command。
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 不实现新交互,不修 unrelated bug。
|
|
||||||
- 不改 shell / `mnote-web`。
|
|
||||||
- 不修改设计文档、AGENTS、git 状态或提交。
|
|
||||||
- 不把 legacy HTML helper 标成 history-safe;模块名和注释必须表达它只是过渡 legacy 路径。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo fmt --manifest-path rust/Cargo.toml --all --check
|
|
||||||
cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml
|
|
||||||
```
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
handoff 必须列出:
|
|
||||||
|
|
||||||
- 修改文件和迁移函数。
|
|
||||||
- 是否改变任何用户行为,预期应为否。
|
|
||||||
- 仍未解决的 history 风险。
|
|
||||||
- 验收命令和结果。
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
# Reasonix Batch A2 / Worker C:3-20 document conflict panel runtime 第一刀
|
|
||||||
|
|
||||||
Project root:`/mnt/Data1T/mnote-worktrees/0525-a2-conflict-runtime-current`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
在独立 worktree 中产出候选 patch:新增 document conflict panel browser runtime 的第一刀,把 `clearSessionConflictSurface` 这类纯 DOM 清理 helper 外置到 `rust/crates/mnote-web/browser/document-conflict-panel-runtime.js`,并让 `web_shell.rs` 优先委托该 runtime,保留 inline fallback。
|
|
||||||
|
|
||||||
## 允许修改
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/browser/document-conflict-panel-runtime.js`
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
||||||
- `rust/crates/mnote-web/src/routes/mod.rs`
|
|
||||||
|
|
||||||
必要时只新增/调整 `web_shell.rs` 或 `routes/mod.rs` 中的字符串断言测试。
|
|
||||||
|
|
||||||
## 实现要求
|
|
||||||
|
|
||||||
- 新增固定 asset route:`GET /api/mnote-browser-runtime/document-conflict-panel-runtime.js`,返回 `application/javascript; charset=utf-8`。
|
|
||||||
- 在 document shell 页面加载该 module,且不影响现有 editor island adapter inline module。
|
|
||||||
- `web_shell.rs` 中 `clearSessionConflictSurface(session)` 优先调用 `window.__mnoteDocumentConflictPanelRuntime.clearSessionConflictSurface(session, deps)`;runtime 不存在时执行原 inline fallback。
|
|
||||||
- 外置 runtime 只做 DOM 清理,不处理 conflict merge / accept / keep current 业务。
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 不迁 Tiptap editor 内部命令。
|
|
||||||
- 不迁 Page AI panel。
|
|
||||||
- 不改变 conflict 状态机、保存接口、local-folder event channel。
|
|
||||||
- 不修改设计文档、AGENTS、git 状态或提交。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node --check rust/crates/mnote-web/browser/document-conflict-panel-runtime.js
|
|
||||||
cargo fmt --manifest-path rust/Cargo.toml --all --check
|
|
||||||
cargo check --manifest-path rust/Cargo.toml -p mnote-web
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web mnote_browser_runtime_assets_are_explicitly_mounted -- --test-threads=1
|
|
||||||
```
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
handoff 必须列出:
|
|
||||||
|
|
||||||
- 修改文件。
|
|
||||||
- 新 route 和注入位置。
|
|
||||||
- 保留的 fallback。
|
|
||||||
- 验收命令和结果。
|
|
||||||
- 未覆盖风险。
|
|
||||||
-61
@@ -1,61 +0,0 @@
|
|||||||
# Reasonix Batch A2 / Worker D:3-20 local upload insert helper 外置实现
|
|
||||||
|
|
||||||
Project root:`/mnt/Data1T/mnote-worktrees/0525-a2-upload-insert-current`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
在独立 worktree 中产出候选 patch:把 `SIDEBAR_TREE_JS` 中 `insertUploadedAssetIntoEditor(asset, targetRoot)` 的实现同构迁入 `rust/crates/mnote-web/browser/local-upload-runtime.js`,`layout.rs` 只保留委托 wrapper 和 fallback。不得改变上传落盘、资源归属或 editor 插入行为。
|
|
||||||
|
|
||||||
## 允许修改
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/browser/local-upload-runtime.js`
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
|
|
||||||
必要时只更新同文件内现有字符串断言测试。
|
|
||||||
|
|
||||||
## 实现要求
|
|
||||||
|
|
||||||
- `local-upload-runtime.js` 新增导出到 `window.__mnoteLocalUploadRuntime.insertUploadedAssetIntoEditor`。
|
|
||||||
- `layout.rs` 中原 `insertUploadedAssetIntoEditor` 优先委托外置 runtime;runtime 不存在时保留原 fallback。
|
|
||||||
- 外置 runtime 通过 deps 接收现有 helper,不复制 resource/open 业务语义:
|
|
||||||
- `uploadedAssetTitle`
|
|
||||||
- `localAssetOpenUrl`
|
|
||||||
- `uploadedAssetUrl`
|
|
||||||
- `uploadedAssetType`
|
|
||||||
- `isLocalUploadedAsset`
|
|
||||||
- `buildOnlyOfficeAssetOpenUrl`
|
|
||||||
- `fetchCurrentOnlyOfficeUserId`
|
|
||||||
- `buildOnlyOfficeOpenPath`
|
|
||||||
- `inferOnlyOfficeFileType`
|
|
||||||
- `currentDocumentId`
|
|
||||||
- `uploadedAttachmentClass`
|
|
||||||
- `uploadedFileSize`
|
|
||||||
- `cssEscape`
|
|
||||||
- `enhanceEditorAttachmentLinks`
|
|
||||||
- 保持 `data-mnote-last-upload-inserted`、`data-mnote-last-upload-asset-id`、`data-mnote-last-upload-insert-error` 行为不变。
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 不迁 `uploadFileToMediaAsset` / `uploadFilesWithResolvedTarget` 主流程。
|
|
||||||
- 不改 `/api/local-folder/assets/upload` 合同。
|
|
||||||
- 不改 resource open / OnlyOffice URL 语义。
|
|
||||||
- 不修改设计文档、AGENTS、git 状态或提交。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node --check rust/crates/mnote-web/browser/local-upload-runtime.js
|
|
||||||
cargo fmt --manifest-path rust/Cargo.toml --all --check
|
|
||||||
cargo check --manifest-path rust/Cargo.toml -p mnote-web
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web sidebar_upload_runtime_routes_local_markdown_assets_to_local_folder -- --test-threads=1
|
|
||||||
```
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
handoff 必须列出:
|
|
||||||
|
|
||||||
- 修改文件。
|
|
||||||
- 委托 deps 清单。
|
|
||||||
- 是否保持 fallback。
|
|
||||||
- 验收命令和结果。
|
|
||||||
- 未覆盖风险。
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
# Reasonix Worker Task
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
对 `5-29` 的 block DnD runtime 拆分做只读审计,目标只限于:
|
|
||||||
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/src/lib.rs` 里的
|
|
||||||
- `drop_indicator_from_target`
|
|
||||||
- `drop_indicator_from_point`
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/src/editor_runtime/block_dnd.rs`
|
|
||||||
|
|
||||||
你只做边界审计与最小切片建议,不修改源码,不运行格式化,不运行构建,不提交 git。
|
|
||||||
|
|
||||||
## Project Root
|
|
||||||
|
|
||||||
`/mnt/Data1T/mnote-worktrees/0525-ak-worker-a-5-29-drop-indicator-readonly`
|
|
||||||
|
|
||||||
## 输入文件
|
|
||||||
|
|
||||||
- Checklist:
|
|
||||||
- `/mnt/Data1T/mnote/design/05-editor-mainline/process/5-29-editor-runtime-followup-checklist-v1.md`
|
|
||||||
- 相关代码入口:
|
|
||||||
- `/mnt/Data1T/mnote-worktrees/0525-ak-worker-a-5-29-drop-indicator-readonly/rust/spikes/leptos-tiptap-spike/src/lib.rs`
|
|
||||||
- `/mnt/Data1T/mnote-worktrees/0525-ak-worker-a-5-29-drop-indicator-readonly/rust/spikes/leptos-tiptap-spike/src/editor_runtime/block_dnd.rs`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你负责:
|
|
||||||
|
|
||||||
- 只读分析 `drop_indicator_from_target` / `drop_indicator_from_point` 现在还剩哪些依赖。
|
|
||||||
- 给出“下一刀最小可迁移 helper”建议。
|
|
||||||
- 明确哪些壳层必须继续留在 `lib.rs`。
|
|
||||||
- 若你认为可以继续外置,请给出建议的 helper 签名和责任边界。
|
|
||||||
|
|
||||||
你不能修改:
|
|
||||||
|
|
||||||
- 任何源码
|
|
||||||
- 任何 design / bugs 文档
|
|
||||||
- 任何生成产物
|
|
||||||
|
|
||||||
共享或冲突文件规则:
|
|
||||||
|
|
||||||
- 本任务是只读审计,工作区必须保持源码零 diff。
|
|
||||||
- 允许写 runner 自己的输出文件,例如 `process-handoff.md/json`、`final.md`、`result.json`。
|
|
||||||
|
|
||||||
## 额外限制
|
|
||||||
|
|
||||||
- 禁止创建新的 `.codex/reasonix-tasks/*.md`
|
|
||||||
- 禁止启动新的 reasonix / claudecode / codex / hermes / runner
|
|
||||||
- 禁止操作其他 worktree
|
|
||||||
- 不要把建议扩展到 `hovered_block_from_selection`、listener、signal、keyboard branch、block reorder
|
|
||||||
- 不要建议复制布局常量到 `block_dnd.rs`
|
|
||||||
|
|
||||||
## 需要回答的问题
|
|
||||||
|
|
||||||
1. `drop_indicator_from_target` 是否已经具备迁入 `editor_runtime/block_dnd.rs` 的条件?
|
|
||||||
2. 如果是,最小 helper 签名应该是什么?
|
|
||||||
3. `drop_indicator_from_point` 是否也应在同一刀一起迁出,还是分下一刀更稳?
|
|
||||||
4. 哪些依赖仍然应保留在 `lib.rs` 壳层?
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
不需要运行测试;这是只读审计任务。
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
请按以下结构回复:
|
|
||||||
|
|
||||||
- 修改文件:
|
|
||||||
- 审计结论:
|
|
||||||
- 建议的最小切片:
|
|
||||||
- 必须留在 lib.rs 的边界:
|
|
||||||
- 未完成项:
|
|
||||||
- 风险和需要 Codex 复核的点:
|
|
||||||
-73
@@ -1,73 +0,0 @@
|
|||||||
# Reasonix Worker Task
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
对 `3-20` 的 document pane host adapter / conflict panel runtime 做只读审计,范围只限于:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
||||||
- `rust/crates/mnote-web/browser/document-conflict-panel-runtime.js`
|
|
||||||
- `design/03-rust-web/process/3-20-browser-runtime-followup-checklist-v1.md`
|
|
||||||
|
|
||||||
只做边界审计和最小切片建议,不修改源码、不运行测试、不提交 git。
|
|
||||||
|
|
||||||
## Project Root
|
|
||||||
|
|
||||||
`/mnt/Data1T/mnote-worktrees/0525-al-worker-a-3-20-document-pane-host-readonly`
|
|
||||||
|
|
||||||
## 输入文件
|
|
||||||
|
|
||||||
- Checklist:
|
|
||||||
- `/mnt/Data1T/mnote/design/03-rust-web/process/3-20-browser-runtime-followup-checklist-v1.md`
|
|
||||||
- 相关代码入口:
|
|
||||||
- `/mnt/Data1T/mnote-worktrees/0525-al-worker-a-3-20-document-pane-host-readonly/rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
||||||
- `/mnt/Data1T/mnote-worktrees/0525-al-worker-a-3-20-document-pane-host-readonly/rust/crates/mnote-web/browser/document-conflict-panel-runtime.js`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你负责:
|
|
||||||
|
|
||||||
- 只读分析 document conflict / document pane host 当前还留在 `web_shell.rs` 的可迁纯 DOM/helper。
|
|
||||||
- 明确哪些逻辑必须继续留在 `web_shell.rs` 壳层。
|
|
||||||
- 给出下一刀最小 helper 建议,优先纯 DOM / callback wiring / host mount helper,不要碰 fetch/persist/session status 业务逻辑。
|
|
||||||
|
|
||||||
你不能修改:
|
|
||||||
|
|
||||||
- 任何源码
|
|
||||||
- 任何 design / bugs 文档
|
|
||||||
- 任何生成产物
|
|
||||||
|
|
||||||
共享或冲突文件规则:
|
|
||||||
|
|
||||||
- 本任务是只读审计,工作区必须保持源码零 diff。
|
|
||||||
- 允许写 runner 自己的输出文件,例如 `process-handoff.md/json`、`final.md`、`result.json`。
|
|
||||||
|
|
||||||
## 额外限制
|
|
||||||
|
|
||||||
- 禁止创建新的 `.codex/reasonix-tasks/*.md`
|
|
||||||
- 禁止启动新的 reasonix / claudecode / codex / hermes / runner
|
|
||||||
- 禁止操作其他 worktree
|
|
||||||
- 不要建议整体迁出 `acceptDiskVersion`、`keepCurrentEditorVersion`、`writeMergedConflictResult`
|
|
||||||
- 不要建议整体迁出 fetch / persist / session status / aggregate/resource snapshot 逻辑
|
|
||||||
- 重点只看 host 挂载、panel 定位、header 插入、diff panel 显隐、shared callback wiring 是否还能收一刀
|
|
||||||
|
|
||||||
## 需要回答的问题
|
|
||||||
|
|
||||||
1. `renderSessionConflictSurface` 中是否还有可迁出的纯 DOM / host helper?
|
|
||||||
2. `openConflictDiffPanel` 中除已迁的 `populateSessionConflictDiffPanel` 外,是否还有可独立迁出的纯 DOM 层?
|
|
||||||
3. 下一刀最小可迁 helper 的建议签名是什么?
|
|
||||||
4. 哪些边界必须继续留在 `web_shell.rs`?
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
不需要运行测试;这是只读审计任务。
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
请按以下结构回复:
|
|
||||||
|
|
||||||
- 修改文件:
|
|
||||||
- 审计结论:
|
|
||||||
- 建议的最小切片:
|
|
||||||
- 必须留在 web_shell.rs 的边界:
|
|
||||||
- 未完成项:
|
|
||||||
- 风险和需要 Codex 复核的点:
|
|
||||||
-78
@@ -1,78 +0,0 @@
|
|||||||
# Reasonix Worker Task
|
|
||||||
|
|
||||||
## 任务
|
|
||||||
|
|
||||||
对 `3-20` 的 filetree drop/upload preflight DOM helper 做只读审计,范围只限于:
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- `rust/crates/mnote-web/browser/filetree-runtime.js`
|
|
||||||
- `design/03-rust-web/process/3-20-browser-runtime-followup-checklist-v1.md`
|
|
||||||
|
|
||||||
只做边界审计和最小切片建议,不修改源码、不运行测试、不提交 git。
|
|
||||||
|
|
||||||
## Project Root
|
|
||||||
|
|
||||||
`/mnt/Data1T/mnote-worktrees/0525-am-worker-a-3-20-filetree-preflight-readonly`
|
|
||||||
|
|
||||||
## 输入文件
|
|
||||||
|
|
||||||
- Checklist:
|
|
||||||
- `/mnt/Data1T/mnote/design/03-rust-web/process/3-20-browser-runtime-followup-checklist-v1.md`
|
|
||||||
- 相关代码入口:
|
|
||||||
- `/mnt/Data1T/mnote-worktrees/0525-am-worker-a-3-20-filetree-preflight-readonly/rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
- `/mnt/Data1T/mnote-worktrees/0525-am-worker-a-3-20-filetree-preflight-readonly/rust/crates/mnote-web/browser/filetree-runtime.js`
|
|
||||||
|
|
||||||
## Ownership
|
|
||||||
|
|
||||||
你负责:
|
|
||||||
|
|
||||||
- 只读分析以下函数是否适合迁入 `filetree-runtime.js`:
|
|
||||||
- `fileTreeRowsForUploadPreflight`
|
|
||||||
- `fileTreeDocumentParentsForPreflight`
|
|
||||||
- `fileTreeTargetChildrenForPreflight`
|
|
||||||
- `fileTreeDropPreflightRows`
|
|
||||||
- 给出下一刀最小 helper 建议。
|
|
||||||
- 明确哪些依赖必须继续留在 `layout.rs` 壳层。
|
|
||||||
|
|
||||||
你不能修改:
|
|
||||||
|
|
||||||
- 任何源码
|
|
||||||
- 任何 design / bugs 文档
|
|
||||||
- 任何生成产物
|
|
||||||
|
|
||||||
共享或冲突文件规则:
|
|
||||||
|
|
||||||
- 本任务是只读审计,工作区必须保持源码零 diff。
|
|
||||||
- 允许写 runner 自己的输出文件,例如 `process-handoff.md/json`、`final.md`、`result.json`。
|
|
||||||
|
|
||||||
## 额外限制
|
|
||||||
|
|
||||||
- 禁止创建新的 `.codex/reasonix-tasks/*.md`
|
|
||||||
- 禁止启动新的 reasonix / claudecode / codex / hermes / runner
|
|
||||||
- 禁止操作其他 worktree
|
|
||||||
- 不要建议整体迁出 `ensureFileTreeWritableTarget`
|
|
||||||
- 不要建议整体迁出 `/api/tree/filetree/drop-preflight` fetch
|
|
||||||
- 不要建议整体迁出 `resolveFileTreeUploadTarget` 或 `refreshLocalFolderSidebarSnapshot`
|
|
||||||
- 重点只看 DOM 行遍历、属性采集、目标 children/parents 组装这一层
|
|
||||||
|
|
||||||
## 需要回答的问题
|
|
||||||
|
|
||||||
1. 这 4 个 preflight helper 中,哪些已经具备迁入 `filetree-runtime.js` 的条件?
|
|
||||||
2. 最小可迁 helper 签名应该是什么?
|
|
||||||
3. 哪些依赖必须继续留在 `layout.rs`?
|
|
||||||
4. 是否应该一刀一起迁,还是拆成两刀更稳?
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
不需要运行测试;这是只读审计任务。
|
|
||||||
|
|
||||||
## 最终回复格式
|
|
||||||
|
|
||||||
请按以下结构回复:
|
|
||||||
|
|
||||||
- 修改文件:
|
|
||||||
- 审计结论:
|
|
||||||
- 建议的最小切片:
|
|
||||||
- 必须留在 layout.rs 的边界:
|
|
||||||
- 未完成项:
|
|
||||||
- 风险和需要 Codex 复核的点:
|
|
||||||
-71
@@ -1,71 +0,0 @@
|
|||||||
# Reasonix Batch B / Worker D3:3-20 insertUploadedAssetIntoEditor 外置候选实现
|
|
||||||
|
|
||||||
Project root:`/mnt/Data1T/mnote-worktrees/0525-b3-upload-insert-runtime`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
在独立 worktree 中产出候选 patch:把 `SIDEBAR_TREE_JS` 中 `insertUploadedAssetIntoEditor(asset, targetRoot)` 的主体同构迁入 `rust/crates/mnote-web/browser/local-upload-runtime.js`,`layout.rs` 只保留委托 wrapper 和 inline fallback。不得改变上传落盘、资源归属、OnlyOffice URL 或 editor 插入行为。
|
|
||||||
|
|
||||||
## 允许修改
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/browser/local-upload-runtime.js`
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
|
|
||||||
必要时只更新 `layout.rs` 中现有字符串断言测试。不要修改设计文档、AGENTS、其它源码、generated wasm、git 状态或提交。
|
|
||||||
|
|
||||||
## 实现要求
|
|
||||||
|
|
||||||
- `local-upload-runtime.js` 新增 `insertUploadedAssetIntoEditor(asset, targetRoot, deps)`,并导出到 `window.__mnoteLocalUploadRuntime.insertUploadedAssetIntoEditor`。
|
|
||||||
- `layout.rs` 中原 `insertUploadedAssetIntoEditor(asset, targetRoot)` 优先委托:
|
|
||||||
`localUploadRuntimeFunction('insertUploadedAssetIntoEditor')`。
|
|
||||||
- 外置 runtime 不复制 resource/open 长期业务语义,必须通过 `deps` 接收以下既有 helper:
|
|
||||||
- `uploadedAssetTitle`
|
|
||||||
- `localAssetOpenUrl`
|
|
||||||
- `uploadedAssetUrl`
|
|
||||||
- `uploadedAssetType`
|
|
||||||
- `isLocalUploadedAsset`
|
|
||||||
- `buildOnlyOfficeAssetOpenUrl`
|
|
||||||
- `fetchCurrentOnlyOfficeUserId`
|
|
||||||
- `buildOnlyOfficeOpenPath`
|
|
||||||
- `inferOnlyOfficeFileType`
|
|
||||||
- `currentDocumentId`
|
|
||||||
- `uploadedAttachmentClass`
|
|
||||||
- `uploadedFileSize`
|
|
||||||
- `cssEscape`
|
|
||||||
- `enhanceEditorAttachmentLinks`
|
|
||||||
- 保持以下 DOM attribute 行为完全不变:
|
|
||||||
- `data-mnote-last-upload-inserted`
|
|
||||||
- `data-mnote-last-upload-asset-id`
|
|
||||||
- `data-mnote-last-upload-insert-error`
|
|
||||||
- 保持 image 分支 `setImage({ src, alt, title })` 行为不变。
|
|
||||||
- 保持附件 link content、`storedHref`、`class`、`target`、`rel`、后续 `setTimeout` enhance 行为不变。
|
|
||||||
- runtime 不存在时,inline fallback 必须继续执行原实现。
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 不迁 `uploadFileToMediaAsset` / `uploadFilesWithResolvedTarget` 编排流程。
|
|
||||||
- 不改 `/api/local-folder/assets/upload` 合同。
|
|
||||||
- 不改 resource open / OnlyOffice URL 语义。
|
|
||||||
- 不做格式化之外的邻近重构。
|
|
||||||
- 不提交 git。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node --check rust/crates/mnote-web/browser/local-upload-runtime.js
|
|
||||||
cargo fmt --manifest-path rust/Cargo.toml --all --check
|
|
||||||
cargo check --manifest-path rust/Cargo.toml -p mnote-web
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web local_upload_runtime_contains_editor_upload_context_helpers -- --test-threads=1
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web sidebar_upload_runtime_routes_local_markdown_assets_to_local_folder -- --test-threads=1
|
|
||||||
```
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
handoff 必须列出:
|
|
||||||
|
|
||||||
- 修改文件。
|
|
||||||
- 委托 deps 清单。
|
|
||||||
- 是否保持 fallback。
|
|
||||||
- 验收命令和结果。
|
|
||||||
- 未覆盖风险。
|
|
||||||
- `git diff --stat`。
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
# Reasonix Batch B / Worker E:5-29 block menu delete undo 回归修复
|
|
||||||
|
|
||||||
Project root:`/mnt/Data1T/mnote-worktrees/0525-b3-block-delete-undo`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
在独立 worktree 中产出候选 patch,修复 `task489-block-menu-delete-undo-smoke` 暴露的回归:块菜单删除 `Beta block` 后,`Control+Z` 必须恢复目标块,`Control+Y` 必须再次删除目标块。
|
|
||||||
|
|
||||||
## 允许修改
|
|
||||||
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/src/editor_runtime/history_safe_commands.rs`
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/src/lib.rs`
|
|
||||||
- 如确需重建运行时,可更新:
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.js`
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island_bg.wasm`
|
|
||||||
|
|
||||||
如证据证明是 smoke 脚本焦点问题,允许只修改:
|
|
||||||
|
|
||||||
- `scripts/task489-block-menu-delete-undo-smoke.js`
|
|
||||||
|
|
||||||
但必须用浏览器证据说明为什么产品行为没有问题。
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 不回退到 `apply_html_update(...)` / `set_content(...)` 整文替换删除。
|
|
||||||
- 不修改上传、mnote-web shell、AGENTS、设计文档、bugs 文档或 git 状态。
|
|
||||||
- 不提交 git。
|
|
||||||
- 不做与 block menu delete undo 无关的重构。
|
|
||||||
|
|
||||||
## 必做排查
|
|
||||||
|
|
||||||
1. 阅读 `bugs/05-editor-mainline/process/5-39-block-menu-delete-undo-regression-v1.md`。
|
|
||||||
2. 对比 `delete_top_level_block_with_history`、block menu delete click handler、`sync_persisted_editor_command` 的调用顺序。
|
|
||||||
3. 先判断根因:history 未入栈、后续同步清空 history、焦点导致快捷键未进入 editor,或脚本断言问题。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo fmt --manifest-path rust/Cargo.toml --all --check
|
|
||||||
cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml
|
|
||||||
```
|
|
||||||
|
|
||||||
若修改了 Rust island 源码且需要浏览器验证,请同时运行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo build --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml --target wasm32-unknown-unknown --release
|
|
||||||
wasm-bindgen rust/spikes/leptos-tiptap-spike/target/wasm32-unknown-unknown/release/mnote_leptos_tiptap_spike.wasm --target web --out-dir rust/spikes/leptos-tiptap-spike/generated/island --out-name mnote-leptos-tiptap-spike-island
|
|
||||||
node scripts/task489-block-menu-delete-undo-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
handoff 必须列出:
|
|
||||||
|
|
||||||
- 根因判断。
|
|
||||||
- 修改文件。
|
|
||||||
- 为什么不会破坏 history-safe 删除方向。
|
|
||||||
- 验收命令和结果。
|
|
||||||
- 未覆盖风险。
|
|
||||||
- `git diff --stat`。
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
# Reasonix Batch C / Worker B:5-29 block menu delete undo 修复候选
|
|
||||||
|
|
||||||
Project root:`/mnt/Data1T/mnote-worktrees/0525-c-worker-b-block-delete-undo`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
在独立 worktree 中产出候选 patch,修复 `node scripts/task489-block-menu-delete-undo-smoke.js` 暴露的回归:块菜单删除 `Beta block` 后,`Control+Z` 必须恢复目标块,`Control+Y` 必须再次删除目标块。
|
|
||||||
|
|
||||||
## 允许修改
|
|
||||||
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/src/editor_runtime/history_safe_commands.rs`
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/src/editor_runtime/command_sync.rs`
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/src/lib.rs`
|
|
||||||
- 如确需重建运行时,可更新:
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.js`
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island_bg.wasm`
|
|
||||||
|
|
||||||
如证据证明只是 smoke 焦点问题,允许只修改:
|
|
||||||
|
|
||||||
- `scripts/task489-block-menu-delete-undo-smoke.js`
|
|
||||||
|
|
||||||
但必须用浏览器证据说明为什么产品行为没有问题。
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 不回退到 `apply_html_update(...)` / `set_content(...)` 整文替换删除。
|
|
||||||
- 不修改 3-20 runtime、上传、mnote-web shell、AGENTS、设计文档、bugs 文档或 git 状态。
|
|
||||||
- 不提交 git。
|
|
||||||
- 不做与 block menu delete undo 无关的重构。
|
|
||||||
|
|
||||||
## 必做排查
|
|
||||||
|
|
||||||
1. 阅读 `bugs/05-editor-mainline/process/5-39-block-menu-delete-undo-regression-v1.md`。
|
|
||||||
2. 对比 `delete_top_level_block_with_history`、block menu delete click handler、`sync_persisted_editor_command` 的调用顺序。
|
|
||||||
3. 先判断根因:history 未入栈、后续同步清空 history、焦点导致快捷键未进入 editor,或脚本断言问题。
|
|
||||||
4. 若修改 Rust island 源码,必须重建 generated island 文件并跑浏览器 smoke。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo fmt --manifest-path rust/Cargo.toml --all --check
|
|
||||||
cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml
|
|
||||||
cargo build --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml --target wasm32-unknown-unknown --release
|
|
||||||
wasm-bindgen rust/spikes/leptos-tiptap-spike/target/wasm32-unknown-unknown/release/mnote_leptos_tiptap_spike.wasm --target web --out-dir rust/spikes/leptos-tiptap-spike/generated/island --out-name mnote-leptos-tiptap-spike-island
|
|
||||||
node scripts/task489-block-menu-delete-undo-smoke.js
|
|
||||||
node scripts/task488-local-attachment-link-delete-undo-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
handoff 必须列出:
|
|
||||||
|
|
||||||
- 根因判断。
|
|
||||||
- 修改文件。
|
|
||||||
- 为什么不会破坏 history-safe 删除方向。
|
|
||||||
- 验收命令和结果。
|
|
||||||
- 浏览器 smoke 证据路径。
|
|
||||||
- 未覆盖风险。
|
|
||||||
- `git diff --stat`。
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
# Reasonix Batch C / Worker C:3-20 uploadFileToMediaAsset runtime 外置候选
|
|
||||||
|
|
||||||
Project root:`/mnt/Data1T/mnote-worktrees/0525-c-worker-c-upload-media-asset`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
在独立 worktree 中产出候选 patch:把 `SIDEBAR_TREE_JS` 中 `uploadFileToMediaAsset(file, plan, options)` 的实现同构迁入 `rust/crates/mnote-web/browser/local-upload-runtime.js`,`layout.rs` 只保留委托 wrapper 和完整 inline fallback。不得改变上传落盘、资源归属、editor 插入、sidebar snapshot refresh 或事件语义。
|
|
||||||
|
|
||||||
## 允许修改
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/browser/local-upload-runtime.js`
|
|
||||||
- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
|
|
||||||
|
|
||||||
必要时只更新 `layout.rs` 中现有字符串断言测试。
|
|
||||||
|
|
||||||
## 实现要求
|
|
||||||
|
|
||||||
- `local-upload-runtime.js` 新增并导出 `uploadFileToMediaAsset(file, plan, options, deps)`。
|
|
||||||
- `layout.rs` 中原 `uploadFileToMediaAsset(file, plan, options)` 优先委托 `localUploadRuntimeFunction('uploadFileToMediaAsset')`。
|
|
||||||
- runtime 不复制 editor / resource open 长期业务语义,必须通过 `deps` 接收既有 helper 或 callback。
|
|
||||||
- 保持以下行为完全不变:
|
|
||||||
- `resolveEditorUploadContext` 的调用和 options 透传。
|
|
||||||
- `uploadLocalFolderAsset` 的调用和 FormData 合同。
|
|
||||||
- `insertUploadedAssetIntoEditor` 的调用时机。
|
|
||||||
- `reloadSidebarTreeSnapshot()`、`wolai:local-assets-changed`、`data-mnote-last-upload-*` 相关行为。
|
|
||||||
- runtime 不存在时,inline fallback 继续执行原实现。
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 不迁 `uploadFilesWithResolvedTarget`。
|
|
||||||
- 不改 `/api/local-folder/assets/upload` 合同。
|
|
||||||
- 不改 resource open / OnlyOffice URL 语义。
|
|
||||||
- 不修改 document conflict runtime、editor island、AGENTS、设计文档或 git 状态。
|
|
||||||
- 不提交 git。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node --check rust/crates/mnote-web/browser/local-upload-runtime.js
|
|
||||||
cargo fmt --manifest-path rust/Cargo.toml --all --check
|
|
||||||
cargo check --manifest-path rust/Cargo.toml -p mnote-web
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web local_upload_runtime_contains_editor_upload_context_helpers -- --test-threads=1
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web sidebar_upload_runtime_routes_local_markdown_assets_to_local_folder -- --test-threads=1
|
|
||||||
node scripts/task479-local-folder-markdown-resource-lifecycle-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
handoff 必须列出:
|
|
||||||
|
|
||||||
- 修改文件。
|
|
||||||
- 委托 deps 清单。
|
|
||||||
- 是否保留 fallback。
|
|
||||||
- 验收命令和结果。
|
|
||||||
- 浏览器 smoke 证据路径。
|
|
||||||
- 未覆盖风险。
|
|
||||||
- `git diff --stat`。
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
# Reasonix Batch C / Worker D:3-20 document conflict action 边界候选
|
|
||||||
|
|
||||||
Project root:`/mnt/Data1T/mnote-worktrees/0525-c-worker-d-conflict-action`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
在独立 worktree 中产出候选 patch:围绕 `document-conflict-panel-runtime.js` 与 `web_shell.rs` 的边界继续收口,但只允许迁出一个低风险 action helper 或 wiring helper。优先选择 `openConflictDiffPanel(session, panel)` 的纯 UI 面板创建/切换部分;如果发现它仍强依赖 session 状态或 editor 内容读取,则只输出最小诊断 patch 或测试,不强迁。
|
|
||||||
|
|
||||||
## 允许修改
|
|
||||||
|
|
||||||
- `rust/crates/mnote-web/browser/document-conflict-panel-runtime.js`
|
|
||||||
- `rust/crates/mnote-web/src/routes/web_shell.rs`
|
|
||||||
|
|
||||||
必要时只更新同文件现有字符串断言测试。
|
|
||||||
|
|
||||||
## 实现要求
|
|
||||||
|
|
||||||
- 保持 `acceptDiskVersion(session)`、`keepCurrentEditorVersion(session)` 的保存 / 状态机语义在 `web_shell.rs` 中,不迁业务状态机。
|
|
||||||
- 如果迁 `openConflictDiffPanel`,runtime 必须通过 `deps` 接收读取编辑器内容、渲染 diff、toast、escape 等依赖,不得在 runtime 中复制 document session 真相。
|
|
||||||
- runtime 不存在时,inline fallback 必须继续执行原实现。
|
|
||||||
- 若实际不可安全迁出,必须用代码证据说明阻塞点,并可只补字符串断言或注释禁止误迁。
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 不迁 document session lifecycle。
|
|
||||||
- 不迁 local upload / filetree / editor island。
|
|
||||||
- 不修改 AGENTS、设计文档、bugs 文档或 git 状态。
|
|
||||||
- 不提交 git。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node --check rust/crates/mnote-web/browser/document-conflict-panel-runtime.js
|
|
||||||
cargo fmt --manifest-path rust/Cargo.toml --all --check
|
|
||||||
cargo check --manifest-path rust/Cargo.toml -p mnote-web
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web document_conflict_panel_runtime_contains_dom_helpers -- --test-threads=1
|
|
||||||
cargo test --manifest-path rust/Cargo.toml -p mnote-web mnote_browser_runtime_assets_are_explicitly_mounted -- --test-threads=1
|
|
||||||
```
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
handoff 必须列出:
|
|
||||||
|
|
||||||
- 根因/边界判断:迁出或不迁出的理由。
|
|
||||||
- 修改文件。
|
|
||||||
- 委托 deps 清单或阻塞证据。
|
|
||||||
- 是否保留 fallback。
|
|
||||||
- 验收命令和结果。
|
|
||||||
- 未覆盖风险。
|
|
||||||
- `git diff --stat`。
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
# Reasonix Batch D / Worker A:5-29 editor focus helper 模块化候选
|
|
||||||
|
|
||||||
Project root:`/mnt/Data1T/mnote-worktrees/0525-d-worker-a-5-29-focus-runtime`
|
|
||||||
|
|
||||||
## 目标
|
|
||||||
|
|
||||||
在独立 worktree 中产出候选 patch,把 `rust/spikes/leptos-tiptap-spike/src/lib.rs` 中焦点相关 helper 的最小可迁部分迁入 `editor_runtime` 子模块,继续推进 `5-28` 后续收口。
|
|
||||||
|
|
||||||
优先迁出:
|
|
||||||
|
|
||||||
- `schedule_editor_focus(editor)`
|
|
||||||
- `active_editor_stage()`
|
|
||||||
- 如有必要,可新增 `body_has_focus()` 或同等私有 helper
|
|
||||||
|
|
||||||
## 允许修改
|
|
||||||
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/src/lib.rs`
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/src/editor_runtime/mod.rs`
|
|
||||||
- 新增 `rust/spikes/leptos-tiptap-spike/src/editor_runtime/editor_focus.rs`
|
|
||||||
- 如 Rust island 源码变更并需要浏览器验证,可更新:
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.js`
|
|
||||||
- `rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island_bg.wasm`
|
|
||||||
|
|
||||||
## 禁止事项
|
|
||||||
|
|
||||||
- 不修改 3-20 / mnote-web 上传 runtime。
|
|
||||||
- 不迁 `sync_editor_overlay_state` / `try_sync_editor_overlay_state` 整个大函数。
|
|
||||||
- 不改 block menu 行为语义,不回退 history-safe delete。
|
|
||||||
- 不修改 AGENTS、design、bugs 或 git 状态。
|
|
||||||
- 不提交 git。
|
|
||||||
|
|
||||||
## 实现要求
|
|
||||||
|
|
||||||
- 新模块必须只承接焦点/active editor DOM 判断,不承接 overlay signal、block menu signal、selection payload 或 host bridge 事件。
|
|
||||||
- `active_editor_stage` 迁出后仍应使用当前 `EDITOR_STAGE_SELECTOR` / editor root 判断语义;可通过参数传入 selectors 或通过小型 provider/helper 避免硬编码重复。
|
|
||||||
- 保持 `task489` 的删除后立即 `Ctrl+Z` 行为不回归。
|
|
||||||
|
|
||||||
## 验收命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cargo fmt --manifest-path rust/Cargo.toml --all --check
|
|
||||||
cargo check --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml
|
|
||||||
cargo build --manifest-path rust/spikes/leptos-tiptap-spike/Cargo.toml --target wasm32-unknown-unknown --release
|
|
||||||
wasm-bindgen rust/spikes/leptos-tiptap-spike/target/wasm32-unknown-unknown/release/mnote_leptos_tiptap_spike.wasm --target web --out-dir rust/spikes/leptos-tiptap-spike/generated/island --out-name mnote-leptos-tiptap-spike-island
|
|
||||||
NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task489-block-menu-delete-undo-smoke.js
|
|
||||||
NODE_PATH=/mnt/Data1T/mnote/node_modules node scripts/task488-local-attachment-link-delete-undo-smoke.js
|
|
||||||
```
|
|
||||||
|
|
||||||
## 输出要求
|
|
||||||
|
|
||||||
handoff 必须列出:
|
|
||||||
|
|
||||||
- 修改文件。
|
|
||||||
- 迁出的函数和未迁出的边界。
|
|
||||||
- 为什么不会破坏 block menu delete undo。
|
|
||||||
- 验收命令和结果。
|
|
||||||
- 浏览器 smoke 证据路径。
|
|
||||||
- 未覆盖风险。
|
|
||||||
- `git diff --stat`。
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user