dsh-agent-plugins-market 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/README.md +117 -111
  2. package/README.zh.md +112 -98
  3. package/client/client.js +547 -540
  4. package/client/client.js.map +1 -1
  5. package/lib/application/catalog-context.js +181 -0
  6. package/lib/application/catalog.js +217 -1110
  7. package/lib/application/details.js +6 -6
  8. package/lib/application/install-store.js +95 -0
  9. package/lib/application/lsp-service.js +97 -0
  10. package/lib/application/mcp-service.js +246 -0
  11. package/lib/application/panel-resources.js +29 -12
  12. package/lib/application/ports.js +21 -0
  13. package/lib/application/project-agent-roles.js +1 -1
  14. package/lib/application/snapshot-cache.js +160 -0
  15. package/lib/application/source-store.js +521 -0
  16. package/lib/catalog/archive.js +34 -29
  17. package/lib/catalog/component-files.js +14 -6
  18. package/lib/catalog/fs-probes.js +43 -0
  19. package/lib/catalog/manifests.js +53 -92
  20. package/lib/catalog/native-project.js +2 -2
  21. package/lib/catalog/paths.js +66 -55
  22. package/lib/catalog/project-config.js +2 -1
  23. package/lib/catalog/project-hooks.js +9 -1
  24. package/lib/catalog/scan-resolvers.js +29 -45
  25. package/lib/catalog/skills-parse.js +14 -10
  26. package/lib/catalog/source-catalog.js +3 -2
  27. package/lib/catalog/suite-components.js +5 -5
  28. package/lib/catalog/suite-scanner.js +3 -1
  29. package/lib/catalog/surfaces.js +5 -26
  30. package/lib/catalog/validate.js +7 -11
  31. package/lib/contracts/market.js +1 -0
  32. package/lib/index.js +91 -208
  33. package/lib/model/types.js +26 -3
  34. package/lib/routes.js +45 -15
  35. package/lib/runtime/agent-role-names.js +70 -0
  36. package/lib/runtime/agent-role-router.js +116 -102
  37. package/lib/runtime/commands-mounts.js +9 -6
  38. package/lib/runtime/deadline.js +28 -0
  39. package/lib/runtime/feedback-tool.js +94 -43
  40. package/lib/runtime/hooks-mounts.js +9 -11
  41. package/lib/runtime/host-locale.js +10 -21
  42. package/lib/runtime/lsp-direct-config.js +19 -19
  43. package/lib/runtime/lsp-mounts.js +159 -68
  44. package/lib/runtime/lsp-server-state.js +4 -4
  45. package/lib/runtime/lsp-status.js +1 -1
  46. package/lib/runtime/mcp-auth-record.js +42 -0
  47. package/lib/runtime/mcp-backend.js +6 -5
  48. package/lib/runtime/mcp-client/config.js +0 -1
  49. package/lib/runtime/mcp-client/connection.js +32 -37
  50. package/lib/runtime/mcp-client/host-contract.js +10 -0
  51. package/lib/runtime/mcp-client/oauth.js +5 -7
  52. package/lib/runtime/mcp-client/plugin-identity.js +28 -0
  53. package/lib/runtime/mcp-client/projection.js +202 -0
  54. package/lib/runtime/mcp-client/tools.js +4 -189
  55. package/lib/runtime/mcp-config.js +29 -10
  56. package/lib/runtime/mcp-direct-config.js +33 -16
  57. package/lib/runtime/mcp-mounts.js +35 -75
  58. package/lib/runtime/mcp-overrides.js +5 -5
  59. package/lib/runtime/mcp-redaction.js +3 -2
  60. package/lib/runtime/mcp-status.js +7 -8
  61. package/lib/runtime/mount-lifecycle.js +73 -0
  62. package/lib/runtime/profile-seam.js +321 -0
  63. package/lib/runtime/project-runtime.js +11 -8
  64. package/lib/runtime/reconcile-scheduler.js +99 -0
  65. package/lib/runtime/reconciler.js +4 -0
  66. package/lib/runtime/server-config.js +6 -4
  67. package/lib/runtime/settings-namespace.js +136 -0
  68. package/lib/runtime/skills-provider.js +5 -3
  69. package/lib/runtime/source-auto-update.js +70 -0
  70. package/lib/{model/state.js → runtime/state-store.js} +9 -11
  71. package/lib/runtime/storage-migration.js +35 -18
  72. package/lib/runtime/subagent-catalog.js +5 -4
  73. package/lib/runtime/user-commands.js +2 -2
  74. package/lib/runtime/user-panels.js +31 -21
  75. package/lib/runtime/user-store.js +12 -13
  76. package/lib/types/application/catalog-context.d.ts +118 -0
  77. package/lib/types/application/catalog.d.ts +99 -304
  78. package/lib/types/application/install-store.d.ts +21 -0
  79. package/lib/types/application/lsp-service.d.ts +36 -0
  80. package/lib/types/application/mcp-service.d.ts +71 -0
  81. package/lib/types/application/panel-resources.d.ts +8 -0
  82. package/lib/types/application/ports.d.ts +72 -0
  83. package/lib/types/application/queries.d.ts +13 -26
  84. package/lib/types/application/snapshot-cache.d.ts +51 -0
  85. package/lib/types/application/source-store.d.ts +100 -0
  86. package/lib/types/catalog/archive.d.ts +3 -11
  87. package/lib/types/catalog/component-files.d.ts +4 -0
  88. package/lib/types/catalog/fs-probes.d.ts +10 -0
  89. package/lib/types/catalog/manifests.d.ts +17 -16
  90. package/lib/types/catalog/native-project.d.ts +2 -2
  91. package/lib/types/catalog/paths.d.ts +47 -15
  92. package/lib/types/catalog/scan-pipeline.d.ts +3 -3
  93. package/lib/types/catalog/scan-resolvers.d.ts +3 -9
  94. package/lib/types/catalog/skills-parse.d.ts +0 -7
  95. package/lib/types/catalog/source-catalog.d.ts +3 -3
  96. package/lib/types/catalog/suite-scanner.d.ts +8 -6
  97. package/lib/types/catalog/validate.d.ts +0 -2
  98. package/lib/types/contracts/lsp-status.d.ts +35 -0
  99. package/lib/types/contracts/market.d.ts +3 -2
  100. package/lib/types/contracts/mcp-status.d.ts +4 -0
  101. package/lib/types/model/types.d.ts +29 -5
  102. package/lib/types/runtime/agent-role-names.d.ts +6 -0
  103. package/lib/types/runtime/agent-role-router.d.ts +54 -51
  104. package/lib/types/runtime/deadline.d.ts +18 -0
  105. package/lib/types/runtime/feedback-tool.d.ts +33 -11
  106. package/lib/types/runtime/hooks-mounts.d.ts +1 -1
  107. package/lib/types/runtime/host-locale.d.ts +1 -1
  108. package/lib/types/runtime/lsp-direct-config.d.ts +3 -3
  109. package/lib/types/runtime/lsp-mounts.d.ts +62 -19
  110. package/lib/types/runtime/lsp-status.d.ts +2 -1
  111. package/lib/types/runtime/mcp-auth-record.d.ts +29 -0
  112. package/lib/types/runtime/mcp-backend.d.ts +7 -4
  113. package/lib/types/runtime/mcp-client/config.d.ts +0 -2
  114. package/lib/types/runtime/mcp-client/host-contract.d.ts +78 -0
  115. package/lib/types/runtime/mcp-client/oauth.d.ts +1 -1
  116. package/lib/types/runtime/mcp-client/plugin-identity.d.ts +16 -0
  117. package/lib/types/runtime/mcp-client/projection.d.ts +45 -0
  118. package/lib/types/runtime/mcp-client/tools.d.ts +5 -72
  119. package/lib/types/runtime/mcp-config.d.ts +25 -4
  120. package/lib/types/runtime/mcp-direct-config.d.ts +18 -4
  121. package/lib/types/runtime/mcp-mounts.d.ts +10 -15
  122. package/lib/types/runtime/mcp-overrides.d.ts +1 -1
  123. package/lib/types/runtime/mcp-status.d.ts +1 -1
  124. package/lib/types/runtime/mount-lifecycle.d.ts +53 -0
  125. package/lib/types/runtime/profile-seam.d.ts +64 -0
  126. package/lib/types/runtime/reconcile-scheduler.d.ts +45 -0
  127. package/lib/types/runtime/reconciler.d.ts +2 -0
  128. package/lib/types/runtime/settings-namespace.d.ts +76 -0
  129. package/lib/types/runtime/source-auto-update.d.ts +33 -0
  130. package/lib/types/{model/state.d.ts → runtime/state-store.d.ts} +2 -2
  131. package/lib/types/runtime/storage-migration.d.ts +5 -3
  132. package/lib/types/runtime/subagent-catalog.d.ts +2 -0
  133. package/lib/types/runtime/user-panels.d.ts +8 -11
  134. package/lib/types/runtime/user-store.d.ts +2 -4
  135. package/package.json +48 -21
  136. package/schemas/README.md +1 -1
@@ -0,0 +1,76 @@
1
+ /**
2
+ * The host settings namespace this plugin registers.
3
+ *
4
+ * The registration is also what makes the host's plugin-config tab serve this
5
+ * plugin's card, and it carries the MCP mount backend, the download region,
6
+ * the project-layout switch, the experience-feedback tool switch, and the
7
+ * background source-update switch. `settings.register`
8
+ * throws on a duplicate namespace, so there is exactly one inject block and one
9
+ * registration.
10
+ *
11
+ * The whole callback is failure-contained on purpose: a throw inside it is
12
+ * INVISIBLE in the UI (the inject resolves asynchronously and cordis only logs
13
+ * it) and silently removes the namespace from `settings.describe`, which is
14
+ * what hides the plugin-config card. Every failure mode lands in the logger
15
+ * with a loud prefix instead.
16
+ *
17
+ * @module runtime/settings-namespace
18
+ */
19
+ import type { Context } from '@deepseek-ai/cordis';
20
+ import type { HostTranslate } from './host-locale.js';
21
+ import { type McpBackend } from './mcp-backend.js';
22
+ import { type DownloadRegionSetting } from './regions.js';
23
+ /** Settings values this plugin reads; anything else reads as its default. */
24
+ export interface MarketSettings {
25
+ mcpEnhanced?: boolean;
26
+ scanProjectLayouts?: boolean;
27
+ downloadRegion?: unknown;
28
+ feedbackEnabled?: boolean;
29
+ autoUpdateSources?: boolean;
30
+ }
31
+ /** Runtime reactions the namespace drives. */
32
+ export interface SettingsNamespaceHost {
33
+ /** Apply the project-layout discovery switch; rejection is logged and contained. */
34
+ setScanProjectLayouts(enabled: boolean): Promise<void>;
35
+ /** Remount every MCP server after the backend switch flips. */
36
+ refreshMcpMounts(): void;
37
+ /** Arm or disarm the background source updater. */
38
+ setAutoUpdateSources(enabled: boolean): void;
39
+ }
40
+ export declare class MarketSettingsNamespace {
41
+ private readonly ctx;
42
+ private readonly dataRoot;
43
+ private readonly locale;
44
+ private readonly host;
45
+ private scope;
46
+ private readonly watchers;
47
+ private feedbackDisposer;
48
+ /**
49
+ * The feedback tool's last reported mount state. A settings change that does
50
+ * not move it (region, backend, project layouts) must not re-log the same
51
+ * line, and every other state is exactly one line: mounted, skipped by the
52
+ * switch, or skipped because the host has no tools registry to register on.
53
+ */
54
+ private feedbackMountState;
55
+ constructor(ctx: Context, dataRoot: string, locale: {
56
+ t: HostTranslate;
57
+ }, host: SettingsNamespaceHost);
58
+ /** Register the namespace; the host resolves it whenever the settings service mounts. */
59
+ mount(): void;
60
+ /** The persisted MCP backend choice; the built-in client until registration lands. */
61
+ backend(): Promise<McpBackend>;
62
+ /**
63
+ * Persist a backend choice.
64
+ * @throws when the settings service is not mounted.
65
+ */
66
+ setBackend(backend: McpBackend): Promise<void>;
67
+ /** The persisted download-region setting. */
68
+ downloadRegion(): Promise<DownloadRegionSetting>;
69
+ /** Release every watcher and unmount the feedback tool. */
70
+ dispose(): void;
71
+ private register;
72
+ /** Apply the background source-update switch; OFF is the default. */
73
+ private syncAutoUpdateSources;
74
+ private syncProjectLayouts;
75
+ private syncFeedbackTool;
76
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Optional background refresh of every configured market source.
3
+ *
4
+ * The `autoUpdateSources` setting (default off) turns this on from the
5
+ * plugin-config card. While enabled the updater runs one refresh pass every
6
+ * {@link AUTO_UPDATE_INTERVAL_MS} and then waits again; the first pass runs a
7
+ * full interval after the switch flips, so enabling the feature never starts
8
+ * network traffic as a surprise. A pass that is still running when the next
9
+ * tick arrives is skipped rather than queued, and the timer is unref'd so it
10
+ * never keeps the DSH process alive on its own.
11
+ * @module runtime/source-auto-update
12
+ */
13
+ import type { Context } from '@deepseek-ai/cordis';
14
+ /** How often the background updater refreshes every source. */
15
+ export declare const AUTO_UPDATE_INTERVAL_MS: number;
16
+ /** Refresh callback shape: one pass over every configured source. */
17
+ export type SourceRefresh = () => Promise<void>;
18
+ export declare class SourceAutoUpdater {
19
+ private readonly ctx;
20
+ private readonly refresh;
21
+ private readonly intervalMs;
22
+ private timer;
23
+ private inFlight;
24
+ constructor(ctx: Context, refresh: SourceRefresh, intervalMs?: number);
25
+ /** Whether a refresh timer is currently armed. */
26
+ get enabled(): boolean;
27
+ /** Arm or disarm the interval; repeated calls with the same state do nothing. */
28
+ setEnabled(enabled: boolean): void;
29
+ /** Disarm the interval; an in-flight pass finishes on its own. */
30
+ dispose(): void;
31
+ private clearTimer;
32
+ private run;
33
+ }
@@ -1,6 +1,6 @@
1
- import { type SuiteState } from './types.js';
1
+ import { type SuiteState } from '../model/types.js';
2
2
  export declare const EMPTY_STATE: SuiteState;
3
3
  /** Parse persisted state; unreadable or wrong-version files yield a contained empty state. */
4
4
  export declare function loadState(statePath: string): Promise<SuiteState>;
5
- /** Persist state atomically through a sibling-temp rename. */
5
+ /** Persist state atomically through the harness's atomic-write helper. */
6
6
  export declare function saveState(statePath: string, state: SuiteState): Promise<void>;
@@ -5,9 +5,11 @@ export interface StorageMigrationResult {
5
5
  /** Move only successfully copied entries; never traverse links or overwrite a destination. */
6
6
  export declare function mergeStorageTree(from: string, to: string, result: StorageMigrationResult): Promise<void>;
7
7
  /**
8
- * Migrate former root overrides and data/user panels into the canonical root.
9
- * Unknown files in override directories remain untouched. Conflicts remain at
10
- * the old path and are returned to block activation; reruns are safe.
8
+ * Migrate former root overrides, data-root panels, and hand-authored
9
+ * resources into their canonical homes: plugin state under the user/data
10
+ * roots, and user content under the shared Agent layout root. Unknown files in
11
+ * override directories remain untouched. Conflicts remain at the old path and
12
+ * are returned to block activation; reruns are safe.
11
13
  */
12
14
  export declare function migratePluginStorage(config?: {
13
15
  userRoot?: string;
@@ -4,6 +4,8 @@ import type { HostTranslate } from './host-locale.js';
4
4
  export interface SubagentCatalogEntry {
5
5
  /** Exact execution identity, independent of the human-readable title. */
6
6
  name: string;
7
+ /** Durable identity for change detection; never rendered in the model-facing catalog. */
8
+ roleId?: string;
7
9
  title: string;
8
10
  description: string;
9
11
  provider?: string;
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * User panel storage: the persistence layer behind the skills / commands /
3
3
  * agent-personas panels. Each surface owns one directory of Markdown files
4
- * under `<userRoot>/user/<kind>/`, so user-authored entries survive restarts,
5
- * are trivially hand-editable, and stay outside suite checkouts.
4
+ * under the shared Agent layout root (`~/.agents/<kind>/`), so user-authored
5
+ * entries survive restarts, are trivially hand-editable, and stay outside
6
+ * suite checkouts.
6
7
  *
7
8
  * Skills entries follow the SKILL.md frontmatter grammar (`name`,
8
9
  * `description`, optional `whenToUse`, invocation controls) plus a
@@ -13,7 +14,6 @@
13
14
  * @module runtime/user-panels
14
15
  */
15
16
  import type { SkillCandidate, SkillDefinition, SkillLookupOptions, SkillProvider } from '@deepseek-ai/dsh-skill';
16
- import type { HostTranslate } from './host-locale.js';
17
17
  /** The skill-source label user-panel entries carry into the skill registry. */
18
18
  export declare const USER_PANEL_SKILL_SOURCE = "user-panel";
19
19
  /** A user panel entry as the HTTP layer serializes it. */
@@ -34,17 +34,15 @@ export interface UserPanelEntry {
34
34
  }
35
35
  /** Throwing CRUD over one panel directory, shared by the three panels. */
36
36
  export declare class UserPanelStore {
37
- private readonly dataRoot;
37
+ private readonly agentsRoot;
38
38
  private readonly kind;
39
39
  /** Extra name grammar for this panel (runs after USER_ENTRY_NAME). */
40
40
  private readonly extraNameCheck;
41
- constructor(dataRoot: string, kind: 'skills' | 'commands' | 'agents',
41
+ constructor(agentsRoot: string, kind: 'skills' | 'commands' | 'agents',
42
42
  /** Extra name grammar for this panel (runs after USER_ENTRY_NAME). */
43
43
  extraNameCheck?: (name: string) => boolean);
44
- /** The panel's directory under the data root. */
44
+ /** The panel's directory under the Agent layout root. */
45
45
  dirPath(): string;
46
- /** The plugin data root the panel lives under. */
47
- root(): string;
48
46
  private get dir();
49
47
  /** Every entry, sorted by name; strict snapshots propagate temporary I/O failures. */
50
48
  list(strict?: boolean): Promise<UserPanelEntry[]>;
@@ -64,7 +62,7 @@ export declare class UserPanelStore {
64
62
  remove(name: string): Promise<void>;
65
63
  }
66
64
  /** Locate the three stores; constructed once per plugin activation. */
67
- export declare function createUserPanelStores(dataRoot: string): {
65
+ export declare function createUserPanelStores(agentsRoot: string): {
68
66
  skills: UserPanelStore;
69
67
  commands: UserPanelStore;
70
68
  agents: UserPanelStore;
@@ -83,9 +81,8 @@ export declare function isUserSkillEntryName(name: string): boolean;
83
81
  */
84
82
  export declare class UserPanelSkillProvider implements SkillProvider {
85
83
  private readonly skills;
86
- private readonly t;
87
84
  readonly name = "user-panel";
88
- constructor(skills: UserPanelStore, t: HostTranslate);
85
+ constructor(skills: UserPanelStore);
89
86
  list(_options: SkillLookupOptions): Promise<SkillCandidate[]>;
90
87
  get(candidate: SkillCandidate, _options: SkillLookupOptions): Promise<SkillDefinition | undefined>;
91
88
  }
@@ -6,12 +6,10 @@
6
6
  * the runtime mounts.
7
7
  * @module runtime/user-store
8
8
  */
9
- /** Where user panel entries persist: `<userRoot>/user/<kind>/`. */
10
- export declare function userEntryDir(dataRoot: string, kind: 'skills' | 'commands' | 'agents'): string;
9
+ /** Where user panel entries persist: `<agentsRoot>/<kind>/`. */
10
+ export declare function userEntryDir(agentsRoot: string, kind: 'skills' | 'commands' | 'agents'): string;
11
11
  /** `[a-z][a-z0-9_-]*` — the grammar every panel entry name must satisfy. */
12
12
  export declare const USER_ENTRY_NAME: RegExp;
13
- /** The enablement frontmatter key shared by skills and commands. */
14
- export declare const DISABLED_KEY = "disabled";
15
13
  /** Parse full YAML metadata without flattening arrays, mappings, or multiline strings. */
16
14
  export declare function parseFrontmatterRecord(text: string): Record<string, unknown>;
17
15
  /** Read one entry; strict runtime snapshots throw on I/O errors other than a vanished file. */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-agent-plugins-market",
3
3
  "description": "The standard way to install Claude Code / Codex / Cursor / Kimi plugin marketplace suites in DeepSeek Harness (DSH) — zero conversion, zero file copying. Skills, MCP servers, hooks and slash commands are injected into your dsh sessions at runtime.",
4
- "version": "0.6.2",
4
+ "version": "0.7.0",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/types/index.d.ts",
@@ -75,18 +75,18 @@
75
75
  "ai-agents"
76
76
  ],
77
77
  "peerDependencies": {
78
- "@deepseek-ai/cordis": "^4.0.1",
79
- "@deepseek-ai/dsh-hooks-claude-code": "^0.1.2-rc.1",
80
- "@deepseek-ai/dsh-llm": "^0.1.2-rc.1",
81
- "@deepseek-ai/dsh-mcp-client": "^0.1.2-rc.1",
82
- "@deepseek-ai/dsh-skill": "^0.1.2-rc.1",
83
- "@deepseek-ai/dsh-tools": "^0.1.2-rc.1"
78
+ "@deepseek-ai/cordis": "^4.0.2",
79
+ "@deepseek-ai/dsh-hooks-claude-code": "^0.1.5-rc.2",
80
+ "@deepseek-ai/dsh-llm": "^0.1.5-rc.2",
81
+ "@deepseek-ai/dsh-mcp-client": "^0.1.5-rc.2",
82
+ "@deepseek-ai/dsh-skill": "^0.1.5-rc.2",
83
+ "@deepseek-ai/dsh-tools": "^0.1.5-rc.2"
84
84
  },
85
85
  "peerDependenciesMeta": {
86
- "@deepseek-ai/dsh-mcp-client": {
86
+ "@deepseek-ai/dsh-hooks-claude-code": {
87
87
  "optional": true
88
88
  },
89
- "@deepseek-ai/dsh-hooks-claude-code": {
89
+ "@deepseek-ai/dsh-mcp-client": {
90
90
  "optional": true
91
91
  },
92
92
  "@deepseek-ai/dsh-tools": {
@@ -94,7 +94,12 @@
94
94
  }
95
95
  },
96
96
  "dependencies": {
97
- "@deepseek-ai/schemastery": "^3.18.1",
97
+ "@deepseek-ai/dsh-atomic-write": "^0.1.5-rc.2",
98
+ "@deepseek-ai/dsh-home-paths": "^0.1.5-rc.2",
99
+ "@deepseek-ai/dsh-lsp": "^0.1.5-rc.2",
100
+ "@deepseek-ai/dsh-lsp-stdio": "^0.1.5-rc.2",
101
+ "@deepseek-ai/dsh-tool-lsp": "^0.1.5-rc.2",
102
+ "@deepseek-ai/schemastery": "^3.18.2",
98
103
  "@modelcontextprotocol/sdk": "^1.30.0",
99
104
  "ajv": "^8.17.1",
100
105
  "fflate": "^0.8.3",
@@ -103,25 +108,41 @@
103
108
  "zod": "^4.4.3"
104
109
  },
105
110
  "devDependencies": {
106
- "@deepseek-ai/cordis": "^4.0.1",
107
- "@deepseek-ai/dsh-client-ui-primitives": "0.1.2-rc.1",
108
- "@deepseek-ai/dsh-hooks-claude-code": "0.1.2-rc.1",
109
- "@deepseek-ai/dsh-llm": "0.1.2-rc.1",
110
- "@deepseek-ai/dsh-mcp-client": "0.1.2-rc.1",
111
- "@deepseek-ai/dsh-skill": "0.1.2-rc.1",
112
- "@deepseek-ai/dsh-tools": "0.1.2-rc.1",
111
+ "@deepseek-ai/cordis": "^4.0.2",
112
+ "@deepseek-ai/dsh-client-ui-primitives": "0.1.5-rc.2",
113
+ "@deepseek-ai/dsh-hooks-claude-code": "0.1.5-rc.2",
114
+ "@deepseek-ai/dsh-llm": "0.1.5-rc.2",
115
+ "@deepseek-ai/dsh-mcp-client": "0.1.5-rc.2",
116
+ "@deepseek-ai/dsh-skill": "0.1.5-rc.2",
117
+ "@deepseek-ai/dsh-tools": "0.1.5-rc.2",
113
118
  "@eslint/js": "^9.39.5",
119
+ "@shikijs/langs": "^4.4.3",
114
120
  "@tsdown/css": "^0.22.14",
115
121
  "@types/node": "^22.15.0",
116
122
  "@types/react": "~18.3.1",
117
- "@types/react-dom": "^19.2.4",
123
+ "@types/react-dom": "~18.3.0",
118
124
  "@vitest/coverage-v8": "^4.1.11",
125
+ "anser": "^2.3.5",
126
+ "clsx": "^2.1.1",
119
127
  "dependency-cruiser": "^18.2.0",
120
128
  "eslint": "^10.9.1",
121
129
  "jsdom": "^30.0.1",
130
+ "katex": "^0.16.47",
131
+ "mdast-util-from-markdown": "^2.0.3",
132
+ "mdast-util-gfm": "^3.1.0",
133
+ "mdast-util-math": "^3.0.0",
134
+ "micromark-core-commonmark": "^2.0.3",
135
+ "micromark-extension-gfm": "^3.0.0",
136
+ "micromark-extension-math": "^3.1.0",
137
+ "micromark-factory-space": "^2.0.1",
138
+ "micromark-util-character": "^2.1.1",
139
+ "micromark-util-classify-character": "^2.0.1",
140
+ "micromark-util-sanitize-uri": "^2.0.1",
141
+ "micromark-util-symbol": "^2.0.1",
122
142
  "prettier": "^3.9.6",
123
143
  "react": "^18.3.1",
124
144
  "react-dom": "~18.3.1",
145
+ "shiki": "^4.4.3",
125
146
  "tsdown": "^0.22.14",
126
147
  "typescript": "^5.8.3",
127
148
  "typescript-eslint": "^8.67.0",
@@ -132,9 +153,12 @@
132
153
  },
133
154
  "homepage": "https://www.npmjs.com/package/dsh-agent-plugins-market",
134
155
  "scripts": {
135
- "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.client.json --noEmit",
136
- "build": "tsc -p tsconfig.json && pnpm run build:client",
156
+ "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.client.json --noEmit && tsc -p tsconfig.test.json --noEmit && tsc -p tsconfig.test.client.json --noEmit",
157
+ "clean": "node -e \"require('node:fs').rmSync('lib',{recursive:true,force:true})\"",
158
+ "prebuild": "pnpm run typecheck",
159
+ "build": "pnpm run clean && tsc -p tsconfig.json && pnpm run build:client",
137
160
  "build:client": "tsdown && node scripts/normalize-client-banner.mjs",
161
+ "pretest": "pnpm run check:quick",
138
162
  "test": "vitest run",
139
163
  "test:contract": "vitest run tests/market-contracts.test.ts tests/routes.test.ts",
140
164
  "test:coverage": "vitest run --coverage",
@@ -142,6 +166,9 @@
142
166
  "format": "prettier --write .",
143
167
  "format:check": "prettier --check .",
144
168
  "check:architecture": "depcruise --validate .dependency-cruiser.cjs src",
145
- "check:refactor": "pnpm run typecheck && pnpm run lint && pnpm run format:check && pnpm run test:contract && pnpm run check:architecture"
169
+ "check:host-alignment": "node scripts/check-host-alignment.mjs",
170
+ "fix:host-alignment": "node scripts/check-host-alignment.mjs --fix",
171
+ "check:quick": "pnpm run typecheck && pnpm run lint",
172
+ "check:refactor": "pnpm run check:quick && pnpm run format:check && pnpm run test:contract && pnpm run check:architecture"
146
173
  }
147
174
  }
package/schemas/README.md CHANGED
@@ -60,7 +60,7 @@ Claude Code and Copilot (including the Universal convention) define usable LSP d
60
60
 
61
61
  ## Executable coverage
62
62
 
63
- All ten active layouts are covered by [offline README repository tests](../tests/real-layouts.test.ts). Fixtures retain original Git blobs, commit IDs, hashes and licenses. Competing manifests are removed at every suite root in isolated cases, and the scanner reports the productive marketplace rather than inferring it from file presence. [Component contract tests](../tests/component-declarations.test.ts) cover path/array/inline forms and validation failures. See the [coverage audit](../docs/layout-coverage.md) for the exact boundary between layout compatibility and vendor-native runtime behavior.
63
+ All ten active layouts are covered by [offline README repository tests](../tests/real-layouts.test.ts). Fixtures retain original Git blobs, commit IDs, hashes and licenses. Competing manifests are removed at every suite root in isolated cases, and the scanner reports the productive marketplace rather than inferring it from file presence. [Component contract tests](../tests/component-declarations.test.ts) cover path/array/inline forms and validation failures. See the [coverage audit](../docs/user/layout-coverage.md) for the exact boundary between layout compatibility and vendor-native runtime behavior.
64
64
 
65
65
  ## Provenance and update policy
66
66