* fix(init): make the universal tool target findable in the picker
Closes#653
`openspec init`'s tool picker is a searchable list of product names. The
vendor-neutral target every unlisted assistant is meant to use was named
"Shared .agents skills" — after the directory it writes, which is not a
word anyone in that position searches for. Typing "universal", "other" or
"generic" returned "No matches", so the escape hatch was unreachable and
the reporter had to open an issue to find it.
Rename the entry to "Other / Universal (shared .agents skills)" and give
choices optional `searchAliases` the filter also matches. The picker also
dropped every non-alphanumeric keystroke: readline reports punctuation
only in `key.sequence`, leaving `key.name` undefined, so ".agents" and
"amazon-q" could not be typed at all.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* fix(init): point at the universal target when a tool search matches nothing
"No matches" is where someone whose assistant is not on the list gives
up — the picker knows the answer and does not say it. Add an optional
`emptyHint` to the searchable multi-select, and have init name the
vendor-neutral entry there.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* fix(init): close every dead end that hides the universal tool target
Hardening pass over the same defect. Reviewing the first fix turned up
four more places the answer was withheld:
- `openspec update`'s tool picker builds its own choices and never
passed searchAliases through, so the same search failed there.
- `--tools <unknown>` printed a bare list of ids. It now names the
fallback, the scripted counterpart of the picker's empty hint. The
hint I first put on validateTools sat on an unreachable branch; the
path users actually hit is the "Invalid tool(s)" parse error, and a
test now pins it.
- The search box dropped pasted text as well as punctuation. Any
sequence whose characters are all printable is now accepted, which
also lets a space reach the box so "claude code" filters. Escape
sequences carry control characters and are still rejected, and the
`name` fallback stays single-character so readline names like 'tab'
are never typed.
- docs-lab still taught the old label in two places.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* docs: keep the FAQ a router and finish the alias list
- help/faq.md is a one-liner surface (README's "FAQ is one-liners" rule),
so the answer points at the support matrix's Other / Universal section
instead of restating the picker's search terms. Drops the em dash that
writing.md forbids.
- reference/supported-tools.md keeps the search terms, now all nine the
picker actually matches: `vendor-neutral` and `agents.md` were added to
searchAliases after the first draft of this page. Same correction in the
legacy docs/supported-tools.md paragraph.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* chore(init): keep the tool-not-listed hint ASCII
The non-interactive fallback hint is new terminal output and carried an em
dash, an ambiguous-width glyph in the class #983 covered. A colon reads the
same and cannot misalign a terminal.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* docs: drop the legacy docs/ tool-matrix edit
docs-lab/reference/supported-tools.md already carries the label and search terms.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* test(init): prove picker punctuation through real readline key events
The prompt tests fed a multi-character sequence that readline never emits:
it splits a paste into one key per character, so a pasted space still
toggles. Drive the handler with real emitKeypressEvents output (fails on
main with 'amazonq'), pin the space limit, and stop claiming multi-word
paste in the changeset and code comment.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
* docs: rebuild docs site from docs-lab
Replace the docs site's source tree with docs-lab, a page-by-page rebuild
of the OpenSpec docs (40 pages: Start / Guides / Customize / Multi-repo /
Reference / Help).
- Point website/docs.sync.config.mjs at ../docs-lab and restructure the
sidebar into nested groups; sync script gains nested meta.json emission,
leading-quote descriptions, idempotent writes, and diagram asset copying
- Remove the marketing landing page; / now redirects to /docs
(meta-refresh page + Cloudflare _redirects)
- Add remark plugins (faq, file-steps, gfm-alert) and the FileSteps
component backing the new page formats
- Add install.md at the repo root, curled by docs-lab/start/installation.md
as an agent-executable install prompt
- Add the docs authoring skills (.agents/skills/{write,draft,verify}-
openspec-docs); docs-lab/README.md links into write-openspec-docs
The old docs/ tree is now unused by the site and left for a follow-up.
Claude-Session: https://claude.ai/code/session_01BMMLYNJQPKXx1QHpnDn4ho
* docs: hold back unwritten pages, add worksets, drop diagram drafts
- website: comment out Overview, Guides, Architecture, Help, Legacy in
docs.sync.config.mjs until those pages are written; temporary
/docs -> /docs/installation redirect (Cloudflare _redirects + static
export meta-refresh fallback in page.tsx)
- docs-lab: new multi-repo/worksets.md page, published under Multi-repo
- docs-lab: content revisions across start/, customize/, reference/,
help/, multi-repo/; add review notes (Notes.md)
- remove docs-lab/diagrams option-* drafts and their website copies
- write-openspec-docs skill: add spoken-flow sentence rule
* docs: address review on PR #1649
- sync-docs: read the existing output directly instead of exists-then-read
(CodeQL TOCTOU alert)
- hold back the headings-only Environment variables and Stores reference
pages until written; links to them fall back to their GitHub source
- sources.md: cutover keeps docs/ in place and points at public/_redirects
- setup.md: label the workflow tree as the default set plus two optional ones
* docs: two review nits (spoken-flow rule, XDG_DATA_HOME note)