Releases: Zettelkasten-Method/ta
Release list
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.
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/taThe 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 --helpAssets
| 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 SHA256SUMSSignature + 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.pkgExpect 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/taRuntime dependencies
rg(ripgrep) on$PATHis preferred for search.- Falls back to
grep -l -rifrgis 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_patternconfig key in~/.config/ta/config.yamlfor custom schemes (14-digitYYYYMMDDHHMMSS, 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 toThinking About Thinking - Cognitive Distancing 202506252102.mdwhen the substring is unique. --verboseglobal 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
NoteIndexindexes 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).NoteParserextracts 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 aResolvedConfig(archive + id_pattern + provenance) and an optionalLoggerso verbose mode reaches every layer.
Internal
- New
IDPatterntype wraps a configurable regex extractor (Sources/ta/Config/IDPattern.swift). - New
ResolvedConfigbundles archive directory, ID pattern, and provenance for downstream consumers (Sources/ta/Config/ResolvedConfig.swift). - New
Loggertype with injectable sink for stderr diagnostics (Sources/ta/Logging/Logger.swift). - Dead
NoteIndex.extractTimestampPrefixremoved;IDPattern.extractIDs(from:)is the replacement. - 33 new tests across
IDPatternTests,ArchiveResolverTests,LoggerTests,NoteIndexTests,NoteParserTests,SubstringResolutionTests,IntegrationTests,GraphExpanderTests,RipgrepRunnerTests,StructuralFilterTests, andSearchCommandTests. The suite is now 112 tests across 19 suites.
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.
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/taThe 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 --helpAssets
| 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 SHA256SUMSSignature + 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.pkgExpect 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/taRuntime dependencies
rg(ripgrep) on$PATHis preferred for search.- Falls back to
grep -l -rifrgis 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
.txtnotes are indexed alongside.md.NoteIndexenumerates both extensions and the supported set is centralized atNoteIndex.supportedExtensions. Adding a third extension is now a one-line change.ta showalready worked on.txtfiles via byte-for-byte body emission; this commit makes them discoverable byta searchandta tag.ParsedNote.rawTextcarries the original source string alongside the existingnonCodeTextprojection.
Changed
ta search's--wordand--phrasepredicates 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 —#fooinside 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 lsuielementfindsLSUIElement;ta search --tag macosfinds#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
RipgrepRunnerderives its-g/--includeflags fromNoteIndex.supportedExtensionsrather than hardcoding*.md.NoteParser.titleFromFilenameusesNSString.deletingPathExtensioninstead of magic-numberedremoveLast(3|4)branches.- 7 new tests across
NoteIndexTests,RipgrepRunnerTests,StructuralFilterTests, andIntegrationTests; the suite is now 79 tests across 16 suites.
0.1.0 — first prototype release
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/taThe 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 --helpAssets
| 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 searchsubcommand — AND-combined predicates (--tag,--phrase,--word, positional phrase),--depth Ngraph expansion (default 3, cap 10). Emits flat YAML list of hits withref,title,snippet,tags,links,depth,viafields per ADR-004.ta tag NAMEsubcommand — convenience forta 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 PATHon a subcommand →TA_DIRenv var →archive:key in~/.config/ta/config.yaml. - Grep fallback — falls back to
grep -l -rwhenrgis absent fromPATH. - Symlink resolution — archive paths that are symlinks resolve correctly before directory enumeration.
- Agent-friendly help and error messages — root
--helpand each subcommand's--helpshow 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 documentation — design spec, implementation plan, and ADRs 001–005.
- 72 tests across 16 suites, including end-to-end integration tests over a 13-note fixture archive.