Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
253 commits
Select commit Hold shift + click to select a range
17d0281
test(v3): snapshot the summary line of every package and fixture action
chhoumann Oct 4, 2026
71fddf3
test(v3): quickadd:list reports lowered actions as it reports v2 choices
chhoumann Oct 4, 2026
1e4fc5a
test(v3): run the capture characterization on migrated and lowered ch…
chhoumann Oct 4, 2026
ae3a473
test(v3): run the daily-note Journal entry action migrated and lowered
chhoumann Oct 4, 2026
eea4440
feat(v3): name Run action targets in the migration report
chhoumann Oct 4, 2026
216a1f4
fix(v3): migrate old nested choices deterministically and report unkn…
chhoumann Oct 4, 2026
866a162
feat(settings): merge QuickAdd 3 action lists by id
chhoumann Oct 4, 2026
821f038
feat(v3): store choices as actions in data.json
chhoumann Oct 4, 2026
fe0a97d
feat(v3): show a migration report and offer to restore QuickAdd 2 set…
chhoumann Oct 4, 2026
50cfbec
fix(v3): keep saving choices the builder made
chhoumann Oct 4, 2026
db90034
fix(v3): tidy the migration report and show the QuickAdd 2 settings g…
chhoumann Oct 4, 2026
f1f6a18
test(e2e): seed choices as stored actions and cover the storage switch
chhoumann Oct 4, 2026
bc92daf
fix(v3): report unknown keys on nested choices that become steps
chhoumann Oct 4, 2026
1770310
feat(v3): let actions own their data and merge settings as actions
chhoumann Oct 4, 2026
fd38842
feat(v3): show an action in the ribbon
chhoumann Oct 4, 2026
0756976
test(e2e): show an action in the ribbon through an edit, a reload and…
chhoumann Oct 4, 2026
32afa3e
test(e2e): resolve obsidian to the test stub for modules the specs im…
chhoumann Oct 4, 2026
fef0bc7
fix(v3): load the actions this build can read and keep the rest as th…
chhoumann Oct 4, 2026
eca23fd
fix(settings): do not merge lists inside a script step's settings by id
chhoumann Oct 4, 2026
669977d
fix(v3): keep saving when restoring the QuickAdd 2 snapshot fails
chhoumann Oct 4, 2026
3660b0c
test(v3): split QUICKADD_V3_EXTRA_CONFIGS on the platform path delimiter
chhoumann Oct 4, 2026
83e8491
test(e2e): fail clearly when a seeded macro or the package fixture ha…
chhoumann Oct 4, 2026
e102c99
test(v3): take only a package's root choices, as import installs them
chhoumann Oct 4, 2026
0f0471f
fix(v3): keep choices saved next to an unreadable action list, and he…
chhoumann Oct 4, 2026
0c52051
fix(v3): read an action only if this build can lower it, steps included
chhoumann Oct 4, 2026
6c6ccab
feat(v3): summarize a choice in one line, folders by their size
chhoumann Oct 4, 2026
96982de
feat(v3): show what each choice does under its name
chhoumann Oct 4, 2026
4de17a6
feat(v3): say what each choice does in the launcher
chhoumann Oct 4, 2026
e50520d
feat(v3): start a new choice from a preset instead of a type
chhoumann Oct 4, 2026
e2b3a66
test(e2e): add a log from its preset and read its summary in the list…
chhoumann Oct 4, 2026
1b44343
test(e2e): open phone settings until the QuickAdd tab is shown
chhoumann Oct 4, 2026
70a0cf6
feat(v3): give a new choice its preset's icon, and offer no script pr…
chhoumann Oct 4, 2026
37bc19b
fix(v3): take only choices the migration can read from a QuickAdd 2 d…
chhoumann Oct 4, 2026
bdcd2f1
fix(v3): fold only the follow-up steps migration derived into a write…
chhoumann Oct 4, 2026
d194177
refactor(macro): share the script picker as pickUserScript
chhoumann Oct 4, 2026
605cf5a
feat(macro): show a script step's file and let a step without one cho…
chhoumann Oct 4, 2026
583770c
feat(macro): change a script step's file from its settings
chhoumann Oct 4, 2026
3e73faf
feat(v3): offer the "Run a script" preset again
chhoumann Oct 4, 2026
adb6f6f
test(e2e): choose a script step's file from its row
chhoumann Oct 4, 2026
19aacd1
fix(macro): keep the script row's name as the command label
chhoumann Oct 4, 2026
d62c454
test(e2e): put data.json back after the storage-switch spec writes it…
chhoumann Oct 4, 2026
9ff7a0b
fix(macro): a script step whose file is not a script offers to choose…
chhoumann Oct 4, 2026
cb64f6c
fix(macro): changing a script step's file leaves the old script's set…
chhoumann Oct 4, 2026
ef46d5e
fix(v3): take a QuickAdd 2 device's choice only if the migration read…
chhoumann Oct 4, 2026
6e73f6e
fix(macro): change a script step's file only after its secret migrati…
chhoumann Oct 4, 2026
4594a7c
fix(macro): picking a script step's current file again changes nothing
chhoumann Oct 4, 2026
313faf7
feat(v3): add a step to an action as the choice it lowers to
chhoumann Oct 4, 2026
c2ba955
feat(choices): replace a choice whole in the tree, for a change of type
chhoumann Oct 4, 2026
5da7202
feat(choices): hand a Template or Capture from its builder to the mac…
chhoumann Oct 4, 2026
4ce0c41
feat(choices): show a Template's or Capture's steps in its builder, w…
chhoumann Oct 4, 2026
b1aa34e
test(e2e): add a script step to a capture from its builder and run it
chhoumann Oct 4, 2026
c63a842
test(user-scripts): import the mocked module's type without an import…
chhoumann Oct 4, 2026
ddf3580
style(macro): give step rows the choice rows' height and padding
chhoumann Oct 4, 2026
469f732
fix(v3): count an unreadable action's id when reading a QuickAdd 2 de…
chhoumann Oct 4, 2026
f570cb8
style: keep one comment above the step row's text rule
chhoumann Oct 4, 2026
6e28bf2
fix(v3): keep what a QuickAdd 2 device added inside a folder this bui…
chhoumann Oct 4, 2026
5d76ca3
docs: start a new choice from a preset
chhoumann Oct 4, 2026
9a967b3
docs: show which file a macro's script step runs
chhoumann Oct 4, 2026
41089ff
docs: add a step to a capture or template, and show a choice in the r…
chhoumann Oct 4, 2026
8ed275d
docs: a new card lands at the end of the lane, and no note on older m…
chhoumann Oct 4, 2026
107bad3
feat(executor): track the run note, the note a run last wrote to
chhoumann Oct 4, 2026
4b0f168
feat(format): resolve {{NOTE}} to the note the run last wrote to
chhoumann Oct 4, 2026
5556dcc
feat(scripts): give user scripts the run note as params.note
chhoumann Oct 4, 2026
1f4f508
feat(v3): lower an open of the run note to an Open file command on {{…
chhoumann Oct 4, 2026
cd09389
fix(v3): keep a converted write's id by naming its nested choice <act…
chhoumann Oct 4, 2026
475a454
test(e2e): open, script and capture steps use the run note
chhoumann Oct 4, 2026
bd25042
test(e2e): wait for the converted action before reading its step ids
chhoumann Oct 4, 2026
1ad0526
docs: describe {{NOTE}}, the note a run last wrote to
chhoumann Oct 4, 2026
a5ad662
fix(v3): a save keeps an action's provenance as the migration found it
chhoumann Oct 4, 2026
de0d5fc
docs(v3): the run note is the note the last write step ended on, foun…
chhoumann Oct 4, 2026
0e344f8
fix(v3): the action lookups tolerate an unreadable action list
chhoumann Oct 4, 2026
a5ef86a
feat(outcome): carry the text a run wrote so it can be undone
chhoumann Oct 4, 2026
682291c
feat(run): one result notice per run, with Open and Undo, and a run log
chhoumann Oct 4, 2026
06f054b
feat(settings): list the last runs under a Run log heading
chhoumann Oct 4, 2026
a1b08fd
fix(settings): ignore a synced settings change read while unloading
chhoumann Oct 4, 2026
7658434
test(e2e): result notice with Open and Undo, and the run log in settings
chhoumann Oct 4, 2026
96a1e1b
docs: describe the result notice and the run log
chhoumann Oct 4, 2026
d1f6191
test(e2e): wait for the alias to be indexed before searching for it
chhoumann Oct 4, 2026
d56510b
fix(run-log): write the log one write at a time
chhoumann Oct 4, 2026
b4fc83b
fix(settings): treat a damaged migrations value as absent
chhoumann Oct 4, 2026
9a5f96c
fix(template): read a note's before-text at the moment of the write
chhoumann Oct 4, 2026
9185266
fix(capture): record the note as it is after its own link was added, …
chhoumann Oct 4, 2026
e3db5ac
docs: describe the getting-started GIF without naming where the line …
chhoumann Oct 4, 2026
3a45468
fix(run-note): refuse a capture or open on {{NOTE}} before any note w…
chhoumann Oct 4, 2026
bf74cec
fix(run-log): start from nothing when the log file is absent
chhoumann Oct 4, 2026
ad9f627
fix(v3): read a QuickAdd 2 device's folder child by child
chhoumann Oct 4, 2026
57e002f
feat(settings): start an empty choice list with three choices
chhoumann Oct 4, 2026
6f07276
feat(format): accept {{ACTION:name}} as the name for {{MACRO:name}}
chhoumann Oct 4, 2026
95df479
feat(format): run any choice from {{ACTION:}} and {{MACRO:}}
chhoumann Oct 4, 2026
9dd7c8f
test(e2e): first-run choices and {{ACTION:}} running a Capture
chhoumann Oct 4, 2026
1a3dd52
docs(format): {{ACTION:}} runs any choice, {{MACRO:}} stays as its ol…
chhoumann Oct 4, 2026
3402ecc
fix(capture): keep an Undo snapshot for a link added to the note and …
chhoumann Oct 4, 2026
e6b6556
fix(v3): take a data.json that already stores actions as migrated
chhoumann Oct 4, 2026
3ceaad5
fix(capture): refresh the Undo snapshot only when the link went into …
chhoumann Oct 4, 2026
2c6a94c
fix(template): refresh the Undo snapshot after a link went into the note
chhoumann Oct 4, 2026
bbc701d
fix(format): {{ACTION:}} gives back the note the invoked choice itsel…
chhoumann Oct 4, 2026
4bf4d26
fix(format): {{ACTION:}} reads the note its choice ended on without c…
chhoumann Oct 4, 2026
c8a6748
feat(v3): list the inputs an action asks for
chhoumann Oct 4, 2026
c758b10
feat(v3): store input overrides on an action
chhoumann Oct 4, 2026
a9f2a30
feat(v3): ask for an input as its action's override says
chhoumann Oct 4, 2026
b972c57
feat(builder): an Inputs group for Template and Capture choices
chhoumann Oct 4, 2026
145f676
test(e2e): the builder lists a choice's inputs and its label override…
chhoumann Oct 4, 2026
1c54bfb
docs(choices): the Inputs group in the Template and Capture builders
chhoumann Oct 4, 2026
6ed73d4
fix(v3): an input override applies to the write of a sequence too
chhoumann Oct 4, 2026
8b3a87f
fix(v3): the Inputs list expands global variables
chhoumann Oct 4, 2026
f4549e5
fix(settings): a repeated folder kept under a fresh id keeps its chil…
chhoumann Oct 4, 2026
752afa2
fix(executor): the notice and the log describe the run's last write
chhoumann Oct 4, 2026
8caee4c
fix(v3): the Inputs list includes what a template path asks for
chhoumann Oct 4, 2026
bfd3717
fix(settings): leave no empty pane after restoring or re-migrating Qu…
chhoumann Oct 4, 2026
1d1bd94
docs(capture): driver and fixture for the Getting Started journal rec…
chhoumann Oct 4, 2026
5930126
docs: re-record the Getting Started journal GIF with the Add to a not…
chhoumann Oct 4, 2026
ebf8c04
docs(capture): driver, fixture and local model stub for the AI macro …
chhoumann Oct 4, 2026
90ad358
docs: re-record the AI Assistant macro GIF from the sequence preset
chhoumann Oct 4, 2026
bf2a6c0
docs: name the AI macro recording's stub provider and model as placeh…
chhoumann Oct 4, 2026
81a0023
docs(capture): say that removing core-plugins.json turns the command …
chhoumann Oct 4, 2026
d370f80
fix(builder): Add a step > Open a note opens the run note
chhoumann Oct 4, 2026
e147323
fix(settings): no Clear button on an empty run log, and the empty sta…
chhoumann Oct 4, 2026
a0a6ebf
feat(first-run): plan vault-aware choices from the jobs a new user picks
chhoumann Oct 5, 2026
c0fc65c
feat(first-run): the empty list asks what you do in Obsidian and crea…
chhoumann Oct 5, 2026
6b47357
test(e2e): the first run creates choices from the picked jobs, with a…
chhoumann Oct 5, 2026
395c7b0
fix(run-log): long names and note paths shorten instead of widening t…
chhoumann Oct 5, 2026
a590fc7
docs: the empty list's question and the choices each answer adds
chhoumann Oct 5, 2026
d118fc2
test(e2e): follow the empty state's new controls and measure the menu…
chhoumann Oct 5, 2026
ae73abf
feat(presets): group the New choice menu by outcome and add four presets
chhoumann Oct 5, 2026
0cc3b96
feat(recipes): bundle the docs' example packages as a recipe catalogue
chhoumann Oct 5, 2026
f212db7
fix(file-picker): name a note by its file when its title holds a plac…
chhoumann Oct 5, 2026
d01e925
feat(recipes): add the docs' examples from an in-app Recipes gallery
chhoumann Oct 5, 2026
11eb37c
test(e2e): add a recipe from the gallery and read the new presets' su…
chhoumann Oct 5, 2026
f4de674
docs: the grouped New choice menu, its new presets, and the Recipes g…
chhoumann Oct 5, 2026
5e2655c
test(e2e): pick the first preset, not the New choice menu's first gro…
chhoumann Oct 5, 2026
d74f6cf
chore(presets): say when the New choice menu shows its packages footer
chhoumann Oct 5, 2026
2c7d9fc
fix(presets): name the preset apart from its group, and say add besid…
chhoumann Oct 5, 2026
9ddce0a
fix(packages): never write over an unreviewed file, and import agains…
chhoumann Oct 5, 2026
caee752
fix(packages): an import that gives up removes the files it created
chhoumann Oct 5, 2026
4b713d5
fix(packages): an import hands back the choices its final merge replaced
chhoumann Oct 5, 2026
2c8ba5c
fix(packages): an import that gives up keeps a created file edited si…
chhoumann Oct 5, 2026
b853655
fix(builder): let the settings keys move focus to the Inputs and Step…
chhoumann Oct 5, 2026
235e940
feat(builder): a line at the top that says what the choice does
chhoumann Oct 5, 2026
c120414
feat(builder): More settings, open when one of them is set
chhoumann Oct 5, 2026
deb8d53
feat(builder): New template… creates a template and opens it
chhoumann Oct 5, 2026
b90e744
feat(builder): a compact Template builder: Template, Folder, File name
chhoumann Oct 5, 2026
07fe78f
feat(builder): a compact Capture builder: Where, Position, What
chhoumann Oct 5, 2026
00c8762
feat(macro): head a macro's steps Steps
chhoumann Oct 5, 2026
6989a76
test(e2e): make a note from a new template in the compact builder
chhoumann Oct 5, 2026
b7a516b
docs: the compact Template and Capture builders
chhoumann Oct 5, 2026
7368db0
fix(builder): the Inputs row names the one {{VALUE}} by its prompt's …
chhoumann Oct 5, 2026
45ae60d
feat(macro): number the sequence's steps and say under each what it does
chhoumann Oct 5, 2026
074db74
feat(macro): lead the sequence builder with what its steps do
chhoumann Oct 5, 2026
bb84a2d
feat(macro): one Add a step menu in step vocabulary
chhoumann Oct 5, 2026
2437e6b
feat(macro): keep the sequence's behavior settings behind More settings
chhoumann Oct 5, 2026
358fdff
feat(macro): lead a branch page with its If step's line
chhoumann Oct 5, 2026
b6fece5
fix(builder): room to scroll a short builder page's last field above …
chhoumann Oct 5, 2026
735fde4
test(e2e): build, reorder and run a sequence from the Add a step menu
chhoumann Oct 5, 2026
1ad01a7
fix(macro): a wait row as tall as its neighbours, the list's end clos…
chhoumann Oct 5, 2026
eec7ab3
docs: the sequence builder speaks steps
chhoumann Oct 5, 2026
4a13b89
fix(builder): a step row leaves out a line that only says its name again
chhoumann Oct 5, 2026
cba0656
fix(builder): a sequence's icon does not open More settings, as on th…
chhoumann Oct 5, 2026
72e244f
fix(builder): a step row with no saved name renders instead of throwing
chhoumann Oct 5, 2026
3cbc456
test(e2e): open the macro page's More settings through run on startup…
chhoumann Oct 5, 2026
4f172b3
fix(recipes): a recipe keeps a file already in the vault unless told …
chhoumann Oct 6, 2026
5d9ba64
fix(packages): a relocated file is written where its destination is e…
chhoumann Oct 6, 2026
841cb7c
fix(recipes): a destination typed in over a file that is there keeps …
chhoumann Oct 6, 2026
052f879
feat(presets): new choices ask for their inputs on one page
chhoumann Oct 6, 2026
a20cf98
feat(preflight): the one-page form shows where the run lands and the …
chhoumann Oct 6, 2026
158b725
feat(prompts): a capture's prompt names the heading it adds under, as…
chhoumann Oct 6, 2026
8b31f18
fix(builder): More settings stays closed for a new choice that asks once
chhoumann Oct 6, 2026
5b2dfca
feat(preflight): Enter in a one-line field submits the one-page form
chhoumann Oct 6, 2026
e39892f
fix(preflight): the one-page preview's values line up under each other
chhoumann Oct 6, 2026
f9e0844
test(e2e): a new choice asks once and shows where it lands
chhoumann Oct 6, 2026
f9ea8c1
docs: new choices ask once, and the form shows where the run lands
chhoumann Oct 6, 2026
076cfff
fix(one-page): the form is titled after the choice, and a capture's t…
chhoumann Oct 6, 2026
10363d0
test(e2e): open the phone macro page's More settings through run on s…
chhoumann Oct 6, 2026
a09bed9
test(e2e): wait for the script picker's highlighted row before Enter
chhoumann Oct 6, 2026
1be89f4
test(one-page): the title test settles the form's promise before clos…
chhoumann Oct 6, 2026
03418de
feat(note-buttons): read a quickadd button block and find the choices…
chhoumann Oct 6, 2026
36c1530
feat(note-buttons): render a quickadd block as buttons that run its c…
chhoumann Oct 6, 2026
8f69f74
feat(note-buttons): copy a choice's button block from its row menu
chhoumann Oct 6, 2026
71b022c
test(e2e): a button in a note runs its choice and follows a rename
chhoumann Oct 6, 2026
a8b5fc6
docs: buttons in notes
chhoumann Oct 6, 2026
1a20468
test(e2e): a capture's value field is titled Text to capture beside o…
chhoumann Oct 6, 2026
fdd1e3a
feat(v3): detect Templater tags and the prompts a template asks
chhoumann Oct 6, 2026
f4a2809
feat(inputs): list a template's Templater prompts as asked by Templater
chhoumann Oct 6, 2026
35975ed
feat(template-builder): say when a template runs Templater, or needs it
chhoumann Oct 6, 2026
cb4d295
test(e2e): a template's Templater badge and prompts, with and without…
chhoumann Oct 6, 2026
f0f9c33
docs: using Templater with QuickAdd 3
chhoumann Oct 6, 2026
a13068f
fix(macro): a step's long line shortens on a phone instead of pushing…
chhoumann Oct 6, 2026
6dd6a01
fix(builder): More settings keeps its chevron beside it on a phone
chhoumann Oct 6, 2026
df98b6c
fix(macro): the sequence's Behavior group sits as far under More sett…
chhoumann Oct 6, 2026
9b64639
fix(macro): run on startup says it runs this sequence, as a sentence
chhoumann Oct 6, 2026
53706a2
fix(builder): the icon field reaches the card's edge on a phone
chhoumann Oct 6, 2026
3afae72
fix(note-buttons): a button that names no choice is not drawn as an u…
chhoumann Oct 6, 2026
b86b4e9
fix(note-buttons): a button that names no choice stays readable in a …
chhoumann Oct 6, 2026
5678ad8
fix(first-run): a job card shows the keyboard's focus ring
chhoumann Oct 6, 2026
212c5d8
fix(choice-list): a folder's Add folder and Add choice show the keybo…
chhoumann Oct 6, 2026
d377758
fix(recipes): a recipe's Guide and links show the keyboard's focus ring
chhoumann Oct 6, 2026
b3dea09
fix(recipes): a recipe's Guide is a finger-sized target on a phone
chhoumann Oct 6, 2026
53d027f
fix(run-log): a long note or failure shortens before the choice's nam…
chhoumann Oct 6, 2026
869a228
fix(preflight): the one-page preview and the date preview keep their …
chhoumann Oct 6, 2026
a15a874
fix(preflight): a one-page dropdown starts where the form's other fie…
chhoumann Oct 6, 2026
387b113
fix(recipes): two recipes say where Daily note path is instead of 'se…
chhoumann Oct 6, 2026
083d544
fix(capture-builder): Where's token hint sits as close under its hint…
chhoumann Oct 6, 2026
ef2d6b2
fix(run): a {{NOTE}} refusal reads once, as the choice's name and the…
chhoumann Oct 6, 2026
ec3beb8
fix(migration-report): the title, intro and Done stay put while the e…
chhoumann Oct 6, 2026
0f28b8a
fix(builders): say note, not file, in the Template, Capture and seque…
chhoumann Oct 6, 2026
fd1187e
fix(one-page): a date field says Not a date, in the form's own font
chhoumann Oct 6, 2026
2cbad07
fix(choice-list): a folder reads "1 of 3 choices" while a filter hide…
chhoumann Oct 6, 2026
1040dc3
fix(recipes): the gallery says recipe and sequence, and titles read i…
chhoumann Oct 6, 2026
7f6385e
feat(run): a run that is not set up refuses in one sentence naming th…
chhoumann Oct 6, 2026
b8d9a83
feat(scripts): a script step whose file is gone or exports nothing re…
chhoumann Oct 6, 2026
a49bfe7
feat(ai): an AI step with online features off or no model refuses
chhoumann Oct 6, 2026
d680674
fix(date-prompt): the preview reads like the one-page date field
chhoumann Oct 6, 2026
309b6c1
feat(inputs): a template's title reads "Filled from the note title"
chhoumann Oct 6, 2026
0d685fa
docs(meeting-notes): re-take the Open settings image on the new build…
chhoumann Oct 6, 2026
79fd4cf
fix(template-builder): Search existing notes says note name, not file…
chhoumann Oct 6, 2026
8f0a6d9
fix(run): a refusal keeps a proper noun's capital after the choice's …
chhoumann Oct 6, 2026
70627f1
test(e2e): storage switch saves before it turns QuickAdd off to write…
chhoumann Oct 6, 2026
f28a779
test(e2e): the script picker test picks Run a script with real clicks…
chhoumann Oct 6, 2026
7ee6fcf
fix(template): a Template checks its template before it asks anything
chhoumann Oct 6, 2026
500184d
fix(preflight): the one-page form and the CLI leave out a title the n…
chhoumann Oct 6, 2026
ee5d1bb
feat(run): {{LINKCURRENT}} with no note open refuses in one sentence
chhoumann Oct 6, 2026
fb34cc6
test(e2e): pickMenuItem clicks a menu's item once the menu holds the …
chhoumann Oct 6, 2026
b1affc9
test(e2e): every spec that picks from an Obsidian menu goes through p…
chhoumann Oct 6, 2026
35844ec
fix(template): a run that may open an existing note is not refused fo…
chhoumann Oct 6, 2026
0ef7397
feat(v3): a step with no v2 command form lowers to a step command ins…
chhoumann Oct 6, 2026
b7bb141
feat(v3): a step runner that runs a sequence's steps
chhoumann Oct 6, 2026
d3b19c0
feat(run): the executor runs a stored sequence through the step runner
chhoumann Oct 6, 2026
0f5a3dc
test(e2e): a sequence with a link, an open in reading view and a wait…
chhoumann Oct 6, 2026
a16f56c
docs(macro): a sequence runs one step at a time
chhoumann Oct 6, 2026
049f32d
feat(v3): new link and Templater steps on the run note
chhoumann Oct 6, 2026
e294532
feat(sequence): rows and settings for link, Templater and open-in-a-v…
chhoumann Oct 6, 2026
b6ab7af
feat(sequence): Add a step offers Link it and Run Templater
chhoumann Oct 6, 2026
43e0868
feat(run): an inline action runs its steps through the step runner
chhoumann Oct 6, 2026
b0b31fc
test(e2e): Link it and Run Templater from Add a step
chhoumann Oct 6, 2026
8544f69
docs: Link it and Run Templater steps
chhoumann Oct 6, 2026
aab6451
fix(preflight): the one-page form asks a Template's note title with i…
chhoumann Oct 6, 2026
0ac73e1
fix(packages): the review lists a kept file as kept and counts only t…
chhoumann Oct 6, 2026
599e828
feat(presets): New note from a template opens the note it creates
chhoumann Oct 6, 2026
14d11ca
fix(run-log): a failed run shows its whole sentence on a line under t…
chhoumann Oct 6, 2026
858a112
fix(preflight): the form's preview names a title not yet typed {title}
chhoumann Oct 6, 2026
c8d0416
fix(packages): the review's banner shows no scrollbar for a pixel of …
chhoumann Oct 6, 2026
34bab15
docs(one-page): the form asks a Template's note title
chhoumann Oct 6, 2026
371dc53
fix(packages): the review groups a skipped new file as kept and count…
chhoumann Oct 6, 2026
bf2eb3e
fix(summary): a Link it line says where and how it puts the link
chhoumann Oct 6, 2026
253903f
fix(format): {{FILENAMECURRENT}} and {{FOLDERCURRENT}} with no note o…
chhoumann Oct 6, 2026
ca46a4e
fix(cli): quickadd:check reports a missing template instead of listin…
chhoumann Oct 6, 2026
5582d25
fix(steps): the Link it, Run Templater and Open a note modals' note f…
chhoumann Oct 6, 2026
7ff8ace
test(summary): a sequence's Create a note then Open the note says ope…
chhoumann Oct 6, 2026
45bc9e3
test(e2e): v3-compact-builder clears a template an aborted run left b…
chhoumann Oct 6, 2026
3141340
fix(builder): a nested step saved without a name reads by what it does
chhoumann Oct 6, 2026
a5ec5ce
test(e2e): the popout save spec reads the choices as QuickAdd 3 store…
chhoumann Oct 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 3 additions & 1 deletion .agents/capture/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ a test suite or required workflow: copy a script, change it, run it.
# A throwaway capture vault with the plugin build linked and the demo fixture.
pnpm exec obsidian-e2e provision --root /tmp/qa-capture --vault Notes \
--data .agents/capture/demo-data.json
rm /tmp/qa-capture/Notes/.obsidian/core-plugins.json # [] disables the command palette
# provision writes core-plugins.json as [], which turns the command palette off;
# removing the file brings Obsidian's defaults back, palette included.
rm /tmp/qa-capture/Notes/.obsidian/core-plugins.json
printf '# Inbox\n\n- Buy oat milk\n' > /tmp/qa-capture/Notes/Inbox.md

# A dedicated instance (never the E2E test instance) on CDP port 9333, DPR 2.
Expand Down
49 changes: 49 additions & 0 deletions .agents/capture/ai-demo-data.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
{
"disableOnlineFeatures": false,
"ai": {
"defaultModel": "demo",
"defaultSystemPrompt": "As an AI assistant within Obsidian, your primary goal is to help users manage their ideas and knowledge more effectively. Format your responses using Markdown syntax. Please use the [[Obsidian]] link format. You can write aliases for the links by writing [[Obsidian|the alias after the pipe symbol]]. To use mathematical notation, use LaTeX syntax. LaTeX syntax for larger equations should be on separate lines, surrounded with double dollar signs ($$). You can also inline math expressions by wrapping it in $ symbols. For example, use $$w_{ij}^{\\text{new}}:=w_{ij}^{\\text{current}}+\\eta\\cdot\\delta_j\\cdot x_{ij}$$ on a separate line, but you can write \"($\\eta$ = learning rate, $\\delta_j$ = error term, $x_{ij}$ = input)\" inline.",
"promptTemplatesFolderPath": "AI prompts",
"showAssistant": true,
"providers": [
{
"id": "local-demo",
"name": "Local demo",
"endpoint": "http://127.0.0.1:18431/v1",
"kind": "openai",
"apiKey": "",
"models": [
{
"name": "demo",
"maxTokens": 1050000,
"maxOutputTokens": 128000,
"supportsTemperature": false
}
],
"autoSyncModels": false,
"modelSource": "modelsDev",
"apiKeyRef": "local-demo-api-key"
}
],
"confirmToolCalls": "destructive"
},
"actions": [],
"migrations": {
"useQuickAddTemplateFolder": true,
"incrementFileNameSettingMoveToDefaultBehavior": true,
"consolidateFileExistsBehavior": true,
"repairTemplateFileExistsBehavior": true,
"mutualExclusionInsertAfterAndWriteToBottomOfFile": true,
"setVersionAfterUpdateModalRelease": true,
"addDefaultAIProviders": true,
"removeMacroIndirection": true,
"migrateFileOpeningSettings": true,
"backfillFileOpeningDefaults": true,
"setProviderModelDiscoveryMode": true,
"migrateProviderApiKeysToSecretStorage": true,
"migrateToMultipleTemplateFolders": true,
"refreshStaleDefaultModelSeeds": true,
"pinAiModelRefs": true,
"migrateToV3Actions": true
}
}
19 changes: 19 additions & 0 deletions .agents/capture/ai-demo-stub.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// A local OpenAI-compatible server with one canned reply, for the
// AI_Assistant_Macro.gif recording (see record-ai-summarize-macro.sh).
import http from "node:http";
const reply = "The team will freeze scope on Friday, run a bug bash on Tuesday, and ship the release candidate to beta users on Thursday, with Priya on the launch checklist and Tom on the announcement post.";
http.createServer((req, res) => {
let body = "";
req.on("data", (c) => (body += c));
req.on("end", () => {
console.log(req.method, req.url);
res.setHeader("Content-Type", "application/json");
if (req.url.endsWith("/models")) return res.end(JSON.stringify({ data: [{ id: "demo", object: "model" }] }));
const model = (() => { try { return JSON.parse(body).model; } catch { return "demo"; } })();
setTimeout(() => res.end(JSON.stringify({
id: "chatcmpl-demo", object: "chat.completion", created: Math.floor(Date.now() / 1000), model,
choices: [{ index: 0, message: { role: "assistant", content: reply }, finish_reason: "stop" }],
usage: { prompt_tokens: 120, completion_tokens: 30, total_tokens: 150 },
})), 900);
});
}).listen(18431, "127.0.0.1", () => console.log("stub on 18431"));
186 changes: 186 additions & 0 deletions .agents/capture/journal-data.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
{
"actions": [
{
"kind": "action",
"id": "06363c82-8a27-49b9-a6dd-a9ca296c5dbd",
"name": "Add to journal",
"icon": "pencil",
"steps": [
{
"id": "06363c82-8a27-49b9-a6dd-a9ca296c5dbd",
"type": "addToNote",
"captureTo": "Journal/{{DATE}}.md",
"captureToActiveFile": false,
"captureToCanvasNodeId": "",
"position": "bottom",
"format": {
"enabled": true,
"format": "- {{DATE:HH:mm}} {{VALUE}}"
},
"insertAfter": {
"after": "",
"insertAtEnd": true,
"considerSubsections": false,
"createIfNotFound": true,
"createIfNotFoundLocation": "top",
"inline": false,
"replaceExisting": false,
"blankLineAfterMatchMode": "auto",
"promptHeading": false
},
"insertBefore": {
"before": "",
"createIfNotFound": false,
"createIfNotFoundLocation": "top"
},
"createFileIfItDoesntExist": {
"enabled": true,
"createWithTemplate": false,
"template": ""
},
"task": false
}
],
"show": {
"command": false
}
},
{
"kind": "action",
"id": "b65527c1-cf1e-4d91-ab15-04805cd8ea2b",
"name": "Task",
"icon": "check-square",
"steps": [
{
"id": "b65527c1-cf1e-4d91-ab15-04805cd8ea2b",
"type": "addToNote",
"captureTo": "{{DAILY}}",
"captureToActiveFile": false,
"captureToCanvasNodeId": "",
"position": "after",
"format": {
"enabled": false,
"format": ""
},
"insertAfter": {
"after": "## Tasks",
"insertAtEnd": true,
"considerSubsections": false,
"createIfNotFound": true,
"createIfNotFoundLocation": "bottom",
"inline": false,
"replaceExisting": false,
"blankLineAfterMatchMode": "auto",
"promptHeading": false
},
"insertBefore": {
"before": "",
"createIfNotFound": false,
"createIfNotFoundLocation": "top"
},
"createFileIfItDoesntExist": {
"enabled": true,
"createWithTemplate": false,
"template": ""
},
"task": true
}
],
"show": {
"command": false
}
},
{
"kind": "action",
"id": "8e90f6ee-ed9a-401f-a217-daf0f293e926",
"name": "New note",
"icon": "file-plus",
"steps": [
{
"id": "8e90f6ee-ed9a-401f-a217-daf0f293e926",
"type": "createNote",
"templatePath": "",
"fileNameFormat": {
"enabled": false,
"format": ""
},
"location": {
"mode": "default",
"folders": [],
"includeSubfolders": false
},
"fileExistsBehavior": {
"kind": "prompt"
},
"discoverExistingNotesBeforeCreate": false
}
],
"show": {
"command": false
}
},
{
"kind": "action",
"id": "54659787-b136-46d2-962c-6cf5cbf0bdfc",
"name": "Log",
"icon": "clock",
"steps": [
{
"id": "54659787-b136-46d2-962c-6cf5cbf0bdfc",
"type": "addToNote",
"captureTo": "{{DAILY}}",
"captureToActiveFile": false,
"captureToCanvasNodeId": "",
"position": "after",
"format": {
"enabled": true,
"format": "- {{TIME}} {{VALUE}}"
},
"insertAfter": {
"after": "## Log",
"insertAtEnd": true,
"considerSubsections": false,
"createIfNotFound": true,
"createIfNotFoundLocation": "bottom",
"inline": false,
"replaceExisting": false,
"blankLineAfterMatchMode": "auto",
"promptHeading": false
},
"insertBefore": {
"before": "",
"createIfNotFound": false,
"createIfNotFoundLocation": "top"
},
"createFileIfItDoesntExist": {
"enabled": true,
"createWithTemplate": false,
"template": ""
},
"task": false
}
],
"show": {
"command": false
}
}
],
"migrations": {
"useQuickAddTemplateFolder": true,
"incrementFileNameSettingMoveToDefaultBehavior": true,
"consolidateFileExistsBehavior": true,
"repairTemplateFileExistsBehavior": true,
"mutualExclusionInsertAfterAndWriteToBottomOfFile": true,
"setVersionAfterUpdateModalRelease": true,
"addDefaultAIProviders": true,
"removeMacroIndirection": true,
"migrateFileOpeningSettings": true,
"backfillFileOpeningDefaults": true,
"setProviderModelDiscoveryMode": true,
"migrateProviderApiKeysToSecretStorage": true,
"migrateToMultipleTemplateFolders": true,
"refreshStaleDefaultModelSeeds": true,
"pinAiModelRefs": true,
"migrateToV3Actions": true
}
}
55 changes: 55 additions & 0 deletions .agents/capture/record-add-to-journal.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#!/usr/bin/env bash
# Drive the Getting Started "Add to journal" Capture choice the way a user would,
# for docs/src/content/docs/docs/Images/getting-started-add-to-journal.gif.
# journal-data.json holds the choice as the page's steps make it from the
# "Add to a note" preset, next to the Task, New note and Log presets.
#
# pnpm exec obsidian-e2e provision --root /tmp/qa-capture --vault Notes \
# --data .agents/capture/journal-data.json
# rm /tmp/qa-capture/Notes/.obsidian/core-plugins.json # the defaults, command palette included
# mkdir -p /tmp/qa-capture/Notes/{Areas,Journal,Meetings,People,Projects,Templates}
# printf -- '- 08:10 Morning run along the harbour, 5 km\n- 08:45 Coffee and weekly planning\n' \
# > "/tmp/qa-capture/Notes/Journal/$(date +%F).md"
# # launch and prepare as in README.md, open the file explorer, then:
# obsidian-e2e capture record journal.webm --cursor -- .agents/capture/record-add-to-journal.sh
set -euo pipefail

: "${OBSIDIAN_E2E_CDP_PORT:?run under obsidian-e2e capture record}"
: "${OBSIDIAN_E2E_CAPTURE_VAULT_PATH:?export the capture launch --print-env output}"
export AGENT_BROWSER_SESSION="${AGENT_BROWSER_SESSION:-quickadd-capture}"
ab() { agent-browser --cdp "$OBSIDIAN_E2E_CDP_PORT" "$@" >/dev/null; }
cap() { obsidian-e2e capture "$@"; }
text="Standup moved to Wednesday"
journal="$OBSIDIAN_E2E_CAPTURE_VAULT_PATH/Journal/$(date +%F).md"
[[ -f "$journal" ]] || { echo "Seed $journal with a few entries first" >&2; exit 1; }
before=$(grep -c "" "$journal")

ab eval "app.workspace.openLinkText('Journal/$(date +%F)', '', false).then(() => app.workspace.activeEditor?.editor?.blur?.())"
ab mouse move 1180 740
sleep 1.5
ab press Control+p
sleep 0.5
cap type "QuickAdd: Run" --delay 60 --selector ".prompt-input"
sleep 0.5
ab press Enter
sleep 0.9
cap type "jour" --delay 90 --selector ".prompt-input"
sleep 0.5
ab press Enter
sleep 0.8
cap type "$text" --delay 45
sleep 0.6
ab press Enter

# Verify the product behaviour, not just the pixels: the entry is a new last
# line of today's journal note, as the Getting Started page says.
entry="^- [0-9]{2}:[0-9]{2} $text\$"
for _ in $(seq 1 30); do
(( $(grep -c "" "$journal") > before )) && tail -n 1 "$journal" | grep -Eq "$entry" && break
sleep 0.2
done
tail -n 1 "$journal" | grep -Eq "$entry" && (( $(grep -c "" "$journal") > before )) || {
echo "QuickAdd did not add a new last line to $journal" >&2
exit 1
}
sleep 2.5
Loading
Loading