Skip to content

Add deepseek tui init support#1066

Open
banqii wants to merge 2 commits into
Fission-AI:mainfrom
banqii:add-deepseek-tui-init-support
Open

Add deepseek tui init support#1066
banqii wants to merge 2 commits into
Fission-AI:mainfrom
banqii:add-deepseek-tui-init-support

Conversation

@banqii
Copy link
Copy Markdown

@banqii banqii commented May 7, 2026

Summary

Add DeepSeek TUI support to openspec init by registering deepseek in AI_TOOLS with skillsDir: '.deepseek'.

  • openspec init --tools deepseek is now valid
  • Skills are generated under .deepseek/skills/...
  • No DeepSeek command adapter is added
  • Command generation remains adapter-gated and reports:
    Commands skipped for: deepseek (no adapter)

Also updates tool docs and adds focused init/tool-detection tests.

Test Plan

pnpm exec vitest run test/core/init.test.ts test/core/shared/tool-detection.test.ts
pnpm run build

Notes

  • Full pnpm test on this machine includes unrelated environment-sensitive zsh completion test failures (Oh My Zsh detection path).
  • Added .cursor/ to .gitignore to avoid committing local Cursor workspace files.
  • AI-assisted change (Cursor agent), reviewed and validated locally.
  • The OpenSpec change folder openspec/changes/add-deepseek-tui-init-support is not archived yet.

Summary by CodeRabbit

  • New Features

    • DeepSeek TUI is now available as a supported AI tool option alongside other integrated tools
    • Skills are automatically generated in the .deepseek/ directory when DeepSeek TUI is selected
  • Documentation

    • Updated supported tools documentation to include DeepSeek TUI
    • Added DeepSeek TUI to the CLI reference as an available tool ID option
  • Chores

    • Updated .gitignore to exclude the .cursor/ directory

ornn.ban and others added 2 commits May 7, 2026 17:56
Register DeepSeek TUI as a supported init tool with .deepseek skills output and adapterless command-skip behavior. Update docs and init parity tests to keep tool onboarding semantics consistent with existing supported tools.

Co-authored-by: Cursor <cursoragent@cursor.com>
Add .cursor to gitignore to avoid committing local Cursor workspace files and settings generated during development.

Co-authored-by: Cursor <cursoragent@cursor.com>
@banqii banqii requested a review from TabishB as a code owner May 7, 2026 11:23
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 7, 2026

Review Change Stack

📝 Walkthrough

Walkthrough

This PR extends OpenSpec's init command to support DeepSeek TUI as a new, skills-capable AI tool. The implementation registers DeepSeek in the tool metadata, specifies adapter-gated command generation (skills only, no commands), updates documentation, and adds test coverage for adapterless tool behavior.

Changes

DeepSeek TUI Initialization Support

Layer / File(s) Summary
Proposal & Design
openspec/changes/add-deepseek-tui-init-support/proposal.md, design.md, tasks.md, .openspec.yaml
Defines feature scope: DeepSeek as a selectable, skills-only tool in init workflows with metadata following existing tool conventions (.deepseek/skills/ output path).
Tool Registration & Specifications
src/core/config.ts, openspec/changes/add-deepseek-tui-init-support/specs/ai-tool-paths/spec.md, specs/cli-init/spec.md
Adds DeepSeek entry to AI_TOOLS array with value: 'deepseek' and skillsDir: '.deepseek'. Specifies that command generation is skipped when no adapter is registered, with required "Commands skipped for: deepseek (no adapter)" output message.
User Documentation
docs/supported-tools.md, docs/cli.md, docs/commands.md
Inserts DeepSeek into supported-tools table and CLI --tools reference list. Also adds lingma entry to docs/cli.md tool IDs.
Test Coverage
test/core/init.test.ts, test/core/shared/tool-detection.test.ts
Adds adapterless skills-only test case for DeepSeek, parity semantics test across Cursor/Kimi/DeepSeek, skill content regression test to verify DeepSeek output matches Claude template, and tool-detection assertion for deepseek inclusion.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • Fission-AI/OpenSpec#1003: Adds a different skills-only AI tool with similar changes to AI_TOOLS, specs/ai-tool-paths, specs/cli-init, and init test coverage for adapterless behavior.
  • Fission-AI/OpenSpec#261: Adds a new AI tool entry to the shared AI_TOOLS export and accompanying registration/docs/tests.
  • Fission-AI/OpenSpec#601: Adds a skills-only AI tool (Trae) with similar modifications to config.ts, docs, and init test assertions for adapterless tool handling.

Suggested reviewers

  • TabishB

Poem

🐰 Deep in the seeks, a tool takes flight,
DeepSeek TUI shines so bright!
Skills are woven, commands are passed,
Init flows smooth from first to last—
No adapter needed, just pure grace! ✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Add deepseek tui init support' directly and clearly describes the main change: adding DeepSeek TUI support to the openspec init command.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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.

Copy link
Copy Markdown
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: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@test/core/init.test.ts`:
- Around line 219-239: The parity it.each test relies on implicit default
delivery mode; explicitly call saveGlobalConfig({ delivery: 'both' }) before
invoking InitCommand.execute to ensure command-generation is attempted for
cursor and the test's hasCommands assertions are deterministic — modify the test
block that constructs InitCommand (InitCommand, initCommand.execute, testDir) to
invoke saveGlobalConfig({ delivery: 'both' }) right before await
initCommand.execute(testDir).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 4ceb13c7-2e7e-4a87-8421-b82eee80b24c

📥 Commits

Reviewing files that changed from the base of the PR and between 053d8a5 and b24bcf9.

📒 Files selected for processing (13)
  • .gitignore
  • docs/cli.md
  • docs/commands.md
  • docs/supported-tools.md
  • openspec/changes/add-deepseek-tui-init-support/.openspec.yaml
  • openspec/changes/add-deepseek-tui-init-support/design.md
  • openspec/changes/add-deepseek-tui-init-support/proposal.md
  • openspec/changes/add-deepseek-tui-init-support/specs/ai-tool-paths/spec.md
  • openspec/changes/add-deepseek-tui-init-support/specs/cli-init/spec.md
  • openspec/changes/add-deepseek-tui-init-support/tasks.md
  • src/core/config.ts
  • test/core/init.test.ts
  • test/core/shared/tool-detection.test.ts

Comment thread test/core/init.test.ts
Comment on lines +219 to +239
it.each([
{ tool: 'cursor', skillsDir: '.cursor', commandPath: ['.cursor', 'commands', 'opsx-explore.md'], hasCommands: true },
{ tool: 'kimi', skillsDir: '.kimi', commandPath: ['.kimi', 'commands'], hasCommands: false },
{ tool: 'deepseek', skillsDir: '.deepseek', commandPath: ['.deepseek', 'commands'], hasCommands: false },
])(
'should keep init parity semantics for $tool',
async ({ tool, skillsDir, commandPath, hasCommands }) => {
const initCommand = new InitCommand({ tools: tool, force: true });
await initCommand.execute(testDir);

const skillFile = path.join(testDir, skillsDir, 'skills', 'openspec-explore', 'SKILL.md');
expect(await fileExists(skillFile)).toBe(true);

const commandTarget = path.join(testDir, ...commandPath);
if (hasCommands) {
expect(await fileExists(commandTarget)).toBe(true);
} else {
expect(await directoryExists(commandTarget)).toBe(false);
}
},
);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add explicit saveGlobalConfig to make the parity test's delivery assumption concrete.

The standalone DeepSeek (line 195) and Kimi (line 171) adapterless tests both call saveGlobalConfig({ delivery: 'both' }) before initCommand.execute, establishing the scenario where command generation is attempted but skipped due to no adapter. The it.each parity test omits this setup, so the cursor hasCommands: true assertion silently relies on whatever default config the fresh temp dir produces. If the default delivery mode is ever 'skills', cursor won't emit command files and the assertion fails; conversely, the kimi/deepseek hasCommands: false assertions would pass vacuously for the wrong reason (delivery gating rather than adapter absence).

🛡️ Proposed fix
   )(
     'should keep init parity semantics for $tool',
     async ({ tool, skillsDir, commandPath, hasCommands }) => {
+      saveGlobalConfig({
+        featureFlags: {},
+        profile: 'core',
+        delivery: 'both',
+      });
       const initCommand = new InitCommand({ tools: tool, force: true });
       await initCommand.execute(testDir);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/core/init.test.ts` around lines 219 - 239, The parity it.each test
relies on implicit default delivery mode; explicitly call saveGlobalConfig({
delivery: 'both' }) before invoking InitCommand.execute to ensure
command-generation is attempted for cursor and the test's hasCommands assertions
are deterministic — modify the test block that constructs InitCommand
(InitCommand, initCommand.execute, testDir) to invoke saveGlobalConfig({
delivery: 'both' }) right before await initCommand.execute(testDir).

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