Commit 39bebef
authored
feat(cli): merge init and experimental commands (Fission-AI#565)
* 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 tests1 parent cf8b621 commit 39bebef
75 files changed
Lines changed: 5355 additions & 7387 deletions
File tree
- openspec
- changes/merge-init-experimental
- specs/legacy-cleanup
- src
- cli
- commands
- experimental
- workflow
- core
- configurators
- slash
- init
- templates
- ui
- utils
- test
- cli-e2e
- commands
- core
- utils
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
2 | | - | |
3 | | - | |
4 | | - | |
5 | | - | |
6 | | - | |
7 | | - | |
8 | | - | |
9 | | - | |
10 | | - | |
11 | | - | |
12 | | - | |
13 | | - | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
18 | | - | |
Large diffs are not rendered by default.
0 commit comments