Changelog
September 22, 2026 · View on GitHub
All notable changes to Context Forge will be documented in this file. This file should contain concise entries from user point of view and should answer the following questions:
- What can I do now that I couldn't do before?
- What specific bugs, if any, are fixed?
- Were any features removed?
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.17.0] - 20260922
Fixed
cf validate frontmatternow validates the worktree you are standing in, not the project root. From a registered worktree every explicit path fell outside the document root and was silently dropped, so the command reported a clean pass having examined nothing —filesChecked: 0, exit 0. Anything gating on it passed everything (#88).- Skipped paths are reported instead of vanishing.
cf validate frontmattertold you how many files it checked but never which of your paths it ignored or why. A path that is out of scope, not markdown, missing, or has no frontmatter now says so, in both--jsonand human output. "I checked nothing because everything you gave me was out of scope" is now distinguishable from "I checked nothing" (#92, #96). - Human output no longer prints
No inconsistencies found (0 files checked)when nothing was examined. It lists the skipped paths with reasons and saysNo files were checked. cf checkfindings name the worktree they came from in a multi-worktree project. Each finding carries a structuredworktreefield in--jsonand is prefixed with[worktree-name]in human output, so you can tell whose checkout a finding belongs to instead of hunting for it locally. Single-checkout projects — including a migrated project with onedefaultworktree — see no change at all (#87).cf list archlists every initiative from a worktree. It was filtering initiative indices through the worktree's slice index range, so a worktree owning 920-929 hid every initiative outside that band — usually all of them, reportingNo initiatives found in initiative plan.against a fully populated plan. An initiative plan is a project-level artifact and is no longer range-filtered;cf list archandcf list arch --allnow agree (#97).- The empty-initiative messages name the plan file or the directory that was scanned, so "none" is a statement you can go verify.
Added
cf validate frontmatter --jsongains three fields, all additive — the existingfilesChecked,totalFindings,errors,warnings, andfindingskeep their exact name, type, and meaning, so external consumers parsing this output keep working unchanged:documentRoot— the document root actually scanned, so a caller can tell which checkout it was.filesSkipped— how many supplied paths were not validated.pathResults— per-path outcome (checked,skipped-out-of-scope,skipped-not-markdown,skipped-not-found,skipped-no-frontmatter) for explicit-path calls. A full walk emits no path list.
rules.excludeconfig key — comma-separated filename globs for scoped rule files to skip when installing rules (e.g.dart.md,swift*.md). Matching is basename-only and skip-only; an already-installed file is never deleted. cf stores and validates the value; the guide'ssetup-idescript is what acts on it (ai-project-guide#23). Validation rejects surrounding whitespace and empty entries from doubled or trailing commas, because the consuming script matches patterns literally and a malformed one would silently never match.- cf recognizes both managed-marker forms, the legacy
[//]: # (context-forge:managed)and the newer<!-- BEGIN:context-forge -->, anywhere in a file rather than only in its first 20 lines. This must ship before ai-project-guide#22, which makes the guide preserve your existing instructions file and append its managed block below — that pushes the marker past any fixed window, and without this change cf would stop recognizing managed installs and start prompting and writing.bakfiles on files it already manages (#98).
[0.16.0] - 20260921
Changed
tarballis now the default guide install strategy forcf initandcf guides install(previouslysubmodule). The guide lands as plain files with no git wiring. Pass--strategy submoduleto get the old behavior. Existing installs are unaffected: cf reads the installed strategy from disk, and a project whose config already names a strategy keeps it.- Tarball installs and updates are committed for you, the same way submodule installs already were. The commit touches only the guide directory, leaves anything else you have staged alone, and never pushes. Skipped, and reported, when the project is not a git repository or gitignores the guide.
- A strategy passed with
--strategyis saved toguide.git_strategyin the shared project config when it differs from what config resolves to, so a later bare install, or a teammate's, uses the same one. Previously the choice lived only in the flag and the next install silently went back to the default. - README documents switching an existing submodule install to tarball:
cf guides uninstall, thencf guides install --strategy tarball.
Fixed
cf guides uninstallno longer leaves empty directories behind under.git/modules/. Module data belonging to other submodules is left alone.
[0.15.0] - 20260919
Changed
- Node.js 20.18.1 or newer is required (previously 18). Node 18 reached end of life in April 2025 and Node 20 in April 2026; the tarball download now uses undici 7, which needs 20.18.1. Nothing else changes on a supported Node.
- README documents what the
tarballstrategy actually needs: one person reaches github.com and api.github.com once, the guide lands as plain files, andcf guides updateshows up as an ordinary reviewable diff.
Fixed
- Tarball guide installs work behind a corporate proxy.
cf guides installandcf guides updatewith thetarballstrategy now honorHTTPS_PROXY,HTTP_PROXY, andNO_PROXYfor the archive download. Previously only the tag lookup did, so the install failed halfway with a bare connection error. Failures now name the URL, which call failed, and which proxy variable applied; an exhausted GitHub API rate limit is reported as such instead of a generic status (#86). cf guides updatewith thetarballstrategy honors a configuredguide.source. It previously always updated from the public default, silently replacing a fork's content (#85).- Tarball installs drop the guide repository's own git wiring (
.gitmodules,.gitignore, and a self-referentialproject-documents/entry present in guide tags before v0.17.8) at extract time, so the guide lands as plain files in every case. - The review gate no longer picks a same-prefix sibling (for example a
*.response.mdfile) over the actual review artifact, which produced a spurious UNKNOWN verdict and a misleading "review failed" reason. The failure rationale now names the file it read (#90). cf set plan|arch|slice|tasks <index>matches zero-padded filenames (003-slices.foo.mdfor index3), socf nextandcf check --sliceno longer report an existing slice plan as missing (#91).- The
git.integration_branchconfig description no longer implies the integration branch prefixes slice branch names; only the fork and merge target change.
[0.14.0] - 20260910
Added
- Fresh clones no longer start with an empty guide directory. Cloning a project without
--recurse-submodulesused to leaveproject-documents/ai-project-guideempty, and the failure surfaced later as a confusing missing-file error.cf build,cf prompt,cf setup-ide, and the MCPcontext_build,prompt_list, andprompt_gettools now check out the guide automatically the first time they read it, reporting what they did on stderr (CLI) or in anoticesarray (MCP). Closes #80. cf init --strategy <method>selects the install strategy at project creation, with the same help text and trade-offs ascf guides install --strategy.cf guides infoshows the submodule checkout state (in sync,out of sync,not initialized). It remains read-only and never modifies the checkout, so you can inspect before acting.- The guide directory now says it is managed content.
cf guides info, the MCPguide_statustool, and the README all state thatproject-documents/ai-project-guideis overwritten oncf guides updateand that customizations belong underproject-documents/user/. Closes #82. - README gained a "Choosing a guide install strategy" section covering all three strategies and why submodule remains the default.
Changed
- The
manualinstall strategy is now calledtarball.manualstill works as a deprecated alias and prints a notice, and existing config files withguide.git_strategy = "manual"keep validating. Closes #81. - Output change:
cf guides info --json, the MCPguide_installandguide_statusresults, andInstallResult.methodnow report"tarball"where they previously reported"manual". Existing tarball installs are detected correctly and need no migration. If you parse this field, update the comparison. - A checkout sitting at a commit other than the one your project pins is reported but deliberately left alone, since that is usually intentional. The message names
cf guides updateas the remedy.
Fixed
cf guides updateworks in a project that has no commits yet. Straight aftercf init, the branch guard failed withgit rev-parse --abbrev-ref HEAD failed ... unknown revisionbecause the branch exists but has nothing on it. The guard now reads the branch name and, when it is not the trunk, asks for confirmation as it does for a branch with no shared history.- A malformed config file no longer silently falls back to the default install strategy and source. Config read errors now fail the command with the actual parse error.
- The automatic checkout is bounded by a timeout, so an unresponsive proxy fails with offline guidance instead of blocking a read command for the operating system's connection timeout. User-initiated
cf guides installandcf guides updateremain unbounded.
[0.13.2] - 20260909
Changed
- Bare
cf install-commandsinstalls machine-level again (~/.claude/commands/cf/,~/.codex/skills/), and the scope flag is now--localfor a project-local install. This reverts the 0.13.0 change that made project-local the default: in practice the commands are wanted machine-wide essentially always, and defaulting to project-local cluttered every project with an identical copy of the same nine commands.--globalis gone — machine-level is the default, so it has nothing left to select.--target <dir>still overrides both scopes, anduninstall-commandsfollows the same resolution. - If you relied on 0.13.0/0.13.1's project-local default, add
--local. If you passed--globalexplicitly, drop the flag. Commands already installed project-local by an earlier version are not migrated or removed — clean them up withcf uninstall-commands --local.
Fixed
cf setup-idenow points at the offline install path when guides are missing, instead of only saying "Guides are not installed. Run 'cf guides install' first." — a user behind a corporate DNS/proxy was told to run a command that would fail again for the same reason, with no hint why. The offline guidance (cf config set guide.source <path>) is now one shared constant used by bothcf guides installandsetup-ide, so the two cannot drift apart (#78)
[0.13.1] - 20260909
Fixed
cf guides installandcf guides updatenow explain network and DNS failures and suggest a VPN/proxy check or a localguide.sourceinstead of printing a bare git error (contributed, #77)- Guide install no longer hangs forever when git blocks on an interactive credential prompt; git runs non-interactively and fails with a message instead (#77)
- Embedded credentials in a
guide.sourceURL are redacted from error output (#77) - The tarball strategy no longer reports "Could not determine latest version" for network failures; the real cause is shown (#77)
[0.13.0] - 20260810
Added
- The nine
/cf:*commands are now available in OpenAI Codex as agent skills.cf install-commands --ide codexinstallscf-build,cf-check,cf-get,cf-next,cf-onboard,cf-project,cf-prompt,cf-set, andcf-statusasSKILL.mdskill directories — invoked in Codex as$cf-build,$cf-status, etc. Project-local installs go to.agents/skills/(shareable via git, alongside the guide's workflow skills);--globalinstalls to~/.codex/skills/. The thin passthrough skills (status,get,check,next,project,set) instruct the model to run the CLI and print its output verbatim — Codex skills have no output-injection directive like Claude commands'!`cf …`, so these are model-mediated by platform limitation (#74). cf setup-ide claudeandcf setup-ide codexnow install the commands/skills too (machine-level), so one command fully configures an IDE.cf init --ide codexinstalls Codex skills instead of Claude commands;cf init --no-ideno longer installs any commands.- README: Codex MCP-server registration snippet for
~/.codex/config.toml.
Changed
- Bare
cf install-commandsnow installs project-local (.claude/commands/cf/) instead of machine-level. The previous destination (~/.claude/commands/cf/) is available with--global. An explicit directory via--target <dir>still overrides both.uninstall-commandsfollows the same resolution (#74).
[0.12.0] - 20260809
Changed
- BREAKING: derived-status wire values are now underscored —
in-progress→in_progressandnot-started→not_startedin all machine-readable output:cf list slices --json,cf list arch --json,cf status --json,cf next --json, and the MCPintrospection_*/project_gettools. There is no deprecated alias or dual-emission — the old hyphenated spellings are no longer emitted anywhere. Consumers comparing against'in-progress'/'not-started'must update;complete,deferred,deprecatedare unchanged. One vocabulary now exists everywhere: on disk, in memory, and on the wire (#72). cf checknow rejects non-canonical status spellings in frontmatter — and migrates them.validateFrontmatteris strict: only the five canonical values (not_started,in_progress,complete,deferred,deprecated) pass. Historical aliases (in-progress,done,completed,ready,pending,planned, …) and close typos (e.g.in-progres) are flagged with an auto-fix thatcf check --fixapplies, rewriting the document to the canonical spelling; genuinely unknown values are flagged with no auto-fix. Reading remains lenient everywhere (cf list,cf statusstill understand every historical spelling); invalid-value messages now report the status exactly as typed.- Every frontmatter write via
cf check --fix(and the newcf validate frontmatter --fix) now stampsdateUpdatedwith the write date, in the same file write as the field it's fixing. Previously a fixed document kept whateverdateUpdatedit had before the fix, silently going stale. The one exception: when a fix's own target field isdateUpdateditself (the missing-dateUpdated-backfilled-from-dateCreatedcase), the stamp is skipped so the backfill isn't immediately overwritten with today's date (#71). - BREAKING (internal API):
updateFrontmatterField, exported from@context-forge/core/node, gains a required fourth parameter (dateUpdated: string). Any external consumer calling it directly must pass a date stamp; there is no default. Acceptable in this unpublished 0.12.0 window (#71).
Added
cf validate frontmatter [paths...]— a new, narrow, scriptable command that validates YAML frontmatter against the per-docType schema, suitable as a pre-commit gate. With no paths, it walks all methodology documents (the same setcf checkscans); with paths, it validates only the in-root.mdfiles among them and silently skips everything else (out-of-root paths, non-.mdfiles, nonexistent paths — no errors). Exit codes:0clean (or--fixresolved everything),1findings remain,2invocation error (unresolvable project).--jsonemits{ filesChecked, totalFindings, errors, warnings, findings[] }, plusfixed/fixLog/fixErrorsin fix mode. Unlikecf check --fix,--fixhere applies without a confirmation prompt — findings are per-document and deterministic, and the command's primary caller is a script (documented in--help) (#73).- Three new frontmatter docTypes are now recognized:
review-resolution,gate-evidence, anddevlog(squadron machine-artifacts). Each requires onlydocTypeanddateCreated— nostatus(these are append-only records with no lifecycle) and, deliberately, nodateUpdated(a single-file validator can't know whether such a document was edited after creation, so requiring the field would force a false backfill) (#73). cf setup-ideandcf init --idenow support two new targets:cursorandagents(aliasesopenai,codex). The guide-side compiler already supported all four; CF's own target validation had simply never been updated to match.cf setup-ide codexwritesAGENTS.mdplus.agents/skills/<name>/SKILL.mdfor each skill;cf setup-ide cursorwrites always-on rules toAGENTS.mdand scoped rules to.cursor/rules/*.mdc(existingpaths:→globs:conversion, unchanged).- Re-running
cf setup-ide cursoragainst a project set up by an older version migrates it automatically:.mdcfiles superseded by the always-on/scoped split are removed and the removal is printed, so an upgraded project doesn't end up with the same always-on rule loaded from two places.
Fixed
cf check's consistency rules now read frontmatter status leniently through the shared alias map. Previously seven rule sites compared the raw string, so a document whose frontmatter saidin_progressornot_started— the canonical spellings — was silently ignored by rules like "frontmatter says complete but tasks are incomplete", while only the hyphenated spellings happened to match. All historical spellings now work everywhere status is read.cf check --fixoutput now attributes each fix to the correct file. When several findings shared a rule (e.g. multiple frontmatter status fixes in one run), every "Fixed:" line displayed the first file's path and before-value.cf build --embednow works for projects whose conventions live inAGENTS.mdor.github/copilot-instructions.md, not onlyCLAUDE.md. Previously it silently embedded nothing for any non-Claude project — a defect reachable today, since Squadron automatically appends--embedfor every non-Claude-Code model. A visible warning is now emitted when no conventions file is found at all, instead of silent omission.- Nested skill directories (
.claude/skills/<name>/SKILL.mdand similar) now actually reach registered git worktrees when propagating IDE setup files. Previously the propagation logic only copied top-level files in each directory, so any skill — which is always a subdirectory — silently never made it to a worktree. - Propagating IDE files to worktrees no longer silently does nothing for an unrecognized target; it now fails loudly instead.
- Copilot's
AGENTS.mdno longer duplicates the scoped-rules index that.github/instructions/*.instructions.mdalready covers viaapplyTo— the index only appears for a target (likeagents) with no scoped-rule surface of its own.
[0.10.7] - 20260802
Fixed
cf check(and theworkflow_checkMCP tool) no longer silently acceptdraftas a status value. Frontmatter validation previously special-caseddraftas a hidden alias fornot_started, so a slice/task/design document with an inventeddraftstatus passed validation with zero findings. It's now flagged the same as any other unrecognized status (Invalid value 'draft' for field 'status'...).
[0.10.6] - 20260801
Fixed
- On macOS,
cfnow stores its data at~/.config/context-forge— and, critically, the published package now agrees with local builds about where that is. Previously the published core resolved storage to a legacy location (~/Library/Preferencesvia env-paths, with older builds using Electron's~/Library/Application Support/context-forge/context-forge), so installing from the registry silently pointedcfat a stale or empty store: projects seemed to vanish (cf statusreported "no registered project found"), while the real data sat untouched in~/.config/context-forge. Any existing~/Library/Preferences/context-forgedirectory is migrated to the new location automatically (one-time atomic rename, only when the new location doesn't already exist);CONTEXT_FORGE_DATA_DIRstill overrides everything. Linux and Windows are unaffected. (#53) cf next's index-band warning no longer misfires in worktree-configured projects. Previously it compared the active slice's hundred-block against the architecture's, assuming one architecture owns exactly one hundred-block — so every slice at 200/300/…/700 tripped a false warning in the common case of adefaultworktree declaringindexRange: [100, 799]. It now checks against the active worktree's declared range instead (falling back to the union of all configured worktrees, then to the original hundred-block check for projects with no worktrees), bringing it into agreement withcf set slice's existing worktree-scoped warning. (#48)- A slice-plan line marked
[~](the descoped/deprecated convention) is no longer silently dropped by the parser. Previously such a line matched neither checkbox format, so the entry vanished entirely — not shown, not counted, not flagged. It now parses as a deprecated entry:cf list slicesrenders it⊘ deprecated,cf nextskips past it, andcf checkno longer false-flags a plan as inconsistent just because it contains one.
[0.10.3] - 20260718
Fixed
parseFrontmatter()no longer lets a nested field (e.g. a review'sfindings[].verdict) silently overwrite a same-named top-level field (e.g.verdict). Previously the parser tracked no indentation, so any colon-bearing line anywhere in the frontmatter block — however deeply nested inside an object, a list of objects, or a folded/literal block scalar — was read as a new top-level key. This could mask a real review verdict with the last nested value seen, producing a falsecf checkreview-gate failure.cf nextnow flags a stalephasefield when a review gate is blocking progress, the same way it already does for every other lifecycle stage. Previously, ifphasehad drifted while a slice/tasks/code review was pending or failing,cf nextnamed the review that was owed but gave no hint thatphaseitself also needed to move — the guidance loop went silent at exactly the moment a confused user most needed it. No change to whether a review gate blocks; this only adds the missing suggestion.
[0.10.2] - 20260714
Fixed
cf checknow flags an architecture document whose frontmatterstatusisn't a recognized value — previouslycf list archwould show it as "⚠ unreadable" butcf checkstayed silent, because its frontmatter-schema validation used a different, narrower alias list than the one drivingcf list arch. Both now agree on what counts as a valid status.cf check's "Architecture status is..." findings now name which architecture document they're about (e.g.Architecture (100) status is "complete" but plan has unchecked entries) instead of a generic, unattributed message — needed in projects with multiple architecture initiatives, where the old message couldn't be traced to a specific one.
[0.10.1] - 20260714
Fixed
deferredis now a fully recognized slice status. It was already accepted bycf check's frontmatter validation, butcf status,cf next, andcf list slicesdidn't know what to do with it and surfaced a spurious "not a recognized status" warning. A slice markeddeferredis now treated the same way adeprecatedone already is — it's skipped when picking the next slice to work on, instead of being reported as an error or offered as "next".
[0.10.0] - 20260714
Added
cf guides update(and theguide_updateMCP tool) now guard against committing a guide update on the wrong branch. If agit.integration_branchis configured and you're onmain, the update is blocked outright with guidance on how to proceed. If you're on any branch other than the configured trunk (ormain, when no integration branch is set), you're asked to confirm before it commits — pass-y/--yestocf guides updateto skip the prompt, orconfirm: trueto the MCP tool. Being on the trunk branch itself behaves exactly as before, with no new prompt.cf config unset <key>— removes a configuration value. Defaults to the current project's config (same ascf config set); pass--globalto remove a machine-wide value instead. Removing a key that isn't set is a harmless no-op, not an error.- Project-scoped config keys are now classified as
shared(team-wide policy, e.g.guide.source,workflow.review_enabled) orpersonal(per-developer, currently onlygit.integration_branch). Personal keys are written to a new.context-forge.local.tomlfile instead of the committed.context-forge.toml—cf config set/get/unset --projectroute to the right file automatically, no flag changes needed.cf initnow gitignores.context-forge.local.tomlby default. cf checknow warns if a personal-scope key (e.g.git.integration_branch, set before this change or by an older version) is present in the committed.context-forge.toml.cf config migrate-personal [--project <id>]moves any such keys into the personal file — if a different value is already set in your personal file, it's left untouched and reported as skipped rather than overwritten.
Fixed
cf config set <key> <value>(with no--project/--globalflag) now writes to the current project's config file, as it always should have — previously it silently wrote to a machine-wide file shared by every project on your machine, so a value set while working in one project could quietly leak into every other project. Writing to the machine-wide file is now an explicit opt-in via a new--globalflag.cf config get/set --project(with no value) also now consistently resolves "the current project" from your working directory.
[0.9.2] - 20260712
Fixed
cf status/cf nextno longer abort when a slice-design has an unrecognized frontmatterstatusvalue — that slice is now reported with a distinct, clearly-labeled warning instead of erroring out the whole command.cf list slicesalready handled this correctly;cf status/cf nextnow match.
[0.9.1] - 20260711
Changed
- The
git.branch_rootconfig key is renamed togit.integration_branch, to match its intended meaning as a long-lived integration branch that work branches fork from and merge into (rather than a plain name prefix on branches that still fork from/merge tomain). This is a clean rename with no deprecated alias —git.branch_rootno longer resolves. - A slice design's docs-only declaration is renamed from
codeReview: nonetoreview: none, and now exempts the slice from theslice,tasks, andcodereview gates uniformly (previously it only exempted thecodegate, so a minimal-documentation slice with no task file yet could still be blocked at theslicereview boundary with no way to declare itself exempt). It does not affect thearch(architecture) review gate, which applies to a different document.cf check --set-review-none <index>now writesreview: none.
[0.9.0] - 20260711
Changed
- Internal:
NormalizedStatusvalues (complete/in-progress/not-started/deprecated) are now referenced via theSTATUSconstant everywhere inpackages/core, replacing ~65 scattered bare-string literals. No behavior change — purely a maintainability/type-safety refactor (a typo likeSTATUS.Compelteis now a compile error instead of a silent runtime mismatch).
Added
- Foundation for review-aware workflow gating (initiative 240):
workflow.review_enabled,workflow.review_threshold, andworkflow.review_unknown_asconfig keys, plus per-gate override keys (workflow.review_gates.{code,arch,slice,tasks}.threshold). All keys default to off/empty and have no effect yet — no command reads them. Introduced to unblock upcoming gate-logic slices. - The review gate is now active behind
workflow.review_enabled(default off — no behavior change unless explicitly turned on). When enabled,cf next/cf status(and their MCP equivalentsworkflow_next/workflow_status) automatically look for the review owed at the slice's current lifecycle position —archbefore a slice plan,slicebefore task breakdown,tasksbefore implementation,codebefore advancing — and reportpending-revieworreview-failedinstead of the usual recommendation when that review is missing or its verdict doesn't clear the configured threshold. Per-gatethresholdoverrides are honored; the review type is always derived from position, never configured (an earlier per-gatereview_typeconfig key was removed before release, since position-derivation made it redundant). cf check/workflow_check(and their--fix/fixvariants) now surface the same review gate as a consistency finding, at all four lifecycle boundaries (arch/slice/tasks/code): an artifact whose owed review is absent reports awarning, and one whose review is present but failing (or UNKNOWN under the default policy) reports anerror. Both are advisory only — never auto-fixable. Silent behindworkflow.review_enabled(default off, byte-identical to prior output).- A slice design can now declare
codeReview: nonein its frontmatter to mark itself docs-only (e.g. documentation, analysis) —cf next/workflow_nextwill not block it on a missing code review at the pre-advance gate. Absent (the default) is unchanged: code review is still required before advancing. cf check/workflow_checkgained two new consistency checks: a task file that has started (any task checked) while its slice plan entry is still unchecked, and a task file that has started while its slice-design frontmatter still saysnot_started— both previously produced no finding at all. The frontmatter case is auto-fixable with--fix.workflow.review_gate_effective_dateconfig key (formatYYYYMMDD, default empty = no cutoff): grandfathers any slice or architecture designed before this date out of every review gate boundary. Turning onworkflow.review_enabledon a project with existing history no longer retroactively demands reviews for work completed before the gate existed.cf check --set-review-none <index>declares a single slice docs-only by writingcodeReview: noneto its slice-design frontmatter — a quicker path than hand-editing the file for slices that can't produce a code review.cf list slices [archIndex]andcf list tasks [archIndex]accept an optional index argument to inspect a different initiative's slice plan or task files directly (e.g.cf list slices 140) without first switching the active architecture pointer viacf set archand switching it back afterward. Neither command mutates project state when given an explicit index.[archIndex]and--allcannot be combined oncf list tasks.
Fixed
cf check/workflow_checkno longer reports a "requires a code review" finding for a checked slice-plan entry that has no slice-design or task file at all — there is no code to review, so the finding was a false positive. Slices with real design/task artifacts and no review are still flagged correctly.cf check/workflow_checknow correctly resolve zero-padded artifact filenames (e.g.050-arch.foo.md) when matching by numeric index. Previously the exact-prefix filename match failed for any zero-padded index, which silently skipped theworkflow.review_gate_effective_datecutoff check for that artifact and produced a false "no review artifact found" finding even when the artifact predated the cutoff.cf check/workflow_checkno longer reports review-gate (or any other consistency) findings against slice indices that don't correspond to any real slice in the active plan. A legacy slice plan using the older, unindexed list format (predating the(NNN)index convention) could produce synthetic sequential indices that numerically collided with real project indices once merged across plans, generating phantom findings.cf config get/set --project <name>now resolves the project name to its actualprojectPathbefore reading/writing config, instead of treating the raw name as a literal directory. A bare registered project name previously caused.context-forge.tomlto be silently written to the wrong (nonexistent) path.cf next,cf list slices,cf list arch, andworkflow_statusno longer report a slice as "not started" when its tasks are actually complete (or in progress) but its slice-plan checkbox hasn't been ticked yet — a slice with 100% of its tasks done, awaiting checkbox sign-off, now reads as complete (shown as "tasks done" until checked) everywhere instead of contradictingcf status.cf nextalso now says "Continue slice N" rather than "Advance to slice N" when the next slice in the plan is already partway done.cf nextno longer suggestscf set arch <index>when the architecture pointer is already set but the file doesn't exist yet — a no-op that stranded users mid-transition between initiatives. It now suggests advancing to Phase 2 (Architecture) instead; the field-unset fallback is unchanged.- The pending architecture (
arch) review gate incf nextno longer silently stops being checked once a slice plan exists. Previously, an unreviewed architecture would only be flagged before the slice plan was created; afterward the requirement vanished for good. cf check/workflow_checknow reports pending or failing reviews for all four lifecycle boundaries (arch,slice,tasks,code), not justcode— each only once its corresponding artifact (architecture file, slice design, task file) exists. Finding text now correctly names the review type owed (e.g. "Run the slice review for slice 100") instead of always saying "code review". A malformed review artifact now degrades to a single error finding for that slice/architecture instead of aborting the whole check.cf config setno longer misinterprets an all-digit value (e.g. aYYYYMMDDdate) as a number for string-typed config keys — the value is now coerced toward the key's declared type instead of guessed from its shape.
[0.8.1] - 20260514
Fixed
cf setnow normalizes artifact field values to bare stems before storage. Full paths (e.g.project-documents/user/architecture/100-arch.foo.md) and stems with.mdsuffix were stored as-is, causingresolveArtifactPathto construct an invalid doubled path — makingcf next,cf check, andcf buildsilently fail to detect files on disk.cf checknow warns when an initiative plan entry is checked but its associated slice plan still has incomplete slices, rather than only comparing the initiative checkbox against the architecture document status.
[0.8.0] - 20260514
Added
cf build --embed— inlines all referenced artifact files (fileArch,fileSlicePlan,fileSlice,fileTasks,fileHLD,fileSpec,fileConcept) andCLAUDE.mdas labeled fenced markdown blocks appended to the context output. Produces a fully self-contained prompt for models without file-read access. Missing files emit a warning rather than failing silently. Composes with all existing flags (--phase,--slice,--json, etc.).
[0.7.1] - 20260512
Fixed
@context-forge/context-forge(umbrella package) now exposes thecfcommand after a global install. Previously, installing the umbrella package installed@context-forge/clias a dependency but did not link its binary — leaving users with nocfcommand until they manually installed@context-forge/cli. Fixed by adding abin/cf.jsforwarding script to the umbrella package.cf list slices,cf list tasks, andcf nextnow correctly order slices by index regardless of the order entries appear in the slice plan file. Previously, entries added out of order during planning could cause the wrong slice to be flagged as "next".
[0.7.0] - 20260412
Added
cf setup-ide copilotandcf init --ide copilot— VS Code Copilot users can now use Context Forge. Compiles project rules and skills into the VS Code Copilot file layout: always-on rules →.github/copilot-instructions.md+AGENTS.md; scoped rules →.github/instructions/*.instructions.mdwithapplyTofrontmatter; skills →.github/prompts/*.prompt.md. Existing unmanaged files are backed up before overwriting; managed files (from a previous run) are updated silently.
Fixed
cf nextnow recommendscf set phase 'Phase 3: Slice Planning'instead ofcf buildwhen a new slice plan file is configured but doesn't exist yet and the project is not already in Phase 3 — previously, runningcf buildfrom Phase 6 would have generated an implementation prompt rather than a slice planning prompt
[0.6.42] - 20260406
Fixed
cf checkno longer flagsstatus: draft— now treated as alias fornot_started(work hasn't begun)cf checkauto-fixes missingdateUpdatedby defaulting todateCreatedwhen presentcf checkno longer floods output with "plan entry but no task file" notices for backlog entries — only flagged when a slice design exists (the only state where missing tasks is actually inconsistent)
[0.6.41] - 20260404
Fixed
- Context profile filtering was silently disabled —
ContextProfileParseronly handled the expanded multi-line YAML format but the actual prompt file uses compact one-liners; all artifact fields (includingfileTasks) were included in every phase regardless of profile configuration - Affects
cf build, MCPcontext_build, and/cf:buildslash command
Changed
ProfileMaptype simplified fromRecord<string, { variables: string[] }>toRecord<string, string[]>parseProfilesYamlrewritten as format-agnostic state machine — no indent-depth logic
[0.6.40] - 20260404
Added
cf list arch/cf list initiativesnow drives from the initiative plan (001-initiative-plan.*.md) when present, showing all entries with index, name, status, and arch file per entry — mirrorscf list slicesbehavior- Entries without an arch file show
not_started; entries with an arch file but unchecked showin_progress; checked entries showcomplete cf list arch --jsonemits structured array withindex,name,status,archFile,isActivefieldsresolveInitiativePlanPath(projectPath)exported from@context-forge/core/node— shared utility for locating initiative plan files
Changed
cf list archfalls back tobuildModel()-based output on projects without a formal initiative plan (no behavior change for those projects)
[0.6.39] - 20260404
Added
cf checkRule 13 (initiative-entry-vs-arch): flags mismatch between initiative plan entry checkbox and corresponding arch docstatus— warns and auto-fixes in both directionscf checkRule 14 (initiative-plan-status-vs-entries): flags initiative plan frontmatterstatusvs. all-entries-checked state (mirrors Rule 7 for slice plans)
Fixed
cf checkaggregate rules (stale-worktree-path, frontmatter-schema, initiative plan rules) were silently skipped when no slice plans existed; removed early-return guard that blocked them
[0.6.38] - 20260403
Fixed
cf setup-ide claudenow propagates generated files (CLAUDE.md,.claude/rules/,.claude/agents/,.claude/skills/) to all registered worktrees after updating the project root. Worktrees do not maintain independent IDE config — they receive a copy from root..claude/settings.local.jsonand.claude/worktrees/are intentionally excluded (worktree-specific).
[0.6.37] - 20260402
Added
- Short-form flags for common CLI options:
-j(--json),-p(--project),-y(--yes),-f(--fix),-a(--all),-r(--raw) - New
packages/cli/src/options.tsmodule with 7 composable helper functions (withJsonOption,withProjectOption,withYesOption,withFixOption,withAllOption,withRawOption,withProjectLevelOption)
Changed
- Migrated all 14 CLI command files to use shared option helpers from
options.ts(removed ~70 inline option registrations) - Normalized
--projectoption description to "Project ID or name (overrides default)" across all commands
Fixed
cf check --fixnow reports "No fixable findings — nothing to apply." when no findings are auto-fixable, instead of silently showing check-only output- Version flag changed from
-Vto-v(--version)
[0.6.36] - 20260402
Added
cf nextsuggestscf set phasewhen current phase doesn't match the recommended phasecf nextwarns when active slice is outside the architecture's index band (e.g., slice 904 under arch 100)cf nextrecommends creating the architecture document when arch is set but the file is missing, even with an active slicewarningsfield onNextActiontype for non-blocking configuration warnings
[0.6.35] - 20260401
Added
cf updatecommand — check npm for newer versions and prompt to install (slice 906)--yesflag for non-interactive auto-install--jsonflag for machine-readable version info- Detects npm vs pnpm global installs; skips local dev installs
[0.6.34] - 20260331
Added
cf worktree rmshows git worktree removal hint when the directory still exists on disk
Fixed
cf guides uninstallfrom a worktree now only deinits the submodule in that worktree — no longer breaks the main repo's guide installation (fixes #46)- Guide directory physically removed from worktree after submodule deinit
[0.6.31–0.6.33] - 20260331
Added
SlicePlanEntry.description— overview text from slice plan entries (after bold name)FutureWorkItem.description— description text from future work entries (after title separator)DocSummary.description— overview paragraph extracted from## Overviewsection of arch docs
[0.6.30] - 20260330
Fixed
cf guides updatenow fetches before--remoteand uses--initfor resilience after worktree removal
[0.6.29] - 20260330
Added
- Frontmatter schema registry (
FRONTMATTER_SCHEMAS) — maps 8 docTypes to required fields with value constraints (slice 905) validateFrontmatter()pure function exported from@context-forge/core- ConsistencyChecker Rule 12: validates all project documents against per-docType frontmatter schemas
- Status alias normalization: accepts
in-progress,not started,active,completedas valid - Auto-fix inference for missing
docType,slice,component,archIndex,projectfrom filename/context
Fixed
- Slices and tasks outside worktree range now shown when plan is cross-initiative
Changed
- Removed Rules 9 (missing-plan-status) and 11 (missing-arch-status) — subsumed by generic schema validation
[0.6.27] - 20260327
Added
- Derive
fileArchandfileSlicePlanfrom initiative plan when file is missing
Fixed
cf install-commandsnow removes stale slash commands from previous versions
[0.6.26] - 20260327
Fixed
- MCP tools resolve project from CWD when
projectIdis omitted
Changed
- Extracted compound workflow commands into dedicated CLI modules
[0.6.25] - 20260325
Added
- 900-band maintenance initiative support:
maintenanceInitiativesfield in project model (sameInitiativetype, separate display bucket for visualization) getFieldNamesByGroup()schema utility for deriving field lists fromPROJECT_FIELDSagent_quickstartMCP tool — structured JSON capability schema for machine consumers (slice 209)cf help --json— machine-readable command catalogcf version --json— structured version output- Structured JSON error format for
--jsonmode (code, message, suggestion fields) docs/AGENT-INTEGRATION.md— agent consumption guide- 7 new slash commands for compound workflows (
/cf:concept,/cf:initiatives,/cf:arch,/cf:plan,/cf:slice,/cf:tasks,/cf:implement)
Fixed
cf list tasksandcf list plansno longer error on empty directories — returns empty result instead ofUserError(blocked Squadron review commands on new projects)- Compound commands (
cf slice,cf tasks, etc.) now validate numeric index — previouslycf slice bananasilently set invalid values cf setwarns on non-numeric artifact values that don't match expected patterns
Changed
- Removed
agent_guideMCP tool (superseded byagent_quickstart) - Replaced hard-coded field arrays (ARTIFACT_FIELDS, WORKFLOW_FIELDS, fieldKeys, MANAGED_FILES) with schema-derived or filesystem-derived sources
- Initiative detection expanded from 100-799 to 100+ (900+ partitioned into
maintenanceInitiatives) - Bare
cf build(no flags) now shows help message instead of raw prompt output
[0.6.8] - 20260318
Added
- Worktree-aware guide operations (slice 190):
cf guides infoandcf guides updatedetect worktree context viaresolveProjectWorktree()and operate on the correct worktree pathSubmoduleStrategy.sync()reads target commit from main worktree, fetches objects, and checks out in worktree guide directory — handles worktrees on different branchesGuideManager.syncWorktrees()syncs multiple worktrees in one call with per-path error handlingGuideDetector.checkSyncStatus()reports per-worktree sync state viagit submodule status- MCP
guide_updateauto-syncs all registered worktrees after primary update - MCP
guide_statusincludesworktreeSyncarray for submodule-based projects with worktrees - New
SyncResulttype exported from@context-forge/core
Fixed
- Guide submodule updates now work in non-default worktrees — previously
cf guides updatefrom a worktree only updated the main worktree's checkout, leaving stale guide files in other worktrees (#44 cosmetic display issue noted)
[0.5.2] - 20260314
Added
cf checkRule 11:missing-arch-status— flags architecture files with nostatusfrontmatter field; fixable (infers from paired slice plan if present, elsenot_started)- Renamed
200-arch.event-driven-pipeline.md→220-arch.event-driven-pipeline.md(index reserved for new initiative)
[0.5.1] - 20260312
Added
- Default worktree improvements (slice 188):
- Default worktree renamed from
"Default"to"default"(lowercase) - Default range changed from
[0, 99]to[100, 799](working range instead of system range) - Dynamic range chopping: default worktree automatically shrinks when new worktrees claim overlapping sub-ranges
- Artifact collision detection blocks range shrinking when default holds references outside the new range
- CLI and MCP surface
chopWarningon worktree add/update
- Default worktree renamed from
[0.5.0] - 20260312
Added
- Worktree initiative (8 slices, 180–188): full git worktree support for parallel multi-initiative development
WorktreeServicecore service — CRUD forWorktreeContextrecords onProjectDataapplyWorktreeOverlaymoved to@context-forge/core(CLI re-exports); shared by CLI and MCPcf worktree init/list/get/update/rmCLI command groupcf statusshows dedicatedWorktree:line;--worktreeand--worktreesflags for cross-directory accesscf setroutes worktree-scoped fields (phase, slice, tasks, arch, plan) toWorktreeContextcf checkruns across all worktree overlays — worktree-scoped fields are visible in all checksstale-worktree-pathconsistency rule detects registered worktrees whose paths no longer existcf statusshows first-run hint when CWD is an unregistered git worktree of a known project- CWD resolution step 2b: auto-resolves project from git worktree even before
cf worktree init - MCP tools:
worktree_list,worktree_get,worktree_init,worktree_update,worktree_rm(5 new) - MCP extended:
workflow_status,workflow_next,context_build,project_updateacceptworktreeId - MCP
worktree_updateoverlap detection — rejects duplicate slice ranges across worktrees
cf taskscommand (renamed fromcf task) withlistanditemssubcommands
Fixed
cf checkwas blind to worktree-scoped fields after worktree migration; now checks all viewscf worktree initrequired--projectflag from unregistered git worktree directories; resolved automatically
[0.4.2] - 20260311
Added
cf backupCLI command — creates versioned timestamped backup of project data (keeps last 10, auto-prunes)storage_backupMCP tool — same backup functionality accessible to AI agents
[0.4.1] - 20260310
Added
cf check --slice <index>— narrow consistency checks to a single slicecf check --yes— skip confirmation prompt in fix modecf checkdefault scope is now all-slices (previously single-slice)workflow_checkMCP tool:sliceIndexparam to target specific slices- ConsistencyChecker rules 6–9: architecture-plan linkage, missing-plan-status, all-arch-plan pairs, filesystem discovery
updateFrontmatterFieldsupports inserting new keys (not just updating existing ones)
[0.4.0] - 20260309
Added
cf setup-ide claudecommand — configures Claude Code integration with CLAUDE.md backup safety and y/N confirmation- Context-profile-aware assembly —
ContextProfileParserfilters artifacts per instruction phase, reducing context bloat cf build --instruction-type/--itflag for profile override without persistinginstructionTypeparam oncontext_buildMCP toolfileConceptfield on project schema for concept document tracking- Rule: avoid overly restrictive regex when creating parsers
Fixed
/cf:promptworks with or withoutgetsubcommand (no double-dispatch)cf set architecturealso sets slice plan (like slice → tasks)cf nextsuggests creating architecture when arch is specified but nonexistentfileConceptadded to schema; project fields listed in general→specific order
[0.3.6] - 20260307
Added
- Guide install (
cf guides install) now creates user artifact directories (user/,architecture/,slices/,tasks/,project-guides/)
Fixed
cf nextrecommends creating architecture before slice plan when neither exists- Electron date picker displays correctly for dates set via CLI as YYYYMMDD (normalized to YYYY-MM-DD)
- Slice plan parser supports unindexed entries (
**Name**without(NNN)prefix) - Slice plan heading exclusion no longer falsely skips sections like "Feature Slices (in implementation order)"
Changed
- Removed obsolete test infrastructure task file (all 891 tests now pass)
- Cleaned up maintenance file: removed completed items, condensed descriptions
[0.3.5] - 20260307
Added
ConsistencyCheckercore service with 5 detection rules: task-vs-plan, frontmatter-vs-computed, missing artifacts, plan-vs-frontmatter, task-file-statusMarkdownWriterutility for non-destructive write-back (checkbox toggling + frontmatter field updates)- Fix mode with
FixLogEntrybefore/after tracing for each applied correction workflow.auto_fixconfig key for automatic corrections during consistency checksworkflow_checkMCP tool (25 total MCP tools)cf checkCLI command replaces stub with full implementation (--fix,--json,--project)
Fixed
/cf:prompt get P5slash command no longer doubles thegetsubcommand--projecthelp text across all CLI commands clarifies name or ID accepted
Changed
- Integration testing slice (168) demoted to maintenance — most deliverables completed incrementally
- Future work item (169) added: all-slices consistency checking mode, duplicate index detection
[0.3.4] - 20260307
Added
WorkflowNavigatorcore service:getStatus()derives slice status from filesystem,getNext()priority-ordered state machine- MCP tools:
workflow_status,workflow_next - CLI discovery commands:
cf arch list,cf plan list,cf slice list,cf task list,cf task items - Smart index resolution:
cf set slice 166derives filename from slice plan - Auto-set
fileTasksfrom slice name workflow.auto_advanceconfig key
Fixed
- Artifact path resolution:
resolveArtifactPath()correctly resolves stems to full paths slicePlannull handling inWorkflowNavigator,ArtifactIntrospector,cf slice list
Changed
- Slash command prompts optimized for token efficiency (~800 tokens saved)
[0.3.3] - 20260307
Added
- Auto-commit after
cf guides installandcf guides update(submodule and clone strategies)
[0.3.2] - 20260306
Fixed
- Phase resolution in
cf build --phase: accepts P1-P7 shorthands, numbers (1-7), and short names (task-breakdown); warns on unrecognized values - Instruction matcher (
getPromptForInstruction) handles full phase strings likePhase 5: Task Breakdown— extracts name portion for fuzzy matching - Template conditionals support
{{#if var}}content{{/if}}without requiring{{else}}clause - Conditional evaluator uses enhanced data (artifact aliases like
fileArch) instead of raw ContextData only
[0.3.1] - 20260306
Added
- README screenshots and assets (context-visualizer, cf-project-list, cf-status)
- CLI README: slash commands section, git-like CWD model explanation,
cf initworkflow
Changed
- Root README rewritten with screenshots, structured sections, and updated architecture description
- CLI README restructured: npm-focused install, slash commands table, commands reference
- Core and MCP READMEs updated for slice 175 changes
[0.3.0] - 20260306
Added
- Artifact fields (
fileArch,fileSlicePlan,fileHLD,fileSpec) in ContextData, mapped through full pipeline - Template variable aliases:
{arch},{plan},{hld},{spec}with index extraction ({archIndex},{planIndex},{hldIndex}) - Phase→instruction auto-set: setting
developmentPhasevia CLI or MCP automatically updatesinstructionto match - Top-level shortcuts:
cf setandcf getas shortcuts forcf project set/get - Claude Code slash commands:
/cf:status,/cf:build,/cf:next,/cf:prompt,/cf:get,/cf:set,/cf:project cf install-commands/cf uninstall-commandsfor Claude Code integration- Smart field setting:
cf set slice 171resolves by scanning project files; customData sub-fields settable with merge semantics - Schema-driven field metadata:
cf project --schemawith aliases, groups, enum values cf guidescommand: install, update, and status for ai-project-guide templatescf checkcommand: consistency checks with--fixoptioncf futurecommand: consolidated future work across all slice plans
Changed
- Consolidated
### Project Contextsection with clean key-value format (replaces bracket-wrapped### Current Work Context) - Unified opening statement (
project-statement) regardless of workType (replaces start/continue branching) - Template field removed from context output
- CWD-based project detection:
cfauto-detects project from current directory - Name-based project resolution:
--project orchestrationwith project names instead of IDs - Compact
cf project listwith*active indicator and~path shortening
[0.2.0] - 20260228
Added
- CWD-based project detection
- Name-based resolution with
--projectflag - Resolution indicators in
cf statusoutput - Compact
cf project listformat
Changed
- Tighter output formatting: consistent label alignment, suppressed empty fields
[0.1.0] - 20260225
Added
- Initial release with 8 commands:
status,next,build,config,project,future,check,prompt - Integration with
@context-forge/corefor context assembly - Phase shorthands for prompt templates (P1-P7)
- JSON output mode on all applicable commands
- MCP server with project management, context generation, artifact introspection, and workflow tools
- Core context engine: template processing, statement management, prompt parsing, project storage