What's New in v1.13.1
This release makes OpenSpec safer to run in repositories you have not reviewed yet, and makes archive, validation, and the agent workflows more predictable.
Improved
- Security hardening - OpenSpec is safer in a freshly cloned repository. A
config.yamlvalue can no longer inject directives into agent instructions, crafted files can no longer hangopenspec updateoropenspec archive, and a repository's.npmrccan no longer redirect the update check. - Next step in
openspec status- Status now ends with aNext:line naming the exact command that moves the change forward, so resuming a change no longer means knowing the workflow by heart. - Profile-aware skills - Generated skills and commands name only the workflows your profile installs, and they match natural phrasing such as "openspec propose" or "do an openspec apply".
- Project check - Workflows confirm the project has run
openspec initbefore writing anything, and never create anopenspec/folder as a side effect. - Explore and update workflows - Explore names
/opsx:proposeand/opsx:applyat every handoff and treats your explicit request to capture a change as confirmation./opsx:updatedrafts its revisions first and writes only after you confirm. - Artifact templates - Generated proposal, spec, design, and tasks files open with a top-level heading, so markdownlint no longer flags every artifact.
- Tool picker - The vendor-neutral target is listed as "Other / Universal" and can be found by searching for terms like
universal,generic, orcustom. - Nix - The flake package now ships bash, zsh, and fish completions.
Fixed
- Archive - Archive refuses a requirement name that differs from an existing one only in case, a
RENAMEDsection whoseFROM:andTO:lines do not pair up, and a delta file it would never read. Bulk archive checks every target before writing any spec, and agent-driven archive and sync create the main spec for a new capability. - Validation -
openspec validatereports requirements written outside a delta section, rejects a scenario with no body, warns when tracked tasks have no checkboxes, and checks a schema'sapply.requiresagainst its artifacts. - Task progress - Tasks under
+,1., and1)list markers now count, and an unrecognized marker such as[~]counts as unfinished, so✓ Completeno longer hides open work. - Spec parsing - Requirement headings with a closing
###sequence resolve correctly, andopenspec show --json --deltas-onlyreports exactly the deltas archive applies. - Changes and lists - A change nested inside a namespace folder is reported instead of silently misread, and one dangling symlink no longer breaks
openspec list. - Stores -
openspec store removeno longer deletes a store nested inside the one being removed, a store namedspecsorchangesno longer becomes the planning root, andstore setup --no-init-gitworks inside an existing Git repository. - Configuration - A global config file with a syntax error is left untouched instead of being overwritten,
openspec config editsupports anEDITORwith arguments such ascode --wait, andDO_NOT_TRACK=truenow disables telemetry. - Setup and completions - Legacy cleanup keeps your own files in old command folders, and uninstalling bash completions restores
.bashrcbyte for byte.
New Contributors
Full Changelog: v1.13.0...v1.13.1