dsh-jspace-trigger
Configurable, near-field trigger for J-Space in DeepSeek Harness.
No blanket injection. No forced system prompt. Only prompt the model to loadj-spacewhen rules say it is worth it.
简体中文 · Design · Contributing · Issues
What is this?
dsh-jspace-trigger is a lightweight DeepSeek Harness (DSH) plugin that decides when to remind the agent to use the J-Space Cognition Suite.
It does not inject J-Space every turn. Instead:
- It watches real user messages.
- It evaluates configurable rules: regex / keywords / length / score / explicit commands.
- Only when a rule fires does it append a small near-field nudge to the agent inbox.
- When nothing fires, it stays completely silent.
Compatibility
| DSH runtime | Status |
|---|---|
DSH 0.1.0-rc.7 (@deepseek-ai/cordis 4.x) |
✅ verified against installed type contracts |
later 0.1.0-rc.x |
expected compatible; report issues otherwise |
< 0.1.0-rc.7 |
unsupported (event/data shapes differ) |
This plugin is runtime dependency-free (Node built-ins only). It pegs
peerDependencies to @deepseek-ai/cordis >=4.0.0-rc <5 and the DSH service
packages so npm can warn on major mismatches without bundling anything.
Why?
Plain J-Space as a DSH skill is available but not automatic. A fixed J-Space system-prompt injection is too noisy for simple tasks.
This plugin is the middle ground:
| Mode | Behavior |
|---|---|
near-field (default) |
Matched tasks receive one short nudge in the inbox; everything else is silent |
none |
Observe-only: rules still run and metrics still update, but no message is ever injected |
Features
- No blanket injection — no J-Space section forced into every system prompt.
- Configurable rule engine — regex/keyword patterns,
any/all/scorematching, rule-local thresholds, and opt-out exclusions. - Length fallback — long non-chat messages can automatically route to
fullorloop. - Session-safe delivery — a hit in one session is never delivered to an agent from another session.
- Deduplication — one event triggers at most one nudge.
- Observe-only mode —
injectMode: nonegives pure telemetry without touching the conversation. - Skill detection & guided install —
jspace_trigger_statusreports whetherj-spaceis installed; triggered nudges include a missing-skill hint, andjspace_install_skillinstalls it explicitly. - Runtime metrics —
jspace_trigger_statusreports events, triggers, injections, and observe-only hits. - Invocation funnel analysis —
jspace_trigger_analyticsconnects a rule hit to delivery and following tool calls, including whether thej-spaceskill was actually loaded. - Dry-run tool —
jspace_trigger_testshows exactly what the current config would do.
Quick start
Prerequisites
- DSH web profile installed and working.
- J-Space Cognition Suite installed as a DSH skill, e.g. at
~/.agents/skills/j-space/.
Install
From GitHub (recommended for end users):
dsh plugin --profile web add "github:EricWang1358/dsh-jspace-trigger"
Or, install the packed tarball from a local clone or a GitHub release:
dsh plugin --profile web add "<path-or-url-to>/dsh-jspace-trigger-<version>.tgz"
Local development link (replace <repo> with your own clone path):
dsh plugin --profile web add "link:<repo>"
Then restart:
dsh --profile web
Verify
dsh --profile web --dump-config | Select-String dsh-jspace-trigger
After restart, the tools jspace_trigger_status, jspace_trigger_test, jspace_trigger_analytics, and jspace_install_skill are available to the agent.
Marketplace discoverability
This is a host bundle plugin: package.json declares
dsh.bundle.patch = ./cordis.patch.yml, which is what DSH plugin markets use to
classify it as an plugin (auto-enable-able) rather than a client or
nonplugin. For the GitHub-topic-driven markets, the repository must carry the
dsh-plugin GitHub topic — with a non-empty repository description, so search
and one-click install can find it.
GitHub topic: dsh-plugin (plus: dsh, dsh-bundle, j-space)
Keepers of a fork: add the topic via gh repo edit <owner>/<repo> --add-topic dsh-plugin.
How triggering works today
Priority order (first match wins, short-circuit):
built-in opt-out (always first) > explicit > ignore/chat > workspace-research > loop > research > complex > length fallback > none
The opt-out rule (jspace-optout) is built in and always evaluated first,
even when you supply a custom rules array, so an explicit "不要使用 j-space /
do not use j-space" can never be overridden by a content keyword. The chat
rule is configurable too: if you redefine chat, your patterns replace the
hardcoded greeting list; if you drop it, a minimal built-in greeting guard still
keeps one-word pleasantries silent.
Default rules
| Rule | Examples | Decision |
|---|---|---|
explicit |
/j-space, use j-space, 启用 j-space, 加载 j-space |
loop + capacity, broadcast |
jspace-optout |
不需要使用 j-space, do not use j-space |
ignore (silent; overrides complexity signals) |
chat |
你好, hello, thanks, ok, 嗯 |
ignore (silent) |
workspace-research |
文件夹/目录/仓库 + 调研/盘点/画像等综合意图 | loop + capacity, broadcast, markers, self-monitoring |
loop |
仓库级、跨文件、多阶段、多轮、long-horizon、multi-file | loop + capacity, broadcast, markers, self-monitoring |
research |
调研、盘点、梳理、尽调、research、survey | full + deep-reasoning, self-monitoring |
complex |
重构、架构、全面、详细、调试、审查、refactor、architecture | full + deep-reasoning, self-monitoring |
Real trigger examples
# explicit -> loop
/j-space 请审计这个仓库并跨文件保持一致
# loop keywords -> loop
做一个仓库级跨文件重构,并保持全局一致
# workspace-research -> loop (two independent signals)
深度调研此文件夹下的内容、TODO 和 DDL,梳理现状与潜在风险
# research intent -> full
调研一下这个技术方案的可行性
# complex keywords -> full
详细分析一下这个项目的架构,并检查潜在风险
# long fallback -> full
超过 120 个字符的非寒暄任务……
# long fallback -> loop
超过 1800 个字符的多阶段长任务……
# chat -> silent
你好
Dry-run a message
jspace_trigger_test "仓库级跨文件重构"
Expected output shape:
action=trigger
pass=loop
modules=capacity,broadcast,markers,self-monitoring
matched=loop
reason=rule:loop
matchMode=any
hits=2
threshold=1
signals=多阶段|多个文件|多轮|长程|长期|仓库级|跨文件|系统化|完整项目|长时|agentic|long-horizon|multi-stage|multi-file|multi-turn|repository-wide|workflow|loop
skillInstalled=true
---
[jspace-trigger] J-space pass: loop. Suggested modules: capacity, broadcast, markers, self-monitoring. If this task needs structured workspace control, load the `j-space` skill and follow its gate.
Observe-only mode
Set in cordis.patch.yml:
config:
injectMode: none
In this mode matched events are recorded in jspace_trigger_status but never injected into any session.
Analyze real invocations
jspace_trigger_analytics is a bounded in-memory funnel for checking whether a nudge was useful:
jspace_trigger_analytics scope=current limit=20
It reports rule -> delivery -> toolCalls -> jspaceSkillLoaded. It deliberately stores no user-message text and no tool arguments—only timestamps, session/event IDs, rule/pass metadata, delivery outcome, and tool names. Set analytics.enabled: false to disable it, or use maxRecords (1–500) to bound the retained recent records.
Skill detection & installation
The plugin never downloads or installs J-Space automatically. It only checks and helps when you ask.
jspace_trigger_statusreportsskillInstalledand installed paths.- When the skill is missing, triggered nudges append:
J-Space skill is not installed. Run `jspace_install_skill` to install it. jspace_install_skillexplicitly clones the upstream repository and copiesj-space/into your configured skill root.
Install the skill manually
jspace_install_skill
To force a reinstall:
jspace_install_skill force=true
To install into a custom root:
jspace_install_skill root="C:\path\to\skills"
Coexistence with routing presets
This plugin does not change a preset's persona or tool surface. It only appends a near-field message after a matched real user message. The following combinations therefore have no tool-name or system-prompt collision, but may affect whether a guide is visible to the model.
Router Standard
When Router Standard selects its weak band, it appends its own routing guide
after each real user message. If a J-Space rule also matches, the session can
receive two near-field guides: Router Standard's build/fix guidance and this
plugin's J-Space suggestion.
dsh-jspace-trigger deliberately does not detect or mute Router Standard. If
you want Router Standard to be the only near-field guide, use observe-only mode:
config:
injectMode: none
Otherwise, the two messages are compatible but add prompt noise. This is most
likely for a weak-band task containing J-Space complexity keywords such as
详细 or 分析.
梁神模式 (Liangshen / anchored standard)
梁神模式的首轮锚定阶段只允许真实用户消息到达模型。本插件的提示使用
source.kind: plugin,因此即使规则命中,首轮提示也会被梁神模式过滤;这
保护了它的 Minimal 锚定,不是错误。模式晋升后,本插件的后续提示可以正常
参与会话。
如果你要保持全程最纯净的梁神模式轨迹,同样建议使用 injectMode: none;
如果希望在完成首轮锚定后获得 J-Space 建议,则保持默认 near-field 即可。
Configuration
Configuration lives in the plugin config, normally edited in cordis.patch.yml.
- insert:
- id: jspace-trigger
name: dsh-jspace-trigger
config:
enabled: true
injectMode: near-field # near-field | none
analytics:
enabled: true # metadata only; no prompts or tool arguments
maxRecords: 50 # bounded to 1..500
trigger:
minScore: 1 # threshold only for matchMode: score
loopChars: 1800 # text longer than this -> loop fallback
fullChars: 120 # text longer than this -> full fallback
rules:
- id: explicit
action: trigger
pass: loop
excludePatterns: ["不要使用 j-space", "do not use j-space"]
modules: [capacity, broadcast]
patterns: ["/j-space", "use j-space"]
- id: chat
action: ignore
patterns: ["^你好[!。.!??~~]*$", "^(hello|hi|thanks|ok)[!。.!??~~]*$"]
- id: workspace-research
action: trigger
pass: loop
matchMode: all
modules: [capacity, broadcast, markers, self-monitoring]
patterns:
- "文件夹|目录|仓库|代码库|工作区|(?:todo|ddl).*(?:文件|列表|状态)|(?:文件|列表).*(?:todo|ddl)|folder|directory|repository|repo|workspace"
- "调研|盘点|梳理|画像|审计|研究|分析|了解|research|survey|audit"
- id: loop
action: trigger
pass: loop
modules: [capacity, broadcast, markers, self-monitoring]
patterns: ["多阶段|多文件|跨文件|长程|仓库级", "long-horizon|multi-file|repository-wide"]
- id: research
action: trigger
pass: full
modules: [deep-reasoning, self-monitoring]
patterns: ["调研|盘点|梳理|尽调|研究|调查|research|investigate|survey"]
- id: complex
action: trigger
pass: full
modules: [deep-reasoning, self-monitoring]
patterns: ["重构|架构|全面|调试|审查", "refactor|architecture|debug|review"]
# Optional: skill install/check settings
skillRoots:
- ~/.agents/skills
- ~/.dsh/skills
repoUrl: https://github.com/Tiger3807861189/J-Space-Cognition-Suite-V3.6.git
branch: main
Rule fields
| Field | Meaning |
|---|---|
action |
trigger, ignore, or none |
pass |
fast, full, loop |
modules |
J-Space modules to suggest on a hit |
patterns |
Regex source strings or RegExp objects |
matchMode |
any (default), all, or score |
minScore |
Per-rule score threshold; overrides trigger.minScore for matchMode: score |
excludePatterns |
Regexes that veto this rule, useful for explicit opt-outs |
Tools
| Tool | Purpose |
|---|---|
jspace_trigger_status |
Show config, counters, skill installation state, and recent hit count |
jspace_trigger_test <text> |
Dry-run a message through the current rules |
jspace_trigger_analytics |
Inspect the bounded, privacy-safe trigger → delivery → tool-call funnel |
jspace_install_skill |
Explicitly install/repair the J-Space skill from upstream |
Project structure
dsh-jspace-trigger/
├── docs/design.md # research + rule design rationale
├── src/trigger-core.mjs # pure rule engine (zero dependencies)
├── src/skill-utils.mjs # skill detection + explicit installer
├── src/call-analysis.mjs # bounded privacy-safe funnel
├── src/index.js # DSH plugin entry (Cordis lifecycle)
├── scripts/check.mjs # cross-platform pre-pack validator
├── scripts/build.sh # CI/pipeline build entry (bash)
├── index.js # package entry (re-exports plugin)
├── index.d.ts # TypeScript declarations
├── cordis.patch.yml # DSH bundle mount
├── .github/ # CI, release, dependabot, CODEOWNERS, issue/PR templates
├── SECURITY.md # security policy
└── tests/ # rule engine + simulated Cordis event tests
Development
node scripts/check.mjs # validate entry + manifest (no child-process capture)
npm test # full rule + simulated Cordis event suite
The suite runs on Node built-ins only — there is nothing to npm install, and
CI deliberately skips install to prove it (see .github/workflows/ci.yml).
Not yet done: real-session validation after a DSH restart.
See docs/design.md for the complete design rationale.
Supply-chain & repository hygiene
- No runtime npm dependencies — the shipped code imports only
node:*built-ins;peerDependenciesare declared for warning purposes only. .npmrcsetsignore-scripts=trueso no postinstall can run during any install.SECURITY.mddocuments supported versions and private reporting.CODEOWNERSroutes review ownership; Dependabot keeps the (nearly empty) dependency graph and GitHub Actions up to date.- CI (
ci.yml) runs the suite on Node 20/22 plus annpm auditgate;release.ymlpublishes a signed-by-tag GitHub release with the packed tarball.
Contributing
Bug reports, feature requests, docs improvements, and PRs are welcome.
Please read CONTRIBUTING.md first.
还没有评论,来写第一条。