v1.13.1 - Hardened CLI, safer archives
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