kotonoha 0.5.5 → 0.5.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,42 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.5.7] - 2026-11-08
11
+
12
+ ### Added
13
+
14
+ - Allow an approved tarball SHA-256 in the manual npm publishing workflow.
15
+ Pack once, verify the supplied hash and publish that exact archive; stop
16
+ before publishing if the artifact differs.
17
+
18
+ ### Fixed
19
+
20
+ - Use WSL-visible path, type and file-identity checks for normal OneDrive host
21
+ reads/saves instead of requiring Windows reparse-tag or final-path APIs.
22
+ Cloud reparse metadata alone no longer blocks WSL operations. Keep detected
23
+ redirection/access denials, source rechecks and in-place updates; retain
24
+ native Windows tag verification and unchanged Python CLI/Canvas/Bases gates.
25
+
26
+ ## [0.5.6] - 2026-11-07
27
+
28
+ ### Added
29
+
30
+ - Allow authorized host directory creation and regular-file creation, editing
31
+ and deletion, including verified OneDrive paths. Require exact path/action
32
+ authority, non-overwriting creation, source rechecks and verified deletion.
33
+ Disclose synced deletion and uncertain recovery; exclude directory deletion,
34
+ recursive removal, moves and renames. Retain dedicated content save gates.
35
+
36
+ ### Fixed
37
+
38
+ - Allow host saves on verified non-redirecting OneDrive cloud paths, including
39
+ native Windows and WSL, instead of rejecting every reparse point. Retain
40
+ identity, in-place updates, attribute preservation and hydration consent.
41
+ - Add an explicitly authorized host import workflow for PDF downloads and local
42
+ Docling outputs in the selected Vault directory. Require exact output paths,
43
+ non-overwriting creation, scoped scratch/directory consent and per-artifact
44
+ verification. Keep Python CLI, Canvas and Bases storage support unchanged.
45
+
10
46
  ## [0.5.5] - 2026-11-06
11
47
 
12
48
  ### Fixed
@@ -284,4 +320,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
284
320
  [0.5.3]: https://github.com/nahisaho/kotonoha/compare/d665884...v0.5.3
285
321
  [0.5.4]: https://github.com/nahisaho/kotonoha/compare/v0.5.3...v0.5.4
286
322
  [0.5.5]: https://github.com/nahisaho/kotonoha/compare/v0.5.4...v0.5.5
287
- [Unreleased]: https://github.com/nahisaho/kotonoha/compare/v0.5.5...HEAD
323
+ [0.5.6]: https://github.com/nahisaho/kotonoha/compare/v0.5.5...v0.5.6
324
+ [0.5.7]: https://github.com/nahisaho/kotonoha/compare/v0.5.6...v0.5.7
325
+ [Unreleased]: https://github.com/nahisaho/kotonoha/compare/v0.5.7...HEAD
package/README-ja.md CHANGED
@@ -6,7 +6,7 @@ kotonohaは、GitHub CopilotとClaude Code向けのスキルを提供します
6
6
 
7
7
  Obsidian向けには、Markdown記法、許可されたVault内のノート操作、JSON Canvas、Bases、公式アプリCLIを扱います。DefuddleによるWeb・HTML本文の抽出と、KnapによるJSON・CSVからのテンプレート生成にも対応します。操作ごとに、参照範囲・依存関係・保存の許可を確認します。
8
8
 
9
- バージョンは **0.5.5** です(2026-11-06更新)。`obsidian-markdown`、`obsidian-cli`、`defuddle`、`knap`を含む11のスキルを同梱しています。npmパッケージを使うか、[ソースからスキルを導入する手順](#このチェックアウトからスキルを導入)を参照してください。
9
+ バージョンは **0.5.7** です(2026-11-08更新)。`obsidian-markdown`、`obsidian-cli`、`defuddle`、`knap`を含む11のスキルを同梱しています。npmパッケージを使うか、[ソースからスキルを導入する手順](#このチェックアウトからスキルを導入)を参照してください。
10
10
 
11
11
  [English](./README.md) | [日本語](./README-ja.md)
12
12
 
@@ -71,7 +71,7 @@ Obsidianでは、[`obsidian.md`](skills/tech-writer/assets/templates/obsidian.md
71
71
 
72
72
  Markdownノートとテンプレートの作成・編集は`obsidian-markdown`が担当します。
73
73
  文書構成にはtech-writer、日本語の校正にはjapanese-proseを利用します。
74
- `obsidian-vault`は、許可範囲のローカル読み取り・静的検証・確定済み候補の保存だけを担う共用基盤に縮小しました。
74
+ `obsidian-vault`は、許可範囲のローカル読み取り・静的検証・確定済み候補の保存、明示許可されたファイル・ディレクトリ操作と成果物の取り込みを担う共用基盤です。
75
75
  直接保存はホストのファイルツールを使うため、Python、uv、専用CLIの計画ファイルは不要です。
76
76
  Obsidianアプリ、MCP、プラグインにも依存しません。
77
77
 
@@ -101,11 +101,28 @@ Linuxでは所有者・グループ・権限を維持します。
101
101
  既存ノートは置換せず同じ実体へ書き込み、WindowsのACL・属性を保持します。仮想的なLinux権限だけでは拒否しません。
102
102
  ネットワーク共有は対象外とし、パス・実体・保存後のバイト列を検証します。保存方式が不明な編集ツールは使いません。
103
103
  `/tmp`等への別出力を、許可済みVaultの更新の代わりにはしません。
104
+ WSLのOneDrive保存は、WSLのパス解決・要素の型・ファイル実体の確認を使います。cloud再解析属性はWSLのシンボリックリンクではありません。
105
+ 通常のWSLファイルにWindows再解析タグ取得や最終パスAPIを要求せず、取得機能がないことだけでは保存を拒否しません。
106
+ ネイティブWindowsではcloudタグ検証を維持します。検出した転送・リンク・範囲外への逸脱と実際の権限拒否は引き続き拒否します。
107
+ オンライン専用と判明したファイルのローカル取得通信には別途同意が必要です。
104
108
  Python CLI・Canvas・Basesの対応範囲は広げません。CLIでは引き続きWSLのWindowsドライブや拡張属性付き対象を拒否します。
105
109
  SELinuxラベルなどの削除を回避策にしません。
106
110
  直接編集はCLIの原子的確定、ルートロック、成功記録による再実行保護を利用しません。
107
111
  保存後に読み戻して確認しますが、途中失敗や同時編集の完全な防止は保証しません。
108
112
  LLMの誤判断を完全には防げず、ホストを隔離する機能でもありません。
113
+ WSLのホストから見えるパス確認はWindows再解析情報の独立監査ではなく、検出不能な転送がないことを保証しません。
114
+
115
+ ホストツールでは、Markdown・PDFに限らず、明示指定したディレクトリの作成と通常ファイルの作成・編集・削除も行えます。
116
+ 正確な対象・操作への許可を確認し、ワイルドカードの一括指定は範囲内で列挙した全対象を承認してから実行します。
117
+ 作成は非上書き、編集は原文・実体の再照合、削除は対象・ハッシュの直前照合と削除後の不在確認を必須とします。
118
+ OneDriveの削除は他の端末へ同期され得ます。復旧は保証せず、ディレクトリ削除・再帰削除・移動・改名は対象外です。
119
+ Markdown校正とCanvas・Basesの保存検査は維持し、Python CLIに新しい操作コマンドは追加しません。
120
+
121
+ 明示指定したPDFのダウンロードとローカルDocling変換成果物は、検証済みのOneDriveを含むVault内作業ディレクトリへ取り込めます。
122
+ 取得元・通信・変換への許可と全出力先を確認し、作業ディレクトリ指定だけでは書き込みません。
123
+ 非上書き作成と保存先・属性検査を使い、新規フォルダー、追加出力、補助ファイルには正確な場所への別途同意が必要です。
124
+ Doclingは任意導入であり、同梱・自動導入しません。取得と変換を個別に検証し、成果物のパスとハッシュを報告します。
125
+ 詳しくは[取り込み手順](skills/obsidian-vault/references/workflow.md#pdfdocling変換成果物の取り込み)を参照してください。
109
126
 
110
127
  ## Obsidian Canvasの操作
111
128
 
@@ -140,7 +157,7 @@ Node 18以上と固定依存が必要です。依存の準備は別途許可を
140
157
 
141
158
  ## Obsidian記法・アプリ操作・データからのノート生成
142
159
 
143
- 0.5.5は、[kepano/obsidian-skills](https://github.com/kepano/obsidian-skills)の6つの機能分野を、kotonoha独自の手順と例で扱います。
160
+ 0.5.7は、[kepano/obsidian-skills](https://github.com/kepano/obsidian-skills)の6つの機能分野を、kotonoha独自の手順と例で扱います。
144
161
  参照した版は[`3ccff5338ea700537839b21900aa5358a0402c98`](https://github.com/kepano/obsidian-skills/tree/3ccff5338ea700537839b21900aa5358a0402c98)です(2026-11-05確認)。
145
162
  対応する実行環境や保存方法が参照先と同一という意味ではありません。既存のCanvas・Basesの検査範囲と保存制約を維持します。
146
163
 
@@ -284,7 +301,7 @@ npx kotonoha install --skill all
284
301
  ```
285
302
 
286
303
  `--skill all`が既定値であるため、`npx kotonoha install`も同じ動作です。導入できるスキルは、使用したパッケージに依存します。
287
- 0.5.5には11のスキルを同梱しています。導入先プロジェクトで、すべて配置されたことを確認します。
304
+ 0.5.7には11のスキルを同梱しています。導入先プロジェクトで、すべて配置されたことを確認します。
288
305
 
289
306
  ```bash
290
307
  test -f .github/skills/consulting-analyst/SKILL.md
package/README.md CHANGED
@@ -14,7 +14,7 @@ The Obsidian suite covers Markdown syntax, authorized Vault notes, JSON Canvas,
14
14
  Bases, official app commands, web/HTML extraction and JSON/CSV template rendering.
15
15
  Each workflow keeps its own scope, dependency and save requirements.
16
16
 
17
- Version: **0.5.5** (updated 2026-11-06), with eleven bundled Skills, including
17
+ Version: **0.5.7** (updated 2026-11-08), with eleven bundled Skills, including
18
18
  `obsidian-markdown`, `obsidian-cli`, `defuddle` and `knap`.
19
19
  Install the npm package or use the
20
20
  [source-checkout installation](#install-skills-from-this-source-checkout).
@@ -132,8 +132,9 @@ for setup, placeholder handling, and limitations.
132
132
 
133
133
  Use `obsidian-markdown` to create or edit Markdown notes and templates. It uses
134
134
  `tech-writer` for structure and coordinates Japanese proofreading with
135
- `japanese-prose`. `obsidian-vault` is now only the shared backend for scoped
136
- local reads, static validation and saving an already prepared candidate.
135
+ `japanese-prose`. `obsidian-vault` is the shared backend for scoped local reads,
136
+ static validation, saving an already prepared candidate, authorized file/directory
137
+ operations and artifact imports.
137
138
  Its direct-save path uses host file tools without Python, uv, Obsidian, MCP
138
139
  or plugins.
139
140
 
@@ -174,8 +175,13 @@ for requests, command examples, data retention and recovery.
174
175
 
175
176
  Saving requires verifiable local regular files; symlinks and multiple hard
176
177
  links are refused. Native Linux saves preserve ownership/modes.
177
- Host direct saves also support confirmed local Windows drives through WSL
178
- (`drvfs`/`9p`/`v9fs`), not network shares. Existing notes must be updated in place,
178
+ Host direct saves also support native Windows and confirmed local Windows drives
179
+ through WSL (`drvfs`/`9p`/`v9fs`), not network shares. WSL OneDrive saves use
180
+ WSL-resolved paths, component types and file identity; cloud reparse metadata
181
+ is not a WSL symlink. Windows tag/final-path APIs are not required for otherwise
182
+ normal WSL files. Native Windows retains cloud-tag verification. Detected
183
+ redirections, symlinks, scope escapes and actual access denials remain blocked;
184
+ known hydration requires separate consent. Existing notes must be updated in place,
179
185
  preserving Windows ACLs/attributes rather than replacing the file or requiring
180
186
  synthetic Linux permissions. Path/identity checks and exact readback remain
181
187
  mandatory; an unknown host replacement method is not sufficient.
@@ -185,7 +191,27 @@ CLI saving still requires a verified Linux filesystem and refuses all xattrs,
185
191
  including SELinux labels. Never remove attributes to bypass a refusal.
186
192
  Direct-edit failure and concurrency limitations are disclosed before saving;
187
193
  neither mode eliminates post-check external edits or LLM mistakes.
188
- The skill is not a host sandbox.
194
+ The skill is not a host sandbox. WSL host-visible checks are not an independent
195
+ Windows reparse audit or a guarantee against undetectable redirections.
196
+
197
+ Host operations also allow explicitly authorized directory creation and
198
+ regular-file creation, editing and deletion, not just Markdown/PDF outputs.
199
+ Each exact path/action needs authority; wildcard batches need approval after
200
+ scoped enumeration. Creation is non-overwriting, edits recheck source bytes and
201
+ identity, and deletion rechecks the exact file/hash then verifies absence.
202
+ OneDrive may sync deletions to other devices; recovery is not guaranteed.
203
+ Directory deletion, recursive removal, moves and renames remain outside this
204
+ workflow. Markdown proofreading and dedicated Canvas/Bases write gates remain
205
+ in force; the Python CLI gains no new commands.
206
+
207
+ Explicit PDF downloads and local Docling conversion outputs can be imported into
208
+ the authorized Vault working directory, including verified OneDrive paths.
209
+ Source/network/conversion authority and every output path must be specified;
210
+ directory selection alone grants no write permission. Imports use non-overwriting
211
+ creation and the same path/attribute checks, with separate consent for exact new
212
+ directories, sidecars and scratch locations. Docling is optional, not bundled or
213
+ auto-installed. Downloads and conversion are verified and reported separately
214
+ with output paths/hashes; Python CLI, Canvas and Bases support is unchanged.
189
215
 
190
216
  ## Working with Obsidian Canvas
191
217
 
@@ -232,7 +258,7 @@ for exact-byte preservation, four original templates and failure handling.
232
258
 
233
259
  ## Obsidian syntax, app commands and data-driven notes
234
260
 
235
- The 0.5.5 Skills cover all six capability families in
261
+ The 0.5.7 Skills cover all six capability families in
236
262
  [kepano/obsidian-skills](https://github.com/kepano/obsidian-skills), with original
237
263
  kotonoha instructions and examples. Reference snapshot:
238
264
  [`3ccff5338ea700537839b21900aa5358a0402c98`](https://github.com/kepano/obsidian-skills/tree/3ccff5338ea700537839b21900aa5358a0402c98),
@@ -424,7 +450,7 @@ npx kotonoha install --skill all
424
450
  ```
425
451
 
426
452
  `--skill all` is the default, so `npx kotonoha install` has the same behavior.
427
- The selected package determines which Skills are available; version 0.5.5
453
+ The selected package determines which Skills are available; version 0.5.7
428
454
  includes all eleven. In the destination project, confirm they were installed:
429
455
 
430
456
  ```bash
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kotonoha",
3
- "version": "0.5.5",
3
+ "version": "0.5.7",
4
4
  "description": "Skills for GitHub Copilot and Claude Code: consulting, technical writing, Japanese prose, Obsidian Markdown, Canvas, Bases and CLI, Defuddle, Knap, and PPTX planning.",
5
5
  "license": "MIT",
6
6
  "author": "nahisaho",
@@ -27,6 +27,10 @@ Coordinate content and review, not a second storage backend. Read the
27
27
  Preserve the selected direct-save or optional plan-approved workflow.
28
28
  For a WSL local Windows drive, use its host direct-save profile; do not
29
29
  reject `v9fs` alone or route a normal content edit through Python CLI planning.
30
+ WSL OneDrive targets use WSL path/type/identity checks, not native Windows
31
+ reparse-tag or final-path API requirements. Missing Windows metadata tools
32
+ alone must not block a normal WSL OneDrive save. Native Windows uses the
33
+ backend's separate tag-verification profile.
30
34
  Do not silently substitute `/tmp` output for the authorized Vault target.
31
35
  If it is unavailable, report the missing sibling and provide an unsaved draft.
32
36
  - Use `tech-writer` for note structure and its existing
@@ -36,6 +40,17 @@ Coordinate content and review, not a second storage backend. Read the
36
40
  storage backend to draft or correct content.
37
41
  - Route `.canvas` to `obsidian-canvas` and standalone `.base` to
38
42
  `obsidian-bases`. Do not replace their checkers with Markdown validation.
43
+ - Explicit PDF downloads and Docling extraction use `obsidian-vault`'s host
44
+ artifact-import workflow with separate source/network/output authority.
45
+ A normal note edit does not authorize imports. Do not block an authorized
46
+ import merely because its outputs are in a Vault or verified OneDrive path.
47
+ Keep raw extraction separate from requested note authoring and proofreading;
48
+ neither Defuddle nor Knap is a PDF converter.
49
+ - Route explicitly requested directory creation or file deletion to
50
+ `obsidian-vault`'s host file/directory workflow with exact paths/actions and
51
+ user authority. A note save can create missing parents only when those exact
52
+ directory paths are also authorized. Do not infer deletion or attachment
53
+ mutation from a content edit, and do not automatically repair deleted links.
39
54
  - The official application CLI is a separate, explicitly selected
40
55
  `obsidian-cli` workflow, not an automatic fallback for a refused save.
41
56
  When it supplies authorized source text, return the candidate and applicable
@@ -101,7 +116,8 @@ Vault-relative paths. Never save any operation files in session storage,
101
116
  including `~/.copilot/session-state/`, and pass this rule to delegated tools.
102
117
  Auxiliary copies require a separately consented non-session location; otherwise
103
118
  keep the draft in the conversation. Target authority never grants whole-Vault
104
- access, folder creation or attachment changes.
119
+ access, folder creation or attachment changes. Those operations need separate
120
+ exact-path/action authority through the backend's host file/directory workflow.
105
121
 
106
122
  Report draft-only, reviewed or handed-off status and the unperformed checks.
107
123
  Do not claim a save based on a draft or an unexecuted handoff.
@@ -1,21 +1,25 @@
1
1
  ---
2
2
  name: obsidian-vault
3
3
  description: >-
4
- Provides scoped local reads, static validation and candidate-only Markdown
5
- saving for sibling Skills. Use for explicit local storage operations or a
4
+ Provides scoped local reads, static validation, candidate-only Markdown
5
+ saving, directory creation, regular-file creation/editing/deletion and
6
+ authorized PDF/conversion artifact imports, including verified local
7
+ OneDrive paths. Use for explicit local storage operations or a
6
8
  sibling's authorized read/validate/save handoff, not content generation.
7
9
  Preserves consent, paths, metadata and source identity, with optional
8
10
  plan-approved saving. Also supplies Canvas storage API version 1.
9
11
  Requires no Obsidian app, official CLI, MCP or plugins.
10
12
  license: MIT
11
- argument-hint: "[read|validate|save] <authorized target and supplied candidate>"
13
+ argument-hint: "[read|validate|save|mkdir|create|edit|delete|import] <authorized targets>"
12
14
  ---
13
15
 
14
16
  # obsidian-vault
15
17
 
16
18
  Own local storage, not note content. Read authorized bytes, return static
17
19
  validation evidence, and save an already prepared candidate without changing
18
- it. See [workflow.md](references/workflow.md) for the handoff contract, CLI
20
+ it. Also perform explicitly authorized directory creation and regular-file
21
+ creation, editing or deletion through the host workflow below.
22
+ See [workflow.md](references/workflow.md) for the handoff contract, CLI
19
23
  compatibility fields, diagnostic limits and recovery.
20
24
 
21
25
  ## Responsibility boundary
@@ -32,6 +36,9 @@ to the explicitly selected `obsidian-cli` workflow. Do not silently launch the
32
36
  app, broaden scope, switch after failure or bypass a refused save.
33
37
  `defuddle` and `knap` prepare candidates outside the Vault; note-level
34
38
  integration belongs to `obsidian-markdown`, not this backend.
39
+ Explicit PDF downloads and local Docling conversion outputs use the separate
40
+ host artifact-import workflow below, not Defuddle, Knap or Python CLI saving.
41
+ The caller owns fetching/conversion; this backend owns scoped output storage.
35
42
 
36
43
  Retain `STORAGE_API_VERSION=1`, authorized reads/enumeration, parsing helpers
37
44
  and `commit_bytes` for `obsidian-canvas`. Its own plan/apply workflow remains
@@ -41,13 +48,15 @@ as static validation data, never inferred rules, recommendations or repairs.
41
48
 
42
49
  ## Candidate handoff
43
50
 
44
- For saving, require the caller to supply the absolute Vault root, authorized read/model
51
+ For content saving, require the caller to supply the absolute Vault root, authorized read/model
45
52
  scopes, exact target, creation versus replacement, original bytes/hash for an
46
53
  edit, exact candidate, allowed change, save mode and actual save authority.
47
54
  Also carry the working directory, auxiliary-copy consent and applicable
48
55
  proofreading review. Ask only for missing storage details, one at a time.
49
56
  Do not author missing content or infer authority from a sibling's draft.
50
57
  Return a refused candidate unchanged to its caller; never repair it to pass.
58
+ Directory creation and file deletion use the operation handoff below; neither
59
+ requires a fabricated content candidate or a Markdown CLI plan.
51
60
 
52
61
  ## Scope and consent
53
62
 
@@ -70,7 +79,13 @@ write or CLI filesystem requirements to a read. Do not enumerate a parent
70
79
  folder or read sibling documents merely to open an already specified file;
71
80
  parent metadata checks do not authorize parent content access.
72
81
 
73
- On Windows or WSL Windows drives, a OneDrive folder name or the
82
+ On WSL Windows drives, use the WSL host path/type/identity checks described in
83
+ the direct-save profile below for authorized reads too. Windows cloud reparse
84
+ metadata is not a WSL symlink. Do not require Windows reparse-tag queries or
85
+ Windows final-path APIs when WSL resolves the authorized path and exposes a
86
+ regular file; their absence alone must not block the read.
87
+
88
+ On native Windows, a OneDrive folder name or the
74
89
  `FILE_ATTRIBUTE_REPARSE_POINT` flag alone is not grounds to refuse reading.
75
90
  Inspect the actual reparse tag for each flagged component from root to target.
76
91
  Allow only verified Windows cloud-family tags (`IO_REPARSE_TAG_CLOUD` and its
@@ -80,10 +95,13 @@ Reject symlinks, junctions, mount-point redirections, unknown tags and scope
80
95
  escapes. Missing tag/final-path verification blocks the affected read; report
81
96
  the exact path and missing capability rather than declaring all OneDrive unsafe.
82
97
 
83
- Read only locally available regular-file bytes. Before opening an online-only
98
+ Read only locally available regular-file bytes. Before opening a known online-only
84
99
  or recall-on-access placeholder, obtain explicit consent for hydration/network
85
- access; if availability cannot be established, stop before a potentially
86
- hydrating read. Do not change cloud attributes, pin files, change sync settings
100
+ access; if metadata or host warnings indicate recall risk and availability
101
+ cannot be established, stop before a potentially hydrating read. A normal WSL
102
+ file read does not need a separate Windows cloud-availability query merely
103
+ because a parent is in OneDrive. Do not change cloud attributes, pin files,
104
+ change sync settings
87
105
  or create copies to force access. Respect ACL denials, host tool refusals and
88
106
  content-exclusion policies; never retry through another tool to bypass them.
89
107
  Check the source identity and change metadata around the read and report
@@ -92,7 +110,7 @@ concurrent changes rather than presenting unstable content as verified.
92
110
  Once these checks pass, read each authorized document independently; one blocked
93
111
  file does not block other verified targets. Report which documents were actually
94
112
  read and the specific reason for any unread document. Read permission does not
95
- grant save permission: the stricter save profiles below remain unchanged.
113
+ grant save permission: apply the save profiles below with separate write authority.
96
114
 
97
115
  ## Working directory and copies
98
116
 
@@ -108,8 +126,9 @@ This includes deliverables, requests, originals, candidates, diffs, diagnostics,
108
126
  reviews, plans, receipts, results and temporary files. Check resolved locations
109
127
  before writing; if the working directory or any selected output is in session
110
128
  storage, stop and ask for a non-session location. Do not use it as a fallback.
111
- Stop on out-of-scope, ambiguous or missing-parent targets; do not create folders
112
- or substitute another location.
129
+ Stop on out-of-scope or ambiguous targets; do not substitute another location.
130
+ For missing parents, use the directory-creation workflow below only with explicit
131
+ authorization for each exact directory; otherwise stop.
113
132
 
114
133
  Direct editing needs no external copies or plan files. For necessary auxiliary
115
134
  files, use a suitable consented location in the current or user-specified
@@ -140,15 +159,19 @@ not performed, not an unverified substitute.
140
159
  changes; never overwrite from stale content. Identical bytes mean no write.
141
160
  5. Save the exact candidate with host tools. On native Linux filesystems,
142
161
  preserve owner/group/modes and refuse xattrs or unsupported attributes.
143
- For WSL Windows drives, use the direct-save profile below instead.
162
+ For Windows drives, select the matching WSL or native Windows direct-save
163
+ profile below instead; do not apply native Windows checks to WSL.
144
164
  Both profiles refuse multiple hard links and attribute-removing workarounds,
145
165
  including removal of SELinux labels.
146
166
  6. Read back after saving; require exact candidate bytes and unchanged unspecified content.
147
167
  Report the exact target and outcome, never success on failure or uncertainty.
148
168
 
149
169
  Preserve unspecified frontmatter, links, code, numbers, identifiers, encoding and
150
- newlines; no unsolicited reformatting. No folder creation, deletion, moves,
151
- renames, attachments or other formats. Proofreading still needs the gate below.
170
+ newlines; no unsolicited reformatting. Markdown candidate saving does not
171
+ authorize folder creation, deletion, moves, renames, attachments or other
172
+ formats; explicit file/directory operations and artifact imports have their own
173
+ authorization below.
174
+ Proofreading still needs the gate below.
152
175
  Before saving, disclose that direct edits lack CLI root locking, atomic commit,
153
176
  plan-hash approval and receipt replay protection. Report only verified readback,
154
177
  not invented CLI JSON/receipts. If the user needs CLI guarantees, await selection.
@@ -160,14 +183,38 @@ the target first when its save state is unknown.
160
183
  Support authorized Markdown saves on a confirmed local Windows drive mounted
161
184
  through WSL as `drvfs`, `9p` or `v9fs`. Do not reject it solely because of that
162
185
  filesystem name or apply the Python CLI's filesystem allowlist to host saves.
186
+ WSL OneDrive saves are supported when the authorized target is exposed as a
187
+ normal WSL file. OneDrive cloud reparse metadata, including on parent directories,
188
+ is not a WSL symbolic link and is not itself a path redirection.
189
+ Native Windows uses the separate tag-verification profile below.
163
190
  This profile does not extend Python CLI, Canvas or Bases saving support.
164
191
 
165
192
  1. Verify WSL, the actual mount and its Windows path mapping; a `/mnt/c/...`
166
- spelling alone is not evidence. Confirm the Windows backing drive is local,
167
- not a mapped network drive or UNC/SMB share. Stop if that cannot be established.
193
+ spelling alone is not evidence. Use the actual WSL mount metadata and path
194
+ mapping to identify the local Windows drive, not a mapped network drive or
195
+ UNC/SMB share. Do not require PowerShell, fsutil or Windows drive APIs to
196
+ repeat a local-drive mapping already established from WSL.
168
197
  2. Keep the authorized root/target, byte hashes, no-symlink and link-count checks.
169
- Check for Windows reparse points, including junctions, along the resolved path;
170
- reject them. Respect Windows read-only attributes and ACL access denials.
198
+ Use WSL path resolution, component metadata (`lstat` or equivalent), regular
199
+ file/directory types and opened-file identity within the authorized root.
200
+ A OneDrive folder name or `FILE_ATTRIBUTE_REPARSE_POINT` alone is not grounds
201
+ to refuse saving. Do not require Windows reparse-tag queries, cloud-tag
202
+ allowlists or Windows final-path APIs for this WSL profile. Missing Windows
203
+ metadata capabilities alone must not block a normal WSL OneDrive save.
204
+ Verify the resolved WSL path and opened file stay inside the authorized root
205
+ and exact target. Reject WSL symlinks, detected junctions or other path
206
+ redirections, scope escapes and special files. If optional Windows metadata
207
+ identifies an actual name-surrogate/redirection, reject it; do not ignore
208
+ positive evidence of a redirection.
209
+ For new files verify the parent before exclusive creation and the opened
210
+ file before writing. Missing WSL path/type/identity checks block the affected
211
+ target; report which check is missing, not a blanket reparse-point refusal.
212
+ Before reading or updating a known online-only or recall-on-access placeholder,
213
+ obtain explicit hydration/network consent. Stop if recall risk is indicated
214
+ but availability is unknown; do not demand a cloud-availability API for an
215
+ otherwise normal WSL file merely because its parent is in OneDrive.
216
+ Do not pin files, remove cloud attributes or change sync settings.
217
+ Respect Windows read-only attributes and ACL access denials.
171
218
  Target only the ordinary `.md` data stream, not `:stream` or device paths.
172
219
  Never run chmod/chown, remove attributes or change mount/Windows settings.
173
220
  3. For an existing note, use a verified in-place write to the same file object,
@@ -182,7 +229,12 @@ This profile does not extend Python CLI, Canvas or Bases saving support.
182
229
  For a new note, create exclusively without overwriting an equivalent name,
183
230
  allowing normal Windows parent ACL inheritance.
184
231
  5. Flush/close, then read back exact bytes and verify file identity and observable
185
- attributes, allowing only normal write timestamps/archive-bit updates.
232
+ WSL-observable attributes, allowing only normal write timestamps/archive-bit
233
+ updates and
234
+ consented hydration state changes, not loss of cloud-provider metadata.
235
+ Retaining the object avoids intentionally replacing its Windows metadata;
236
+ unavailable Windows ACL/cloud-attribute enumeration is not a refusal reason
237
+ and must not be reported as verified attribute preservation.
186
238
  Report saved only on a match. Disclose non-atomic writes,
187
239
  possible partial writes and concurrent Obsidian/Sync/Windows edits before saving;
188
240
  after a possible write failure report unknown, without retry or rollback.
@@ -193,6 +245,149 @@ Do not silently redirect a refused save to `/tmp` or another file. An alternate
193
245
  output needs explicit exact-path consent and is never a successful Vault update.
194
246
  Proofreading gates and the session-storage prohibition still apply.
195
247
 
248
+ ### Native Windows direct saves
249
+
250
+ Use the same authorization, source rechecks, exclusive creation, in-place updates
251
+ and exact readback rules. Verify the local Windows backing drive and ordinary
252
+ data stream. A OneDrive folder name or flag alone is not grounds to refuse
253
+ saving. For native Windows path verification, inspect each actual reparse
254
+ tag, including parent directories, and allow only verified Windows cloud-family
255
+ tags (`IO_REPARSE_TAG_CLOUD` and documented variants) that are not name surrogates.
256
+ Verify the opened object's final path and identity stay inside the authorized
257
+ root and exact target. Reject symlinks, junctions, mount-point redirections,
258
+ unknown tags and escapes. Missing tag/final-path verification blocks the affected
259
+ native Windows target. Respect ACLs/read-only attributes and hydration consent.
260
+ Do not apply these Windows-API preconditions to WSL host reads or saves.
261
+
262
+ Neither host profile is a Windows security sandbox or a guarantee against all
263
+ undetectable reparse redirections, races or sync failures. WSL checks establish
264
+ the host-visible path/type/identity, not an independent Windows reparse audit.
265
+
266
+ ## Authorized file and directory operations
267
+
268
+ Use host filesystem tools for directory creation and regular-file creation,
269
+ editing or deletion inside the authorized Vault/scopes, including verified
270
+ OneDrive paths. These are host operations, not new Python CLI commands.
271
+ Do not refuse an authorized ordinary file merely because its extension is not
272
+ `.md`. The backend stores supplied bytes, not authored content or executable
273
+ instructions. Markdown authoring/proofreading stays with `obsidian-markdown`;
274
+ Canvas and Bases creation/editing stays with their dedicated workflows and
275
+ existing save gates. Never use generic file writing to bypass those gates.
276
+
277
+ 1. Require the absolute Vault root, working directory, exact resolved targets,
278
+ operation (`mkdir`, `create`, `edit` or `delete`), permitted changes and actual
279
+ user authority. For file creation/editing require exact candidate bytes;
280
+ edits also require current source bytes/hash and identity. A capability
281
+ request or directory selection is not permission to mutate existing files.
282
+ Explicit target/action/change authority suffices without repeated approval,
283
+ unless pre-operation confirmation was requested. Ask for missing details one
284
+ at a time; pass read/model scopes and copy consent where applicable.
285
+ 2. Present the exact operation list. Expand a wildcard or batch only within
286
+ separately authorized enumeration scopes, then obtain approval for the
287
+ resulting exact paths/actions before mutation. Do not infer permission for
288
+ siblings, parent creation, attachment changes or backlink repair.
289
+ Check resolved paths from root to target, equivalent-name collisions, types,
290
+ identity, link counts and management-directory exclusions. Reject symlinks,
291
+ detected junctions/redirections, scope escapes and special/device files.
292
+ Select the WSL or native Windows profile for local-drive, ordinary-stream,
293
+ ACL and hydration checks; unknown-tag refusal is native-Windows-only.
294
+ Do not reintroduce Windows tag/API requirements for WSL operations.
295
+ Do not bypass host refusals or content exclusions; missing verification blocks
296
+ only the affected operation.
297
+ 3. For `mkdir`, list and authorize each missing parent explicitly. Create each
298
+ directory without overwriting, after verifying its existing parent; recheck
299
+ the new directory's identity and scope before proceeding to its children.
300
+ An already-existing verified directory is a no-op, not a newly created one;
301
+ a file or equivalent-name collision is a conflict, not success.
302
+ 4. For `create`, use exclusive non-overwriting creation of the exact supplied
303
+ bytes. For `edit`, compare current source bytes/hash and identity immediately
304
+ before writing; stop on concurrent changes and do not write identical bytes.
305
+ Apply the existing Linux/Windows save-preservation and readback rules to the
306
+ authorized file type. Binary edits require a supplied complete byte candidate
307
+ or a separately authorized format-aware producer, not text rewriting.
308
+ 5. For `delete`, require explicit deletion authority for every exact regular
309
+ file, including notes and attachments. Identify and record the current file's
310
+ identity and SHA-256 with authorized local reads; hashing does not authorize
311
+ sending its content to a model. Present the deletion and disclose that
312
+ OneDrive may propagate it to other devices and backups/trash recovery are
313
+ not guaranteed. Recheck bytes/hash, identity, parent and scope immediately
314
+ before unlinking only that file; stop on changes. Do not remove attributes,
315
+ broaden ACLs or use a recursive deletion command. Deletion uses the same
316
+ path/access checks, not the content-save attribute-preservation/readback
317
+ requirement. Verify absence without following links afterward; a replacement
318
+ at that path is a conflict/unknown result, never a reason to delete again.
319
+ A missing target is reported as already absent, not deleted by this operation.
320
+ 6. Report each path/action as created, edited, deleted, unchanged/already absent,
321
+ blocked, failed or unknown based on observed results. Stop dependent operations
322
+ after a prerequisite fails and report partial batches accurately. Disclose
323
+ non-atomicity and concurrent edits before mutation; never automatically retry
324
+ or roll back a possibly performed operation.
325
+
326
+ Directory deletion, recursive removal, moves and renames are outside this
327
+ workflow. Never delete the Vault root, working-directory root or session storage.
328
+ Do not automatically repair references after deletion, make backup copies or
329
+ claim recoverability. Backups need separate exact-path/copy authorization.
330
+ Network fetch, tool execution and dependency installation need their own consent.
331
+
332
+ ## Authorized PDF and conversion artifact imports
333
+
334
+ This is a host-tool storage workflow, not a new `vault.py` command or a
335
+ relaxation of Markdown, Canvas or Bases save gates. Do not treat OneDrive or
336
+ being inside a Vault as a blanket prohibition on an explicitly authorized
337
+ PDF download or Docling conversion. Neither tool is bundled or auto-installed.
338
+
339
+ 1. Obtain the absolute Vault root, selected working directory, exact source
340
+ URLs/local files, permitted read/model-input scopes and exact output paths.
341
+ Resolve paths using the working-directory rules above. A directory choice
342
+ alone is not download, conversion, network or write permission. Ask for
343
+ missing details one at a time. Explicit source/action/output authorization
344
+ suffices; do not demand Markdown candidates before downloading a PDF.
345
+ 2. Distinguish source fetch consent, cloud hydration, local conversion and
346
+ sending content to models/services. A download authorizes only its specified
347
+ source, not arbitrary redirects, linked resources or remote conversion.
348
+ Do not upload Vault content to external conversion services. Check available
349
+ download/Docling capabilities and their output behavior before execution;
350
+ ask before installing dependencies or downloading OCR/model assets.
351
+ 3. Present every output path before writing: source `.pdf`, extracted `.md`,
352
+ and only explicitly requested images/JSON or other conversion sidecars.
353
+ Use non-overwriting creation with exact/equivalent-name collision checks.
354
+ Existing files require separate replacement authority and source bytes/hash;
355
+ use the selected direct-save profile, never a converter's unchecked overwrite.
356
+ Verify paths, identities, no symlinks, management-directory exclusions and
357
+ link counts as above. Windows/WSL imports use their respective host profile:
358
+ WSL path/type checks or native Windows verified non-redirecting cloud tags.
359
+ Apply the profile's ordinary-data-stream rule to
360
+ each authorized artifact extension, never `:stream` or device paths.
361
+ 4. Only create missing directories with separate approval for their exact paths,
362
+ after verifying the existing ancestor and rechecking each created directory;
363
+ follow the file/directory operation workflow above.
364
+ Authorization for an output does not authorize sibling outputs. Configure
365
+ conversion to produce only the approved outputs; if that cannot be guaranteed,
366
+ use a separately consented staging location and transfer exact verified bytes.
367
+ A consented workspace inside the selected Vault directory may hold import
368
+ scratch files; the Python CLI workspace remains Vault-external. List scratch,
369
+ cache and temporary locations/retention before running. Never use session
370
+ storage or silently substitute `/tmp`. Without approved locations or a known
371
+ safe creation/write method, stop before fetching or converting.
372
+ 5. For downloads check command/HTTP failure and verify the result is a PDF, not
373
+ an HTML error/login page. For conversion check exit status and every expected
374
+ artifact's existence/content; an empty or missing result is not success.
375
+ Read back exact stored bytes and record their SHA-256 hashes. Keep provenance
376
+ from the authorized source; do not claim extraction fidelity without review.
377
+ Raw extracted Markdown is not meaning-preserving proofreading. Hand requested
378
+ note authoring or Japanese revisions to `obsidian-markdown`; those edits keep
379
+ their normal save/review gates.
380
+ 6. Report download, conversion and each output's exact path/hash/status separately.
381
+ A verified PDF can remain saved when conversion fails; report that partial
382
+ result. After a possible write failure report unknown for the affected output,
383
+ inspect without rewriting, and never automatically retry, roll back or delete.
384
+ Respect host refusals, ACL denials and content exclusions; this workflow must
385
+ not bypass them. Clean up only known scratch files with deletion consent.
386
+
387
+ Disclose direct-save non-atomicity and concurrent OneDrive/Obsidian edits before
388
+ writing. One blocked artifact does not invalidate other verified outputs; do not
389
+ claim the entire import was completed when any requested step was unperformed.
390
+
196
391
  ## Validation and proofreading save gates
197
392
 
198
393
  Validate only; do not generate or improve the candidate. Unresolved links are
@@ -247,11 +442,13 @@ plan and approval.
247
442
 
248
443
  ## Outcomes and limits
249
444
 
250
- Both modes save one note per operation. Distinguish unsaved, saved, partial,
445
+ Both Markdown save modes save one note per operation. Artifact imports report
446
+ each separately authorized output. Distinguish unsaved, saved, partial,
251
447
  failed and unknown outcomes, naming the target and unperformed work. Never
252
448
  automatically re-save or roll back a possibly saved operation. Confirm unknown
253
- records/temp files and their diffs with the user before acting. Do not commit,
254
- push, publish, delete, move or rename notes.
449
+ records/temp files and their diffs with the user before acting. File deletion
450
+ requires the explicit host-operation authority above; it is never implied by
451
+ editing, importing or cleanup. Do not commit, push, publish, move or rename notes.
255
452
 
256
453
  Require verifiable local regular files and the selected profile's attribute preservation; refuse
257
454
  unsupported capabilities rather than weakening checks. Neither mode guarantees
@@ -1,8 +1,9 @@
1
1
  # Obsidianローカル保存バックエンド
2
2
 
3
- 呼出元が指定した範囲の読み取り・静的検証・候補の保存だけを担当する。
3
+ 呼出元が指定した範囲の読み取り・静的検証・候補の保存と、明示許可されたPDF・変換成果物の取り込みを担当する。
4
+ ホストツールによるディレクトリ作成、通常ファイルの作成・編集・削除も、正確な対象と操作への許可を得て行う。
4
5
  本文の作成・編集の指揮はobsidian-markdown、日本語の校正はjapanese-proseへ分離する。
5
- 対象は0.5.4であり、Canvas用の共用保存API版1は維持する。
6
+ 対象は0.5.7であり、Canvas用の共用保存API版1は維持する。
6
7
 
7
8
  ## 上位ワークフローの移管
8
9
 
@@ -13,6 +14,8 @@
13
14
  | アプリ上の検索・リンク確認・タスクやプロパティの操作 | 明示的に選択したobsidian-cli |
14
15
  | Web・HTML抽出、JSON・CSVからの候補生成 | defuddle、knap。ノートへの組み込みはobsidian-markdown |
15
16
  | 許可範囲のローカル読み取り・検証・確定済み候補の保存 | obsidian-vault |
17
+ | ディレクトリ作成、通常ファイルの作成・編集・削除 | obsidian-vaultのホスト操作手順。Markdown・Canvas・Basesの内容編集は各担当を維持 |
18
+ | 明示指定したPDFのダウンロードとDocling変換成果物の保存 | ホストの取得・変換ツールとobsidian-vaultの取り込み手順。本文編集はobsidian-markdown |
16
19
 
17
20
  規約の推定、関連ノートの推薦、独立したリンク分析・修復は、このSkillでは行わない。
18
21
  旧来の高水準の依頼を受けた場合は担当を案内し、ここで候補本文を作ったり探索を始めたりしない。
@@ -26,6 +29,7 @@
26
29
  作業ディレクトリ、補助コピーへの同意、校正結果のレビューも引き継ぐ。
27
30
  不足する保存情報は1問ずつ確認し、候補が未作成なら呼出元へ戻す。
28
31
  候補を検査に通すために、バックエンドが本文を補完・修正することはない。
32
+ ディレクトリ作成とファイル削除は後述の操作情報を渡し、架空の本文候補やCLI計画は要求しない。
29
33
 
30
34
  ## ホストツールによる候補の直接保存
31
35
 
@@ -41,12 +45,13 @@ Vaultルート基準と明示されたパスや絶対パスは、その指定を
41
45
  依頼、原文、候補、差分、診断、レビュー、計画、保存記録、結果、一時ファイルにも同じ制約を適用する。
42
46
  書き込み前に実体の保存場所を確認し、作業ディレクトリや出力先がセッション領域なら、別の場所を1問ずつ確認する。
43
47
  明示指定された場合も、このSkillではセッション領域へ書かず、代替場所への許可を得る。
44
- 対象の親が存在しなければ止め、セッション領域への代替保存や新規フォルダー作成を行わない。
48
+ 対象の親が存在しなければ、正確な各ディレクトリの作成への明示許可を確認する。
49
+ 許可がなければ止め、セッション領域への代替保存や無断のフォルダー作成は行わない。
45
50
  対象や変更内容が曖昧なら1問ずつ確認する。「案を作って」だけでは保存しない。
46
51
  利用者が対象・変更内容・保存を明示した依頼は、その範囲の書き込み許可として扱える。
47
52
  毎回のCLI計画承認は要求しない。保存前の差分確認を求められたら、確認まで書かない。
48
53
 
49
- Vault内の`.md`だけを扱い、対象と親の実体、許可範囲、通常ファイルかを確認する。
54
+ Markdown候補保存ではVault内の`.md`だけを扱い、対象と親の実体、許可範囲、通常ファイルかを確認する。
50
55
  途中のシンボリックリンク、Vault外、管理フォルダーへのアクセスを拒否する。
51
56
  大文字小文字違いも含めて`.obsidian`と`.git`を除外し、別表記の同名対象を上書きしない。
52
57
  確認に必要な機能がないホストでは保存しない。
@@ -56,7 +61,9 @@ Vault内の`.md`だけを扱い、対象と親の実体、許可範囲、通常
56
61
  Linuxの通常FSでは所有者・グループ・権限を維持し、拡張属性などを保全できなければ拒否する。
57
62
  WSLのWindowsドライブには次節の直接保存手順を使い、仮想的なLinux権限だけで拒否しない。
58
63
  どちらも複数ハードリンクを拒否し、属性を削除して回避しない。
59
- 新規フォルダー、削除・移動・改名、添付や`.canvas`・`.base`の編集は対象外とする。
64
+ ノート保存への許可だけではフォルダー作成、削除、添付変更を行わず、明示許可された操作は後述のホスト操作手順で扱う。
65
+ `.canvas`・`.base`の作成・内容編集は専用ワークフローを維持し、移動・改名はこの手順の対象外とする。
66
+ PDF・変換成果物は独立した取り込み手順も適用する。
60
67
  指定外のプロパティ、リンク、コード、数値、識別子、文字コード、改行を保持する。
61
68
  同一内容なら書かず、保存後は読み戻して対象パスと実際の変更内容を報告する。
62
69
 
@@ -77,14 +84,29 @@ CLI操作が失敗した場合も、この経路へ無断で切り替えない
77
84
 
78
85
  この手順は、ホストツールによる通常のMarkdownノート保存だけに適用する。
79
86
  この直接保存手順は0.5.4から対応する。
87
+ ネイティブWindowsの再解析タグ検証は別の手順とし、WSL保存の必須条件に流用しない。
88
+ 通常ファイルの作成・編集と成果物取り込みも、実行環境に応じた手順を各拡張子の通常データストリームに適用する。
80
89
  WSLのローカルWindowsドライブなら、FS名がdrvfs・9p・v9fsであることだけを理由に拒否しない。
81
90
  Python CLI・Canvas・Basesの保存対応は拡張せず、CLIの許可FS一覧を直接保存の条件に流用しない。
82
91
  Pythonやuvを必須にする変更でもない。
83
92
 
84
93
  1. WSL環境、実際のマウント、Windowsパスとの対応を確認する。`/mnt/c/...`という表記だけでは判断しない。
85
- Windows側の実体がローカルドライブであることも確認し、ネットワークドライブやUNC・SMB共有は対象外にする。
94
+ WSLのマウント情報とパス対応からローカルWindowsドライブを確認し、ネットワークドライブやUNC・SMB共有は対象外にする。
95
+ WSLで確認できたドライブ対応を、PowerShell・fsutil・Windows APIで再確認することは必須にしない。
86
96
  2. 許可済みのVaultと保存先、原文ハッシュ、ファイル実体、リンク数を確認する。
87
- パス途中のWindowsジャンクション等の再解析ポイントも拒否し、読み取り専用属性やACLによる拒否を尊重する。
97
+ OneDriveというフォルダー名や再解析ポイント属性だけでは保存を拒否しない。
98
+ OneDriveのcloud再解析属性はWSLのシンボリックリンクではなく、それ自体は別パスへの転送を示さない。
99
+ WSLのパス解決、各要素のlstat等のメタデータ、通常ファイル・ディレクトリか、開いた実体の識別情報を確認する。
100
+ 解決したWSLパスと実体が許可済みのVaultと正確な対象の範囲に収まることを確認する。
101
+ Windows再解析タグ取得、cloudタグの許可一覧、Windows最終パスAPIは必須にしない。
102
+ それらの取得機能がないことだけで、通常のWSLファイルとして扱えるOneDriveへの保存を拒否しない。
103
+ WSLのシンボリックリンク、検出したジャンクションや実際の転送、範囲外、特殊ファイルは拒否する。
104
+ 任意のWindowsメタデータ検査で名前代理・転送が判明した場合も拒否し、実際の転送の証拠は無視しない。
105
+ 新規対象は排他的作成前に親を検証し、作成した実体も書き込み前に確認する。
106
+ オンライン専用やアクセス時に取得すると判明したファイルは、読み取り・更新前に取得通信への明示同意を得る。
107
+ 取得通信の兆候がありローカル利用可能か不明なら止めるが、通常のWSLファイルにWindows側の利用可能性APIを要求しない。
108
+ 固定、クラウド属性削除、同期設定変更で回避しない。
109
+ WSLのパス・型・実体を確認できなければ、その不足と対象パスを具体的に報告する。読み取り専用属性やACLによる拒否を尊重する。
88
110
  通常の`.md`データストリームだけを対象にし、`:stream`やデバイスパスへ書き込まない。
89
111
  3. 既存ノートは同じファイル実体へ書き込む。切り詰めずに開き、同じハンドルで原文と実体を保存直前に照合する。
90
112
  候補を書いた後、候補と同じ長さに切り詰める。一時ファイルへの置換、改名、削除しての再作成は使わない。
@@ -93,7 +115,9 @@ Pythonやuvを必須にする変更でもない。
93
115
  Linuxのuid・gid・modeが仮想表示であることや、POSIX拡張属性一覧を取得できないことだけでは拒否しない。
94
116
  新規ノートは排他的に作成し、既存名を上書きせず、通常のWindows親ディレクトリのACL継承に従う。
95
117
  5. 書き込みをフラッシュして閉じ、読み戻したバイト列・実体・観測できる属性を確認する。
96
- 通常の書き込みに伴う時刻やアーカイブ属性の更新は許容するが、他の属性の変更は許容しない。
118
+ 通常の書き込みに伴う時刻・アーカイブ属性更新と、同意済みのローカル取得に伴う状態変化だけを許容する。
119
+ 同じ実体を維持し、クラウドプロバイダーのメタデータを意図的に置換しない。
120
+ WindowsのACL・cloud属性を列挙できないことだけでは拒否せず、検証できた属性として報告もしない。
97
121
  途中失敗やObsidian・Sync・Windows側の同時編集を完全には防げないことを、保存前に説明する。
98
122
  書いた可能性がある失敗は結果不明とし、自動再保存やロールバックは行わない。
99
123
 
@@ -104,6 +128,89 @@ chmod・chown、属性の削除、マウントやWindows設定の変更で保存
104
128
  校正の保護検査・意味レビューと、セッション領域への保存禁止は維持する。
105
129
  権限の違いは[MicrosoftのWSLファイル権限資料](https://learn.microsoft.com/en-us/windows/wsl/file-permissions)を参照する。
106
130
 
131
+ ### ネイティブWindowsでの直接保存
132
+
133
+ ネイティブWindowsでは親を含む実際の再解析タグを確認し、名前代理ではない確認済みのcloud系タグだけを許可する。
134
+ 開いた実体のWindows最終パスと識別情報を確認し、未知のタグ、ジャンクション、範囲外への転送は拒否する。
135
+ 確認できなければネイティブWindowsの対象を停止するが、このWindows API要件をWSL保存へ流用しない。
136
+ 認可、原文再照合、非上書き作成、同一実体への更新、読み戻しと取得通信同意は維持する。
137
+ WSLの確認はホストから見えるパス・型・実体の確認であり、Windows再解析情報の独立監査ではない。
138
+ どちらも検出不能な転送、同時変更、同期失敗がないことを保証しない。
139
+
140
+ ## ディレクトリとファイルのホスト操作
141
+
142
+ 許可済みのVaultと範囲内で、ディレクトリ作成、通常ファイルの作成・編集・削除をホストツールで行う。
143
+ 検証済みのOneDriveも対象とし、通常ファイルを`.md`以外という理由だけで拒否しない。
144
+ `mkdir`・`create`・`edit`・`delete`はホストへの操作指定であり、Python CLIに同名コマンドを追加するものではない。
145
+ 本文生成は担当Skillへ戻し、Markdownの校正・Canvas・Basesの保存検査を汎用書き込みで回避しない。
146
+
147
+ 1. Vaultの絶対パス、作業ディレクトリ、解決済みの正確な全対象、操作、変更範囲、利用者の実際の許可を受け取る。
148
+ ファイル作成・編集は正確な候補バイト列、編集は現在の原文バイト列・ハッシュ・実体も必要とする。
149
+ 機能追加の依頼や作業ディレクトリ指定だけでは実際のファイル操作を許可しない。
150
+ 対象・操作・変更への明示許可があれば毎回の再承認は不要だが、事前確認を求められた場合は確認まで操作しない。
151
+ 必要な読み取り・モデル入力範囲、コピー同意も渡し、不足する情報は1問ずつ確認する。
152
+ 2. 全対象と操作を提示する。ワイルドカードや一括指定は許可済みの列挙範囲内だけで展開し、確定したパス・操作への承認を得る。
153
+ 親・対象の実体、同等名、型、範囲、リンク数、管理フォルダー除外を確認する。
154
+ シンボリックリンク、検出したジャンクション・転送、範囲外、特殊ファイルは拒否する。
155
+ WSLでは前節のWSLパス・型・実体の確認、ネイティブWindowsでは再解析タグ検証を使う。
156
+ 未知のWindowsタグ拒否はネイティブWindowsに限定し、WSLでWindowsメタデータ取得を再び必須にしない。
157
+ どちらもローカルドライブ・通常ストリーム・ACL・取得通信の確認は維持する。
158
+ ホスト拒否やコンテンツ除外を回避せず、確認不能なら影響する操作だけを停止する。
159
+ 3. ディレクトリ作成は未作成の親もすべて正確なパスで許可を得て、既存の親を検証してから非上書きで順に作る。
160
+ 作成した各実体と範囲を確認してから子へ進む。検証済みの既存ディレクトリは変更なしとする。
161
+ 同名ファイルや同等名の衝突は成功ではなく競合とする。
162
+ 4. ファイル作成は正確なバイト列を排他的に保存する。編集は直前の原文バイト列・ハッシュ・実体を照合し、外部変更なら止める。
163
+ 同一内容なら書かず、対象形式にも既存のLinux・Windows属性保全と読み戻しの確認を適用する。
164
+ バイナリは完全な候補バイト列か別途許可した形式対応ツールを使い、テキスト置換で壊さない。
165
+ 5. 削除はノート・添付を含む正確な各通常ファイルへの明示的な削除許可を必須とする。
166
+ 許可済みのローカル読み取りで現在の実体とSHA-256を記録する。ハッシュ計算は本文のモデル送信を許可しない。
167
+ 削除対象を提示し、OneDriveが他の端末へ削除を同期し得ること、バックアップやごみ箱からの復旧を保証しないことを説明する。
168
+ 削除直前に内容・ハッシュ・実体・親・範囲を再照合し、変更があれば止める。正確な1ファイルだけをunlinkする。
169
+ 属性削除・ACL変更・再帰削除で通さない。保存時の属性保全や内容読み戻しは削除の条件に流用しない。
170
+ 削除後はリンクを追わず不在を確認する。同じパスの別実体は競合・結果不明とし、再削除しない。
171
+ もともと不在なら「既に不在」と報告し、この操作で削除済みとはしない。
172
+ 6. 各パスと操作の作成済み・編集済み・削除済み・変更なし・既に不在・停止・失敗・結果不明を実測で報告する。
173
+ 前提操作が失敗したら依存する操作を止め、一括処理の部分実施を正確に報告する。
174
+ 非原子的操作と同時編集リスクを事前説明し、実行された可能性がある操作を自動再実行・ロールバックしない。
175
+
176
+ ディレクトリ削除、再帰削除、移動・改名は対象外とする。Vaultルート、作業ディレクトリのルート、セッション領域を削除しない。
177
+ 削除後の参照修復やバックアップ作成は自動で行わない。バックアップには正確な場所とコピーへの別途同意が必要である。
178
+ 通信、外部ツールの実行、依存導入はそれぞれの許可を維持する。
179
+
180
+ ## PDF・Docling変換成果物の取り込み
181
+
182
+ これはホストツールで行う保存手順であり、`vault.py`に新しいコマンドを追加するものではない。
183
+ Vault内やOneDrive上であることだけを理由に、明示許可されたPDF保存や変換を禁止しない。
184
+ Doclingは同梱・自動導入せず、取得と変換は呼出元のツールが担当する。
185
+ DefuddleとKnapをPDF変換の代替として使わない。
186
+
187
+ 1. Vaultの絶対パス、作業ディレクトリ、正確な取得元URL・入力ファイル、読み取り・モデル入力範囲、全出力先を確認する。
188
+ 作業ディレクトリ指定だけでは取得・変換・通信・保存の許可にならない。不足する情報は1問ずつ確認する。
189
+ 明示された取得元・操作・出力先への許可があれば、PDF取得前にMarkdown候補を要求しない。
190
+ 2. ダウンロード通信、クラウドファイルのローカル取得、ローカル変換、モデルへの入力を区別する。
191
+ 指定外のリダイレクト先や参照資料の取得は無断で行わず、Vault本文を外部変換サービスへ送らない。
192
+ 利用できる取得ツール・Doclingと出力方式を実行前に確認する。依存導入やOCR・モデル資産の取得は別途許可を得る。
193
+ 3. 元PDF、抽出Markdown、明示指定した画像・JSON等の全出力先を保存前に提示する。
194
+ 同名・同等名の衝突を確認して非上書きで作成し、既存対象の置換には別途許可と元のバイト列・ハッシュを要求する。
195
+ 対象・親の実体、範囲、管理フォルダー除外、リンク数を確認し、WSLとネイティブWindowsそれぞれの手順を使う。
196
+ 変換ツールの無検証上書きは使わず、通常データストリーム以外への書き込みは拒否する。
197
+ 4. 親が未作成なら正確な作成パスへの別途許可を得て、既存の祖先と作成した各フォルダーを再確認する。
198
+ ツールの追加出力を承認済みのものに限定できなければ、別途同意した仮出力先で生成し、検証済みのバイト列だけを移す。
199
+ 取り込みの補助ファイルは同意済みのVault内作業ディレクトリも利用できるが、CLI計画の作業領域はVault外のままとする。
200
+ 補助・キャッシュ・一時ファイルの場所と保持を事前に提示する。セッション領域や無断の`/tmp`代替は使わない。
201
+ 安全な作成・書き込み方法や必要な場所への許可がなければ、取得・変換前に止める。
202
+ 5. 取得は終了状態とHTTPエラーを確認し、HTMLのログイン・エラーページではなくPDFであることを検証する。
203
+ 変換は終了状態と全成果物の存在・内容を確認する。空・欠落した出力を成功としない。
204
+ 保存後は正確なバイト列を読み戻し、SHA-256を記録する。取得元を保持し、内容の忠実性はレビューなしに保証しない。
205
+ 生の抽出は意味保存校正ではない。本文作成・日本語修正を求められたらobsidian-markdownへ渡し、通常の保存・レビュー検査を使う。
206
+ 6. ダウンロード・変換・各成果物の正確なパス、ハッシュ、結果を個別に報告する。
207
+ PDF保存後に変換が失敗した場合はPDFだけ保存済みの部分実施とする。書いた可能性がある失敗は対象の結果不明とする。
208
+ 自動再保存・ロールバック・削除は行わず、確認のための読み取りだけを行う。補助ファイルの削除にも許可が必要である。
209
+ ホストの拒否、ACL、コンテンツ除外を回避しない。1成果物の停止で他の検証済み成果物を未実施と扱わない。
210
+
211
+ 保存前には非原子的書き込みとOneDrive・Obsidianの同時編集リスクを説明する。
212
+ 取り込みへの許可は通常のノート編集・Canvas・Basesの保存許可を拡大しない。
213
+
107
214
  ## CLI計画保存モードの導入と起動
108
215
 
109
216
  既存の同名Skillを無断で置換しない。必要な呼出元と兄弟Skillは別途導入する。
@@ -241,4 +348,5 @@ receipt.jsonは保存後の検証済み記録、result.jsonは本文を含めな
241
348
  成功記録が不正、欠落した記録から以前の保存が疑われる、現在の内容が変わった、という場合は自動再保存しない。
242
349
  unknownは「変更なし」を意味しない。対象、原文、候補、一時ファイル、記録を確認し、新しい計画が必要か判断する。
243
350
  一時ファイルや操作ディレクトリは利用者の確認なしに掃除しない。
244
- 削除を依頼された場合も、確認した操作ディレクトリの既知ファイルだけを対象にする。
351
+ 補助ファイルの掃除は、確認した操作ディレクトリの既知ファイルへの削除許可の範囲に限定する。
352
+ Vault内の通常ファイルを削除する依頼には、上記のホスト操作手順を使う。CLIに削除コマンドはない。