When --json is passed, ora spinners wrote progress text to stderr, which
broke JSON parsing for AI agents that combine stdout+stderr. Conditionally
skip spinner creation in status, instructions, and templates commands.
Closes#957
* feat(core): add legacy cleanup detection functions for init migration
Implement src/core/legacy-cleanup.ts with detection and cleanup functions
for all legacy OpenSpec artifact types:
Detection functions:
- detectLegacyConfigFiles() - checks for config files with OpenSpec markers
(CLAUDE.md, CLINE.md, CODEBUDDY.md, COSTRICT.md, QODER.md, IFLOW.md,
AGENTS.md, QWEN.md)
- detectLegacySlashCommands() - checks for old /openspec:* command
directories and files across all 21 tool integrations
- detectLegacyStructureFiles() - checks for openspec/AGENTS.md and
openspec/project.md (project.md preserved for migration hint)
- detectLegacyArtifacts() - orchestrates all detection
Utility functions:
- hasOpenSpecMarkers() - checks if content has OpenSpec markers
- isOnlyOpenSpecContent() - checks if file is 100% OpenSpec content
- removeMarkerBlock() - surgically removes marker blocks from mixed content
Cleanup functions:
- cleanupLegacyArtifacts() - orchestrates removal with proper edge cases:
- Deletes files that are 100% OpenSpec content
- Removes marker blocks from files with mixed content
- Deletes legacy slash command directories and files
- Preserves openspec/project.md (shows migration hint only)
Formatting functions:
- formatDetectionSummary() - formats what was detected before cleanup
- formatCleanupSummary() - formats what was cleaned up after
This is task 1.1 for the merge-init-experimental change.
* feat(utils): add removeMarkerBlock() for surgically removing marker blocks
- Add removeMarkerBlock() function to file-system.ts that properly handles
inline marker mentions by using findMarkerIndex/isMarkerOnOwnLine
- Refactor legacy-cleanup.ts to use the shared utility
- Export removeMarkerBlock from utils/index.ts for reusability
- Add comprehensive tests for inline marker mention edge cases
- Add tests for shell-style markers and various whitespace scenarios
The new implementation correctly ignores markers mentioned inline within
text and only removes actual marker blocks that are on their own lines.
* feat(core): add formatProjectMdMigrationHint() for migration messaging
- Add standalone formatProjectMdMigrationHint() function for reusable
migration hint output directing users to migrate project.md content
to config.yaml's "context:" field
- Update formatDetectionSummary() to include the migration hint when
project.md is detected (not just in cleanup summary)
- Refactor formatCleanupSummary() to use the new function for
consistency
- Add unit tests for the new function and updated behavior
* test(init): rewrite init tests for experimental workflow approach
Rewrites the init command tests to verify the new experimental workflow
implementation. The new tests cover:
- OpenSpec directory structure creation (specs, changes, archive)
- config.yaml generation with default schema
- 9 Agent Skills creation for various tools (Claude, Cursor, Windsurf, etc.)
- 9 slash commands generation using tool-specific adapters
- Multi-tool support (--tools all, --tools none, specific tools)
- Extend mode (re-running init)
- Tool-specific adapters (Gemini TOML, Continue .prompt, etc.)
- Error handling for invalid tools and permissions
Removes old tests for legacy config file generation (AGENTS.md, CLAUDE.md,
project.md, etc.) as the new init command uses Agent Skills instead.
* test(update): rewrite tests for skills/commands refresh behavior
Update the update command tests to match the new implementation that
refreshes skills and opsx commands instead of config files.
Changes:
- Remove old ToolRegistry import (deleted module)
- Rewrite tests to verify skill file updates
- Rewrite tests to verify opsx command generation
- Add tests for multi-tool support (Claude, Cursor, Qwen, Windsurf)
- Add tests for error handling and tool detection
- Fix test assertions to match actual skill template names
The update command now:
- Detects configured tools by checking skill directories
- Updates SKILL.md files with latest skill templates
- Generates opsx commands using tool-specific adapters
* docs(readme): update documentation for new init behavior
- Replace tool list with simplified supported tools section (skills-based)
- Update init instructions to document --tools flag, --force, and legacy cleanup
- Replace project.md with config.yaml documentation
- Update workflow examples to use /opsx:* commands instead of /openspec:*
- Add command reference table for slash commands
- Update Team Adoption and Updating sections for new workflow
- Replace Experimental Features with Workflow Customization section
* refactor(cli): remove legacy configurators and merge experimental into workflow
- Delete src/core/configurators/ directory (ToolRegistry, all config generators)
- Delete legacy templates (agents-template, claude-template, project-template, etc.)
- Move experimental commands to src/commands/workflow/ with cleaner structure
- Remove experimental setup.ts and index.ts (functionality merged into init)
- Update CLI to register workflow commands directly instead of through experimental
- Update openspec update command to refresh skills/commands instead of config files
- Update tests for new command structure
* refactor: extract shared modules and move AGENTS.md to root
- Move AGENTS.md from openspec/ to project root
- Add shared module with tool-detection and skill-generation utilities
- Update legacy-cleanup with improved cleanup logic
- Enhance update.ts with additional functionality
- Add comprehensive tests for shared modules
* fix(ui): update welcome screen tagline
Change from experimental reference to reflect the merged workflow.
* fix: improve Windows cross-platform compatibility
- Handle both forward and backward slashes in path parsing
- Normalize paths before regex matching for legacy artifact detection
- Use regex split for both path separators in tool directory extraction
- Handle CRLF line endings when cleaning up multiple blank lines
- Add retry logic for test file cleanup to handle Windows file locking
* fix(init): use dynamic counts for skills and commands in success message
Replace hard-coded "9 skills and 9 commands" with dynamic values from
getSkillTemplates().length and getCommandContents().length to prevent
the message from diverging from reality when skills/commands change.
* fix: various small improvements across init, cleanup, and file handling
- Remove shell prompt characters from README bash examples (MD014)
- Show actual config filename (config.yaml vs config.yml) in init output
- Include hasProjectMd in hasLegacyArtifacts to show migration hint
- Add existence check before AGENTS.md deletion to avoid spurious errors
- Preserve leading whitespace and original newline style in file operations
- Use dynamic tool list from CommandAdapterRegistry in tests
This change adds support for factory functions in slash command configuration,
allowing slash commands to be defined as functions that return command objects.
* feat: add non-interactive options to openspec init
- Add --tools, --all-tools, and --skip-tools CLI options
- Enable automated initialization for CI/CD pipelines
- Maintain backward compatibility with interactive mode
- Add comprehensive validation and error handling
- Update cli-init spec with non-interactive requirements
- Add unit and integration tests for new functionality
Closes change proposal: add-non-interactive-init-options
* feat(init): add single --tools flag for non-interactive init
* test(init): verify --tools help lists available ids
* Revert manual spec.md edits
The canonical spec shouldn't be edited directly when a change delta
already captures the update. Archiving that delta will sync the spec.
---------
Co-authored-by: Tabish Bidiwale <30385142+TabishB@users.noreply.github.com>
Co-authored-by: Tabish Bidiwale <tabishbidiwale@gmail.com>
* feat: implement Phase 1 E2E testing with cross-platform CI matrix
- Add shared runCLI helper in test/helpers/run-cli.ts for spawn testing
- Create test/cli-e2e/basic.test.ts covering help, version, validate flows
- Migrate existing CLI exec tests to use runCLI helper
- Extend CI matrix to bash (Linux/macOS) and pwsh (Windows)
- Update Phase 1 tasks and proposal with implementation status
* fix: correct YAML syntax in CI workflow diagnostics command
* fix: use multiline YAML for diagnostics command
* fix ci
* fix: ci
* fix: update core validation and json converter
* chore(ci): split pr and main workflows
* refactor: simplify CI workflow with unified matrix strategy
- Consolidate test_pr and test_matrix into single test job
- Add proper shell configuration with defaults
- Add timeout protection (15 minutes)
- Simplify required-checks to single job
- Maintain cross-platform testing (bash on Linux/macOS, pwsh on Windows)
* fix: restore lean PR workflow with async main branch matrix
- PRs run only essential tests on ubuntu-latest (fast feedback)
- Main branch runs full cross-platform matrix asynchronously
- Separate required-checks for each workflow type
- Different timeouts: 10min for PR, 15min for matrix