@imunitic/synapse 0.2.7 → 0.2.9
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/commands/synapse-design-note.md +8 -1
- package/commands/synapse-note.md +27 -5
- package/commands/synapse-status.md +29 -23
- package/commands/synapse-vault-tidy.md +5 -3
- package/harness/codex/skills/synapse-status/SKILL.md +37 -27
- package/harness/codex/skills/synapse-vault-tidy/SKILL.md +5 -3
- package/package.json +4 -4
- package/skills/synapse-task/SKILL.md +1 -1
- package/synapse-claude.md +12 -11
- package/synapse.conf.template +10 -1
|
@@ -51,6 +51,12 @@ reading the same file:
|
|
|
51
51
|
4. If nothing confidently matches, ask the user for a short project tag — plain free-text, not a
|
|
52
52
|
multiple-choice list, never hinting at any other project's tag as an example — then append the
|
|
53
53
|
resolved pair to the conf file.
|
|
54
|
+
5. Once the prefix is known, mint the note's `note_id` the same shared-counter way `/synapse-note`'s
|
|
55
|
+
"Resolving a missing task ID" step 6 does: `task_id` and `note_id` share one counter per prefix, so
|
|
56
|
+
check both fields (`synapse vault-search --fields frontmatter.task_id,frontmatter.note_id`, filter
|
|
57
|
+
both for `{prefix}-\d+`, take the highest number found across both, add 1; start at 1 if none exist
|
|
58
|
+
yet). This is frontmatter only — unlike a task note, a design note's title and filename stay
|
|
59
|
+
exactly `{PROJECT} — {Topic}`, with no id prepended.
|
|
54
60
|
|
|
55
61
|
Never hardcode a specific project/prefix pair in this command's own instructions — the conf file is
|
|
56
62
|
machine-local and deliberately outside the portable Synapse package, so projects from
|
|
@@ -174,6 +180,7 @@ so the `## Status` line is the only lifecycle marker that matters. It simply sta
|
|
|
174
180
|
title: "{PROJECT} — {Topic}"
|
|
175
181
|
project: {prefix}
|
|
176
182
|
created: "{now}"
|
|
183
|
+
note_id: {id}
|
|
177
184
|
---
|
|
178
185
|
|
|
179
186
|
# {PROJECT} — {Topic}
|
|
@@ -205,7 +212,7 @@ edit history here worth tracking separately.
|
|
|
205
212
|
## Filename
|
|
206
213
|
|
|
207
214
|
`designs/{PROJECT} — {Topic}.md` — sanitize filesystem-illegal characters (`/ : * ? " < > |`). No
|
|
208
|
-
slug, no numbering —
|
|
215
|
+
slug, no numbering — vault filenames are the title itself.
|
|
209
216
|
|
|
210
217
|
---
|
|
211
218
|
|
package/commands/synapse-note.md
CHANGED
|
@@ -87,10 +87,12 @@ unchanged for anyone who has never touched an XDG config directory.
|
|
|
87
87
|
5. Whenever step 3 or step 4 resolves a pair not already in the conf file (including a fresh
|
|
88
88
|
`project-name=prefix` line matching what was just deduced or asked), append it — so the next task
|
|
89
89
|
for this project resolves from step 2 without a search or a question.
|
|
90
|
-
6. Once the prefix is known, find the next number
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
90
|
+
6. Once the prefix is known, find the next number. `task_id` and `note_id` (the id every note gets —
|
|
91
|
+
see "Assigning a note_id" below) share one counter per prefix, so this has to check both fields,
|
|
92
|
+
not just `task_id` alone: run `synapse vault-search --fields frontmatter.task_id,frontmatter.note_id`
|
|
93
|
+
with `{"or": [{"!=": [{"var": "frontmatter.task_id"}, null]}, {"!=": [{"var": "frontmatter.note_id"}, null]}]}`
|
|
94
|
+
on stdin, filter both returned columns client-side for values matching `{prefix}-\d+`, take the
|
|
95
|
+
highest number found across both, add 1. If none exist yet for that prefix, start at 1.
|
|
94
96
|
7. Format the new task ID **zero-padded to 3 digits** (`{prefix}-001`, `{prefix}-030`,
|
|
95
97
|
`{prefix}-037`, ...), matching the org-roam-era convention — widening
|
|
96
98
|
naturally past 3 digits if a prefix ever needs it.
|
|
@@ -120,7 +122,7 @@ offered.
|
|
|
120
122
|
|
|
121
123
|
Resolve this to a `category` matching the folder name exactly as
|
|
122
124
|
`Index.md` currently spells it, before moving on to the creation steps
|
|
123
|
-
below. No project-slug question is needed here —
|
|
125
|
+
below. No project-slug question is needed here — vault filenames are
|
|
124
126
|
the title itself, not a slug-prefixed timestamp, so there's no separate
|
|
125
127
|
namespacing concern to resolve. The note always lands flat at
|
|
126
128
|
`{category}/{filename}.md` — never inferred into a subfolder such as a
|
|
@@ -129,6 +131,25 @@ triage/priority one a vault owner might maintain by hand (e.g.
|
|
|
129
131
|
sorting a note into one of those, if a category has one, is never an
|
|
130
132
|
agent's call to make.
|
|
131
133
|
|
|
134
|
+
## Assigning a note_id (bare mode only)
|
|
135
|
+
|
|
136
|
+
Task mode already gets its id via "Resolving a missing task ID" above. Bare mode needs one too —
|
|
137
|
+
every note gets a `note_id`, not just tasks — but unlike task mode, this step never blocks with a
|
|
138
|
+
question: a quick bare note shouldn't require an interrupt just to get an id.
|
|
139
|
+
|
|
140
|
+
1. Try steps 1-3 of "Resolving a missing task ID" above (repo context, the resolved
|
|
141
|
+
`synapse-projects.conf`, then deducing from the vault itself) to resolve a project prefix. Skip
|
|
142
|
+
step 4 entirely — if none of the first three resolve one, fall through to step 2 below instead of
|
|
143
|
+
asking.
|
|
144
|
+
2. If a prefix resolved: mint the next number the same shared-counter way as that section's step 6
|
|
145
|
+
(checking both `task_id` and `note_id` across the vault for that prefix). If no prefix resolved:
|
|
146
|
+
mint `note-NNN` instead — its own flat, project-less counter, found the same way (`synapse
|
|
147
|
+
vault-search --fields frontmatter.note_id`, filter for `note-\d+`, take the highest, add 1; start
|
|
148
|
+
at 1 if none exist yet).
|
|
149
|
+
3. Carry the resolved `{id}` into "Creating the note" below as `note_id`. Unlike task mode, the title
|
|
150
|
+
itself is untouched — no id prefix on the visible title or the `title` frontmatter field for a bare
|
|
151
|
+
note.
|
|
152
|
+
|
|
132
153
|
## Resolving the project folder (task mode only)
|
|
133
154
|
|
|
134
155
|
Task notes are grouped one level deeper by project, `tasks/{project}/{filename}.md` — see
|
|
@@ -161,6 +182,7 @@ or supplied directly by a caller like `/synapse-task-note`):
|
|
|
161
182
|
---
|
|
162
183
|
title: "{title}"
|
|
163
184
|
created: "{now}"
|
|
185
|
+
note_id: {id}
|
|
164
186
|
---
|
|
165
187
|
|
|
166
188
|
```
|
|
@@ -27,7 +27,7 @@ periodic look on their own schedule -- this report doesn't cover it.
|
|
|
27
27
|
## Prerequisites
|
|
28
28
|
|
|
29
29
|
Requires the `synapse` CLI on `PATH`. Backend-agnostic -- every query below goes through `synapse
|
|
30
|
-
vault-search`, so it works the same
|
|
30
|
+
vault-search`, so it works the same regardless of which `Store` backend is configured. If the
|
|
31
31
|
CLI errors (no vault configured), say so and stop -- there is no other fallback.
|
|
32
32
|
|
|
33
33
|
## Producing the report
|
|
@@ -37,10 +37,11 @@ Run each query below via `synapse vault-search --fields <fields>`, with the Json
|
|
|
37
37
|
since a matched row already carries them.
|
|
38
38
|
|
|
39
39
|
**1. Design notes still `Discussing`.** Design notes carry status in-body under `## Status`, not in
|
|
40
|
-
frontmatter (unlike task notes) -- a content match, scoped to `designs/`. Needs
|
|
40
|
+
frontmatter (unlike task notes) -- a content match, scoped to `designs/`. Needs the title and the
|
|
41
|
+
note's own `note_id` (every design note gets one, minted by `/synapse-design-note` itself):
|
|
41
42
|
|
|
42
43
|
```
|
|
43
|
-
synapse vault-search --fields frontmatter.title <<'EOF'
|
|
44
|
+
synapse vault-search --fields frontmatter.title,frontmatter.note_id <<'EOF'
|
|
44
45
|
{"and": [
|
|
45
46
|
{"glob": ["designs/*", {"var": "path"}]},
|
|
46
47
|
{"regexp": ["## Status\nDiscussing", {"var": "content"}]}
|
|
@@ -51,10 +52,10 @@ EOF
|
|
|
51
52
|
**2. `Ready` design notes with no compiled task yet.** `/synapse-task-note`'s own "Linking back"
|
|
52
53
|
step patches a compiled design note with a `> Compiled task: [[...]]` line right after its title --
|
|
53
54
|
"`Ready` and missing that line" is a direct signal, not fuzzy title-matching against `tasks/`. Needs
|
|
54
|
-
|
|
55
|
+
the title and `note_id`:
|
|
55
56
|
|
|
56
57
|
```
|
|
57
|
-
synapse vault-search --fields frontmatter.title <<'EOF'
|
|
58
|
+
synapse vault-search --fields frontmatter.title,frontmatter.note_id <<'EOF'
|
|
58
59
|
{"and": [
|
|
59
60
|
{"glob": ["designs/*", {"var": "path"}]},
|
|
60
61
|
{"regexp": ["## Status\nReady", {"var": "content"}]},
|
|
@@ -67,11 +68,11 @@ EOF
|
|
|
67
68
|
at least one bullet -- a heading with nothing under it (fully pruned, per the Ready-gate convention
|
|
68
69
|
`/synapse-design-note` now follows) doesn't count as open. Since this section spans every status,
|
|
69
70
|
each line in the composed report also shows *which* status the note is currently in, and whether it
|
|
70
|
-
has a compiled task note -- request `content` too, and pull
|
|
71
|
-
rather than reading the note again:
|
|
71
|
+
has a compiled task note -- request `content` and `note_id` too, and pull the status/compiled-task
|
|
72
|
+
target directly out of the returned text rather than reading the note again:
|
|
72
73
|
|
|
73
74
|
```
|
|
74
|
-
synapse vault-search --fields frontmatter.title,content <<'EOF'
|
|
75
|
+
synapse vault-search --fields frontmatter.title,frontmatter.note_id,content <<'EOF'
|
|
75
76
|
{"and": [
|
|
76
77
|
{"glob": ["designs/*", {"var": "path"}]},
|
|
77
78
|
{"regexp": ["## Open Questions\n- ", {"var": "content"}]}
|
|
@@ -95,10 +96,11 @@ silently stop finding anything under a multi-line pattern.
|
|
|
95
96
|
|
|
96
97
|
**4. Open task notes with at least one unchecked item.** Task notes carry `status:` in frontmatter,
|
|
97
98
|
unlike design notes -- filter there first, and request `content` to count `- [ ]` lines directly from
|
|
98
|
-
the row rather than reading each match again
|
|
99
|
+
the row rather than reading each match again. `task_id` is already frontmatter on every task note, no
|
|
100
|
+
extra minting step needed:
|
|
99
101
|
|
|
100
102
|
```
|
|
101
|
-
synapse vault-search --fields frontmatter.title,content <<'EOF'
|
|
103
|
+
synapse vault-search --fields frontmatter.title,frontmatter.task_id,content <<'EOF'
|
|
102
104
|
{"in": [{"var": "frontmatter.status"}, ["TODO", "IN-PROGRESS"]]}
|
|
103
105
|
EOF
|
|
104
106
|
```
|
|
@@ -112,36 +114,40 @@ waiting specifically on human sign-off, since `synapse-task` deliberately never
|
|
|
112
114
|
`REVIEW` on its own:
|
|
113
115
|
|
|
114
116
|
```
|
|
115
|
-
synapse vault-search --fields frontmatter.title <<'EOF'
|
|
117
|
+
synapse vault-search --fields frontmatter.title,frontmatter.task_id <<'EOF'
|
|
116
118
|
{"==": [{"var": "frontmatter.status"}, "REVIEW"]}
|
|
117
119
|
EOF
|
|
118
120
|
```
|
|
119
121
|
|
|
120
122
|
## Composing the report
|
|
121
123
|
|
|
122
|
-
One section per category, in the order above. Each line
|
|
123
|
-
`
|
|
124
|
-
is
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
124
|
+
One section per category, in the order above. Each line leads with the note's own id in brackets
|
|
125
|
+
(`note_id` for a design note, `task_id` for a task note) — the whole point of every note now carrying
|
|
126
|
+
one is that a human can act on a line directly ("open sb-068") without the title as an intermediate
|
|
127
|
+
step — followed by the title, plus whatever other identifying detail that category needs. A note
|
|
128
|
+
somehow missing its id (pre-dates the field, or the backfill hasn't reached it yet) drops the bracket
|
|
129
|
+
entirely rather than printing an empty one, the same graceful-degradation the title-less case already
|
|
130
|
+
gets. The Open Questions section is the one place a note's status and compiled-task link also belong
|
|
131
|
+
on the line -- every other section's heading already implies status (the "Discussing" section only
|
|
132
|
+
ever holds `Discussing` notes) and compiled-task-ness (the "Ready, not yet compiled" section only ever
|
|
133
|
+
holds notes without one), but Open Questions spans every status and both compiled and uncompiled
|
|
134
|
+
notes, so put the status first, before the id, so it's the first thing scanned:
|
|
129
135
|
|
|
130
136
|
```
|
|
131
137
|
## Discussing
|
|
132
|
-
- {title}
|
|
138
|
+
- [{note_id}] {title}
|
|
133
139
|
|
|
134
140
|
## Ready, not yet compiled
|
|
135
|
-
- {title}
|
|
141
|
+
- [{note_id}] {title}
|
|
136
142
|
|
|
137
143
|
## Open questions
|
|
138
|
-
- **{status}** — {title} — {compiled task title, or "not compiled"}
|
|
144
|
+
- **{status}** — [{note_id}] {title} — {compiled task title, or "not compiled"}
|
|
139
145
|
|
|
140
146
|
## In progress (unchecked items)
|
|
141
|
-
- {title} ({N} unchecked)
|
|
147
|
+
- [{task_id}] {title} ({N} unchecked)
|
|
142
148
|
|
|
143
149
|
## Awaiting review
|
|
144
|
-
- {title}
|
|
150
|
+
- [{task_id}] {title}
|
|
145
151
|
```
|
|
146
152
|
|
|
147
153
|
Omit a section entirely when it has zero matches -- matching `/synapse-note --list`'s own convention
|
|
@@ -30,9 +30,11 @@ of scope — foundational files, not taxonomy notes.
|
|
|
30
30
|
|
|
31
31
|
Requires the `synapse` CLI on `PATH`, resolving a vault with a working `LinkGraph`
|
|
32
32
|
(`synapse vault-backlinks`/`vault-links`/`vault-unresolved`/`vault-orphans`/`vault-deadends` — see
|
|
33
|
-
`sb — Obsidian CLI as ObsidianStore's transport`
|
|
34
|
-
|
|
35
|
-
back to
|
|
33
|
+
`sb — Obsidian CLI as ObsidianStore's transport` and `sb — DiskStore's own index, Obsidian becomes
|
|
34
|
+
optional`). Both real coding-vault backends have one now — `obsidian` reaching the CLI when
|
|
35
|
+
reachable and falling back to `disk`'s own implementation otherwise, `disk` always local. If
|
|
36
|
+
`SYNAPSE_VAULT_STORE` ever resolves to a backend with no `LinkGraph` at all, these commands exit 1
|
|
37
|
+
saying so; stop and report that rather than falling back to anything else.
|
|
36
38
|
|
|
37
39
|
This command reaches the vault store only through the `synapse` CLI's `vault-*` subcommands, the
|
|
38
40
|
same door every other skill uses — no MCP tool, no direct `ObsidianStore` call. `vault-links`/
|
|
@@ -29,7 +29,7 @@ produces the same five-category sweep.
|
|
|
29
29
|
## Prerequisites
|
|
30
30
|
|
|
31
31
|
Requires the `synapse` CLI on `PATH`. Backend-agnostic -- every query below goes through `synapse
|
|
32
|
-
vault-search`, so it works the same
|
|
32
|
+
vault-search`, so it works the same regardless of which `Store` backend is configured. If the
|
|
33
33
|
CLI errors (no vault configured), say so and stop -- there is no other fallback.
|
|
34
34
|
|
|
35
35
|
## Producing the report
|
|
@@ -39,10 +39,11 @@ Run each query below via `synapse vault-search --fields <fields>`, with the Json
|
|
|
39
39
|
since a matched row already carries them.
|
|
40
40
|
|
|
41
41
|
**1. Design notes still `Discussing`.** Design notes carry status in-body under `## Status`, not in
|
|
42
|
-
frontmatter (unlike task notes) -- a content match, scoped to `designs/`. Needs
|
|
42
|
+
frontmatter (unlike task notes) -- a content match, scoped to `designs/`. Needs the title and the
|
|
43
|
+
note's own `note_id` (every design note gets one, minted at creation time):
|
|
43
44
|
|
|
44
45
|
```
|
|
45
|
-
synapse vault-search --fields frontmatter.title <<'EOF'
|
|
46
|
+
synapse vault-search --fields frontmatter.title,frontmatter.note_id <<'EOF'
|
|
46
47
|
{"and": [
|
|
47
48
|
{"glob": ["designs/*", {"var": "path"}]},
|
|
48
49
|
{"regexp": ["## Status\nDiscussing", {"var": "content"}]}
|
|
@@ -53,10 +54,10 @@ EOF
|
|
|
53
54
|
**2. `Ready` design notes with no compiled task yet.** The design-compilation skill's own "Linking
|
|
54
55
|
back" step patches a compiled design note with a `> Compiled task: [[...]]` line right after its
|
|
55
56
|
title -- "`Ready` and missing that line" is a direct signal, not fuzzy title-matching against
|
|
56
|
-
`tasks/`. Needs
|
|
57
|
+
`tasks/`. Needs the title and `note_id`:
|
|
57
58
|
|
|
58
59
|
```
|
|
59
|
-
synapse vault-search --fields frontmatter.title <<'EOF'
|
|
60
|
+
synapse vault-search --fields frontmatter.title,frontmatter.note_id <<'EOF'
|
|
60
61
|
{"and": [
|
|
61
62
|
{"glob": ["designs/*", {"var": "path"}]},
|
|
62
63
|
{"regexp": ["## Status\nReady", {"var": "content"}]},
|
|
@@ -68,11 +69,12 @@ EOF
|
|
|
68
69
|
**3. Design notes (any status) with a non-empty `## Open Questions`.** Match the heading followed by
|
|
69
70
|
at least one bullet -- a heading with nothing under it (fully pruned, per the design-note skill's own
|
|
70
71
|
Ready-gate convention) doesn't count as open. Since this section spans every status, each line in the
|
|
71
|
-
composed report also shows *which* status the note is currently in
|
|
72
|
-
|
|
72
|
+
composed report also shows *which* status the note is currently in, and whether it has a compiled task
|
|
73
|
+
note -- request `content` and `note_id` too, and pull both directly out of the returned text rather
|
|
74
|
+
than reading the note again:
|
|
73
75
|
|
|
74
76
|
```
|
|
75
|
-
synapse vault-search --fields frontmatter.title,content <<'EOF'
|
|
77
|
+
synapse vault-search --fields frontmatter.title,frontmatter.note_id,content <<'EOF'
|
|
76
78
|
{"and": [
|
|
77
79
|
{"glob": ["designs/*", {"var": "path"}]},
|
|
78
80
|
{"regexp": ["## Open Questions\n- ", {"var": "content"}]}
|
|
@@ -80,12 +82,14 @@ synapse vault-search --fields frontmatter.title,content <<'EOF'
|
|
|
80
82
|
EOF
|
|
81
83
|
```
|
|
82
84
|
|
|
83
|
-
This spans every status, so take
|
|
84
|
-
|
|
85
|
-
`Discussing`/`Ready`/`Reference`, but a design note written before that three-word convention
|
|
86
|
-
standardized can carry free text there instead
|
|
87
|
-
rather than forcing it into a bucket, surfacing an odd note beats losing it, the same
|
|
88
|
-
reporting a 0-unchecked task instead of hiding it
|
|
85
|
+
This spans every status, so take two things from each row's `content` column directly instead of
|
|
86
|
+
chaining further status-specific `regexp` branches onto the query: the line following `## Status`
|
|
87
|
+
(normally `Discussing`/`Ready`/`Reference`, but a design note written before that three-word convention
|
|
88
|
+
was standardized can carry free text there instead, e.g. `Superseded by [[...]]` -- report that
|
|
89
|
+
verbatim rather than forcing it into a bucket, surfacing an odd note beats losing it, the same
|
|
90
|
+
reasoning behind reporting a 0-unchecked task instead of hiding it, see Query 4 below) and the target
|
|
91
|
+
of a `> Compiled task: [[...]]` line, if present -- that's the compiled task, parsed straight out of
|
|
92
|
+
the wikilink text rather than resolved through any vault-wide link index.
|
|
89
93
|
|
|
90
94
|
A `regexp` pattern containing a literal newline (`\n`) must be written with a single backslash, byte-
|
|
91
95
|
for-byte, in the JSON text piped to `vault-search` -- the heredocs above are unquoted-delimiter
|
|
@@ -95,10 +99,11 @@ silently stop finding anything under a multi-line pattern.
|
|
|
95
99
|
|
|
96
100
|
**4. Open task notes with at least one unchecked item.** Task notes carry `status:` in frontmatter,
|
|
97
101
|
unlike design notes -- filter there first, and request `content` to count `- [ ]` lines directly from
|
|
98
|
-
the row rather than reading each match again
|
|
102
|
+
the row rather than reading each match again. `task_id` is already frontmatter on every task note, no
|
|
103
|
+
extra minting step needed:
|
|
99
104
|
|
|
100
105
|
```
|
|
101
|
-
synapse vault-search --fields frontmatter.title,content <<'EOF'
|
|
106
|
+
synapse vault-search --fields frontmatter.title,frontmatter.task_id,content <<'EOF'
|
|
102
107
|
{"in": [{"var": "frontmatter.status"}, ["TODO", "IN-PROGRESS"]]}
|
|
103
108
|
EOF
|
|
104
109
|
```
|
|
@@ -112,34 +117,39 @@ waiting specifically on human sign-off, since the task-status skill deliberately
|
|
|
112
117
|
note past `REVIEW` on its own:
|
|
113
118
|
|
|
114
119
|
```
|
|
115
|
-
synapse vault-search --fields frontmatter.title <<'EOF'
|
|
120
|
+
synapse vault-search --fields frontmatter.title,frontmatter.task_id <<'EOF'
|
|
116
121
|
{"==": [{"var": "frontmatter.status"}, "REVIEW"]}
|
|
117
122
|
EOF
|
|
118
123
|
```
|
|
119
124
|
|
|
120
125
|
## Composing the report
|
|
121
126
|
|
|
122
|
-
One section per category, in the order above. Each line
|
|
123
|
-
`
|
|
124
|
-
is
|
|
125
|
-
|
|
126
|
-
|
|
127
|
+
One section per category, in the order above. Each line leads with the note's own id in brackets
|
|
128
|
+
(`note_id` for a design note, `task_id` for a task note) — the whole point of every note now carrying
|
|
129
|
+
one is that a human can act on a line directly ("open sb-068") without the title as an intermediate
|
|
130
|
+
step — followed by the title. A note somehow missing its id (pre-dates the field) drops the bracket
|
|
131
|
+
entirely rather than printing an empty one, the same graceful-degradation the title-less case already
|
|
132
|
+
gets. The Open Questions section is the one place a note's status and compiled-task link also belong
|
|
133
|
+
on the line -- every other section's heading already implies status (the "Discussing" section only
|
|
134
|
+
ever holds `Discussing` notes) and compiled-task-ness (the "Ready, not yet compiled" section only ever
|
|
135
|
+
holds notes without one), but Open Questions spans every status and both compiled and uncompiled
|
|
136
|
+
notes, so put the status first, before the id, so it's the first thing scanned:
|
|
127
137
|
|
|
128
138
|
```
|
|
129
139
|
## Discussing
|
|
130
|
-
- {title}
|
|
140
|
+
- [{note_id}] {title}
|
|
131
141
|
|
|
132
142
|
## Ready, not yet compiled
|
|
133
|
-
- {title}
|
|
143
|
+
- [{note_id}] {title}
|
|
134
144
|
|
|
135
145
|
## Open questions
|
|
136
|
-
- **{status}** — {title}
|
|
146
|
+
- **{status}** — [{note_id}] {title} — {compiled task title, or "not compiled"}
|
|
137
147
|
|
|
138
148
|
## In progress (unchecked items)
|
|
139
|
-
- {title} ({N} unchecked)
|
|
149
|
+
- [{task_id}] {title} ({N} unchecked)
|
|
140
150
|
|
|
141
151
|
## Awaiting review
|
|
142
|
-
- {title}
|
|
152
|
+
- [{task_id}] {title}
|
|
143
153
|
```
|
|
144
154
|
|
|
145
155
|
Omit a section entirely when it has zero matches -- matching the note-listing skill's own convention
|
|
@@ -30,9 +30,11 @@ there is no argument to parse, every run produces the same one-pass sweep.
|
|
|
30
30
|
## Prerequisites
|
|
31
31
|
|
|
32
32
|
Requires the `synapse` CLI on `PATH`, resolving a vault with a working link graph
|
|
33
|
-
(`synapse vault-backlinks`/`vault-links`/`vault-unresolved`/`vault-orphans`/`vault-deadends`).
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
(`synapse vault-backlinks`/`vault-links`/`vault-unresolved`/`vault-orphans`/`vault-deadends`). Both
|
|
34
|
+
real coding-vault backends have one — `disk` (the default) always local, `obsidian` reaching a
|
|
35
|
+
running app when reachable and falling back to `disk`'s own implementation otherwise. If
|
|
36
|
+
`SYNAPSE_VAULT_STORE` ever resolves to a backend with no link graph at all, these commands exit 1
|
|
37
|
+
saying so; stop and report that rather than falling back to anything else.
|
|
36
38
|
|
|
37
39
|
This skill reaches the vault store only through the `synapse` CLI's `vault-*` subcommands, the same
|
|
38
40
|
door every other skill uses — no MCP tool, no direct `ObsidianStore` call. `vault-links`/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@imunitic/synapse",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.9",
|
|
4
4
|
"description": "Memory for Claude Code, Codex CLI, and OpenCode: a durable Obsidian vault plus a per-repo code graph.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -22,9 +22,9 @@
|
|
|
22
22
|
"*.conf.template"
|
|
23
23
|
],
|
|
24
24
|
"optionalDependencies": {
|
|
25
|
-
"@imunitic/synapse-darwin-arm64": "0.2.
|
|
26
|
-
"@imunitic/synapse-linux-x64": "0.2.
|
|
27
|
-
"@imunitic/synapse-linux-arm64": "0.2.
|
|
25
|
+
"@imunitic/synapse-darwin-arm64": "0.2.9",
|
|
26
|
+
"@imunitic/synapse-linux-x64": "0.2.9",
|
|
27
|
+
"@imunitic/synapse-linux-arm64": "0.2.9"
|
|
28
28
|
},
|
|
29
29
|
"license": "SEE LICENSE IN LICENSE"
|
|
30
30
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: synapse-task
|
|
3
|
-
description: Update
|
|
3
|
+
description: Update vault task notes' status frontmatter and Notes sections, enforcing status transitions so active work is IN-PROGRESS and completed checklists move only to REVIEW (not DONE).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Synapse Task Status Skill
|
package/synapse-claude.md
CHANGED
|
@@ -96,17 +96,18 @@ a real yes/no answer, not a formality to wave past.
|
|
|
96
96
|
|
|
97
97
|
The vault is reached through the `synapse` CLI — `synapse vault-read`/`vault-write`/`vault-list`/
|
|
98
98
|
`vault-search`/`vault-search-text`/`vault-doc-map`/`vault-patch`/`vault-backlinks`/`vault-links`/
|
|
99
|
-
`vault-unresolved`/`vault-orphans`/`vault-deadends` — for reads
|
|
100
|
-
a vault path or calling an `mcp__obsidian__*` tool directly.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
`SYNAPSE_VAULT_STORE`/`SYNAPSE_VAULT_DIR` — never something a skill
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
99
|
+
`vault-unresolved`/`vault-orphans`/`vault-deadends`/`vault-ambiguous`/`vault-rename` — for reads
|
|
100
|
+
*and* for writes, never by resolving a vault path or calling an `mcp__obsidian__*` tool directly.
|
|
101
|
+
Which concrete store the CLI talks to (`SYNAPSE_VAULT_STORE=disk`, the default; or `obsidian`,
|
|
102
|
+
opted into for a running Obsidian app's own live search relevance and graph data) is resolved once,
|
|
103
|
+
inside the compiled binary, from `SYNAPSE_VAULT_STORE`/`SYNAPSE_VAULT_DIR` — never something a skill
|
|
104
|
+
or an agent turn needs to know or branch on. By default that means no Obsidian dependency
|
|
105
|
+
whatsoever: `read`/`write`/`list`/`search`/the link graph/rename are all plain disk I/O and direct
|
|
106
|
+
computation against the vault folder. Under the opted-in `obsidian` backend, `search`/the link
|
|
107
|
+
graph/rename go through Obsidian's own CLI over its local socket instead when Obsidian is running,
|
|
108
|
+
falling back to the same disk-backed behavior automatically and silently (a one-line stderr note,
|
|
109
|
+
nothing an agent turn needs to react to) whenever it isn't — no precondition to check or fail on
|
|
110
|
+
either way.
|
|
110
111
|
|
|
111
112
|
**Every write to a note goes through `synapse vault-write` or `vault-patch`. Never the `Write`/`Edit`
|
|
112
113
|
tools on the on-disk path, and never a raw `mcp__obsidian__*` tool call either** — not for a one-line
|
package/synapse.conf.template
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
# synapse-setup configure copies this file in automatically when it finds no
|
|
2
2
|
# synapse.conf anywhere. Edit the path below for this machine.
|
|
3
|
-
SYNAPSE_VAULT_DIR="$HOME/
|
|
3
|
+
SYNAPSE_VAULT_DIR="$HOME/Vault/YourVault"
|
|
4
|
+
|
|
5
|
+
# Default "disk" if unset: reads/writes the vault folder directly, no
|
|
6
|
+
# external dependency at all -- search and the link graph
|
|
7
|
+
# (backlinks/links/unresolved/orphans/deadends/ambiguous) are computed by
|
|
8
|
+
# DiskStore's own scan. Set to the name of an extended store instead to
|
|
9
|
+
# prefer a running external app's own live search relevance and graph data,
|
|
10
|
+
# falling back to the same disk-backed behavior automatically whenever that
|
|
11
|
+
# app isn't reachable -- see docs/synapse/synapse-extended-store.md.
|
|
12
|
+
#SYNAPSE_VAULT_STORE="obsidian"
|
|
4
13
|
|
|
5
14
|
# Where Synapse clones/builds tree-sitter grammars (shared across every
|
|
6
15
|
# project -- not per-repo). Safe to leave at the default.
|