AgentSkillsCN

end-to-end-workflow

功能开发决策树——用于确定在 NovelSaga 中,针对不同功能类型应修改哪些文件。

SKILL.md
--- frontmatter
name: end-to-end-workflow
description: Decision tree for feature development - use to determine which files to modify for different feature types in NovelSaga

End-to-End Feature Development Workflow

Quick Reference

Feature TypeFiles to TouchBuild Order
New Config FieldCore types → TS export → Bridge servicecargo test export_bindingsxtask build-jscargo build
New CLI CommandCLI args → main dispatch → (optional) bridgecargo build -p novelsaga-cli
New Bridge ServiceBridge service → Core integration → CLI registrationxtask build-jscargo build
New LSP CapabilityLSP backend → Core integrationcargo build -p novelsaga-cli
New File FormatCore format enum → ConfigManager parsercargo build -p novelsaga-core

Decision Tree

Starting Point: What Are You Building?

code
┌─────────────────────────────────────────────────────────────────────┐
│  FEATURE TYPE DECISION TREE                                         │
└─────────────────────────────────────────────────────────────────────┘

Q: Does it involve configuration types?
├── YES → Go to [Config Workflow](#config-workflow)
│
└── NO → Q: Does it add a CLI command?
    ├── YES → Go to [CLI Workflow](#cli-workflow)
    │
    └── NO → Q: Does it need JS bridge integration?
        ├── YES → Go to [Bridge Workflow](#bridge-workflow)
        │
        └── NO → Q: Does it modify LSP behavior?
            ├── YES → Go to [LSP Workflow](#lsp-workflow)
            │
            └── NO → Q: Is it a new library feature?
                ├── YES → Go to [Core Library Workflow](#core-library-workflow)
                │
                └── NO → See [other skills](#cross-references)

Config Workflow

Use when: Adding/modifying config fields, new config file formats

Files to modify:

code
1. projects/core/src/config/mod.rs
   └─ Add field to RootConfig or OverridableConfig
   └─ Add #[derive(TS)] #[ts(export, export_to = "_config.ts")]

2. projects/core/src/config/formatter.rs (if fmt-related)
   └─ Add field to FormatterConfig

3. Run: cargo test export_bindings
   └─ Generates: projects/cli-js-bridges/config-bridge/src/types/_config.ts

4. (Optional) Extend types in projects/cli-js-bridges/config-bridge/src/types/config.ts
   └─ DO NOT modify _config.ts (generated)

5. (Optional) Update bridge service to use new fields
   └─ projects/cli-js-bridges/config-bridge/src/services/config.ts

CLI Workflow

Use when: Adding/modifying CLI commands or arguments

Files to modify:

code
1. projects/cli/src/args/mod.rs
   └─ Add variant to Commands enum
   └─ Add fields with #[arg(...)] attributes

2. projects/cli/src/main.rs
   └─ Add match arm in command dispatch
   └─ Implement command logic (or delegate to module)

3. (Optional) Add module for complex commands
   └─ projects/cli/src/commands/<command>.rs
   └─ Export in projects/cli/src/commands/mod.rs

Bridge Workflow

Use when: Adding a new JS bridge service or modifying bridge communication

Files to modify:

code
For NEW bridge service:

1. Create: projects/cli-js-bridges/<name>-bridge/
   ├─ package.json (name: "@nsaga/<name>-bridge")
   ├─ build.mts (uses @nsaga/build-tool)
   └─ src/index.ts (entry point)
   └─ src/services/<name>.ts (service implementation)

2. Rust side: projects/cli/src/bridge/manager/
   └─ Create <name>_bridge.rs implementing Bridge trait
   └─ Register in BridgeManager::new()

3. Build: xtask build-js

For EXISTING bridge modifications:

1. Service logic: projects/cli-js-bridges/<name>-bridge/src/services/*.ts
2. Type definitions: projects/cli-js-bridges/<name>-bridge/src/types/*.ts
3. Build: xtask build-js

LSP Workflow

Use when: Adding LSP capabilities (formatting, hover, diagnostics, etc.)

Files to modify:

code
1. projects/cli/src/lsp/backend.rs
   └─ Implement LanguageServer trait methods
   └─ Register capabilities in initialize()

2. (Optional) Add document handlers:
   └─ did_open, did_change, did_close
   └─ Store in: self.documents Arc<RwLock<HashMap<Url, String>>>

3. (Optional) Formatting implementation:
   └─ Call Core library: novelsaga_core::library::formatter::format_text()
   └─ Return TextEdit with full document replacement

Core Library Workflow

Use when: Adding new library functionality (formatters, parsers, utilities)

Files to modify:

code
1. projects/core/src/library/
   └─ Create: <feature>/mod.rs
   └─ Export in: projects/core/src/library/mod.rs

2. (Optional) Add FFI exposure:
   └─ projects/core/src/diplomat_ffi.rs
   └─ Wrap with #[diplomat::opaque]

3. Add tests in same file:
   └─ #[cfg(test)] mod tests { ... }

Type Export Workflow

Core → TypeScript Flow

code
┌─────────────────────────────────────────────────────────────┐
│  TYPE EXPORT PIPELINE                                       │
└─────────────────────────────────────────────────────────────┘

Step 1: Rust Core
projects/core/src/config/*.rs
├─ #[derive(TS)]
├─ #[ts(export, export_to = "_config.ts")]
└─ struct MyConfig { ... }

        ↓ cargo test export_bindings

Step 2: Generated Types
projects/cli-js-bridges/config-bridge/src/types/_config.ts
└─ Auto-generated: DO NOT MODIFY

        ↓ (manual) Extend in

Step 3: Bridge Types
projects/cli-js-bridges/config-bridge/src/types/config.ts
└─ export type NovelSagaConfig = RootConfig & OverridableConfig

        ↓ xtask build-js

Step 4: Bridge Distribution
projects/cli/assets/js/dist/config-bridge.js
└─ Bundled for CLI embedding

        ↓ cargo build

Step 5: CLI Binary
out/novelsaga (or target/debug/novelsaga)
└─ Embeds bridge assets

Type Export Rules

RuleCorrectIncorrect
Derive macro#[derive(TS)]Manual TS definitions
Export pathexport_to = "_config.ts"Custom paths
Generated fileRead-only _config.tsEditing _config.ts
ExtensionsCreate config.tsModify _config.ts
Regenerationcargo test export_bindingsHand-editing

Build Order

Correct Sequence for Type Changes

bash
# 1. Modify Rust types with #[derive(TS)]
#    Edit: projects/core/src/config/*.rs

# 2. Generate TypeScript types
cargo test -p novelsaga-core export_bindings

# 3. Build JS bridges (includes type check)
xtask build-js

# 4. Build CLI with embedded bridges
cargo build -p novelsaga-cli

# 5. Run tests
cargo test -p novelsaga-cli

Incremental Build Shortcuts

What ChangedCommand
Only Rust corecargo build -p novelsaga-core
Only CLIcargo build -p novelsaga-cli
Only JS bridgesxtask build-js
Types + bridgescargo test export_bindings && xtask build-js
Full rebuildxtask build-all

Build Dependencies Graph

code
novelsaga-core
    ↓ (dependency)
novelsaga-cli
    ↓ (spawns + embeds)
config-bridge (JS)
    ↓ (imports types from)
_config.ts (generated from core)

Anti-Patterns

CategoryDon'tDo Instead
Type ExportEdit _config.ts directlyExtend in separate files, regenerate via cargo test export_bindings
Build OrderBuild CLI before bridgesRun xtask build-js before cargo build after type changes
Bridge CreationCreate bridge without BridgeManagerRegister in manager for lazy-loading
CLI ArgsHardcode values in main.rsUse args/mod.rs with clap derive
JS Bridgeconsole.log() in productionUse console.error() for logs, stdout for JSON-RPC
Config TypesAdd TS-only types in bridgeAdd to Rust core with #[derive(TS)]
TestingSkip cargo test export_bindingsAlways regenerate after type changes
DependenciesInstall deps in subprojectpnpm install at root only

Cross-References

For implementation details, see specific skills:

TopicSkillFiles
Core types, config, statecore-devprojects/core/src/**/*.rs
CLI commands, bridge mgmtcli-devprojects/cli/src/**/*.rs
LSP protocol, handlerslsp-devprojects/cli/src/lsp/**/*.rs
JS bridge servicests-bridgeprojects/cli-js-bridges/**/*.ts
Diplomat FFIffi-diplomatprojects/core/src/diplomat_ffi.rs
Nix buildsnix-workflowflake.nix, packages.nix
Testing patternstesting-guideTest patterns across project

When to Use

Load this skill when:

  • Starting a new feature and unsure which files to modify
  • Planning changes that span multiple modules (Core → TS → Bridge)
  • Need to understand the build sequence after type changes
  • Adding config fields that need to be exposed to TypeScript
  • Creating a new bridge service

This skill is for FILE MAPPING, not implementation. For how to implement specific patterns, load the appropriate module skill.