cwest/okfctl
Author and maintain Open Knowledge Format (OKF) bundles from your agent — scaffold and validate nodes, run curation health checks, plan v0.1→v0.2 migrations, and query the opt-in semantic layer.
Changelog
All notable changes to okfctl are documented here.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
Entries for tagged releases mirror the notes published on the
GitHub releases page. On each new
tagged release, goreleaser generates the release notes from the commit log
(see .goreleaser.yaml).
Unreleased
Added
- A knowledge bundle can now reference a separate type-template bundle instead of
vendoring one. Declare it with a
templates: <path>key in the bundle's.okfsidecar (resolved relative to the bundle root), or pass--templates-from <dir>tovalidate,node new,template list, andtemplate show(the flag overrides the sidecar key). Referenced templates are folded in and localType Templatenodes overlay them (local wins pertarget_type);template listandtemplate showreport each template'ssource, andtemplate listflags a local entry that shadows a referenced one. The referenced bundle is never part of the consumer's node set and is never written, sovalidate,lint,index build, andindex checkare byte-identical with or without the key; a reference that cannot be loaded is a hard error naming the path (plainvalidatewithout--templatesnever consults the key). (#182)
Fixed
validatenow enforces OKF v0.2 §9 on every reservedlog.mdat any depth: each##date heading must be a valid ISO-8601YYYY-MM-DD(rejecting impossible dates like2025-13-45and non-dates likelast Tuesday), consecutive headings must be newest-first, a log with entries must carry at least one date heading, a log must open with a#title (a frontmatter block is rejected), and legacy inline-dated bullets are flagged for regrouping. An empty log, a title-only log, and thebundle initscaffold stay conformant. Also closes a §8 gap where a non-rootindex.mdwith an empty frontmatter block (---immediately followed by---) slipped through. (#176)log appendnow writes §9 date-grouped entries —## <today>headings with* <message>items, newest-first — instead of inline-dated bullets, and preserves any existing#title rather than stacking a second# Change Logheader over it. On write it regroups pre-existing legacy- YYYY-MM-DD — msgbullets under their date headings (merging into an existing group, idempotent and lossless). Every node-mutation command that records to the log inherits the §9 shape. Together with thevalidatechange this holds the invariant thatokfctl validatenever rejects a log okfctl wrote. (#177)
Build
- The Go toolchain was bumped from 1.26.6 to 1.26.10 to pick up patched
standard-library fixes for disclosed vulnerabilities (GO-2026-6603, -6607,
-6608, -6611, -6612, -6613, -6617, and the crypto/x509 certificate-verification
fix GO-2026-6809), clearing
govulncheckin CI.
0.4.0 - 2026-08-19
Added
- Agent Plugins 1.0.0 packaging: a root
plugin.jsonthat lets a compatible agent client install okfctl's shareable skills as one unit. The manifest is spec-only plusAGENTS.md, pins the$schemato the Agent Plugins 1.0.0 schema URL, and keeps okfctl-specific config underextensions."dev.okfctl". CI validates it against the pinned schema, rejects a deliberately malformed fixture, and runs the skill-leak gate over the packaged payload. - A skill-command contract check that installs the released binary from the public install path and runs every command the shipped skills document, so a skill drifting out of sync with the CLI fails CI even when the manifest stays byte-identical.
Changed
- User-facing prose across the README, the hand-written docs, and the command help text was rewritten in a plainer voice, and the README now leads with the problem okfctl solves rather than a command list.
- House prose style is the closed-up Chicago em dash (
word—word); the shipped Markdown surfaces were converted to it.
Fixed
- Homepage inline-boundary spacing and the brand wordmark render correctly.
- The retired Go Report Card badge was dropped from the README.
Build
- A CI prose gate scans the shipped Markdown surfaces and the built site for a negative-listing slop cadence and for spaced em dashes, failing the build on either. The gate rides one detector set across both an HTML and a Markdown front end, and both of its controls are proven in CI.
- The release path now refuses to publish a tag whose version has no matching,
dated, non-empty
## [X.Y.Z]section in this changelog. The check runs before goreleaser, so an empty release can never ship.
0.3.1 - 2026-08-13
Fixed
- The published documentation site rebuilds from
mainafter a release, so the live docs no longer lag a freshly tagged version.
Build
- The Go toolchain was bumped to 1.26.6 to pick up patched standard-library fixes.
0.3.0 - 2026-08-13
Added
- Installable, verifiable distribution. A one-line installer served at
https://okfctl.dev/install.shdetects OS/arch, downloads the matching release archive, verifies it against the publishedchecksums.txt, and installs bothokfctlandokfctl-search, refusing to install on a checksum mismatch. A Homebrew cask (brew install cwest/tap/okfctl) is published tocwest/homebrew-tap. Releases now include Windows builds (amd64 and arm64) as.ziparchives and Linux system packages (.deband.rpm) via nfpm. - Supply-chain provenance. Every archive ships a Software Bill of Materials
generated with syft, and release artifacts are signed keyless with cosign
(Sigstore/Fulcio) using the release workflow's OIDC identity, verifiable with
cosign verify-blob. GET /api/v1/search—theokfctl-apiplugin serves search off a resident index, with the lexical gate exposed as a query parameter, unknown parameters rejected, and the recency-decay floor applied. The API is v0.2-aware, surfacingstatus,epistemic, andgenerated.at.- Query scoping for search—repeatable, negatable
--path/--type/--tag(and--not-*) filters, a--lexical-gatethat preserves lexical recall alongside semantic ranking, and bounded recency decay with a configurable relevance floor and half-life. - The okfctl.dev site—a bespoke Astro site and its GitHub Pages pipeline,
serving the documentation at clean URLs, with a social card, favicon,
robots.txt,llms.txt, and a 404 page, shipped through the theming seam. - Generated command reference—the command reference is generated from the cobra tree with a CI drift gate, and every command gained a long description and a runnable example.
- A TACA-style trustworthiness evaluation pass for knowledge-base nodes.
- Fuzz targets for the untrusted-input parsers.
Changed
validate,lint, andanalyzeare OKF v0.2-aware—they read the v0.2 provenance families and resolve nested provenance in templaterequired_fields, while keeping the v0.1 fallbacks.okfctl versionfrom ago install github.com/cwest/okfctl@latestbuild now reports the installed module version instead ofdev, via adebug.ReadBuildInfo()fallback. Release builds still report the injected tag, and a plain checkout build without usable module metadata still reportsdev.analyzeprefersverified[].atas the freshness basis.- The README was rewritten as an on-ramp rather than a command dump, and the homepage copy had its AI-slop tells removed.
- CI pins its actions to commit SHAs, attests build provenance, runs the site
test suite rather than only the site build, and re-enables
gosecanderrcheckwith per-site triage.
Fixed
- Release signing publishes correctly by using cosign's bundle format.
- Search orders the preserved lexical tail by score, and rejects an
out-of-range
--decay-flooror a negative--half-life. - The documentation site publishes at clean URLs instead of
/_generated/, and the 404 page andllms.txtpoint at the clean doc URLs. - A v0.1 flat-string
sourceslist is accepted for templaterequired_fields.
0.2.0 - 2026-08-02
okfctl targets OKF v0.2. New bundles are created at okf_version: 0.2, and
v0.1 bundles remain readable—v0.2's two breaking renames (timestamp →
generated.at, body # Citations → frontmatter sources) are read with a v0.1
fallback, per spec §12's best-effort consumption rule.
Added
okf migrate—a two-phase v0.1 → v0.2 upgrade path: a mechanical pass plus a judgment queue for calls a tool should not make alone. Ships with theokf-migrate-planskill.okfctl-api—an HTTP API plugin over a bundle, serving/statsand/graph(walking skeleton; ships with an ADR describing its shape).- Passage-level search indexing—sub-node passages are indexed and returned as snippets, so a hit points at the paragraph rather than the file. Retrieval quality on the real corpus improved 0.545 → 0.909 (~12x index size).
- Query scoping—filter semantic queries by path, type, and tag, with optional recency decay.
lint --json—machine-readable findings for CI and downstream tooling.- Bulk index promotion—promote directory-as-concept
index.mdnodes in bulk.
Changed
- Provenance reads the v0.2
generated/verified/sourcesfamilies, falling back to the v0.1 forms when a bundle declares the older version. - Freshness resolves through
generated.atrather than filesystemmodified/created, so a regenerated node reports its real age. - Prose-only scanning—cross-reference and time-marker detection no longer
reads link URLs as prose, eliminating a class of false
missing-xrefand time-sensitive findings (both inline and reference-style links excluded). - Title-as-home-node—a node whose title leads with a term is credited as that term's home, closing a coverage-gap false positive.
- A model2vec directory containing
tokenizer.jsonis now accepted for search. - Section citations corrected throughout for the v0.1 (11 sections) → v0.2 (13 sections) numbering shift.
Fixed
- Broken internal links are gated as defects when they look like defects.
- Vendored and derived directories are skipped during the bundle walk.
- A bulk mechanical commit can declare itself as such and skip the git-drift check.
0.1.0 - 2026-07-27
Initial release: the okfctl command-line tool for authoring and maintaining
Open Knowledge Format (OKF) bundles, targeting OKF v0.1.
Added
- Bundle lifecycle—
bundle init, node authoring, andvalidate(the walking skeleton). - Reserved-file lifecycle—generation and maintenance of the reserved
index.mdandlog.mdfiles, with nested per-directory indexes and dir-relative links (§6). - Node mutation verbs—
node edit,node mv,node rm, andnode refresh(bulk-fix of stale timestamps). - Derived-artifact maintenance—
created/modifiedmetadata,log.md, andindex.mdmaintained by default, with git-drift findings. - Lint—structural checks and semantic curation checks (
lint --semantic); precision hardened on the real corpus (2,438 findings → 21). - Analyze—
okfctl analyze, a proactive curation report covering freshness and clusters. - Graph—link-graph export and serve; DOT-pipe as the sanctioned SVG path.
- Search—core lexical + graph-structural search, plus the
okfctl-searchsemantic plugin (Model2Vec safetensors loader, WordPiece tokenizer). - Plugins—
okfctl-<name>plugin dispatch overPATH, withplugin install. - Remote sources—
registry/connectfor git-backed remote bundle sources. - Release mechanics—goreleaser, version injection via ldflags, and installable binaries.
- Documentation & conformance—the PRD, ADRs, ship-with-the-tool skills
(
okf-authoring,okf-curation-health,okf-semantic-search), and a spec-conformance suite proving okfctl's output validates clean.