Skip to content

feat: simplify skill installation with profiles and smart defaults init#719

Merged
TabishB merged 8 commits intomainfrom
simplify-onboarding
Feb 18, 2026
Merged

feat: simplify skill installation with profiles and smart defaults init#719
TabishB merged 8 commits intomainfrom
simplify-onboarding

Conversation

@TabishB
Copy link
Contributor

@TabishB TabishB commented Feb 17, 2026

Summary

  • Adds change proposal for simplified init flow and skill installation
  • Introduces profile system (core/custom) to reduce workflow overwhelm
  • Enables smart defaults init with auto-detection and tool confirmation
  • Adds delivery config (both/skills/commands) as power-user setting
  • New propose workflow combining new + ff for faster onboarding
  • Fixes tool selection UX (space to select, enter to confirm)
  • Adds exploration note for explore → propose transition UX questions

Key Design Decisions

Decision Rationale
Extend existing global config Reuse ~/.config/openspec/config.json instead of new file
Smart defaults with confirmation Auto-detect tools, show pre-selected checkboxes, user confirms
Two-tier profiles (core/custom) Core covers essential loop, custom for power users
Filesystem as truth Backwards compatible, config is a template not constraint

Init Flow

$ openspec init

Detected tools:
  [x] Claude Code
  [x] Cursor
  [ ] Windsurf

Press Enter to confirm, or Space to toggle

Setting up OpenSpec...
✓ Done

Start your first change:
  /opsx:propose "add dark mode"

Change Artifacts

  • proposal.md - Why and what changes
  • design.md - Technical decisions and rationale
  • specs/ - Delta specs for capabilities
  • tasks.md - Implementation tasks grouped by feature
  • explorations/explore-workflow-ux.md - Open UX questions for explore → propose

Test plan

  • Review change artifacts for consistency
  • Validate specs against existing canonical specs
  • Ready for /opsx:apply after merge

🤖 Generated with Claude Code

Introduces a change proposal to simplify the init flow and skill installation:

- Zero-question init with sensible defaults (core profile, both delivery)
- Auto-detect AI tools from existing directories (.claude/, .cursor/, etc.)
- Profile system: core (4 workflows), extended (11 workflows), custom
- Delivery config: both, skills, commands
- New `propose` workflow combining new + ff
- Fix tool selection UX (space to select, enter to confirm)

Key design decisions:
- Extend existing global config (~/.config/openspec/config.json)
- Profile install/uninstall immediately mutates filesystem
- Safe deletion via SKILL_NAMES and COMMAND_IDS constant lookups
- Filesystem as truth for installed workflows

Also adds rules to openspec/config.yaml to prevent overengineering
(explicit lookups over pattern matching).
@1code-async
Copy link
Contributor

1code-async bot commented Feb 17, 2026

Task completed.


PR Review: feat: simplify skill installation with profiles and zero-question init

Overall Assessment

This is a well-structured change proposal with clear motivation, thorough design rationale, and detailed specs. The artifacts are internally consistent and follow the project's spec-driven conventions. Below are specific findings organized by priority.


Issues

1. Missing .openspec.yaml metadata file

Other active change proposals (e.g., schema-alias-support, unify-template-generation-pipeline) include a .openspec.yaml with schema and created fields. This change is missing one. Minor, but worth adding for consistency.

schema: spec-driven
created: 2026-02-17

2. Workflow count inconsistency: "11 workflows" in extended profile

The proposal and design both reference "all 11 workflows" for the extended profile. The profiles spec (specs/profiles/spec.md:12) explicitly lists them:

propose, explore, apply, archive, new, ff, continue, verify, sync, bulk-archive, onboard

That's 11. But propose is new — it doesn't exist today. The proposal says there are "currently 10" workflows. So extended should contain the original 10 + the new propose = 11. This math checks out, but it's worth being explicit in the proposal that extended = existing 10 + propose, not that there were already 11. The current wording in proposal.md:65 says "All 11 workflows including..." which could imply they all existed before.

3. Missing spec: available-tools capability

The proposal (proposal.md:128) lists available-tools as a new capability ("Detect what AI tools the user has from existing directories"), and the design discusses auto-detection extensively. However, the specs directory has tool-auto-detection/spec.md instead of available-tools/spec.md. The naming mismatch is confusing — proposal.md calls it available-tools, design.md discusses it as "Auto-Detection", and the spec directory is tool-auto-detection.

Recommendation: Either rename the spec directory to available-tools to match the proposal, or update the capability name in the proposal. Consistency between the capability list and spec directory names makes it easier to trace requirements.

4. No spec directory for propose-workflow behavior details around new + ff equivalence

The propose-workflow/spec.md states at line 31:

THEN the result SHALL be identical to running openspec new change "feature-name" followed by /opsx:ff feature-name

"Identical" is a strong contract. The design (design.md:76-79) describes a different implementation where the propose template calls openspec new change then runs its own artifact generation loop. If propose has its own explanatory output and onboarding UX (as the spec also requires at lines 19-25), the result won't be byte-for-byte identical to new + ff. Consider softening this to "functionally equivalent" or specifying what "identical" means (same directory structure and artifacts, not necessarily same console output).

5. profile install implicitly changes profile to custom — potentially surprising

From specs/profiles/spec.md:29:

THEN the system SHALL set profile to custom if not already

If a user on core profile runs openspec profile install verify, their profile silently changes from core to custom. The spec doesn't require informing the user of this side-effect. This could be confusing — a user might not realize their profile changed. Consider requiring the system to inform the user: "Profile changed from core to custom."

6. profile uninstall on a core workflow — what happens?

The spec covers uninstalling workflows but doesn't address what happens when a user tries to uninstall a workflow that's in their current non-custom profile. For example, if profile is core and user runs openspec profile uninstall explore:

  • Does it change profile to custom with [propose, apply, archive]?
  • Does it refuse because explore is part of core?
  • Does it warn and proceed?

This edge case should be specified.

7. --apply-profile confirmation UX not fully specified

From specs/cli-init/spec.md:103:

AND ask for confirmation before removing, listing each item to be deleted

Good that confirmation is required, but there's no scenario for what happens if the user declines. Should the system skip deletion entirely? Abort the init? Proceed with install but skip deletion? Worth specifying.


Minor Nits

8. Duplicate section numbering in design.md

design.md has two sections numbered "6":

  • Line 106: "### 6. Filesystem as Truth for Installed Workflows"
  • Line 120: "### 6a. Profile Install/Uninstall = Immediate Filesystem Mutation"
  • Line 132: "### 6b. Safe Deletion via Constant Lookups"

The 6a/6b pattern works but section 7 ("Fix Multi-Select Keybindings") is the 8th decision. Consider renumbering for clarity or keeping the subsection style consistently (6, 6a, 6b is fine but should be called out as subsections).

9. Proposal mentions 9 specs but there are actually 9 spec directories

The proposal's Capabilities section lists 9 capabilities (5 new + 4 modified). The specs/ directory contains 9 subdirectories. This is consistent — just confirming alignment. However, there are only 9 spec directories, not 11 as the PR description claims ("Delta specs for 11 capabilities"). The PR description should be corrected.

10. Tasks.md missing task for .openspec.yaml creation

No task tracks creating the .openspec.yaml metadata file for this change.

11. tool-auto-detection spec doesn't specify HOW case sensitivity is handled

From specs/tool-auto-detection/spec.md:37-38:

WHEN checking for directories on case-insensitive filesystems
THEN the system SHALL handle case variations appropriately

Per the newly added config.yaml rule ("Be explicit about mechanisms, not just outcomes"), this spec should specify the mechanism. Does it lowercase before comparison? Use fs.exists and let the OS handle it? This is especially relevant since the config.yaml rules in this same PR emphasize being explicit about HOW.


What's Done Well

  • Strong design rationale: Every decision in design.md includes alternatives considered and explicit rationale. This is exemplary documentation.
  • Consistent spec format: All 9 specs follow the project's WHEN/THEN scenario pattern consistently.
  • Safety-first deletion approach: Using SKILL_NAMES/COMMAND_IDS constant lookups instead of pattern matching is a sound safety design that prevents accidental deletion of user-created content.
  • Backwards compatibility is well-considered: "Filesystem as truth" with additive-only init and explicit --apply-profile for destructive changes is the right default.
  • config.yaml rules are a good upstream contribution: The 4 new rules (explicit mechanisms, constant lookups, no pattern matching) encode lessons from this design and will benefit future changes.
  • The "aha moment" framing in the proposal is effective — it makes the motivation concrete and testable.

Summary

The change proposal is thorough and well-structured. The main items to address are the naming inconsistency between available-tools (proposal) and tool-auto-detection (spec directory), the underspecified edge cases around profile transitions during install/uninstall, the missing .openspec.yaml, and the overly strong "identical" contract for the propose workflow. The config.yaml additions are a nice improvement that the project will benefit from beyond this change.


View full conversation

Powered by 1Code

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 17, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds design and detailed specifications to simplify OpenSpec skill/command installation: global config extensions (profile, delivery, workflows), a two-tier profile system (core, custom), a combined propose workflow, filesystem-based tool auto-detection with confirmation, profile-driven conditional generation, updated init UX (multi-select keybindings), and a phased migration plan. No runtime code changes.

Changes

Cohort / File(s) Summary
Design & Proposal
openspec/changes/simplify-skill-installation/design.md, openspec/changes/simplify-skill-installation/proposal.md
New design and proposal describing profile-driven installs, delivery modes (both/skills/commands), propose workflow, global-config schema additions, zero-question init, and CLI surface changes.
Init & Generation Specs
openspec/changes/simplify-skill-installation/specs/cli-init/spec.md, openspec/changes/simplify-skill-installation/specs/skill-generation/spec.md, openspec/changes/simplify-skill-installation/specs/command-generation/spec.md
Specifies zero-question init flows, tool-confirmation UX, overwrite/preserve rules, and conditional generation of skills/commands based on profile + delivery; mandates inclusion of propose template.
Profiles & Global Config
openspec/changes/simplify-skill-installation/specs/profiles/spec.md, openspec/changes/simplify-skill-installation/specs/user-config/spec.md, openspec/changes/simplify-skill-installation/specs/delivery-config/spec.md
Defines core/custom profiles, global-config fields (profile, delivery, workflows), defaults, interactive profile picker behavior, and config listing semantics.
Tool Detection & Propose
openspec/changes/simplify-skill-installation/specs/available-tools/spec.md, openspec/changes/simplify-skill-installation/specs/propose-workflow/spec.md
Adds filesystem-based detection of AI tools (.claude, .cursor, etc.) and a one-step propose workflow that creates a change and all artifacts.
UX & Config Practices
openspec/changes/simplify-skill-installation/specs/tool-selection-ux/spec.md, openspec/changes/simplify-skill-installation/.openspec.yaml, openspec/config.yaml
Updates multi-select keybindings and visual feedback (Space toggle, Enter confirm), adds per-change .openspec.yaml, and enforces explicit artifact lists / constant-driven deletion guidance.
Roadmap / Tasks
openspec/changes/simplify-skill-installation/tasks.md
Adds an 11-section implementation roadmap covering global config, profiles, detection, propose template, conditional generation, init/update changes, migration, tests, and docs.
Docs & Conventions
openspec/explorations/workspace-architecture.md, docs/concepts.md, openspec/specs/docs-agent-instructions/spec.md, openspec/specs/openspec-conventions/spec.md
New/existing docs expanded with workspace architecture exploration and updated spec-authoring guidance emphasizing behavior-first, progressive rigor, and spec separation.

Sequence Diagram(s)

sequenceDiagram
    actor User as User
    participant Init as "openspec init"
    participant ToolDetect as "Tool Detection"
    participant Config as "Global Config"
    participant Generator as "Skill/Command Generator"
    participant FS as "Filesystem"

    User->>Init: run init (interactive/non-interactive)
    Init->>ToolDetect: scan project for tool dirs (.claude, .cursor, ...)
    ToolDetect->>FS: fs.existsSync(toolDir)
    FS-->>ToolDetect: presence results
    ToolDetect-->>Init: detectedTools
    Init->>User: show multi-select (Space toggle, Enter confirm)
    User->>Init: select/confirm tools
    Init->>Config: read profile & delivery (apply defaults if absent)
    Config-->>Init: profile, delivery
    Init->>Generator: generate artifacts for profile+delivery+tools
    Generator->>FS: write skill/command files (per delivery)
    FS-->>Generator: write results
    Generator-->>Init: completion
    Init->>User: success message
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Poem

🐰 I hopped through specs and left a trail,

Profiles, prompts, and a propose to hail,
I sniffed .claude and .cursor without fail,
Toggled space, hit enter — the install set sail,
A tiny rabbit cheers the new workflow tale.

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Title check ✅ Passed The title 'feat: simplify skill installation with profiles and smart defaults init' directly and clearly captures the main changes: introduction of profiles, delivery configuration, and zero-question init with auto-detection of AI tools.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch simplify-onboarding

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@greptile-apps
Copy link

greptile-apps bot commented Feb 17, 2026

Greptile Summary

This PR adds a comprehensive change proposal for simplifying OpenSpec's skill installation and initialization flow. The proposal introduces a three-tier profile system (core/extended/custom) to reduce workflow overwhelm for new users, enabling a zero-question init experience that gets users to an "aha moment" in under a minute.

Key improvements include:

  • Zero-question init flow with auto-detection of AI tools from existing directories
  • Profile system defaulting to 4 core workflows (propose, explore, apply, archive) instead of overwhelming users with 11
  • New propose workflow combining new + ff for faster onboarding
  • Delivery config (both/skills/commands) as a power-user setting
  • Fixed tool selection UX using standard keybindings (space to toggle, enter to confirm)
  • Safe deletion mechanism using explicit constant lookups (SKILL_NAMES, COMMAND_IDS) instead of pattern matching
  • Backward compatibility via filesystem-as-truth approach

The change artifacts are well-structured with clear proposal, design decisions, implementation tasks, and 11 detailed spec files covering all modified and new capabilities. The design document provides strong rationale for architectural decisions like extending the existing global config, making profile install/uninstall operations immediately mutate the filesystem, and using explicit constant-based lookups for safety.

Minor observations:

  • The cli-init/spec.md references a COMMAND_IDS constant that needs to be added to tool-detection.ts (tracked in tasks 2.4)
  • The existing canonical cli-init/spec.md specifies 9 skills, but this change updates it to be profile-based (correctly documented as MODIFIED requirements)

Confidence Score: 5/5

  • This PR is safe to merge - it's a well-structured change proposal with comprehensive documentation
  • This is a change proposal (documentation only) with no code changes. The proposal, design, and specs are thorough, well-reasoned, and follow the repository's conventions. All change artifacts are consistent, implementation tasks are clearly defined with proper dependencies, and the design addresses safety concerns explicitly (constant-based deletion, backwards compatibility, schema evolution).
  • No files require special attention - all change artifacts are well-structured and consistent

Important Files Changed

Filename Overview
openspec/changes/simplify-skill-installation/proposal.md Clear proposal document outlining zero-question init, profiles, and propose workflow. Well-structured with rationale.
openspec/changes/simplify-skill-installation/design.md Comprehensive design decisions with clear rationale for profile system, delivery config, and safety mechanisms.
openspec/changes/simplify-skill-installation/specs/cli-init/spec.md Modified requirements for profile-based generation, auto-detection, and safe deletion via constant lookups. Comprehensive scenarios.
openspec/changes/simplify-skill-installation/specs/profiles/spec.md Clear profile definitions (core/extended/custom) with CLI commands and filesystem mutation behavior.
openspec/changes/simplify-skill-installation/specs/propose-workflow/spec.md New propose workflow combining new+ff with onboarding UX. Clear equivalence to sequential operations.
openspec/config.yaml Added rules for explicit mechanisms, constant-based lookups, and avoiding pattern matching in specs/design.

Flowchart

flowchart TD
    Start["`openspec init`"] --> DetectTools[Auto-detect AI tools<br/>from directories]
    DetectTools --> ReadConfig[Read global config<br/>~/.config/openspec/config.json]
    ReadConfig --> GetDefaults[Get defaults:<br/>profile=core, delivery=both]
    
    GetDefaults --> Interactive{Interactive<br/>mode?}
    Interactive -->|Yes| ShowTools[Show detected tools<br/>pre-selected]
    Interactive -->|No| CheckTools{Tools<br/>detected?}
    
    ShowTools --> ConfirmTools[User confirms/modifies<br/>Space to toggle, Enter to confirm]
    CheckTools -->|Yes| UseDetected[Use detected tools]
    CheckTools -->|No| Fail[Fail with error:<br/>Use --tools flag]
    
    ConfirmTools --> ResolveProfile[Resolve profile:<br/>core/extended/custom]
    UseDetected --> ResolveProfile
    
    ResolveProfile --> CoreProfile{Profile?}
    CoreProfile -->|core| InstallCore[Install 4 workflows:<br/>propose, explore, apply, archive]
    CoreProfile -->|extended| InstallExtended[Install 11 workflows:<br/>all existing + propose]
    CoreProfile -->|custom| InstallCustom[Install user-selected<br/>workflows from config]
    
    InstallCore --> CheckDelivery{Delivery?}
    InstallExtended --> CheckDelivery
    InstallCustom --> CheckDelivery
    
    CheckDelivery -->|both| GenBoth[Generate skills<br/>and commands]
    CheckDelivery -->|skills| GenSkills[Generate<br/>skills only]
    CheckDelivery -->|commands| GenCommands[Generate<br/>commands only]
    
    GenBoth --> Success["`✓ Done<br/>Run /opsx:propose 'your idea'`"]
    GenSkills --> Success
    GenCommands --> Success
Loading

Last reviewed commit: b365792

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 14

🧹 Nitpick comments (6)
openspec/changes/simplify-skill-installation/tasks.md (2)

39-42: No rationale for separating available-tools.ts from tool-detection.ts.

Task 5.1 creates a new module rather than extending the existing one, but neither the task nor the design document explains the boundary. Both modules deal with tool identity and detection. Without a stated rationale (e.g., "tool-detection.ts is about installed/configured tools; available-tools.ts is about directory-scanned tools"), maintainers have no guidance on which file to add future tool-related functionality to.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/changes/simplify-skill-installation/tasks.md` around lines 39 - 42,
The review calls out missing rationale for creating src/core/available-tools.ts
instead of extending tool-detection.ts; update the design and task text to state
the clear responsibility boundary: specify that tool-detection.ts remains
responsible for runtime/installed/configured tool identity and resolution, while
available-tools.ts implements filesystem scanning
(getAvailableTools(projectPath)) to discover directory-backed tools and maps
directory names using AI_TOOLS; modify task 5.1 description to include this
boundary and mention getAvailableTools and AI_TOOLS so future maintainers know
which module to extend for scanning vs configuration logic, and add a short note
in the design document explaining the separation.

83-88: E2E test plan omits the uninstall path.

Task 10.3 covers init → propose → apply → archive but not profile install / profile uninstall. Given that profile uninstall immediately deletes files via SKILL_NAMES/COMMAND_IDS lookups — arguably the riskiest new operation in this PR — an explicit e2e test scenario (e.g., profile install <workflow> → verify files → profile uninstall <workflow> → verify deletion) would provide meaningful coverage.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/changes/simplify-skill-installation/tasks.md` around lines 83 - 88,
Add an explicit e2e test for the uninstall path: extend task 10.3 (the
end-to-end flow) to include running `profile install <workflow>` then verifying
installed files exist, and then running `profile uninstall <workflow>` and
verifying those files are deleted; ensure the test specifically targets the code
paths that use SKILL_NAMES and COMMAND_IDS lookups (the risky immediate-delete
logic) and include assertions for both successful install and
safe/unexpected-file handling after uninstall (run on Windows/CI as part of
10.2/10.1).
openspec/changes/simplify-skill-installation/specs/command-generation/spec.md (1)

28-33: Propose command file path only specified for Claude Code.

Other tool adapters (Cursor, Windsurf, etc.) have no equivalent scenario for the propose command file path. If their path conventions are handled in per-adapter specs, this is fine — otherwise those scenarios need a home before implementation.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@openspec/changes/simplify-skill-installation/specs/command-generation/spec.md`
around lines 28 - 33, The spec only defines the propose command path for Claude
Code (`.claude/commands/opsx/propose.md`) while other adapters (Cursor,
Windsurf, etc.) are missing equivalent scenarios; update the spec by either
adding corresponding "Propose command file path" scenarios for each adapter
(e.g., Cursor and Windsurf) that assert their expected file paths or add a
clarifying note referencing the per-adapter spec files where those paths are
defined (ensure you reference the "propose" requirement and the adapter names
`Cursor` and `Windsurf` so implementers know whether to implement
adapter-specific propose paths or rely on per-adapter specs).
openspec/changes/simplify-skill-installation/specs/user-config/spec.md (1)

36-39: Specify the format for indicating defaults vs explicitly set values.

The requirement says "SHALL indicate which values are defaults vs explicitly set" but does not define the format. Without this, implementations diverge — common options include a (default) suffix, an asterisk, or a distinct column. Adding a concrete example would close the ambiguity.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/changes/simplify-skill-installation/specs/user-config/spec.md`
around lines 36 - 39, Update the "Scenario: List all config with profile" for
the `openspec config list` command to define a concrete format for indicating
defaults vs explicitly set values (e.g., append " (default)" to values that are
defaults or add a "Source" column with values "default" or "explicit"); include
a short example output showing profile, delivery, and workflows settings with
the chosen marker so implementers have an exact template to follow.
openspec/changes/simplify-skill-installation/proposal.md (1)

97-111: No explicit command to switch to the custom profile.

The CLI commands section shows profile set core and profile set extended but has no profile set custom. Currently, reaching the custom profile requires install/uninstall calls that implicitly transition the profile. Adding an explicit command would improve discoverability and make the profile system feel complete.

 openspec profile set core
 openspec profile set extended
+openspec profile set custom    # transition to custom, keeping current workflows
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/changes/simplify-skill-installation/proposal.md` around lines 97 -
111, Add an explicit "profile set custom" command to the CLI docs and example
block so users can directly switch to the custom profile instead of relying on
implicit install/uninstall transitions; update the examples in the Profile
management section to include "openspec profile set custom" and, if the CLI
implementation uses a handler like profile set (or a ProfileService method),
ensure the command maps to the same activation logic used by
"install"/"uninstall" so switching to custom behaves identically to the implicit
transitions.
openspec/changes/simplify-skill-installation/specs/cli-init/spec.md (1)

89-91: "Refresh/update the core workflows" is ambiguous — clarify whether existing files are overwritten.

The spec doesn't define whether "refresh/update" means:

  1. Re-generate files unconditionally (overwriting user-modified skill content), or
  2. Add only missing workflow files, leaving existing ones intact.

Option 1 silently discards user customizations. The spec should make the behavior explicit to prevent divergent — and potentially destructive — implementations.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/changes/simplify-skill-installation/specs/cli-init/spec.md` around
lines 89 - 91, The spec's "refresh/update the core workflows" for the openspec
init behavior is ambiguous about whether existing workflow files are
overwritten; update the spec text for the scenario where a user with an extended
profile runs "openspec init" with the core profile to explicitly state the
intended behavior (e.g., "re-generate and overwrite core workflow files,
replacing existing files" OR "only add missing core workflow files and leave
existing files untouched"), and also add the expected handling for user-modified
files (e.g., create backups, prompt, or skip) so implementations of openspec
init, core profile refresh logic, and extended profile preservation are
unambiguous.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@openspec/changes/simplify-skill-installation/proposal.md`:
- Line 7: The markdown has four fenced code blocks without language specifiers
(causing MD040); update each fenced block by adding an appropriate language
hint: add ```text for the general output/commands blocks (the blocks containing
"..." and "$ openspec init" and "I'll create a change with 3 artifacts: ...")
and use ```shell for the shell/example block that starts with "# Profile
management (what to install)". Ensure each opening fence is updated to include
the language token while keeping the block contents unchanged.
- Around line 139-152: The impact section missed updating the COMMAND_IDS
constant to include the new "propose" command id; update the COMMAND_IDS list to
include the same "propose" identifier you added to SKILL_NAMES so profile
cleanup (openspec init --apply-profile) will remove stale propose command files,
and ensure any tests or cleanup logic that iterates COMMAND_IDS (e.g., the
safe-deletion routine) recognizes the new propose entry.

In `@openspec/changes/simplify-skill-installation/specs/cli-init/spec.md`:
- Around line 65-67: The spec's hardcoded success message "/opsx:propose \"your
idea\"" is tool-specific; update the code that emits the "Init success message"
(the place that currently returns the literal "/opsx:propose \"your idea\"") to
produce a tool-agnostic or tool-aware message: either replace the hardcoded
string with a generic instruction like "Start your first change: propose your
idea using your installed tool" or detect the selected adapter and format the
example invocation accordingly (e.g., choose the appropriate slash/CLI syntax
per detected tool). Locate where the init success string is composed (the
function or template referenced by "Init success message") and change the
returned text to use a generic phrasing or branch on the configured tool to
render the correct invocation.

In `@openspec/changes/simplify-skill-installation/specs/delivery-config/spec.md`:
- Around line 28-30: Update the "Scenario: Get delivery preference" for the
`config get delivery` command to explicitly state the expected output when the
delivery field is absent in the config: specify whether the command should print
the effective value "both" (i.e., the default) or the value plus an annotation
like "(default: both, not explicitly set)"; mention the exact expected string to
avoid ambiguity so implementations of `config get delivery` and the scenario
text (Scenario: Get delivery preference) are aligned.
- Line 10: Update the two section headings "Skills only delivery" and "Commands
only delivery" to use compound-adjective hyphenation: change them to
"Skills-only delivery" and "Commands-only delivery" respectively (locate the
headings in the spec where those exact phrases appear and replace them).

In `@openspec/changes/simplify-skill-installation/specs/profiles/spec.md`:
- Around line 26-42: Add a new explicit scenario (or a clear NOTE) describing
the implicit one-way switch to the `custom` profile that occurs when running
`profile install <workflow>` or `profile uninstall <workflow>`; explain that
these commands will set the profile to `custom` if it was `core` or `extended`,
that this is irreversible via those commands alone, and include the recovery
method (e.g., run `profile set core` or `profile set <named>` to return to a
named profile). Reference the `profile install` and `profile uninstall`
behaviors and the fact that the change affects the global `workflows` config so
readers understand the impact.
- Around line 21-24: The spec currently omits filesystem side-effect behavior
for the "profile set" command; add two explicit scenarios to clarify intent: (1)
"profile set" (without --apply-profile) must only update the global config
profile setting and output confirmation, with no filesystem mutations, and (2)
"profile set --apply-profile" must update the global config profile setting,
output confirmation, and immediately mutate the filesystem by removing or
installing workflow files not part of the new profile using SKILL_NAMES /
COMMAND_IDS lookups; reference the existing "profile set" scenario, the
--apply-profile flag (Task 8.6), and the SKILL_NAMES/COMMAND_IDS mechanism when
adding these two scenarios so implementors know exactly when to mutate the
filesystem.
- Line 28: Add an explicit error scenario for the "profile set <invalid-name>"
case: state that when "profile set" is invoked with an unrecognized/invalid
profile name (e.g., "profile set typo") the system SHALL return an error
response (non-zero exit/status) and SHALL NOT change the current profile (i.e.,
the profile remains unchanged and SHALL NOT be set to `custom`), and include an
assertion that an appropriate diagnostic message is returned; apply the same
addition to the corresponding duplicate location referenced (the other
occurrence).
- Around line 53-58: Add a new scenario under the "Requirement: Profile
defaults" section to cover existing global configs that lack the profile field:
create a "Scenario: Global config exists but profile field absent" (or similar)
that states WHEN a global config file exists but does not contain a `profile`
field THEN the system SHALL behave as if profile is `core`; update the spec text
adjacent to the existing "Scenario: No global config exists" so implementations
handling schema evolution (e.g., migrations or defaults) are explicitly tested
for missing fields as well as missing files.

In `@openspec/changes/simplify-skill-installation/specs/propose-workflow/spec.md`:
- Around line 6-9: The "Basic propose invocation" scenario (Scenario: Basic
propose invocation) is underspecified because it says "generate all artifacts
needed for implementation" without enumerating them; update that scenario to
either list the canonical artifacts (e.g., proposal.md, design.md, tasks.md) or
add a clear reference to the canonical list used elsewhere (the first-time user
guidance scenario) so the behavior is explicit and consistent with the
config.yaml rule; ensure the text in the Scenario: Basic propose invocation
entry mirrors the artifact enumeration used in the first-time user guidance
scenario.
- Around line 30-32: The equivalence mixes CLI and skill models; update the
Scenario text for clarity by stating whether /opsx:propose is a skill or a CLI
and aligning the referenced invocations accordingly — e.g., replace the line
with a sentence like: "THEN the result SHALL produce the same filesystem
artifacts as running the CLI command `openspec new change \"feature-name\"`
followed by invoking the skill `/opsx:ff feature-name`" or, if you intend both
as skills, change `openspec new change` to `/opsx:new change` so the statement
consistently references `/opsx:propose`, `/opsx:new`, and `/opsx:ff`.

In `@openspec/changes/simplify-skill-installation/specs/skill-generation/spec.md`:
- Around line 23-26: The phrase "in addition to existing templates" is
ambiguous; update the spec to reference the canonical list or enumerate
templates explicitly—replace or augment that line by referencing the SKILL_NAMES
constant (or the exact list it contains) so readers know which templates are
considered "existing templates" (e.g., mention "in addition to templates listed
in SKILL_NAMES" or enumerate the names from SKILL_NAMES directly in the
scenario).
- Around line 11-14: The Scenario "Skip skill generation when delivery is
commands-only" in specs/skill-generation/spec.md currently asserts "the system
SHALL only generate command files" which belongs to command-generation; remove
that sentence from this spec so the Scenario only asserts the skill system
behavior ("SHALL NOT generate any skill files"), and if needed add or move the
removed assertion to specs/command-generation/spec.md (or reference the
command-generation spec) so command-generation remains authoritative; update the
Scenario text to only describe skill-generation outcomes and ensure no
cross-spec conflict remains.

In
`@openspec/changes/simplify-skill-installation/specs/tool-auto-detection/spec.md`:
- Around line 36-38: Update the Scenario "Case sensitivity on different
platforms" to specify the explicit mechanism rather than just the outcome: state
that the system SHALL either rely on the OS filesystem via an existence check
(e.g., use fs.existsSync(path.join(projectRoot, tool.skillsDir)) so case
handling is delegated to the platform) or SHALL normalize directory names (e.g.,
convert names to lowercase before comparison) and pick which approach is
required; reference config.yaml rule by adding the chosen mechanism
(fs.existsSync/path.join/projectRoot/tool.skillsDir or normalizing to lowercase)
in the scenario text.

---

Nitpick comments:
In `@openspec/changes/simplify-skill-installation/proposal.md`:
- Around line 97-111: Add an explicit "profile set custom" command to the CLI
docs and example block so users can directly switch to the custom profile
instead of relying on implicit install/uninstall transitions; update the
examples in the Profile management section to include "openspec profile set
custom" and, if the CLI implementation uses a handler like profile set (or a
ProfileService method), ensure the command maps to the same activation logic
used by "install"/"uninstall" so switching to custom behaves identically to the
implicit transitions.

In `@openspec/changes/simplify-skill-installation/specs/cli-init/spec.md`:
- Around line 89-91: The spec's "refresh/update the core workflows" for the
openspec init behavior is ambiguous about whether existing workflow files are
overwritten; update the spec text for the scenario where a user with an extended
profile runs "openspec init" with the core profile to explicitly state the
intended behavior (e.g., "re-generate and overwrite core workflow files,
replacing existing files" OR "only add missing core workflow files and leave
existing files untouched"), and also add the expected handling for user-modified
files (e.g., create backups, prompt, or skip) so implementations of openspec
init, core profile refresh logic, and extended profile preservation are
unambiguous.

In
`@openspec/changes/simplify-skill-installation/specs/command-generation/spec.md`:
- Around line 28-33: The spec only defines the propose command path for Claude
Code (`.claude/commands/opsx/propose.md`) while other adapters (Cursor,
Windsurf, etc.) are missing equivalent scenarios; update the spec by either
adding corresponding "Propose command file path" scenarios for each adapter
(e.g., Cursor and Windsurf) that assert their expected file paths or add a
clarifying note referencing the per-adapter spec files where those paths are
defined (ensure you reference the "propose" requirement and the adapter names
`Cursor` and `Windsurf` so implementers know whether to implement
adapter-specific propose paths or rely on per-adapter specs).

In `@openspec/changes/simplify-skill-installation/specs/user-config/spec.md`:
- Around line 36-39: Update the "Scenario: List all config with profile" for the
`openspec config list` command to define a concrete format for indicating
defaults vs explicitly set values (e.g., append " (default)" to values that are
defaults or add a "Source" column with values "default" or "explicit"); include
a short example output showing profile, delivery, and workflows settings with
the chosen marker so implementers have an exact template to follow.

In `@openspec/changes/simplify-skill-installation/tasks.md`:
- Around line 39-42: The review calls out missing rationale for creating
src/core/available-tools.ts instead of extending tool-detection.ts; update the
design and task text to state the clear responsibility boundary: specify that
tool-detection.ts remains responsible for runtime/installed/configured tool
identity and resolution, while available-tools.ts implements filesystem scanning
(getAvailableTools(projectPath)) to discover directory-backed tools and maps
directory names using AI_TOOLS; modify task 5.1 description to include this
boundary and mention getAvailableTools and AI_TOOLS so future maintainers know
which module to extend for scanning vs configuration logic, and add a short note
in the design document explaining the separation.
- Around line 83-88: Add an explicit e2e test for the uninstall path: extend
task 10.3 (the end-to-end flow) to include running `profile install <workflow>`
then verifying installed files exist, and then running `profile uninstall
<workflow>` and verifying those files are deleted; ensure the test specifically
targets the code paths that use SKILL_NAMES and COMMAND_IDS lookups (the risky
immediate-delete logic) and include assertions for both successful install and
safe/unexpected-file handling after uninstall (run on Windows/CI as part of
10.2/10.1).

Comment on lines 36 to 38
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

"Handle case variations appropriately" violates the config.yaml rule requiring explicit mechanisms.

The new config.yaml rule (line 19) reads: "Be explicit about mechanisms, not just outcomes (say HOW, not just WHAT)." This scenario says WHAT (handle case) but not HOW. For cross-platform path detection, the mechanism matters:

  • Linux filesystems are case-sensitive; .Claude/ would not match.
  • macOS HFS+ / Windows NTFS are case-insensitive by default.

The spec should specify the actual mechanism — e.g., "the system SHALL use fs.existsSync(path.join(projectRoot, tool.skillsDir)) which delegates case handling to the OS filesystem" or "the system SHALL normalize directory names to lowercase before comparison."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@openspec/changes/simplify-skill-installation/specs/tool-auto-detection/spec.md`
around lines 36 - 38, Update the Scenario "Case sensitivity on different
platforms" to specify the explicit mechanism rather than just the outcome: state
that the system SHALL either rely on the OS filesystem via an existence check
(e.g., use fs.existsSync(path.join(projectRoot, tool.skillsDir)) so case
handling is delegated to the platform) or SHALL normalize directory names (e.g.,
convert names to lowercase before comparison) and pick which approach is
required; reference config.yaml rule by adding the chosen mechanism
(fs.existsSync/path.join/projectRoot/tool.skillsDir or normalizing to lowercase)
in the scenario text.

Issues fixed:
- Clarify workflow count: extended = existing 10 + new propose = 11
- Rename spec: tool-auto-detection → available-tools (matches proposal)
- Change "identical" to "functionally equivalent" in propose spec
- Add profile change notification when install/uninstall changes profile
- Specify edge case: uninstall workflow from current non-custom profile
- Specify behavior when --apply-profile confirmation is declined
- Fix section numbering in design.md (6, 6a, 6b, 8)
- Add scaffolding verification tasks (verify .openspec.yaml exists)
- Specify case sensitivity mechanism: use fs.existsSync, let OS handle it
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Nitpick comments (2)
openspec/changes/simplify-skill-installation/specs/available-tools/spec.md (1)

36-40: fs.existsSync() alone doesn't confirm the path is a directory.

fs.existsSync('.cursor') returns true for a regular file named .cursor too. Add an isDirectory() check — e.g., fs.existsSync(p) && fs.statSync(p).isDirectory() — to avoid false-positive tool detection.

📝 Suggested addition
 - **THEN** the system SHALL use `fs.existsSync()` with exact directory names from AI_TOOLS
+- **THEN** the system SHALL verify the matched path is a directory (not a file)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/changes/simplify-skill-installation/specs/available-tools/spec.md`
around lines 36 - 40, The current check uses fs.existsSync() with entries from
AI_TOOLS which can return true for files as well as directories; update the
detection logic to verify the path is a directory by combining fs.existsSync(p)
with a directory stat check (e.g., fs.statSync(p).isDirectory()) wherever the
project inspects AI_TOOLS entries (the code referencing fs.existsSync,
fs.statSync, and AI_TOOLS), so only actual directories are considered tools and
false positives from regular files are avoided.
openspec/changes/simplify-skill-installation/design.md (1)

155-162: Section 7 is absent from the Decisions numbering.

The ## Decisions section jumps from §6b directly to §8, skipping §7. Either a section was removed without renumbering, or §8 should be §7. Minor, but worth fixing to avoid confusion when cross-referencing by number.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/changes/simplify-skill-installation/design.md` around lines 155 -
162, The Decisions numbering skips §7 (it jumps from §6b to §8); open the "##
Decisions" section and renumber the "§8" heading labeled "8. Fix Multi-Select
Keybindings" to "7. Fix Multi-Select Keybindings", and update any in-document
cross-references or table-of-contents entries that mention §8/§7 so numbering is
consistent (search for the literal "§8", "8. Fix Multi-Select Keybindings", and
any TOC entries and change them to "§7"/"7. Fix Multi-Select Keybindings").
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@openspec/changes/simplify-skill-installation/design.md`:
- Around line 113-118: Update the §6 behavior bullet for --apply-profile to
match the detailed spec: remove the word "only" and state that --apply-profile
syncs/removes extras from both SKILL_NAMES and COMMAND_IDS (i.e., it deletes
items referenced by SKILL_NAMES and COMMAND_IDS), so the summary aligns with §6b
and specs/cli-init/spec.md and implementors will also clean up command files
when running openspec init --apply-profile.

In `@openspec/changes/simplify-skill-installation/specs/cli-init/spec.md`:
- Around line 88-91: The phrase "refresh/update the core workflows" in the
"Scenario: Existing extended installation" for the `openspec init` command is
ambiguous about overwrite semantics; update that THEN clause to explicitly state
the intended behavior — e.g., replace it with either "THEN the system SHALL
regenerate core workflow files, overwriting existing content" if destructive
overwrite is intended, or "THEN the system SHALL add any missing core workflow
files and leave existing files untouched" if non-destructive behavior is
intended — and ensure the chosen wording is used consistently in the scenario
and any related acceptance criteria.

In `@openspec/changes/simplify-skill-installation/specs/profiles/spec.md`:
- Around line 53-55: Update the "Scenario: List available profiles" for the
`openspec profile list` command to indicate the active profile is clearly marked
in the output; modify the THEN clause in that scenario to require the currently
active profile be annotated (for example "core (active)") alongside the workflow
counts so users can identify which profile is active without running `openspec
profile show`.
- Around line 26-33: Add an explicit error scenario for "profile install
<workflow>" when the workflow name is unknown: define that running "profile
install bogus-workflow" SHALL fail with a non-zero exit code, SHALL NOT change
the profile or modify the global config `workflows` array, and SHALL display a
clear error listing valid workflow names (or where to find them); update the
spec to include this negative test case alongside the existing positive "Install
individual workflow" scenario so implementations of the "profile install"
command (and any validation in installWorkflow / profileInstall handlers) must
validate the workflow name and return the specified error behavior.

In `@openspec/changes/simplify-skill-installation/specs/propose-workflow/spec.md`:
- Around line 11-13: The scenario "Propose with existing change name" invoked
via the /opsx:propose command lacks defined behavior for the two choices and
non-interactive runs; update the spec to add explicit THEN clauses: for
"Continue" specify that /opsx:propose should detect existing change state
(complete vs incomplete) and either resume incomplete generation from the last
successful step using the existing change directory (reference the propose
workflow/resume logic) or, if all artifacts already exist, prompt to regenerate
artifacts or skip generation and proceed to review; for "Create new" specify
whether a new name is auto-suffixed (e.g., append a unique timestamp/sequence)
or the user is prompted for a new name and ensure the command returns the chosen
name to the workflow (reference /opsx:propose name handling); and for
non-interactive mode specify a deterministic fallback (auto-suffix new name or
fail with a clear error code) so automated callers have predictable behavior.

In `@openspec/changes/simplify-skill-installation/tasks.md`:
- Line 65: Task 8.1 references detectInstalledTools() but the implemented
function is getAvailableTools(projectPath); reconcile them by either renaming
getAvailableTools to detectInstalledTools (preserving its signature) or by
adding and exporting a small wrapper function detectInstalledTools(projectPath)
that calls getAvailableTools(projectPath) and documents their relationship; then
update the task text so the name used in the init step matches the exported
symbol (either detectInstalledTools or getAvailableTools) to remove the
mismatch.
- Around line 44-52: Add the missing "propose" command id to the COMMAND_IDS
constant (the same enum/array used by the safe-deletion check) so the new
openspec-propose skill and its command template ("propose") are recognized
during profile cleanup; update the COMMAND_IDS definition to include "propose"
alongside existing entries, ensuring the string matches the command template id
and the SKILL_NAMES entry "openspec-propose".

---

Duplicate comments:
In `@openspec/changes/simplify-skill-installation/proposal.md`:
- Around line 139-152: The proposal adds "propose" to SKILL_NAMES but omitted
the matching entry in COMMAND_IDS; update the COMMAND_IDS constant to include a
mapping for "propose" (the same identifier used in SKILL_NAMES) so that safe
deletion and command lookups work consistently—locate the COMMAND_IDS definition
and add the propose key with the appropriate command id string used elsewhere
(matching how other skills are mapped).
- Around line 7-17: The fenced code blocks that show the shell interaction (the
block starting with "0:00  $ openspec init" and the other blocks containing
"/opsx:propose", agent output, and "/opsx:apply") lack language specifiers and
trigger MD040; update each triple-backtick fence to include an appropriate
language (e.g., ```bash or ```sh for shell/session blocks, or ```text if you
prefer plain text) so markdownlint no longer flags them—locate the fences around
the snippets like "0:00  $ openspec init", the "/opsx:propose ..." interaction,
the agent-created files list, and the "/opsx:apply" block and add the language
tag to each opening ``` fence.

In `@openspec/changes/simplify-skill-installation/specs/cli-init/spec.md`:
- Around line 65-67: In the "Scenario: Init success message" replace the
hardcoded Claude Code invocation string "Start your first change: /opsx:propose
\"your idea\"" with a tool-agnostic or conditional message: either a generic
prompt such as "Start your first change: propose \"your idea\"" or generate the
displayed example dynamically based on detected tool(s) (e.g., map detected tool
names to their invocation syntax and render the appropriate example). Update the
spec text where that exact string appears so consumers no longer see the
Claude-specific "/opsx:propose" unless the implementation explicitly detects and
chooses that tool's syntax.

In `@openspec/changes/simplify-skill-installation/specs/profiles/spec.md`:
- Around line 26-44: The spec's "Install individual workflow" and "Uninstall
individual workflow" scenarios implicitly change profile to `custom` without
documenting recovery; add a short dedicated scenario or NOTE after both
scenarios that (1) explicitly states this is a one-way automatic switch unless
the user manually resets the profile, (2) documents the recovery command (e.g.,
`openspec profile set core`) and any prerequisites/validation for reverting, and
(3) clarifies whether reverting will remove or preserve workflows added/removed
while in `custom` so implementers know expected behavior for
SKILL_NAMES/COMMAND_IDS handling.
- Around line 62-67: Add a new parallel scenario under the "Requirement: Profile
defaults" section to cover schema-evolution: when a global config file exists
but lacks a `profile` key, the system SHALL behave as if profile is `core`;
specifically, mirror the existing "Scenario: No global config exists" structure
with a new scenario (e.g., "Scenario: Global config exists but profile field
absent") that states WHEN the global config file exists and has no `profile`
field THEN the system SHALL default to `core`, referencing task 1.4/schema
evolution for context.
- Around line 21-25: The spec currently omits whether "openspec profile set
<name>" mutates filesystem artifacts and lacks an error scenario for invalid
names; update the "Set profile" scenarios to (1) explicitly state that "openspec
profile set <name>" only updates the global config profile setting (no
install/remove of workflow files or other FS side-effects) and emits a
confirmation message, and (2) add a new negative scenario for "openspec profile
set <invalid-name>" that defines expected behavior: validate names, print a
clear error message, and exit with a non-zero status code; reference the
"openspec profile set <name>" and "profile set <invalid-name>" commands and the
global config profile setting in the spec text so implementers know to enforce
config-only changes and proper validation/exit semantics.

In `@openspec/changes/simplify-skill-installation/specs/propose-workflow/spec.md`:
- Around line 30-32: Clarify the ambiguous equivalence statement: explicitly
state whether `propose` is a CLI command or an AI skill (slash command), and
define what "equivalent" means (e.g., produces the same filesystem artifacts and
metadata as running `openspec new change "feature-name"` and then invoking the
`/opsx:ff feature-name` skill, or simply yields the same end-state behavior via
different invocation paths). Update the Scenario text to name the invocation
method for `propose` (CLI or skill) and add a short parenthetical defining
equivalence as either "artifact-equivalent" or "invocation-equivalent" so
readers know whether you mean identical files/outputs or equivalent operational
outcome.
- Around line 6-9: Update the "Basic propose invocation" scenario so the vague
THEN "the system SHALL generate all artifacts needed for implementation" is
replaced with an explicit list of artifacts (e.g., proposal.md, design.md,
tasks.md) to match the first-time user guidance; modify the Scenario: Basic
propose invocation block (the WHEN `/opsx:propose "add user authentication"` and
the corresponding THEN line) to enumerate those filenames instead of the generic
phrase.

---

Nitpick comments:
In `@openspec/changes/simplify-skill-installation/design.md`:
- Around line 155-162: The Decisions numbering skips §7 (it jumps from §6b to
§8); open the "## Decisions" section and renumber the "§8" heading labeled "8.
Fix Multi-Select Keybindings" to "7. Fix Multi-Select Keybindings", and update
any in-document cross-references or table-of-contents entries that mention §8/§7
so numbering is consistent (search for the literal "§8", "8. Fix Multi-Select
Keybindings", and any TOC entries and change them to "§7"/"7. Fix Multi-Select
Keybindings").

In `@openspec/changes/simplify-skill-installation/specs/available-tools/spec.md`:
- Around line 36-40: The current check uses fs.existsSync() with entries from
AI_TOOLS which can return true for files as well as directories; update the
detection logic to verify the path is a directory by combining fs.existsSync(p)
with a directory stat check (e.g., fs.statSync(p).isDirectory()) wherever the
project inspects AI_TOOLS entries (the code referencing fs.existsSync,
fs.statSync, and AI_TOOLS), so only actual directories are considered tools and
false positives from regular files are avoided.

- Add language specifiers to fenced code blocks in proposal.md
- Add COMMAND_IDS update for propose in modified files list
- Make init success message tool-aware (colon vs hyphen syntax)
- Fix grammar: "Skills-only" and "Commands-only" in delivery-config
- Specify config get delivery output when field absent: "both (default)"
- Add profile set scenarios: config-only vs --apply-profile with filesystem mutation
- Add error scenarios for invalid profile name and unknown workflow
- Add scenario for existing config without profile field
- Mark active profile in profile list output
- Enumerate artifacts in propose basic scenario
- Fix propose equivalence to use skill syntax consistently
- Specify continue/create new branches in propose
- Remove out-of-scope command assertion from skill-generation spec
- Reference SKILL_NAMES constant instead of vague "existing templates"
- Fix design.md: SKILL_NAMES AND COMMAND_IDS (not "only")
- Specify overwrite semantics for refresh/update
- Add task 6.8: propose to COMMAND_IDS
- Fix function name: getAvailableTools() not detectInstalledTools()
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@openspec/changes/simplify-skill-installation/design.md`:
- Line 156: The heading "### 8. Fix Multi-Select Keybindings" jumps from §6b and
leaves §7 missing; update the decision numbering so it is sequential by either
renaming the heading text "### 8. Fix Multi-Select Keybindings" to "### 7. Fix
Multi-Select Keybindings" or re-inserting the removed §7 content (or a brief
placeholder note) before this heading to preserve history; ensure any other
subsequent numbered headings are adjusted consistently so there are no gaps in
the decision log.

In `@openspec/changes/simplify-skill-installation/proposal.md`:
- Around line 68-81: The UX text for the new propose workflow is inconsistent
about which artifacts it creates; update the /opsx:propose description and the
"Why" timeline so they match intent: either include specs/ in the list and
change "3 artifacts" to "4 artifacts" (update the UX message that currently
lists proposal.md, design.md, tasks.md to also list specs/) if propose indeed
runs both new + ff, or explicitly remove "all artifacts" and change the UX
message to state that propose creates only proposal.md, design.md, tasks.md and
that specs/ (delta specs) are generated later by /opsx:apply; ensure references
to the propose workflow and /opsx:apply remain consistent across the proposal.md
content.

In `@openspec/changes/simplify-skill-installation/specs/profiles/spec.md`:
- Around line 27-32: The "Set profile with apply" scenario's install step ("the
system SHALL install any missing workflow files for the new profile") lacks a
tool-detection clause; add a pre-install step mirroring the "profile install"
scenario by explicitly stating the system SHALL detect all configured tools in
the current project (so the install targets the same set as SKILL_NAMES and
COMMAND_IDS lookups), and clarify that only workflow files for those detected
tools will be generated/installed when performing the apply-profile install
step.

In `@openspec/changes/simplify-skill-installation/specs/skill-generation/spec.md`:
- Around line 22-32: The requirement text is self-contradictory about where the
openspec-propose template lives; update the Scenario "Propose skill in
templates" so it describes the post-change behavior that the `openspec-propose`
template is returned via the unified SKILL_NAMES lookup (not "in addition to"
SKILL_NAMES), and remove any phrasing that implies a separate fetch path; ensure
the Requirement and Scenario consistently state that `SKILL_NAMES` includes
`openspec-propose`.

---

Duplicate comments:
In `@openspec/changes/simplify-skill-installation/proposal.md`:
- Line 7: The fenced code blocks in simplify-skill-installation proposal.md
currently lack language tokens; update every triple-backtick fence (```) to
include the appropriate language specifier (e.g., ```text or ```shell) so each
of the code blocks (the four blocks referenced in the review) carry correct
language tokens and are consistent across the document; ensure you change each
opening fence only and keep the fence content unchanged.

Comment on lines +68 to +81
The `propose` workflow is new - it combines `new` + `ff` into a single command that creates a change and generates all artifacts.

### 5. Improved Propose UX

`/opsx:propose` should naturally onboard users by explaining what it's doing:

```text
I'll create a change with 3 artifacts:
- proposal.md (what & why)
- design.md (how)
- tasks.md (implementation steps)

When ready to implement, run /opsx:apply
```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Artifact count inconsistency: "all artifacts" vs "3 artifacts".

Line 68 states that propose "generates all artifacts", but the UX message at line 75 claims only 3 and omits specs/. Since propose = new + ff, and ff is the workflow that generates delta specs, specs/ should be a fourth artifact. The same omission appears in the "Why" timeline at line 13.

Either clarify that propose intentionally defers specs/ generation to /opsx:apply (and remove "all artifacts"), or add specs/ to both the count and the list.

✏️ Option A — if `propose` does generate specs
-I'll create a change with 3 artifacts:
+I'll create a change with 4 artifacts:
 - proposal.md (what & why)
 - design.md (how)
+- specs/ (delta specs)
 - tasks.md (implementation steps)
-0:45  Agent creates proposal.md, design.md, tasks.md
+0:45  Agent creates proposal.md, design.md, specs/, tasks.md
✏️ Option B — if specs/ is deferred to apply
-it combines `new` + `ff` into a single command that creates a change and generates all artifacts.
+it combines `new` + `ff` into a single command that creates a change and generates the planning artifacts (proposal.md, design.md, tasks.md); delta specs are produced during `/opsx:apply`.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
The `propose` workflow is new - it combines `new` + `ff` into a single command that creates a change and generates all artifacts.
### 5. Improved Propose UX
`/opsx:propose` should naturally onboard users by explaining what it's doing:
```text
I'll create a change with 3 artifacts:
- proposal.md (what & why)
- design.md (how)
- tasks.md (implementation steps)
When ready to implement, run /opsx:apply
```
The `propose` workflow is new - it combines `new` + `ff` into a single command that creates a change and generates all artifacts.
### 5. Improved Propose UX
`/opsx:propose` should naturally onboard users by explaining what it's doing:
Suggested change
The `propose` workflow is new - it combines `new` + `ff` into a single command that creates a change and generates all artifacts.
### 5. Improved Propose UX
`/opsx:propose` should naturally onboard users by explaining what it's doing:
```text
I'll create a change with 3 artifacts:
- proposal.md (what & why)
- design.md (how)
- tasks.md (implementation steps)
When ready to implement, run /opsx:apply
```
The `propose` workflow is new - it combines `new` + `ff` into a single command that creates a change and generates the planning artifacts (proposal.md, design.md, tasks.md); delta specs are produced during `/opsx:apply`.
### 5. Improved Propose UX
`/opsx:propose` should naturally onboard users by explaining what it's doing:
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/changes/simplify-skill-installation/proposal.md` around lines 68 -
81, The UX text for the new propose workflow is inconsistent about which
artifacts it creates; update the /opsx:propose description and the "Why"
timeline so they match intent: either include specs/ in the list and change "3
artifacts" to "4 artifacts" (update the UX message that currently lists
proposal.md, design.md, tasks.md to also list specs/) if propose indeed runs
both new + ff, or explicitly remove "all artifacts" and change the UX message to
state that propose creates only proposal.md, design.md, tasks.md and that specs/
(delta specs) are generated later by /opsx:apply; ensure references to the
propose workflow and /opsx:apply remain consistent across the proposal.md
content.

Comment on lines 27 to 32
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

--apply-profile install step (line 31) has no tool-detection clause.

Line 31 specifies that missing workflow files shall be installed, but unlike the profile install scenario (which explicitly requires "detect all configured tools in current project" at line 44), there is no equivalent step here. An implementor has no guidance on which tools to target when generating those files — leading to inconsistent behavior or a best-guess implementation.

✏️ Proposed addition
 #### Scenario: Set profile with apply
 - **WHEN** user runs `openspec profile set <name> --apply-profile`
 - **THEN** the system SHALL update the global config profile setting
 - **THEN** the system SHALL remove workflow files not in new profile (via SKILL_NAMES and COMMAND_IDS lookups)
 - **THEN** the system SHALL ask for confirmation before removing files
+- **THEN** the system SHALL detect all configured tools in current project
 - **THEN** the system SHALL install any missing workflow files for the new profile
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/changes/simplify-skill-installation/specs/profiles/spec.md` around
lines 27 - 32, The "Set profile with apply" scenario's install step ("the system
SHALL install any missing workflow files for the new profile") lacks a
tool-detection clause; add a pre-install step mirroring the "profile install"
scenario by explicitly stating the system SHALL detect all configured tools in
the current project (so the install targets the same set as SKILL_NAMES and
COMMAND_IDS lookups), and clarify that only workflow files for those detected
tools will be generated/installed when performing the apply-profile install
step.

Comment on lines +22 to +32
#### Scenario: Propose skill in templates
- **WHEN** getting skill templates
- **THEN** the system SHALL include `openspec-propose` template
- **THEN** the template SHALL be in addition to templates listed in SKILL_NAMES constant

### Requirement: Skill names constant update
The `SKILL_NAMES` constant SHALL include the propose workflow.

#### Scenario: Updated skill names
- **WHEN** referencing `SKILL_NAMES` constant
- **THEN** it SHALL include `openspec-propose` in addition to existing names
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Self-contradiction: openspec-propose cannot be "in addition to SKILL_NAMES" and also inside SKILL_NAMES simultaneously.

Line 25 implies openspec-propose lives outside SKILL_NAMES ("in addition to templates listed in SKILL_NAMES constant"), while lines 27–32 specify that SKILL_NAMES SHALL include openspec-propose. An implementor reading line 25 in isolation could infer a separate, parallel fetch path for the propose template rather than the unified SKILL_NAMES lookup the next requirement mandates.

Since Requirement at lines 27–32 establishes openspec-propose as part of SKILL_NAMES, line 25 should describe the post-change state:

✏️ Proposed fix
 #### Scenario: Propose skill in templates
 - **WHEN** getting skill templates
 - **THEN** the system SHALL include `openspec-propose` template
-- **THEN** the template SHALL be in addition to templates listed in SKILL_NAMES constant
+- **THEN** the template SHALL be retrievable via the SKILL_NAMES constant
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/changes/simplify-skill-installation/specs/skill-generation/spec.md`
around lines 22 - 32, The requirement text is self-contradictory about where the
openspec-propose template lives; update the Scenario "Propose skill in
templates" so it describes the post-change behavior that the `openspec-propose`
template is returned via the unified SKILL_NAMES lookup (not "in addition to"
SKILL_NAMES), and remove any phrasing that implies a separate fetch path; ensure
the Requirement and Scenario consistently state that `SKILL_NAMES` includes
`openspec-propose`.

@TabishB
Copy link
Contributor Author

TabishB commented Feb 18, 2026

@1code review again

@1code-async
Copy link
Contributor

1code-async bot commented Feb 18, 2026

Task completed.

Sure — here's a quick summary of the 6 issues and 4 nits:

Issues

  1. Missing ## Purpose sections — All 9 spec files skip the required ## Purpose section that the canonical schema expects. They'll fail validation if merged into openspec/specs/.

  2. Design decision numbering skips 7 — Goes 1, 2, 3, 4, 5, 6, 6a, 6b, 8. Decision 7 is missing.

  3. Propose spec omits specs/ from onboarding message — The "first-time user guidance" scenario lists proposal.md, design.md, tasks.md but the actual artifact list includes specs/ too.

  4. No scenario for --tools flag in interactive modecli-init/spec.md only covers --tools for non-interactive. What happens if someone runs openspec init --tools claude interactively?

  5. profile set doesn't clarify next-init behavior — The spec says it updates config but doesn't touch the filesystem. It should explicitly state the new profile takes effect on the next openspec init.

  6. Design snippet vs spec mismatch on tool detectiondesign.md shows a TOOL_DIRS constant, but available-tools/spec.md says to use the existing AI_TOOLS config with skillsDir. The design snippet should match the spec.

Nits

  1. Only Claude and Cursor have named detection scenarios — Windsurf is mentioned in design but has no explicit scenario in available-tools/spec.md.

  2. Tasks 10.2–10.3 feel out of scope — Modifying the ff skill and adding guardrails isn't directly about profile/init simplification. Could be a follow-up change.

  3. Capability name mismatchproposal.md lists init as a modified capability but the canonical spec directory is cli-init.

  4. Decision 8 numbering — This is really just "fix the 7→8 skip" from issue feat: add change proposal for openspec init command #2 above.


View full conversation

Powered by 1Code

- Update design to use existing CLAUDE.md mechanisms
- Add cli-update spec for managing skill updates
- Clarify profile system and user config interactions
- Add explorations directory with design notes
- Update docs with clearer concepts
Clarify that init auto-detects tools and asks for confirmation,
rather than being completely question-free. Update examples to
show the tool confirmation UI.
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
openspec/specs/openspec-conventions/spec.md (1)

39-497: ⚠️ Potential issue | 🟡 Minor

Pre-existing: file self-violates its own Validating header uniqueness constraint (7 duplicate pairs).

The ## Requirements section (lines 6–247) and the thematic sections below (lines 248–497) contain identical ### Requirement: headers for every shared requirement:

Header First occurrence Duplicate
Project Structure Line 39 Line 258
Structured Format for Behavioral Specs Line 65 Line 288
Header-Based Requirement Identification Line 94 Line 319
Change Storage Convention Line 123 Line 348
Archive Process Enhancement Line 166 Line 391
Proposal Format Line 189 Line 414
Change Review Line 208 Line 447

Per lines 117–121 of this same spec, validation tools SHALL flag duplicate headers as errors, and the archive command relies on normalized header matching (lines 170–179) to apply delta changes — duplicates would cause double-application or ambiguous resolution. The two new requirements added by this PR do not introduce new duplicates, but the structural issue will affect any tooling that processes this file.

This appears to be caused by the file having two organizational layers (a flat ## Requirements index followed by thematic sub-sections) rather than one. Consider collapsing to a single authoritative location per requirement, or explicitly designating the thematic sections as non-normative prose.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/specs/openspec-conventions/spec.md` around lines 39 - 497, The spec
currently duplicates seven `### Requirement:` headers (Project Structure;
Structured Format for Behavioral Specs; Header-Based Requirement Identification;
Change Storage Convention; Archive Process Enhancement; Proposal Format; Change
Review), violating the file's own "Validating header uniqueness" rule; collapse
or remove the duplicate set by keeping one authoritative requirement entry per
named header (e.g., retain the first canonical `### Requirement: Project
Structure` and remove or merge the later `### Requirement: Project Structure`
duplicate), or mark the thematic second set explicitly as non-normative prose
(e.g., convert those `### Requirement:` headings to plain subheadings) so
programmatic matching uses a single normalized header per requirement; ensure
any moved content is merged under the retained header and run the
header-uniqueness validator to confirm no duplicates remain.
🧹 Nitpick comments (5)
openspec/specs/openspec-conventions/spec.md (2)

16-38: Minor: missing blank line between ### Requirement: header and SHALL statement.

The majority of requirements in this file (e.g., lines 7–9, 65–67, 94–96) have a blank line separating the ### Requirement: heading from the opening SHALL statement. The two new requirements at lines 16–17 and 28–29 omit this blank line, creating a visual inconsistency. (There is one pre-existing exception at line 230–231, but the dominant pattern includes the blank line.)

✏️ Proposed fix
-### Requirement: Behavior-First Specification Boundary
-OpenSpec specifications SHALL capture verifiable behavior contracts and avoid internal implementation detail.
+### Requirement: Behavior-First Specification Boundary
+
+OpenSpec specifications SHALL capture verifiable behavior contracts and avoid internal implementation detail.
-### Requirement: Progressive Rigor
-OpenSpec conventions SHALL keep specs lightweight by default and scale rigor only when risk or coordination complexity demands it.
+### Requirement: Progressive Rigor
+
+OpenSpec conventions SHALL keep specs lightweight by default and scale rigor only when risk or coordination complexity demands it.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/specs/openspec-conventions/spec.md` around lines 16 - 38, The two
new requirement blocks titled "Requirement: Behavior-First Specification
Boundary" and "Requirement: Progressive Rigor" are missing the blank line
between the `### Requirement:` header and the opening SHALL sentence; update
spec.md by inserting a single blank line immediately after each of those `###
Requirement:` headers so they match the existing pattern (e.g., the blocks for
"Requirement: Behavior-First Specification Boundary" and "Requirement:
Progressive Rigor" should have a newline before the first SHALL statement).

35-37: "Proportionally" is undefined — consider anchoring it with at least one concrete example.

The THEN clause authors increase detail and explicit validation expectations proportionally is open to interpretation. Without at least one example of what "increased rigor" looks like (e.g., requiring an explicit rollback plan, adding an ADR, mandating explicit sign-off steps in tasks.md), the requirement is not verifiable, which conflicts with the Behavior-First principle being introduced by the sibling requirement at lines 19–22.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/specs/openspec-conventions/spec.md` around lines 35 - 37, The THEN
clause in "Scenario: High-risk or cross-boundary change specification" is vague
because "proportionally" is undefined; update the clause to list concrete,
verifiable requirements (e.g., require an explicit rollback plan, a new or
updated ADR, a migration plan with verification steps, a testing matrix, and
documented explicit sign-offs in tasks.md) and/or add a bulleted example list
showing specific escalation levels (e.g., cross-team: add sign-off;
API-breaking: add ADR + rollback plan; security-sensitive: add threat model +
security review). Ensure you edit the heading "Scenario: High-risk or
cross-boundary change specification" and replace or augment the THEN line
`authors increase detail and explicit validation expectations proportionally`
with these concrete examples so reviewers can verify compliance.
openspec/changes/simplify-skill-installation/specs/cli-init/spec.md (1)

86-89: No output notification specified before overwriting customized workflow files.

The overwrite intent is now explicit (good), but the spec doesn't require any message indicating which files are being overwritten. A user who has customized a workflow file (e.g., explore.md) will lose those edits silently. Adding a "Overwriting: explore, apply, ..." line to the output — without requiring a confirmation prompt — would at least make the side-effect visible.

✏️ Optional addition
 #### Scenario: Existing custom installation
 - **WHEN** user has custom profile with extra workflows and runs `openspec init` with core profile
 - **THEN** the system SHALL NOT remove extra workflows
+- **THEN** the system SHALL display: "Overwriting: <list of core workflow files being regenerated>"
 - **THEN** the system SHALL regenerate core workflow files, overwriting existing content with latest templates
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/changes/simplify-skill-installation/specs/cli-init/spec.md` around
lines 86 - 89, Update the "Scenario: Existing custom installation" behavior to
require a non-interactive notification before overwriting core workflow files:
when running `openspec init` with core profile and core workflow files will be
regenerated (e.g., explore.md, apply.md), the spec must add a THEN clause that
the CLI outputs a line like "Overwriting: explore.md, apply.md, ..." listing the
files to be overwritten (no confirmation prompt required), and ensure this
notification appears immediately prior to the overwrite action so users see
which customized files will be replaced.
openspec/changes/simplify-skill-installation/specs/user-config/spec.md (1)

15-18: Consider specifying behavior when custom profile has an empty or absent workflows array.

As written, profile: "custom" with no workflows field silently produces a zero-workflow installation. A user who accidentally ends up in this state (e.g., after uninstalling all workflows) gets no feedback. Adding a warning case would make the behavior explicit.

✏️ Optional addition
+#### Scenario: Custom profile with empty workflows
+- **WHEN** config contains `profile: "custom"` and `workflows` is an empty array (or absent)
+- **THEN** the system SHALL display a warning: "No workflows configured. Run `openspec config profile` to select workflows."
+- **AND** the system SHALL NOT generate any skill or command files
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/changes/simplify-skill-installation/specs/user-config/spec.md`
around lines 15 - 18, The spec currently treats profile: "custom" with a missing
or empty workflows array as silently resulting in zero workflows; update the
behavior so that when profile: "custom" and the "workflows" field is absent or
an empty array the system still treats it as [] but emits a clear warning/notice
to the user (or installer log) indicating no workflows are enabled and
suggesting next steps (e.g., how to add workflows); locate the code that checks
for profile: "custom" and reads the "workflows" array and add the warning branch
for workflows === undefined || workflows.length === 0, leaving the empty-array
semantics intact.
openspec/changes/simplify-skill-installation/specs/profiles/spec.md (1)

50-53: No failure path defined for auto-triggered openspec update.

Lines 51-52 specify that when the user confirms, the system SHALL run openspec update automatically — but there's no scenario covering what happens if that update fails. Without guidance, implementors will diverge on whether to roll back the global config change, leave the config updated and report the error, or something else.

✏️ Optional addition
+#### Scenario: Auto-triggered update fails
+- **WHEN** user confirms "Apply to this project now?"
+- **AND** `openspec update` exits with a non-zero code
+- **THEN** the system SHALL display the update error
+- **THEN** the system SHALL preserve the global config change (do NOT roll back)
+- **THEN** the system SHALL display: "Config saved. Fix the error above, then run `openspec update` manually."
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/changes/simplify-skill-installation/specs/profiles/spec.md` around
lines 50 - 53, Add an explicit failure path for the auto-triggered "openspec
update" invoked after updating the global config: when the update command
invoked by the confirmation prompt ("Apply to this project now? (y/n)" → run
`openspec update`) fails, the implementation must (a) surface a clear error to
the user including the underlying error message, (b) leave the global config in
a consistent state by either rolling back the global config change or
documenting that the config was changed but the project update failed, and (c)
offer remediation options (retry `openspec update`, run it manually later, or
rollback) in the user-facing message; update the spec text around the "WHEN user
confirms" / "THEN the system SHALL run `openspec update` automatically" steps to
state which of these behaviors is required and what user-facing messages/actions
should be presented.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@openspec/changes/simplify-skill-installation/proposal.md`:
- Around line 104-122: The fenced code block showing the interactive picker
example (the block that begins with "$ openspec config profile" and contains the
"Delivery: [skills] [commands] [both]" and workflow checklist) is missing a
language specifier; add a language tag (e.g., "text") to the opening fence so
the block becomes ```text and the content is treated as plain text for MD040
compliance.

In `@openspec/changes/simplify-skill-installation/specs/cli-update/spec.md`:
- Around line 36-42: The scenario "Delivery changed to skills-only" incorrectly
scopes deletion to "command files for workflows in the profile"; update the spec
for the "Delivery changed to skills-only" scenario (triggered by running
`openspec update` with global config `delivery: skills`) to require deletion of
all command files in the project (not just those belonging to profile
workflows), ensure the spec also clarifies that skill files are
generated/updated and the final message remains "Removed: <count> command files
(delivery: skills)"; reference the scenario title, the `openspec update` action,
the `delivery: skills` config, and the expected removal message when making the
change.

In `@openspec/explorations/workspace-architecture.md`:
- Around line 30-35: The "After (simplified)" snippet still lists the deprecated
`extended` preset (the line `openspec config profile extended # preset
shortcut`), which contradicts design.md §2 and profiles/spec.md that define only
`core` and `custom`; update that snippet to remove or replace the `extended`
entry so it reflects the final two-profile design (e.g., change to `openspec
config profile custom # preset shortcut` or remove the line entirely), and
verify the surrounding "What We've Decided" text no longer references
`extended`.

In `@openspec/specs/docs-agent-instructions/spec.md`:
- Line 58: Replace the unhyphenated compound modifier "security/privacy
sensitive work" with the hyphenated form "security/privacy-sensitive work" in
the markdown text (look for the line containing "**AND** reserve deeper, fuller
specification style for higher-risk changes (such as API breaks, migrations,
cross-team, or security/privacy sensitive work)"); ensure the hyphen is added so
the compound modifier correctly reads "security/privacy-sensitive work".

---

Outside diff comments:
In `@openspec/specs/openspec-conventions/spec.md`:
- Around line 39-497: The spec currently duplicates seven `### Requirement:`
headers (Project Structure; Structured Format for Behavioral Specs; Header-Based
Requirement Identification; Change Storage Convention; Archive Process
Enhancement; Proposal Format; Change Review), violating the file's own
"Validating header uniqueness" rule; collapse or remove the duplicate set by
keeping one authoritative requirement entry per named header (e.g., retain the
first canonical `### Requirement: Project Structure` and remove or merge the
later `### Requirement: Project Structure` duplicate), or mark the thematic
second set explicitly as non-normative prose (e.g., convert those `###
Requirement:` headings to plain subheadings) so programmatic matching uses a
single normalized header per requirement; ensure any moved content is merged
under the retained header and run the header-uniqueness validator to confirm no
duplicates remain.

---

Duplicate comments:
In `@openspec/changes/simplify-skill-installation/proposal.md`:
- Around line 67-80: The prose is inconsistent: the `propose` workflow text
claims it "generates all artifacts" but the UX message for `/opsx:propose` lists
only proposal.md, design.md, and tasks.md and defers specs/ to `/opsx:apply`;
decide which behavior is correct and make the copy consistent—either change the
claim to say `propose` generates the three artifacts (proposal.md, design.md,
tasks.md) and update the timeline to reflect specs/ are created by
`/opsx:apply`, or explicitly state that `propose` also generates specs/ (delta
specs) and update the UX message and timeline to include specs/ alongside
proposal.md, design.md, tasks.md; ensure the terms `/opsx:propose`,
`/opsx:apply`, `proposal.md`, `design.md`, `tasks.md`, and `specs/` are updated
consistently.

---

Nitpick comments:
In `@openspec/changes/simplify-skill-installation/specs/cli-init/spec.md`:
- Around line 86-89: Update the "Scenario: Existing custom installation"
behavior to require a non-interactive notification before overwriting core
workflow files: when running `openspec init` with core profile and core workflow
files will be regenerated (e.g., explore.md, apply.md), the spec must add a THEN
clause that the CLI outputs a line like "Overwriting: explore.md, apply.md, ..."
listing the files to be overwritten (no confirmation prompt required), and
ensure this notification appears immediately prior to the overwrite action so
users see which customized files will be replaced.

In `@openspec/changes/simplify-skill-installation/specs/profiles/spec.md`:
- Around line 50-53: Add an explicit failure path for the auto-triggered
"openspec update" invoked after updating the global config: when the update
command invoked by the confirmation prompt ("Apply to this project now? (y/n)" →
run `openspec update`) fails, the implementation must (a) surface a clear error
to the user including the underlying error message, (b) leave the global config
in a consistent state by either rolling back the global config change or
documenting that the config was changed but the project update failed, and (c)
offer remediation options (retry `openspec update`, run it manually later, or
rollback) in the user-facing message; update the spec text around the "WHEN user
confirms" / "THEN the system SHALL run `openspec update` automatically" steps to
state which of these behaviors is required and what user-facing messages/actions
should be presented.

In `@openspec/changes/simplify-skill-installation/specs/user-config/spec.md`:
- Around line 15-18: The spec currently treats profile: "custom" with a missing
or empty workflows array as silently resulting in zero workflows; update the
behavior so that when profile: "custom" and the "workflows" field is absent or
an empty array the system still treats it as [] but emits a clear warning/notice
to the user (or installer log) indicating no workflows are enabled and
suggesting next steps (e.g., how to add workflows); locate the code that checks
for profile: "custom" and reads the "workflows" array and add the warning branch
for workflows === undefined || workflows.length === 0, leaving the empty-array
semantics intact.

In `@openspec/specs/openspec-conventions/spec.md`:
- Around line 16-38: The two new requirement blocks titled "Requirement:
Behavior-First Specification Boundary" and "Requirement: Progressive Rigor" are
missing the blank line between the `### Requirement:` header and the opening
SHALL sentence; update spec.md by inserting a single blank line immediately
after each of those `### Requirement:` headers so they match the existing
pattern (e.g., the blocks for "Requirement: Behavior-First Specification
Boundary" and "Requirement: Progressive Rigor" should have a newline before the
first SHALL statement).
- Around line 35-37: The THEN clause in "Scenario: High-risk or cross-boundary
change specification" is vague because "proportionally" is undefined; update the
clause to list concrete, verifiable requirements (e.g., require an explicit
rollback plan, a new or updated ADR, a migration plan with verification steps, a
testing matrix, and documented explicit sign-offs in tasks.md) and/or add a
bulleted example list showing specific escalation levels (e.g., cross-team: add
sign-off; API-breaking: add ADR + rollback plan; security-sensitive: add threat
model + security review). Ensure you edit the heading "Scenario: High-risk or
cross-boundary change specification" and replace or augment the THEN line
`authors increase detail and explicit validation expectations proportionally`
with these concrete examples so reviewers can verify compliance.

Comment on lines +104 to +122
```
$ openspec config profile

Delivery: [skills] [commands] [both]
^^^^^^

Workflows: (space to toggle, enter to save)
[x] propose
[x] explore
[x] apply
[x] archive
[ ] new
[ ] ff
[ ] continue
[ ] verify
[ ] sync
[ ] bulk-archive
[ ] onboard
```
Copy link
Contributor

@coderabbitai coderabbitai bot Feb 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fenced code block at line 104 is still missing a language specifier (MD040).

The interactive picker example block has no language tag despite the prior round of MD040 fixes (which addressed lines 7, 27, 74, and 97).

✏️ Suggested fix
-```
+```text
 $ openspec config profile
 
 Delivery: [skills] [commands] [both]
 ...
🧰 Tools
🪛 markdownlint-cli2 (0.21.0)

[warning] 104-104: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/changes/simplify-skill-installation/proposal.md` around lines 104 -
122, The fenced code block showing the interactive picker example (the block
that begins with "$ openspec config profile" and contains the "Delivery:
[skills] [commands] [both]" and workflow checklist) is missing a language
specifier; add a language tag (e.g., "text") to the opening fence so the block
becomes ```text and the content is treated as plain text for MD040 compliance.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@coderabbitai stop suggesting this

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@TabishB, understood! This suggestion is coming from the markdownlint-cli2 static analysis tool that's checking the PR.

If you'd like to stop seeing MD040 warnings, you can configure markdownlint to ignore this rule by:

  1. Adding a .markdownlint.yaml or .markdownlint.json file to your repository with:

    MD040: false
  2. Or adding a comment to disable it for specific blocks:

    <!-- markdownlint-disable MD040 -->

    your code block here

    <!-- markdownlint-enable MD040 -->
    

Alternatively, if you'd prefer I simply not mention MD040 violations in my reviews regardless of what the linter reports, I can add that as a learning for this project. Let me know which approach you prefer!


🧠 Learnings used
Learnt from: CR
Repo: Fission-AI/OpenSpec PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-25T01:08:02.839Z
Learning: Use `@/openspec/AGENTS.md` to learn how to create and apply change proposals, spec format and conventions, and project structure and guidelines

Comment on lines +36 to +42
#### Scenario: Delivery changed to skills-only
- **WHEN** user runs `openspec update`
- **AND** global config specifies `delivery: skills`
- **AND** project has command files installed
- **THEN** the system SHALL delete command files for workflows in the profile
- **THEN** the system SHALL generate/update skill files only
- **THEN** the system SHALL display: "Removed: <count> command files (delivery: skills)"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Scenario "Delivery changed to skills-only" scope is misleadingly narrower than intended.

Line 40 says the system SHALL delete command files "for workflows in the profile," but the "Delivery change with extra workflows" scenario (lines 67-72) clarifies that all command files are deleted — including those for extra workflows not in the profile. An implementor testing against only this scenario would skip cleanup of extra-workflow command files, producing a partially cleaned project.

✏️ Suggested fix
-- **THEN** the system SHALL delete command files for workflows in the profile
+- **THEN** the system SHALL delete command files for all installed workflows (including extras not in profile)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
#### Scenario: Delivery changed to skills-only
- **WHEN** user runs `openspec update`
- **AND** global config specifies `delivery: skills`
- **AND** project has command files installed
- **THEN** the system SHALL delete command files for workflows in the profile
- **THEN** the system SHALL generate/update skill files only
- **THEN** the system SHALL display: "Removed: <count> command files (delivery: skills)"
#### Scenario: Delivery changed to skills-only
- **WHEN** user runs `openspec update`
- **AND** global config specifies `delivery: skills`
- **AND** project has command files installed
- **THEN** the system SHALL delete command files for all installed workflows (including extras not in profile)
- **THEN** the system SHALL generate/update skill files only
- **THEN** the system SHALL display: "Removed: <count> command files (delivery: skills)"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/changes/simplify-skill-installation/specs/cli-update/spec.md` around
lines 36 - 42, The scenario "Delivery changed to skills-only" incorrectly scopes
deletion to "command files for workflows in the profile"; update the spec for
the "Delivery changed to skills-only" scenario (triggered by running `openspec
update` with global config `delivery: skills`) to require deletion of all
command files in the project (not just those belonging to profile workflows),
ensure the spec also clarifies that skill files are generated/updated and the
final message remains "Removed: <count> command files (delivery: skills)";
reference the scenario title, the `openspec update` action, the `delivery:
skills` config, and the expected removal message when making the change.

Comment on lines +30 to +35
**After (simplified):**
```
openspec config profile # interactive picker (delivery + workflows)
openspec config profile core # preset shortcut
openspec config profile extended # preset shortcut
```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

extended preset in "What We've Decided" contradicts the final two-profile design.

Line 34 still shows openspec config profile extended # preset shortcut in the "After (simplified)" section, but design.md §2 explicitly dropped extended ("Extended is redundant") and the normative profiles/spec.md defines only core and custom. Readers consulting this "decided" section for the final command surface will believe extended is a valid shortcut when it is not.

✏️ Suggested fix
 openspec config profile          # interactive picker (delivery + workflows)
 openspec config profile core     # preset shortcut
-openspec config profile extended # preset shortcut
🧰 Tools
🪛 markdownlint-cli2 (0.21.0)

[warning] 31-31: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/explorations/workspace-architecture.md` around lines 30 - 35, The
"After (simplified)" snippet still lists the deprecated `extended` preset (the
line `openspec config profile extended # preset shortcut`), which contradicts
design.md §2 and profiles/spec.md that define only `core` and `custom`; update
that snippet to remove or replace the `extended` entry so it reflects the final
two-profile design (e.g., change to `openspec config profile custom # preset
shortcut` or remove the line entirely), and verify the surrounding "What We've
Decided" text no longer references `extended`.

#### Scenario: Applying progressive rigor
- **WHEN** an agent drafts specs for routine changes
- **THEN** instructions SHALL favor concise, lightweight requirements and scenarios
- **AND** reserve deeper, fuller specification style for higher-risk changes (such as API breaks, migrations, cross-team, or security/privacy sensitive work)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Missing hyphen in compound modifier.

security/privacy sensitive work should be security/privacy-sensitive work — the compound modifier preceding the noun requires a hyphen.

✏️ Proposed fix
-  - **AND** reserve deeper, fuller specification style for higher-risk changes (such as API breaks, migrations, cross-team, or security/privacy sensitive work)
+  - **AND** reserve deeper, fuller specification style for higher-risk changes (such as API breaks, migrations, cross-team, or security/privacy-sensitive work)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- **AND** reserve deeper, fuller specification style for higher-risk changes (such as API breaks, migrations, cross-team, or security/privacy sensitive work)
- **AND** reserve deeper, fuller specification style for higher-risk changes (such as API breaks, migrations, cross-team, or security/privacy-sensitive work)
🧰 Tools
🪛 LanguageTool

[grammar] ~58-~58: Use a hyphen to join words.
Context: ...rations, cross-team, or security/privacy sensitive work) #### Scenario: Time-to-...

(QB_NEW_EN_HYPHEN)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openspec/specs/docs-agent-instructions/spec.md` at line 58, Replace the
unhyphenated compound modifier "security/privacy sensitive work" with the
hyphenated form "security/privacy-sensitive work" in the markdown text (look for
the line containing "**AND** reserve deeper, fuller specification style for
higher-risk changes (such as API breaks, migrations, cross-team, or
security/privacy sensitive work)"); ensure the hyphen is added so the compound
modifier correctly reads "security/privacy-sensitive work".

- Add tasks to update explore.ts references to /opsx:propose
- Create exploration note for deeper explore → propose UX questions
- Captures open questions about exploration artifacts, lifecycle,
  context handoff, and transition smoothness
@TabishB TabishB changed the title feat: simplify skill installation with profiles and zero-question init feat: simplify skill installation with profiles and smart defaults init Feb 18, 2026
- Add ## Purpose sections to all 10 spec files (required by schema)
- Add specs/ to propose workflow's first-time user guidance scenario
- Add --tools flag scenario for interactive mode in cli-init/spec.md
- Clarify that profile changes take effect on next init/update
- Fix design snippet to use AI_TOOLS config instead of TOOL_DIRS constant
- Add explicit Windsurf detection scenario to available-tools/spec.md
- Mark tasks 10.2-10.3 as follow-up work (out of scope)
- Fix capability name: init → cli-init in proposal.md
@TabishB TabishB merged commit 5fd8e9d into main Feb 18, 2026
9 checks passed
@TabishB TabishB deleted the simplify-onboarding branch February 18, 2026 10:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

Comments