Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ The root `.gitignore` is an allowlist. Never add knowledge projects, caches, cre
- `docs_mv.py` — move/rename a doc or folder, or rename a heading, rewriting links and anchors (`--dry-run` to preview)
- `docs_doctor.py` — health check of a project's setup (hook, template sync, config, git, lint, staleness); `--all` for every project
- `sync_rules.py` — push the template's shared rules, hook and config files (`.vscode/*`, `.markdownlint.json`, `_doc-template.md`) into all projects (`--check` for drift)
- `icloud_bridge.py` — selective iCloud mirror, centralized Obsidian task views, boolean imports, local commits and optional macOS scheduling/notifications
- `icloud_bridge.py` — selective iCloud mirror, centralized Obsidian task views, task/metadata imports, local commits and optional macOS scheduling/notifications
- `ibridge_tasks.py` — internal lossless Tasks/Dataview field parser and stable-row projection protocol
- `framework_checkout.py` — preview/enable a minimal pull-only clone, update it, or restore the full checkout
- `docsource.py` — shared working-tree/Git-index reader for lint and README catalogue checks
- `selftest.py` — automated self-test of all the tools in an isolated temp copy (about 15 seconds)
Expand All @@ -38,7 +39,7 @@ The root `.gitignore` is an allowlist. Never add knowledge projects, caches, cre

## Changing the tools or template (verification required)
- Before editing anything in `_tools/` or `_template/`, make sure no other session is editing them (one writer at a time). Snapshot shared inputs and check for concurrent changes before deploying a release.
- Run `uv run _tools/selftest.py` before you start (to know the baseline) and again when you finish. It must report all checks passed. Use `-k <section>` while iterating (sections: create, new_doc, stamp, hook, lint, timezone, links, staged_source, markdown_fences, toc, mv, tables, stale, sync, doctor, layout, cli_errors, failure_paths, uv_cache, framework_checkout, ibridge, ibridge_rename, ibridge_isolation, ibridge_notes, ibridge_transient, ibridge_status, ibridge_setup, framework_index, ci_allowlist).
- Run `uv run _tools/selftest.py` before you start (to know the baseline) and again when you finish. It must report all checks passed. Use `-k <section>` while iterating (sections: create, new_doc, stamp, hook, lint, timezone, links, staged_source, markdown_fences, toc, mv, tables, stale, sync, doctor, layout, cli_errors, failure_paths, uv_cache, framework_checkout, ibridge, ibridge_tasks, ibridge_rich_adapter, ibridge_rename, ibridge_isolation, ibridge_notes, ibridge_transient, ibridge_status, ibridge_setup, framework_index, ci_allowlist).
- Every new tool, setting or behaviour gets a check in `_tools/selftest.py` and an entry in the public documentation: keep README.md concise and place detailed commands/configuration in docs/guide.md (`uv run .github/scripts/test_public_docs.py` checks both in the full development checkout and fails if a tool or `.docs.yaml` setting is undocumented) in the same change. Run that public-documentation check alongside the self-test before submitting. A tool change without passing checks is not done.
- When managed template rules change, sync them into affected projects only with the owner's authorization, then validate and commit in each independent project repository. Publishing the framework alone does not authorize modifying knowledge projects.
- The pre-commit hook fails closed: if a project cannot find `../_tools` or `uv`, its commits are blocked (`DOCS_SKIP_HOOK=1` bypasses once, only when the user says so).
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,8 @@ Every tool, flag and setting is documented in the [full guide](docs/guide.md).
- **Rename tasks** with per-project opt-in, or **edit selected notes** with both the bridge text-edit switch and project path-pattern opt-in. Generated task views accept only supported task edits.
- **Keep a local history.** An available Mac validates imports against clean working trees and conflict rules, updates source files, and commits locally. Local commits do not push to GitHub.

The iPhone bridge supports nested and quoted tasks, Tasks dates/priorities and custom statuses, and plugin-generated recurrence. See the [task compatibility and acceptance requirements](docs/obsidian.md#task-format-compatibility).

Scheduled sync defaults to **five minutes, plus iCloud delivery delay**. Folderwise provides no hosted sync service.

**[Set up Obsidian + iCloud →](docs/obsidian.md)** · [See the task round trip](docs/obsidian.md#complete-and-reopen-from-iphone) · [Acceptance checklist](docs/ibridge-testing.md)
Expand Down
192 changes: 192 additions & 0 deletions _tools/fixtures/obsidian_tasks_8_6_0.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
{
"upstream": "obsidian-tasks-group/obsidian-tasks",
"commit": "6c7e9a1443e645f29998619974329b61cd2d52dd",
"version": "8.6.0",
"generatedAt": "2026-10-26T12:00:00Z",
"cases": [
{
"name": "tasksPluginEmoji_complete",
"format": "tasksPluginEmoji",
"before": "- [ ] Fixture __SOURCE__ ⏫ 📅 2026-11-01",
"after": [
"- [x] Fixture __SOURCE__ ⏫ 📅 2026-11-01 ✅ 2026-10-26"
]
},
{
"name": "tasksPluginEmoji_cancel",
"format": "tasksPluginEmoji",
"before": "- [ ] Fixture __SOURCE__ 📅 2026-11-01",
"after": [
"- [-] Fixture __SOURCE__ 📅 2026-11-01 ❌ 2026-10-26"
]
},
{
"name": "tasksPluginEmoji_reopen",
"format": "tasksPluginEmoji",
"before": "- [x] Fixture __SOURCE__ ✅ 2026-10-25",
"after": [
"- [ ] Fixture __SOURCE__"
]
},
{
"name": "tasksPluginEmoji_daily",
"format": "tasksPluginEmoji",
"before": "- [ ] Fixture __SOURCE__ 🆔 original 🔁 every day 📅 2026-11-01",
"after": [
"- [ ] Fixture __SOURCE__ 🔁 every day 📅 2026-11-02",
"- [x] Fixture __SOURCE__ 🆔 original 🔁 every day 📅 2026-11-01 ✅ 2026-10-26"
]
},
{
"name": "tasksPluginEmoji_weekly",
"format": "tasksPluginEmoji",
"before": "- [ ] Fixture __SOURCE__ 🔁 every week on Monday 📅 2026-11-02",
"after": [
"- [ ] Fixture __SOURCE__ 🔁 every week on Monday 📅 2026-11-09",
"- [x] Fixture __SOURCE__ 🔁 every week on Monday 📅 2026-11-02 ✅ 2026-10-26"
]
},
{
"name": "tasksPluginEmoji_monthly",
"format": "tasksPluginEmoji",
"before": "- [ ] Fixture __SOURCE__ 🔁 every month 📅 2026-11-01",
"after": [
"- [ ] Fixture __SOURCE__ 🔁 every month 📅 2026-12-01",
"- [x] Fixture __SOURCE__ 🔁 every month 📅 2026-11-01 ✅ 2026-10-26"
]
},
{
"name": "tasksPluginEmoji_when_done",
"format": "tasksPluginEmoji",
"before": "- [ ] Fixture __SOURCE__ 🔁 every week when done 📅 2026-11-01",
"after": [
"- [ ] Fixture __SOURCE__ 🔁 every week when done 📅 2026-11-02",
"- [x] Fixture __SOURCE__ 🔁 every week when done 📅 2026-11-01 ✅ 2026-10-26"
]
},
{
"name": "tasksPluginEmoji_no_date",
"format": "tasksPluginEmoji",
"before": "- [ ] Fixture __SOURCE__ 🔁 every day",
"after": [
"- [ ] Fixture __SOURCE__ 🔁 every day",
"- [x] Fixture __SOURCE__ 🔁 every day ✅ 2026-10-26"
]
},
{
"name": "tasksPluginEmoji_delete",
"format": "tasksPluginEmoji",
"before": "- [ ] Fixture __SOURCE__ 🏁 delete",
"after": []
},
{
"name": "tasksPluginEmoji_recur_delete",
"format": "tasksPluginEmoji",
"before": "- [ ] Fixture __SOURCE__ 🔁 every day 🏁 delete 📅 2026-11-01",
"after": [
"- [ ] Fixture __SOURCE__ 🔁 every day 🏁 delete 📅 2026-11-02"
]
},
{
"name": "tasksPluginEmoji_completed_first",
"format": "tasksPluginEmoji",
"before": "- [ ] Fixture __SOURCE__ 🔁 every day 📅 2026-11-01",
"after": [
"- [x] Fixture __SOURCE__ 🔁 every day 📅 2026-11-01 ✅ 2026-10-26",
"- [ ] Fixture __SOURCE__ 🔁 every day 📅 2026-11-02"
]
},
{
"name": "dataview_complete",
"format": "dataview",
"before": "- [ ] Fixture __SOURCE__ [priority:: high] [due:: 2026-11-01]",
"after": [
"- [x] Fixture __SOURCE__ [priority:: high] [due:: 2026-11-01] [completion:: 2026-10-26]"
]
},
{
"name": "dataview_cancel",
"format": "dataview",
"before": "- [ ] Fixture __SOURCE__ [due:: 2026-11-01]",
"after": [
"- [-] Fixture __SOURCE__ [due:: 2026-11-01] [cancelled:: 2026-10-26]"
]
},
{
"name": "dataview_reopen",
"format": "dataview",
"before": "- [x] Fixture __SOURCE__ [completion:: 2026-10-25]",
"after": [
"- [ ] Fixture __SOURCE__"
]
},
{
"name": "dataview_daily",
"format": "dataview",
"before": "- [ ] Fixture __SOURCE__ [id:: original] [repeat:: every day] [due:: 2026-11-01]",
"after": [
"- [ ] Fixture __SOURCE__ [repeat:: every day] [due:: 2026-11-02]",
"- [x] Fixture __SOURCE__ [id:: original] [repeat:: every day] [due:: 2026-11-01] [completion:: 2026-10-26]"
]
},
{
"name": "dataview_weekly",
"format": "dataview",
"before": "- [ ] Fixture __SOURCE__ [repeat:: every week on Monday] [due:: 2026-11-02]",
"after": [
"- [ ] Fixture __SOURCE__ [repeat:: every week on Monday] [due:: 2026-11-09]",
"- [x] Fixture __SOURCE__ [repeat:: every week on Monday] [due:: 2026-11-02] [completion:: 2026-10-26]"
]
},
{
"name": "dataview_monthly",
"format": "dataview",
"before": "- [ ] Fixture __SOURCE__ [repeat:: every month] [due:: 2026-11-01]",
"after": [
"- [ ] Fixture __SOURCE__ [repeat:: every month] [due:: 2026-12-01]",
"- [x] Fixture __SOURCE__ [repeat:: every month] [due:: 2026-11-01] [completion:: 2026-10-26]"
]
},
{
"name": "dataview_when_done",
"format": "dataview",
"before": "- [ ] Fixture __SOURCE__ [repeat:: every week when done] [due:: 2026-11-01]",
"after": [
"- [ ] Fixture __SOURCE__ [repeat:: every week when done] [due:: 2026-11-02]",
"- [x] Fixture __SOURCE__ [repeat:: every week when done] [due:: 2026-11-01] [completion:: 2026-10-26]"
]
},
{
"name": "dataview_no_date",
"format": "dataview",
"before": "- [ ] Fixture __SOURCE__ [repeat:: every day]",
"after": [
"- [ ] Fixture __SOURCE__ [repeat:: every day]",
"- [x] Fixture __SOURCE__ [repeat:: every day] [completion:: 2026-10-26]"
]
},
{
"name": "dataview_delete",
"format": "dataview",
"before": "- [ ] Fixture __SOURCE__ [onCompletion:: delete]",
"after": []
},
{
"name": "dataview_recur_delete",
"format": "dataview",
"before": "- [ ] Fixture __SOURCE__ [repeat:: every day] [onCompletion:: delete] [due:: 2026-11-01]",
"after": [
"- [ ] Fixture __SOURCE__ [repeat:: every day] [onCompletion:: delete] [due:: 2026-11-02]"
]
},
{
"name": "dataview_completed_first",
"format": "dataview",
"before": "- [ ] Fixture __SOURCE__ [repeat:: every day] [due:: 2026-11-01]",
"after": [
"- [x] Fixture __SOURCE__ [repeat:: every day] [due:: 2026-11-01] [completion:: 2026-10-26]",
"- [ ] Fixture __SOURCE__ [repeat:: every day] [due:: 2026-11-02]"
]
}
]
}
Loading
Loading