Skip to content

quill 1.1.2: fix AI capture into a new project - #900

Merged
ItsLemmy merged 1 commit into
noctalia-dev:mainfrom
Fel-2:fix-quill-1-1-2
Oct 2, 2026
Merged

ItsLemmy merged 1 commit into
noctalia-dev:mainfrom
Fel-2:fix-quill-1-1-2

Conversation

@Fel-2

@Fel-2 Fel-2 commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

Plugin

  • Id: fel/quill
  • New plugin
  • Update to an existing plugin (version bumped in plugin.toml)

What it does

Bug fix release. No user-facing features change.

Capturing a todo with AI into a project that does not exist yet did nothing. update was not involved and nothing was reported to the user.

resolveProject in lib/capture.luau called M.notesDir(). M is capture's own exports table, and notesDir is defined on the Store module, so the call hit a nil value:

plugin fel/quill:panel: call to 'async http callback' failed:
   .../quill/lib/capture.luau]:92: attempt to call a nil value

Writing a todo with AI into a project that already existed was unaffected, because that path returns before reaching the call. Only the new-project branch broke, which is why it looked intermittent.

One word changed: M.notesDir() to Store.notesDir().

External dependencies

  • git - optional, used only for the notes git-history feature when the notes directory is a repository.
  • opencode - optional, used only by the cli AI backend.

Both are declared in dependencies in plugin.toml. Neither is required for this fix.

Testing

Driven the real capture.capture() under the shipped module loader, with AI.parseCapture returning a payload whose file points at a project that does not exist.

Before the fix, the traceback reproduces the reported error exactly:

capture.luau:92: attempt to call a nil value (field 'notesDir')
  in upvalue 'resolveProject'
  in local 'cb'
  in field 'capture'

After the fix the same input reports Added todo to Coffee Run (new project) and writes the project note.

Input Before After
New nested project crash, nothing written project created, todo appended
Existing project worked worked
No project given worked (inbox) worked (inbox)
Unsafe path rejected rejected

noctalia plugins lint reports 0 errors, 0 warnings, and the plugin's own checks pass (41 checks across roll/hint/time/due/ai, 0 failures).

  • Tested on Niri
  • Tested on Hyprland
  • Tested on Sway
  • Tested on another compositor:
  • Noctalia version tested against: v5.1.0
  • Plugin API level: 24

Screenshots / Videos

Not applicable: this is a crash fix with no visual change.

Checklist

Ready-for-review requirement: Every box in this section must be checked.

  • The directory name matches the part of id after the / in plugin.toml exactly.
  • It ships plugin.toml, README.md, thumbnail.webp, and translations/en.json.
  • README.md follows the README template, documents every entry id and dependency, and includes exact panel IPC commands and launcher prefixes where applicable.
  • thumbnail.webp is present and relevant; for a new plugin I created it with the thumbnail generator, and for an update I regenerated it with the generator if the visual identity or user-facing appearance changed.
  • version follows semver and is bumped in this PR; plugin_api is the oldest API level this plugin requires.
  • Every non-English translation in this PR uses a locale supported by Noctalia core, and I can read, write, and understand that language well enough to review and maintain it (no unreviewed machine/LLM translations).
  • I did not edit catalog.toml; CI generates it.
  • This PR touches exactly one plugin directory.

Code review attestation

Ready-for-review requirement: Every attestation below must be checked.

  • The code is readable and not obfuscated, minified, or generated.
  • It does not download and execute remote code.
  • Every network call, filesystem write, and spawned process is something the description above accounts for.
  • I have the right to publish this code under the license declared in plugin.toml.

resolveProject called M.notesDir(), but notesDir lives on the Store module, not
on capture's own exports table. The call hit a nil value, so capturing a todo
with AI into a project that did not exist yet threw and nothing was written.
Projects that already existed were unaffected, which is why it looked like AI
capture only sometimes worked.
@ItsLemmy
ItsLemmy merged commit 40981ac into noctalia-dev:main Oct 2, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants