adopt-spec

Adopt a typed .spec.ts for an existing hand-written CLAUDE.md — start from the file you already have, non-destructively

By zernie · 1,517 installs

npx skills add zernie/vigiles --skill adopt-spec

Source repository · Upstream listing

Start a typed CLAUDE.md.spec.ts from an existing hand written CLAUDE.md (or AGENTS.md). This is the non destructive adoption path — you keep your existing instruction file as the starting point and get type safety going forward. Adoption rules Adoption is the safe, faithful on ramp — never an upgrade in disguise. These are non negotiable: Faithful. Preserve every rule, command, key file, and prose section as is. Invent nothing — the spec must compile back to ~the user's existing file. Non destructive. Never edit the original CLAUDE.md / AGENTS.md . Only write the new .spec.ts . Never auto compile over the file — switching it to spec managed is a separate, explicit step the user runs with a diff to review. Don't escalate enforcement. Keep guidance() as guidance() . Upgrading to enforce() has a cost (config/plugins, possible false positives) and is a separate opt in step — the strengthen skill. Adoption is not turning on strict / workflow gating. Reversible. vigiles eject <file hands the file back as plain hand owned markdown anytime — it's never a one way door. Tell the user this. Ask before writing. Present the generated spec and a conversion summary first; write only on the user's yes. A lighter touch exists. For no spec at all, inline <! vigiles:enforce ... comments are verified by vigiles lint with the same engine. Instructions Step 1: Read the Existing File Read the target instruction file (default: CLAUDE.md in the repo root). If the user specified a path, use that. Also check if vigiles is installed: look for vigiles in package.json devDependencies. If not, suggest: Step 2: Parse the Structure Identify these sections in the markdown: Commands — lines like npm run build — description or command — description Key files — lines like src/foo.ts — description listing important files Rules — headings with Enforced by: or Guidance only annotations Prose sections — everything else (positioning, architecture, principles, etc.) For each rule, classify it: Has Enforced by: \ linter/rule\ → enforce("linter/rule", "why") Has Enforced by: \ code review\ or similar non linter → guidance("...") Has Guidance only → guidance("...") Has no annotation → mark as TODO for the user to classify Step 3: Generate the Spec File Create CLAUDE.md.spec.ts (or the appropriate name based on the source file) with this structure: Important guidelines: Use file() refs in sections where file paths appear in backticks — this enables stale reference detection Use cmd() refs for any npm run commands mentioned in sections Convert Enforced by: \ code review\ rules to guidance() — code review is not a mechanical enforcement For rules with no annotation, add a // TODO: classify as enforce() or guidance() comment Keep rule IDs as kebab case versions of the heading text Preserve the Why: text as the second argument to enforce() or guidance() If sections reference other files or skills, use ref() for cross references Step 4: Verify the Spec Compiles Run: Compare the compiled output against the original file. Key differences are expected (formatting, section ordering), but all rules, commands, key files, and prose content should be preserved. Step 5: Present the Result Show the user: 1. The generated spec file 2. How many rules were converted (enforce vs guidance vs TODO) 3. How many file/cmd refs were added for stale reference detection 4. The command to compile: npx vigiles compile 5. The command to verify: npx vigiles lint Ask if they want you to write the file. If yes, also suggest adding to .gitignore or updating CI to run vigiles compile and vigiles lint . Step 6: Optional — Set Up CI If the user wants CI integration, suggest adding to their GitHub Actions workflow: Or using the vigiles GitHub Action: