Skip to content

Releases: Zettelkasten-Method/ta

0.3.0

Choose a tag to compare

@DivineDominion DivineDominion released this 28 May 06:52

Fixes a silent-empty-result failure for suffix-timestamped archives (Title 202506252102.md) and makes note ID detection configurable. Adds layered wiki-link resolution and a global --verbose flag so pipeline decisions are observable on stderr.

macOS universal binary (arm64 + x86_64). Developer ID signed, notarized by Apple.

Install

Option A: .pkg installer (recommended)

Download ta-0.3.0-macos-universal.pkg and double-click, or:

sudo installer -pkg ta-0.3.0-macos-universal.pkg -target /

Installs ta to /usr/local/bin/ta. Signed with Developer ID Installer (Christian Tietze, team FRMDA3XRGC), notarized by Apple, and the notarization ticket is stapled to the .pkg — Gatekeeper-clean on first run.

Option B: .tar.gz tarball

tar -xzf ta-0.3.0-macos-universal.tar.gz
sudo mv ta-0.3.0-macos-universal/ta /usr/local/bin/
xattr -d com.apple.quarantine /usr/local/bin/ta

The binary is signed with Developer ID Application (hardened runtime + secure timestamp). Apple doesn't support stapling a notarization ticket to a bare Mach-O, so the quarantine flag has to be cleared manually on first run — Option A avoids this.

Option C: Build from source

git clone https://codeberg.org/ctietze/ta && cd ta
swift build -c release
./.build/release/ta --help

Assets

File Architecture Size SHA-256
ta-0.3.0-macos-universal.pkg arm64 + x86_64 2.6 MB e12205bba9bc5b33dd3e9e327c6bf0b0e9cda4f248202ce486d428beb0e77ffa
ta-0.3.0-macos-universal.tar.gz arm64 + x86_64 2.6 MB ac1bf9c15753465c1cd7e93714e29736f2efc9cb8f4689971cc6f26d9d4809f1

Verify integrity

Hash verification against the published SHA256SUMS:

shasum -a 256 -c SHA256SUMS

Signature + notarization — the authoritative integrity check:

pkgutil --check-signature ta-0.3.0-macos-universal.pkg
spctl --assess --type install -vv ta-0.3.0-macos-universal.pkg

Expect Developer ID Installer: Christian Tietze (FRMDA3XRGC) and source=Notarized Developer ID.

For the tarball, verify the extracted binary's embedded Developer ID Application signature:

codesign -dv --verbose=4 /usr/local/bin/ta

Runtime dependencies

  • rg (ripgrep) on $PATH is preferred for search.
  • Falls back to grep -l -r if rg is absent.

What's in 0.3.0

Fixes a silent-empty-result failure for suffix-timestamped archives (Title 202506252102.md) and makes note ID detection configurable. Adds layered wiki-link resolution and a global --verbose flag so pipeline decisions are observable on stderr.

Added

  • Configurable note ID detection. The default pattern is now the unanchored regex \d{12}, a strict superset of the previous prefix-only behavior. Prefix (202503091430 Title.md), suffix (Title 202506252102.md), and mid-filename layouts all index correctly with no config required. See ADR-006.
  • id_pattern config key in ~/.config/ta/config.yaml for custom schemes (14-digit YYYYMMDDHHMMSS, alphanumeric IDs, project-specific patterns). Invalid regexes fall back to the default with a verbose-mode warning rather than crashing.
  • Layered wiki-link resolution. [[target]] resolves in three tiers: exact ID → filename substring (case-insensitive, Archive-style) → unambiguous ID prefix. [[Cognitive Distancing]] now resolves to Thinking About Thinking - Cognitive Distancing 202506252102.md when the substring is unique.
  • --verbose global flag on every subcommand (search, tag, show). Logs pipeline decisions to stderr: resolved config (archive path + id_pattern + provenance), file-scan skips with reasons, ripgrep commands and match counts, structural verification, graph expansion depth, and wiki-link resolution method. Defaults to off; stdout is unchanged.
  • ADR-006 documenting the ID-detection redesign and alternatives considered.

Changed

  • NoteIndex indexes filename stems alongside extracted IDs, enabling substring-based wiki-link resolution. All non-overlapping matches of the ID pattern in a filename become index keys (a file with two 12-digit runs is reachable via either).
  • NoteParser extracts the timestamp ID position-agnostically. Title extraction no longer requires a 12-digit prefix; suffix-timestamped notes get the correct title and ID.
  • Pipeline plumbing. SearchPipeline, ShowPipeline, and the runners accept a ResolvedConfig (archive + id_pattern + provenance) and an optional Logger so verbose mode reaches every layer.

Internal

  • New IDPattern type wraps a configurable regex extractor (Sources/ta/Config/IDPattern.swift).
  • New ResolvedConfig bundles archive directory, ID pattern, and provenance for downstream consumers (Sources/ta/Config/ResolvedConfig.swift).
  • New Logger type with injectable sink for stderr diagnostics (Sources/ta/Logging/Logger.swift).
  • Dead NoteIndex.extractTimestampPrefix removed; IDPattern.extractIDs(from:) is the replacement.
  • 33 new tests across IDPatternTests, ArchiveResolverTests, LoggerTests, NoteIndexTests, NoteParserTests, SubstringResolutionTests, IntegrationTests, GraphExpanderTests, RipgrepRunnerTests, StructuralFilterTests, and SearchCommandTests. The suite is now 112 tests across 19 suites.

0.2.0

Choose a tag to compare

@DivineDominion DivineDominion released this 26 May 04:51

Search now finds matches it previously hid: text inside Markdown inline-code spans (e.g. `LSUIElement`), notes stored as .txt, and queries that don't match the casing of the source.

macOS universal binary (arm64 + x86_64). Developer ID signed, notarized by Apple.

Install

Option A: .pkg installer (recommended)

Download ta-0.2.0-macos-universal.pkg and double-click, or:

sudo installer -pkg ta-0.2.0-macos-universal.pkg -target /

Installs ta to /usr/local/bin/ta. Signed with Developer ID Installer (Christian Tietze, team FRMDA3XRGC), notarized by Apple, and the notarization ticket is stapled to the .pkg — Gatekeeper-clean on first run.

Option B: .tar.gz tarball

tar -xzf ta-0.2.0-macos-universal.tar.gz
sudo mv ta-0.2.0-macos-universal/ta /usr/local/bin/
xattr -d com.apple.quarantine /usr/local/bin/ta

The binary is signed with Developer ID Application (hardened runtime + secure timestamp). Apple doesn't support stapling a notarization ticket to a bare Mach-O, so the quarantine flag has to be cleared manually on first run — Option A avoids this.

Option C: Build from source

git clone https://codeberg.org/ctietze/ta && cd ta
swift build -c release
./.build/release/ta --help

Assets

File Architecture Size SHA-256
ta-0.2.0-macos-universal.pkg arm64 + x86_64 2.5 MB 04e0ac2de08aee848f7f49a14a2c1bca74607c1d8f80aa566e37bef4e348fcaf
ta-0.2.0-macos-universal.tar.gz arm64 + x86_64 2.5 MB 23857276b45dcc0f3781b318d61f34904e0bd3325926954760d48a5da5b3b6ee

Verify integrity

Hash verification against the published SHA256SUMS:

shasum -a 256 -c SHA256SUMS

Signature + notarization — the authoritative integrity check:

pkgutil --check-signature ta-0.2.0-macos-universal.pkg
spctl --assess --type install -vv ta-0.2.0-macos-universal.pkg

Expect Developer ID Installer: Christian Tietze (FRMDA3XRGC) and source=Notarized Developer ID.

For the tarball, verify the extracted binary's embedded Developer ID Application signature:

codesign -dv --verbose=4 /usr/local/bin/ta

Runtime dependencies

  • rg (ripgrep) on $PATH is preferred for search.
  • Falls back to grep -l -r if rg is absent.

What's in 0.2.0

Search now finds matches it previously hid: text inside Markdown inline-code spans (e.g. `LSUIElement`), notes stored as .txt, and queries that don't match the casing of the source.

Added

  • .txt notes are indexed alongside .md. NoteIndex enumerates both extensions and the supported set is centralized at NoteIndex.supportedExtensions. Adding a third extension is now a one-line change. ta show already worked on .txt files via byte-for-byte body emission; this commit makes them discoverable by ta search and ta tag.
  • ParsedNote.rawText carries the original source string alongside the existing nonCodeText projection.

Changed

  • ta search's --word and --phrase predicates now match inside inline-code spans. Previously, terms wrapped in backticks (e.g. `LSUIElement`) were stripped before search and invisible to all predicates. Word and phrase predicates now match against the raw note text. Hashtag matching (--tag) still respects inline-code stripping — #foo inside backticks is not counted as a tag, and [[link]] inside backticks is not counted as a wiki link.
  • All predicates (--tag, --phrase, --word) are now case-insensitive. ta search --word lsuielement finds LSUIElement; ta search --tag macos finds #MacOS. Both the ripgrep/grep candidate-selection layer and the in-process structural filter use case-insensitive matching consistently.
  • Snippets in search output come from the raw note text, so the surrounding context shown to the user matches what they would see in the file (including any backticks).

Internal

  • RipgrepRunner derives its -g/--include flags from NoteIndex.supportedExtensions rather than hardcoding *.md.
  • NoteParser.titleFromFilename uses NSString.deletingPathExtension instead of magic-numbered removeLast(3|4) branches.
  • 7 new tests across NoteIndexTests, RipgrepRunnerTests, StructuralFilterTests, and IntegrationTests; the suite is now 79 tests across 16 suites.

0.1.0 — first prototype release

Choose a tag to compare

@DivineDominion DivineDominion released this 18 Apr 06:27

First prototype release of ta — a command-line retrieval tool over a Zettelkasten archive, shaped for coding agents.

Install

Option A: .pkg installer (recommended)

Installs ta to /usr/local/bin/. Signed with Developer ID Installer (Christian Tietze, team FRMDA3XRGC), notarized by Apple, and the notarization ticket is stapled to the .pkg — Gatekeeper-clean on first run. Double-click to install.

Option B: .tar.gz tarball

Extract, move ta to a directory on your $PATH, remove the quarantine flag:

tar -xzf ta-0.1.0-macos-universal.tar.gz
sudo mv ta-0.1.0-macos-universal/ta /usr/local/bin/
xattr -d com.apple.quarantine /usr/local/bin/ta

The binary is signed with Developer ID Application (hardened runtime + secure timestamp). Apple doesn't support stapling a notarization ticket to a bare Mach-O, so the quarantine flag has to be cleared manually on first run — the .pkg in Option A avoids this.

Option C: Build from source

git clone https://codeberg.org/ctietze/ta && cd ta
swift build -c release
./.build/release/ta --help

Assets

File Architecture Size SHA-256
ta-0.1.0-macos-universal.pkg arm64 + x86_64 2.5 MB fd640c2be610fe735ad147d920026f0579caa09affdc60a6a8d30a7ffb79a5fa
ta-0.1.0-macos-universal.tar.gz arm64 + x86_64 2.5 MB e991c6b8bcabe19e466fac44ac464e007c94570601fba5ca0a02fe482a931e30

What's in 0.1.0

First prototype release of ta — a command-line retrieval tool over a Zettelkasten archive, shaped for coding agents.

Added

  • ta search subcommand — AND-combined predicates (--tag, --phrase, --word, positional phrase), --depth N graph expansion (default 3, cap 10). Emits flat YAML list of hits with ref, title, snippet, tags, links, depth, via fields per ADR-004.
  • ta tag NAME subcommand — convenience for ta search --tag NAME.
  • ta show REF... subcommand — emits YAML frontmatter + raw markdown body per ref, --- delimited. Partial-success exit handling (exit 0 if any ref resolved, 1 if none) per ADR-005.
  • Cold-start pipeline — ripgrep candidate selection → swift-markdown AST walk → hashtag and wiki-link regex extraction on non-code text → BFS graph expansion with cycle dedup → YAML emission. No in-memory index between invocations.
  • Hashtag recognition — Unicode-aware regex per ADR-002. Rejects URL fragments and word-adjacent #; accepts hyphens and underscores mid-tag.
  • Wiki-link recognition[[target]] and [[target|anchor]] per ADR-001. Resolves via exact 12-digit timestamp prefix → unambiguous prefix match → unresolved.
  • Code-block exclusion — tags and wiki-links inside fenced/indented code blocks and inline code are never recognized as structural markers.
  • Archive resolution — precedence flag --archive PATH on a subcommand → TA_DIR env var → archive: key in ~/.config/ta/config.yaml.
  • Grep fallback — falls back to grep -l -r when rg is absent from PATH.
  • Symlink resolution — archive paths that are symlinks resolve correctly before directory enumeration.
  • Agent-friendly help and error messages — root --help and each subcommand's --help show runnable examples; error paths (missing predicates, missing refs, unresolved archive, tool-not-found) include copy-pasteable next steps.
  • Agent skills bundle under docs/skills/ — three copy-pasteable skills for coding agents: ta-search (literal lookups), ta-associative-recall (fan-out recall for fuzzy queries), ta-deep-research (graph crawl + synthesis).
  • Design documentationdesign spec, implementation plan, and ADRs 001–005.
  • 72 tests across 16 suites, including end-to-end integration tests over a 13-note fixture archive.