kotonoha 0.4.0 → 0.4.2
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 +47 -1
- package/README-ja.md +82 -4
- package/README.md +123 -6
- package/bin/kotonoha.js +4 -1
- package/package.json +8 -3
- package/skills/japanese-prose/scripts/invariants.py +24 -6
- package/skills/obsidian-bases/SKILL.md +140 -0
- package/skills/obsidian-bases/assets/templates/cards.base +8 -0
- package/skills/obsidian-bases/assets/templates/kanban.base +7 -0
- package/skills/obsidian-bases/assets/templates/list.base +8 -0
- package/skills/obsidian-bases/assets/templates/table.base +10 -0
- package/skills/obsidian-bases/references/execution-contract.json +246 -0
- package/skills/obsidian-bases/references/workflow.md +155 -0
- package/skills/obsidian-bases/scripts/check.cjs +690 -0
- package/skills/obsidian-bases/scripts/package-lock.json +104 -0
- package/skills/obsidian-bases/scripts/package.json +18 -0
- package/skills/obsidian-bases/scripts/verify.cjs +454 -0
- package/skills/obsidian-canvas/SKILL.md +134 -0
- package/skills/obsidian-canvas/assets/templates/comparison.canvas +11 -0
- package/skills/obsidian-canvas/assets/templates/mind-map.canvas +11 -0
- package/skills/obsidian-canvas/assets/templates/note-map.canvas +10 -0
- package/skills/obsidian-canvas/assets/templates/workflow.canvas +11 -0
- package/skills/obsidian-canvas/references/execution-contract.json +404 -0
- package/skills/obsidian-canvas/references/workflow.md +187 -0
- package/skills/obsidian-canvas/scripts/canvas.py +1479 -0
- package/skills/obsidian-canvas/scripts/canvas.py.lock +143 -0
- package/skills/obsidian-canvas/scripts/test_canvas.py +2047 -0
- package/skills/obsidian-canvas/scripts/test_canvas.py.lock +143 -0
- package/skills/obsidian-vault/SKILL.md +162 -0
- package/skills/obsidian-vault/references/execution-contract.json +479 -0
- package/skills/obsidian-vault/references/workflow.md +206 -0
- package/skills/obsidian-vault/scripts/test_vault.py +569 -0
- package/skills/obsidian-vault/scripts/test_vault.py.lock +143 -0
- package/skills/obsidian-vault/scripts/vault.py +1363 -0
- package/skills/obsidian-vault/scripts/vault.py.lock +143 -0
- package/skills/tech-writer/SKILL.md +26 -7
- package/skills/tech-writer/assets/templates/obsidian.md +37 -0
- package/skills/tech-writer/references/doctypes/obsidian.md +106 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# Obsidian Canvasの操作ガイド
|
|
2
|
+
|
|
3
|
+
Canvas専用の5コマンドで、許可範囲の読み取りから差分承認、1ファイルの保存までを分離する。
|
|
4
|
+
制御ファイルの正本は[execution-contract.json](execution-contract.json)である。
|
|
5
|
+
以下のパスと数値は説明用であり、利用者の許可を表す値ではない。
|
|
6
|
+
|
|
7
|
+
## 導入
|
|
8
|
+
|
|
9
|
+
初期対応はLinux、CPython 3.12、uv、検証できるローカルFSである。
|
|
10
|
+
Obsidianアプリ、MCP、プラグインは不要である。
|
|
11
|
+
同じSkillルートにobsidian-vaultを置き、共用APIの版が1であることを必要とする。
|
|
12
|
+
旧公開版0.4.1にはこのAPIがない。Canvas単独導入は兄弟を自動追加・更新しない。
|
|
13
|
+
依存不足ではdependency_missingとなり、更新の許可を得るまで処理を行わない。
|
|
14
|
+
|
|
15
|
+
未導入の場合の選択導入は次のとおりである。開発中のCanvasは公開版0.4.1には含まれない。
|
|
16
|
+
既存Skillは既定では保持される。更新が必要なら、ローカルの変更を確認し、利用者の承認後に対象を明示して置換する。
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
kotonoha install --skill obsidian-canvas
|
|
20
|
+
kotonoha install --skill obsidian-vault
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
添削にはjapanese-proseも必要である。通常の図の編集では必須にしない。
|
|
24
|
+
初回の依存準備で通信する場合は、対象と目的を説明して別に許可を得る。
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
uv sync --locked --python 3.12 --script <canvas-dir>/scripts/canvas.py
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
実行では必ず固定されたオフライン経路を使う。パスに空白があれば、シェルで1引数になるよう引用する。
|
|
31
|
+
|
|
32
|
+
```text
|
|
33
|
+
uv run --offline --locked --python 3.12 <canvas-dir>/scripts/canvas.py inspect --request /absolute/private/request.json
|
|
34
|
+
uv run --offline --locked --python 3.12 <canvas-dir>/scripts/canvas.py inspect --request /absolute/private/request.json --path Maps/research.canvas
|
|
35
|
+
uv run --offline --locked --python 3.12 <canvas-dir>/scripts/canvas.py read --request /absolute/private/request.json --path Maps/research.canvas
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Vault内の本文はこのinspect/readで取得する。ホストの汎用ツールで許可範囲の確認を迂回しない。
|
|
39
|
+
readは許可された`.md`と`.canvas`に対応し、添付の本文は取得しない。
|
|
40
|
+
|
|
41
|
+
## 読み取り依頼
|
|
42
|
+
|
|
43
|
+
Vaultの絶対パス、目的、読み取り範囲、モデルに渡す情報を事前に確定する。
|
|
44
|
+
次の例はMapsだけを対象とする。model_context=falseのままでは読み取らない。
|
|
45
|
+
同意を確認してからtrueにし、勝手に範囲を`.`へ拡大しない。
|
|
46
|
+
上限のnullは明示的な無制限である。必要な上限を合意してから数値を設定する。
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"schema_version": 1,
|
|
51
|
+
"vault_root": "/absolute/vault",
|
|
52
|
+
"read_scopes": [{"kind": "directory", "path": "Maps"}],
|
|
53
|
+
"purpose": "選択したCanvasの構造と参照を診断する",
|
|
54
|
+
"intent": "inspect",
|
|
55
|
+
"write_target": null,
|
|
56
|
+
"base_sha256": null,
|
|
57
|
+
"workspace": null,
|
|
58
|
+
"consent": {"model_context": false, "workspace_copies": false},
|
|
59
|
+
"limits": {"max_files": null, "max_file_bytes": null, "max_total_bytes": null},
|
|
60
|
+
"mutations": [],
|
|
61
|
+
"markings": [],
|
|
62
|
+
"protected_terms": [],
|
|
63
|
+
"allow_formatting": false,
|
|
64
|
+
"layout": null,
|
|
65
|
+
"operation_nonce": null
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
管理フォルダーは大文字小文字の違いも含めて探索せず、シンボリックリンクを追わない。
|
|
70
|
+
範囲外の参照は存在確認も行わない。追加の参照先本文を読むには新しい読み取り許可が必要である。
|
|
71
|
+
参照先の実在と、その内容や関係が正しいことは別々に報告する。
|
|
72
|
+
|
|
73
|
+
## 候補、配置、変更対象
|
|
74
|
+
|
|
75
|
+
作成ではintent=create、保存先、Vault外のworkspace、コピー同意を設定する。
|
|
76
|
+
base_sha256はnull、mutationsは空とし、候補全体を承認対象にする。
|
|
77
|
+
編集ではintent=editとし、readで得た原文のbase_sha256と保存先を設定する。
|
|
78
|
+
候補生成後に原文が変わった場合は、再取得して提案からやり直す。
|
|
79
|
+
保存先の親を自動作成しない。
|
|
80
|
+
|
|
81
|
+
operation_nonceはホストが1操作につき生成する128bitのランダム値を32桁の小文字16進数で記録する。
|
|
82
|
+
同一計画ではその値を維持し、衝突・不明状態の回避のため自動更新しない。
|
|
83
|
+
workspaceと操作ディレクトリは現在の利用者所有の0700、入力やコピーは0600とする。
|
|
84
|
+
候補・レビュー・計画の途中の親もシンボリックリンクにしない。
|
|
85
|
+
|
|
86
|
+
変更はノードまたは接続のIDと属性で指定する。
|
|
87
|
+
次の例はnode-aの位置だけを変更し、他の値や存続IDの順序は変えない。
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
[
|
|
91
|
+
{"entity": "node", "id": "node-a", "action": "set", "fields": ["x", "y"]}
|
|
92
|
+
]
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
追加・削除はadd/removeと空のfieldsを使う。
|
|
96
|
+
同じIDの種別変更はremove/addの対を明示し、接続先を黙って付け替えない。
|
|
97
|
+
nodes/edgesの有無や順序を意図的に変える場合は、documentの仮想属性を明示する。
|
|
98
|
+
削除するカードに依存する接続の削除は、計画で接続IDごとに確認する。
|
|
99
|
+
JSONの整形差分も承認対象とし、changed editではallow_formatting=trueを必要とする。
|
|
100
|
+
|
|
101
|
+
自動配置はgrid、horizontal、verticalと対象IDの順序を指定する。
|
|
102
|
+
最大幅・最大高と正の余白で位置を計算し、group、非正寸法、既存groupとの交差を拒否する。
|
|
103
|
+
配置だけでは参照や実表示を確認したことにはならない。
|
|
104
|
+
|
|
105
|
+
```text
|
|
106
|
+
uv run --offline --locked --python 3.12 <canvas-dir>/scripts/canvas.py layout --request /absolute/private/layout-request.json --candidate /absolute/private/input.canvas
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
layoutは別の候補を作り、原文や入力候補を変更しない。
|
|
110
|
+
結果をplanへ渡すときはlayoutをnullに戻し、位置変更をmutationsに反映した新しい依頼を用意する。
|
|
111
|
+
|
|
112
|
+
## 印とレビュー
|
|
113
|
+
|
|
114
|
+
印は`[根拠あり] `、`[提案] `、`[未確認] `のいずれかを、既知の文字列属性の先頭に置く。
|
|
115
|
+
直後にはASCII空白1文字を付ける。
|
|
116
|
+
追加または意味内容を変える対象には、対象と印の対応をmarkingsで宣言する。
|
|
117
|
+
|
|
118
|
+
```json
|
|
119
|
+
{
|
|
120
|
+
"entity": "node",
|
|
121
|
+
"id": "file-a",
|
|
122
|
+
"carrier_entity": "node",
|
|
123
|
+
"carrier_id": "evidence-group",
|
|
124
|
+
"carrier_field": "label",
|
|
125
|
+
"category": "evidence"
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
file/linkカードは先行する包含groupを使う。text、group、接続ラベルは自分自身にも対応付けられる。
|
|
130
|
+
自己の印を優先し、なければ最内側のgroupを使う。複数のgroupで分類が矛盾すれば拒否する。
|
|
131
|
+
移動やgroupの削除・分類変更が、未変更のカードへ与える影響も計画に示す。
|
|
132
|
+
file/linkへ独自のlabelや子一覧を追加しない。
|
|
133
|
+
|
|
134
|
+
すべての変更計画には、原文・候補の正確なハッシュと実際の担当者を持つReviewが必要である。
|
|
135
|
+
diagram_checksで意図、根拠の区別、印の保持、依存変更、配置データを実際に確認する。
|
|
136
|
+
create/editのsemantic_checksはnullとする。
|
|
137
|
+
添削ではintent=proofreadとし、変更文字列ごとのStringReviewを必要とする。
|
|
138
|
+
選択したtext.text、group.label、edge.label以外を変えない。
|
|
139
|
+
|
|
140
|
+
StringReviewにはentity、id、field、文字列の前後UTF-8ハッシュと、9項目のchecksを記録する。
|
|
141
|
+
図全体のハッシュと文字列のハッシュを取り違えない。
|
|
142
|
+
変更文字列との完全一致が必要であり、余分・欠落・重複・古いハッシュは通過しない。
|
|
143
|
+
実際に確認していない項目をtrueにせず、合格するための意味レビューを自動生成しない。
|
|
144
|
+
添削で印の分類や数量対応、リンク、コード、見出し、用語を変えない。
|
|
145
|
+
|
|
146
|
+
## 計画と承認
|
|
147
|
+
|
|
148
|
+
```text
|
|
149
|
+
uv run --offline --locked --python 3.12 <canvas-dir>/scripts/canvas.py plan --request /absolute/private/request.json --candidate /absolute/private/input.canvas --review /absolute/private/review.json
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
planはVaultを変更しない。原文と候補が同一バイト列なら、レビューや保存能力を要求せずno_changesを返す。
|
|
153
|
+
変更計画では操作ディレクトリに原文、候補、レビュー、差分、変更一覧、診断、plan.jsonを保持する。
|
|
154
|
+
新規作成ではbefore.canvasを作らない。
|
|
155
|
+
利用者には保存先、正確な全アーティファクトのパス、計画ハッシュ、完全な差分、未確認事項を提示する。
|
|
156
|
+
同じ親の一時ファイル、外部編集の競合、保持・削除方法、実表示の未確認も説明する。
|
|
157
|
+
後でObsidianを開くとURLカードなどが通信し得ることを伝える。
|
|
158
|
+
|
|
159
|
+
実際の利用者がこの計画と差分を承認した後にだけapplyする。
|
|
160
|
+
次の引数値は説明用であり、過去のハッシュやAIの判定を人間の承認として使わない。
|
|
161
|
+
|
|
162
|
+
```text
|
|
163
|
+
uv run --offline --locked --python 3.12 <canvas-dir>/scripts/canvas.py apply --request /absolute/private/request.json --plan /absolute/private/OPERATION_ID/plan.json --approve-plan-sha256 APPROVED_PLAN_SHA256
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
依頼、内容、レビュー、検査コード、対象の実体が変われば再承認する。
|
|
167
|
+
保存は1操作1Canvasに限定し、ノート・添付を変更しない。
|
|
168
|
+
|
|
169
|
+
## 結果と復旧
|
|
170
|
+
|
|
171
|
+
| 終了コード | 意味 |
|
|
172
|
+
|---|---|
|
|
173
|
+
| 0 | 完了。保存要求がない場合と検証済み保存を区別する |
|
|
174
|
+
| 1 | 入力または実行失敗。確定後の失敗はunknownになり得る |
|
|
175
|
+
| 2 | 同意、権限、競合、検査による拒否。今回の保存なし |
|
|
176
|
+
| 3 | 判定不能や未処理が残る。検証済み保存を伴う場合もある |
|
|
177
|
+
| 4 | 兄弟Skill、依存関係、安全な保存機能等が不足 |
|
|
178
|
+
|
|
179
|
+
未解決・曖昧・外部URLだけで部分実施にせず、理由ごとの規則に従う。
|
|
180
|
+
partial/saved/verified=trueは、保存を確認したが参照に未確認が残る結果である。
|
|
181
|
+
failed/unknownは今回の保存結果が不明であり、自動再保存やロールバックを行わない。
|
|
182
|
+
参照先は保存後も変わり得る。計画時の診断と適用時の現在の診断を区別する。
|
|
183
|
+
|
|
184
|
+
成功記録と現在の候補が一致する再実行だけをalready_appliedとする。
|
|
185
|
+
過去の不確定な記録、記録の不正・不一致、既存の一時ファイルを、消してやり直す回避策にしない。
|
|
186
|
+
対象と原文・候補・記録を利用者が確認し、正確な既知パスの削除や新しい計画を明示承認した場合だけ再開する。
|
|
187
|
+
同じ親への原子的な保存でも、最終照合直後の外部編集と同権限の悪意あるプロセスを完全には防げない。
|