dsh-doublecheck 0.9.29 → 0.9.31

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 (62) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/LICENSE +0 -0
  3. package/PRIVACY.md +11 -0
  4. package/README.en.md +577 -0
  5. package/README.es.md +577 -0
  6. package/README.hi.md +577 -0
  7. package/README.md +369 -247
  8. package/README.pt.md +577 -0
  9. package/cordis.patch.yml +0 -0
  10. package/icon.svg +1 -0
  11. package/lib/ci.d.ts +0 -0
  12. package/lib/ci.js +0 -0
  13. package/lib/domain/evidence.d.ts +7 -6
  14. package/lib/domain/evidence.js +15 -21
  15. package/lib/domain/gate.d.ts +0 -0
  16. package/lib/domain/gate.js +0 -0
  17. package/lib/domain/projection.d.ts +0 -0
  18. package/lib/domain/projection.js +0 -0
  19. package/lib/domain/report.d.ts +6 -0
  20. package/lib/domain/report.js +1 -1
  21. package/lib/domain/stages.d.ts +0 -0
  22. package/lib/domain/stages.js +0 -0
  23. package/lib/domain/vagueness.d.ts +0 -0
  24. package/lib/domain/vagueness.js +0 -0
  25. package/lib/domain/vocabulary.d.ts +0 -0
  26. package/lib/domain/vocabulary.js +0 -0
  27. package/lib/events.d.ts +2 -0
  28. package/lib/events.js +0 -0
  29. package/lib/grill/index.d.ts +0 -0
  30. package/lib/grill/index.js +84 -26
  31. package/lib/grill/provider.d.ts +0 -0
  32. package/lib/grill/provider.js +0 -0
  33. package/lib/guard/activation.d.ts +0 -0
  34. package/lib/guard/activation.js +0 -0
  35. package/lib/guard/command.d.ts +0 -0
  36. package/lib/guard/command.js +1 -0
  37. package/lib/guard/gate.d.ts +0 -0
  38. package/lib/guard/gate.js +0 -0
  39. package/lib/guard/index.d.ts +0 -0
  40. package/lib/guard/index.js +30 -25
  41. package/lib/guard/prose.d.ts +0 -0
  42. package/lib/guard/prose.js +0 -0
  43. package/lib/guard/review.d.ts +0 -0
  44. package/lib/guard/review.js +0 -0
  45. package/lib/index.d.ts +0 -0
  46. package/lib/index.js +0 -0
  47. package/lib/invariant.d.ts +0 -0
  48. package/lib/invariant.js +0 -0
  49. package/lib/session-events.d.ts +0 -0
  50. package/lib/session-events.js +0 -0
  51. package/lib/types.d.ts +0 -0
  52. package/lib/types.js +0 -0
  53. package/package.json +38 -29
  54. package/skills/delivery-proof/SKILL.md +0 -0
  55. package/skills/delivery-review/SKILL.md +0 -0
  56. package/skills/grill-requirements/SKILL.md +0 -0
  57. package/skills/red-green-tdd/SKILL.md +0 -0
  58. package/strict.patch.yml +0 -0
  59. package/README-es.md +0 -449
  60. package/README-hi.md +0 -449
  61. package/README-pt.md +0 -449
  62. package/README-zh.md +0 -449
@@ -60,35 +60,29 @@ export function emptyDetection() {
60
60
  * Normalize one settled PTC sub-dispatch event, across the event-vocabulary
61
61
  * rename at the session-format V2→V3 edge.
62
62
  *
63
- * The current line names the settled sub-dispatch `tool/ptc-dispatch` (the
64
- * host's V2→V3 migration renames the predecessor `tool/code-dispatch`, keeping
65
- * the payload values), so a stored V2 log arrives under the new label. A host
66
- * on the older release line still emits the predecessor label, which is outside
67
- * this line's `SessionEventMap`; it is matched structurally instead of as a
68
- * switch case, so the fold never depends on which generation wrote the log.
63
+ * The V3 line names the settled sub-dispatch `tool/ptc-dispatch` (the host's
64
+ * V2→V3 migration renames the predecessor `tool/code-dispatch`, keeping the
65
+ * payload values), so a stored V2 log arrives under the new label. Neither
66
+ * label is a member of this host line's `SessionEventMap` — the 0.2.2 tools
67
+ * contract retires the PTC declaration while persistence still recognizes both
68
+ * names — so both are matched structurally instead of as switch cases. The
69
+ * fold therefore never depends on which generation wrote the log.
69
70
  *
70
71
  * @param event - one committed session event.
71
72
  * @returns the settled payload, or `undefined` when the event is not a settled sub-dispatch.
72
73
  */
73
74
  export function ptcSettle(event) {
74
- if (event.type === 'tool/ptc-dispatch') {
75
- return {
76
- name: event.data.name,
77
- arguments: event.data.arguments,
78
- isError: event.data.isError,
79
- content: event.data.content,
80
- };
81
- }
82
- if (event.type !== 'tool/code-dispatch')
75
+ const type = event.type;
76
+ if (type !== 'tool/ptc-dispatch' && type !== 'tool/code-dispatch')
83
77
  return undefined;
84
- const legacy = event.data;
85
- if (legacy === null || legacy === undefined || typeof legacy.name !== 'string')
78
+ const settled = event.data;
79
+ if (settled === null || settled === undefined || typeof settled.name !== 'string')
86
80
  return undefined;
87
81
  return {
88
- name: legacy.name,
89
- arguments: legacy.arguments,
90
- isError: legacy.isError === true,
91
- content: Array.isArray(legacy.content) ? legacy.content : [],
82
+ name: settled.name,
83
+ arguments: settled.arguments,
84
+ isError: settled.isError === true,
85
+ content: Array.isArray(settled.content) ? settled.content : [],
92
86
  };
93
87
  }
94
88
  /**
File without changes
File without changes
File without changes
File without changes
@@ -55,6 +55,12 @@ export interface ReportData extends ReportFacts {
55
55
  checks: VerifyCheck[];
56
56
  complete: boolean;
57
57
  } | null;
58
+ /**
59
+ * Why verification did not run, when it was requested. `null` when it ran or
60
+ * was not requested — the renderer must not reduce a failed attempt to a
61
+ * bare "Not run.".
62
+ */
63
+ verificationNote: string | null;
58
64
  /** Workspace markdown copy outcome. */
59
65
  path: string | null;
60
66
  written: boolean;
@@ -179,7 +179,7 @@ export function renderReportMarkdown(data) {
179
179
  }
180
180
  lines.push('', '## Verification');
181
181
  if (data.verification === null) {
182
- lines.push('Not run.');
182
+ lines.push(data.verificationNote === null || data.verificationNote === undefined ? 'Not run.' : `Not run — ${data.verificationNote}`);
183
183
  }
184
184
  else {
185
185
  for (const check of data.verification.checks) {
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
package/lib/events.d.ts CHANGED
@@ -196,6 +196,8 @@ declare module '@deepseek-ai/cordis' {
196
196
  checks: VerifyCheck[];
197
197
  complete: boolean;
198
198
  } | null;
199
+ /** Why verification did not run, when it was requested; null otherwise. */
200
+ verificationNote?: string | null;
199
201
  path: string | null;
200
202
  written: boolean;
201
203
  }): void;
package/lib/events.js CHANGED
File without changes
File without changes
@@ -348,6 +348,7 @@ export function apply(ctx, config) {
348
348
  ],
349
349
  required: true,
350
350
  },
351
+ verificationNote: { oneOf: [{ type: 'string' }, { type: 'null' }], required: true },
351
352
  path: { oneOf: [{ type: 'string' }, { type: 'null' }], required: true },
352
353
  written: { type: 'boolean', required: true },
353
354
  },
@@ -365,13 +366,14 @@ export function apply(ctx, config) {
365
366
  ? { spec: null, testRuns: { failed: 0, passed: 0 }, timeline: [], edits: 0, review: null }
366
367
  : foldReportFacts(sessionEvents(session), reportDetection);
367
368
  const verify = args.verify ?? config.reportVerify;
368
- const verification = verify
369
+ const attempt = verify
369
370
  ? await runVerifyWorkflow(ctx, config, facts.spec, exec)
370
- : null;
371
+ : { verification: null, note: null };
371
372
  const report = {
372
373
  ...facts,
373
- verdict: deriveReportVerdict(facts, verification),
374
- verification,
374
+ verdict: deriveReportVerdict(facts, attempt.verification),
375
+ verification: attempt.verification,
376
+ verificationNote: attempt.note,
375
377
  path: null,
376
378
  written: false,
377
379
  };
@@ -379,7 +381,7 @@ export function apply(ctx, config) {
379
381
  report.path = outcome.path;
380
382
  report.written = outcome.written;
381
383
  if (session !== undefined) {
382
- ctx.emit('doublecheck/report', { session, verdict: report.verdict, verification, path: report.path, written: report.written });
384
+ ctx.emit('doublecheck/report', { session, verdict: report.verdict, verification: report.verification, verificationNote: report.verificationNote, path: report.path, written: report.written });
383
385
  }
384
386
  return report;
385
387
  },
@@ -394,19 +396,65 @@ export function apply(ctx, config) {
394
396
  }));
395
397
  }
396
398
  /**
397
- * Run the per-dimension verification workflow through the workflow seam,
398
- * when one is mounted. A missing seam or a non-completed run settles as
399
- * `null` (no verification) — the report states it did not run.
400
- * @returns the settled checks with the completeness flag, or null when
401
- * verification did not run at all.
399
+ * Resolve the workflow engine for this call.
400
+ *
401
+ * A profile-level bundle row lives in the Host realm, but the web profile
402
+ * mounts the engine inside the calling preset's isolated `delegation` group,
403
+ * so `ctx.get('workflowEngine')` from the plugin context returns undefined
404
+ * even though the service is registered. `agentPresets.serviceFor()` is the
405
+ * host's explicit cross-realm accessor (it inspects the agent's retained
406
+ * composition), so it is tried first; the plain lookup stays as the fallback
407
+ * for profiles that mount the engine on the host plane.
408
+ * @param ctx - the plugin context (Host/profile realm).
409
+ * @param agent - the calling agent, when the tool call has one.
410
+ * @returns the engine, or a human-readable reason it is unreachable.
411
+ */
412
+ function resolveWorkflowEngine(ctx, agent) {
413
+ const presets = ctx.get('agentPresets');
414
+ if (agent?.ctx !== undefined && typeof presets?.serviceFor === 'function') {
415
+ try {
416
+ const scoped = presets.serviceFor(agent, 'workflowEngine');
417
+ if (scoped !== undefined)
418
+ return { engine: scoped };
419
+ }
420
+ catch (error) {
421
+ ctx.logger.debug(`dsh-doublecheck: preset workflowEngine lookup failed: ${String(error)}`);
422
+ }
423
+ }
424
+ const host = ctx.get('workflowEngine');
425
+ if (host !== undefined)
426
+ return { engine: host };
427
+ return {
428
+ why: presets === undefined
429
+ ? 'the agent-preset registry is not mounted and the host plane has no workflowEngine'
430
+ : typeof presets.serviceFor !== 'function'
431
+ ? 'the mounted agentPresets service has no serviceFor() and the host plane has no workflowEngine'
432
+ : 'the calling agent preset does not mount a workflow engine (standard/cordis enable workflow-ptc; ptc/minimal do not) and the host plane has none',
433
+ };
434
+ }
435
+ /**
436
+ * Run the per-dimension verification workflow through the workflow seam.
437
+ *
438
+ * Every way this can fail — no spec, no agent, an engine that is unreachable
439
+ * from this realm, a rejected start, an early stop, a malformed value, a
440
+ * rejected result — settles as `verification: null` plus a note that the
441
+ * report renders. A missing seam must not fail the report call itself, but it
442
+ * must not look like "the checks all passed and there was nothing to say"
443
+ * either.
444
+ * @returns the settled checks, or null verification with the reason.
402
445
  */
403
446
  async function runVerifyWorkflow(ctx, config, spec, exec) {
404
- if (spec === null || exec.agent === undefined)
405
- return null;
406
- const engine = ctx.get('workflowEngine');
447
+ if (spec === null) {
448
+ return { verification: null, note: 'no committed spec is on record; record one with doublecheck_spec before verification' };
449
+ }
450
+ if (exec.agent === undefined) {
451
+ return { verification: null, note: 'the call has no owning agent, so no agent preset can supply a workflow engine' };
452
+ }
453
+ const { engine, why } = resolveWorkflowEngine(ctx, exec.agent);
407
454
  if (engine === undefined) {
408
- ctx.logger.warn('dsh-doublecheck: verification skipped: the workflowEngine seam is not mounted');
409
- return null;
455
+ const note = `verification did not run: ${why}`;
456
+ ctx.logger.warn(`dsh-doublecheck: ${note}`);
457
+ return { verification: null, note };
410
458
  }
411
459
  let run;
412
460
  try {
@@ -423,16 +471,20 @@ async function runVerifyWorkflow(ctx, config, spec, exec) {
423
471
  catch (error) {
424
472
  // Invalid script/meta or an absent verify provider: verification did not
425
473
  // run, and the report states so instead of failing the report itself.
426
- ctx.logger.warn(`dsh-doublecheck: verification workflow rejected: ${String(error)}`);
427
- return null;
474
+ const note = `verification did not run: the workflow engine rejected the verify run: ${String(error)}`;
475
+ ctx.logger.warn(`dsh-doublecheck: ${note}`);
476
+ return { verification: null, note };
428
477
  }
429
478
  try {
430
479
  const result = await run.result;
431
- if (result.stopReason !== 'completed')
432
- return null;
480
+ if (result.stopReason !== 'completed') {
481
+ const detail = result.error === undefined ? '' : `: ${result.error}`;
482
+ return { verification: null, note: `verification did not run: the verify workflow stopped with "${result.stopReason}" before completing${detail}` };
483
+ }
433
484
  const value = result.value;
434
- if (value === null || value === undefined || !Array.isArray(value.checks))
435
- return null;
485
+ if (value === null || value === undefined || !Array.isArray(value.checks)) {
486
+ return { verification: null, note: 'verification did not run: the verify workflow completed without a structured checks array' };
487
+ }
436
488
  const checks = [];
437
489
  for (const check of value.checks) {
438
490
  if (!VERIFY_DIMENSIONS.includes(check.dimension))
@@ -443,17 +495,23 @@ async function runVerifyWorkflow(ctx, config, spec, exec) {
443
495
  // judged here so a checker that silently dropped a dimension cannot
444
496
  // upgrade the delivery.
445
497
  const complete = VERIFY_DIMENSIONS.every(dimension => checks.some(check => check.dimension === dimension));
446
- return { checks, complete };
498
+ return { verification: { checks, complete }, note: null };
447
499
  }
448
500
  catch (error) {
449
501
  // A broken workflow engine must not fail the report call itself: the
450
502
  // delivery settles as unverified and the markdown says verification did
451
- // not run.
452
- ctx.logger.warn(`dsh-doublecheck: verification workflow failed: ${String(error)}`);
453
- return null;
503
+ // not run, with the reason.
504
+ const note = `verification did not run: the verify workflow failed: ${String(error)}`;
505
+ ctx.logger.warn(`dsh-doublecheck: ${note}`);
506
+ return { verification: null, note };
454
507
  }
455
508
  finally {
456
- await run.dispose();
509
+ try {
510
+ await run.dispose();
511
+ }
512
+ catch (error) {
513
+ ctx.logger.warn(`dsh-doublecheck: verify run disposal failed: ${String(error)}`);
514
+ }
457
515
  }
458
516
  }
459
517
  /** Write the report markdown through the filesystem seam, when one exists. */
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -113,6 +113,7 @@ export function doublecheckHandler(deps) {
113
113
  ...facts,
114
114
  verdict: deriveReportVerdict(facts, null),
115
115
  verification: null,
116
+ verificationNote: null,
116
117
  path: null,
117
118
  written: false,
118
119
  };
File without changes
package/lib/guard/gate.js CHANGED
File without changes
File without changes
@@ -585,31 +585,36 @@ export function apply(ctx, config) {
585
585
  const registry = projectionCtx.get('sessionProjections');
586
586
  if (registry === undefined)
587
587
  return;
588
- // The registry returns the disposer that unregisters this projection; it
589
- // MUST be owned by an effect. Registering without holding it left the old
590
- // closure live after a config hot-reload: turning `gate` (or any detection
591
- // knob) off and on again kept judging with the stale definitions — a
592
- // silent false-safety window, and a hard throw once the state version moved.
593
- projectionCtx.effect(() => registry.register({
594
- key: 'doublecheck',
595
- stateSchema: doublecheckStateSchema,
596
- init: emptyDoublecheckState,
597
- apply: (state, event) => applyDoublecheckEvent(state, event, detection),
598
- wire: {
599
- viewSchema: doublecheckViewSchema,
600
- view: viewDoublecheck,
601
- },
602
- // v3: the wire value changed type (object -> one bounded line). The
603
- // bump is the persisted-cache invalidation the registry documents, and
604
- // it IS the backward-compatibility story: the state fields themselves
605
- // are unchanged and still pass `doublecheckStateSchema`, but a row
606
- // written at `ver: 2` is discarded on a `ver: 3` unit and the key
607
- // refolds from `init` over the full log (the host's `restoreFloor`
608
- // drops to seq 0 on any version mismatch). No migration code, and a
609
- // pre-upgrade session degrades to a recomputed line instead of a
610
- // stale one or a crash.
611
- stateVersion: 3,
612
- }), 'dsh-doublecheck: projection');
588
+ // Registration is asynchronous on the 0.2.2 line and returns a ready
589
+ // handle; awaiting it inside the effect keeps the fiber from publishing a
590
+ // half-registered unit. The handle's `dispose()` is the unregistration
591
+ // path and MUST be owned by an effect. Registering without holding it left
592
+ // the old closure live after a config hot-reload: turning `gate` (or any
593
+ // detection knob) off and on again kept judging with the stale
594
+ // definitions — a silent false-safety window, and a hard throw once the
595
+ // state version moved.
596
+ projectionCtx.effect(async () => {
597
+ const handle = await registry.register({
598
+ key: 'doublecheck',
599
+ stateSchema: doublecheckStateSchema,
600
+ init: emptyDoublecheckState,
601
+ apply: (state, event) => applyDoublecheckEvent(state, event, detection),
602
+ wire: {
603
+ viewSchema: doublecheckViewSchema,
604
+ view: viewDoublecheck,
605
+ },
606
+ // stateVersion is the persisted-cache invalidation the registry
607
+ // documents, and it IS the backward-compatibility story: the state
608
+ // fields themselves are unchanged and still pass
609
+ // `doublecheckStateSchema`, but a row written at `ver: 2` is
610
+ // discarded on a `ver: 3` unit and the key refolds from `init` over
611
+ // the full log (the host's `restoreFloor` drops to seq 0 on any
612
+ // version mismatch). No migration code, and a pre-upgrade session
613
+ // degrades to a recomputed line instead of a stale one or a crash.
614
+ stateVersion: 3,
615
+ });
616
+ return () => handle.dispose();
617
+ }, 'dsh-doublecheck: projection');
613
618
  });
614
619
  // The invariant companion, registered from the main plugin so its checks
615
620
  // see the live detection knobs. Activates only when an invariant registry
File without changes
File without changes
File without changes
File without changes
package/lib/index.d.ts CHANGED
File without changes
package/lib/index.js CHANGED
File without changes
File without changes
package/lib/invariant.js CHANGED
File without changes
File without changes
File without changes
package/lib/types.d.ts CHANGED
File without changes
package/lib/types.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-doublecheck",
3
- "version": "0.9.29",
3
+ "version": "0.9.31",
4
4
  "description": "Delivery quality gate for DeepSeek Harness: grill the requirements, test the implementation, prove the delivery, and gate the handoff with a deliverable/rework decision.",
5
5
  "packageManager": "pnpm@11.7.0",
6
6
  "repository": {
@@ -51,7 +51,9 @@
51
51
  "README-es.md",
52
52
  "README-pt.md",
53
53
  "README-hi.md",
54
- "LICENSE"
54
+ "LICENSE",
55
+ "PRIVACY.md",
56
+ "icon.svg"
55
57
  ],
56
58
  "scripts": {
57
59
  "build": "tsc --noEmitOnError && node scripts/fix-dts.mjs",
@@ -83,14 +85,18 @@
83
85
  "author": "PerryLink",
84
86
  "license": "Apache-2.0",
85
87
  "engines": {
86
- "node": "^22.19.0 || >=24.0.0",
87
- "dsh": ">=0.1.6-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0"
88
+ "node": "^22.19.0 || >=24.9.0",
89
+ "dsh": ">=0.1.6-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0 || >=0.2.2-0 <0.3.0"
88
90
  },
89
91
  "dsh": {
90
92
  "manifestVersion": 1,
91
93
  "bundle": {
92
94
  "patch": "./cordis.patch.yml"
93
- }
95
+ },
96
+ "capabilities": [
97
+ "tools:register"
98
+ ],
99
+ "labels": []
94
100
  },
95
101
  "dshWorkshop": {
96
102
  "schema": "omdsh-workshop-package/v1",
@@ -137,46 +143,49 @@
137
143
  },
138
144
  "peerDependencies": {
139
145
  "@deepseek-ai/cordis": "^4.0.5-alpha.1",
140
- "@deepseek-ai/dsh-agent": ">=0.1.6-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0",
141
- "@deepseek-ai/dsh-commands": ">=0.1.6-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0",
146
+ "@deepseek-ai/dsh-agent": ">=0.1.6-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0 || >=0.2.2-0 <0.3.0",
147
+ "@deepseek-ai/dsh-commands": ">=0.1.6-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0 || >=0.2.2-0 <0.3.0",
142
148
  "@deepseek-ai/dsh-invariants": ">=0.1.6-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0",
143
- "@deepseek-ai/dsh-llm": ">=0.1.6-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0",
144
- "@deepseek-ai/dsh-session": ">=0.1.6-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0",
145
- "@deepseek-ai/dsh-session-projection": ">=0.1.6-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0",
146
- "@deepseek-ai/dsh-skill": ">=0.1.6-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0",
147
- "@deepseek-ai/dsh-tools": ">=0.1.6-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0",
149
+ "@deepseek-ai/dsh-llm": ">=0.1.6-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0 || >=0.2.2-0 <0.3.0",
150
+ "@deepseek-ai/dsh-session": ">=0.1.6-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0 || >=0.2.2-0 <0.3.0",
151
+ "@deepseek-ai/dsh-session-projection": ">=0.1.6-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0 || >=0.2.2-0 <0.3.0",
152
+ "@deepseek-ai/dsh-skill": ">=0.1.6-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0 || >=0.2.2-0 <0.3.0",
153
+ "@deepseek-ai/dsh-tools": ">=0.1.6-0 <0.2.0 || >=0.2.0-0 <0.3.0 || >=0.2.1-0 <0.3.0 || >=0.2.2-0 <0.3.0",
148
154
  "@deepseek-ai/schemastery": "^3.18.5-alpha.1"
149
155
  },
150
156
  "dependencies": {
151
157
  "zod": "^4.4.3"
152
158
  },
153
159
  "devDependencies": {
154
- "@deepseek-ai/cordis": "^4.0.5-alpha.1",
155
- "@deepseek-ai/cordis-plugin-loader": "^1.0.6-alpha.1",
156
- "@deepseek-ai/dsh-agent": "0.2.1-rc.2",
157
- "@deepseek-ai/dsh-commands": "0.2.1-rc.2",
158
- "@deepseek-ai/dsh-fs": "0.2.1-rc.2",
160
+ "@deepseek-ai/cordis": "^4.1.0",
161
+ "@deepseek-ai/cordis-plugin-loader": "^1.1.0",
162
+ "@deepseek-ai/dsh-agent": "0.2.2-rc.1",
163
+ "@deepseek-ai/dsh-commands": "0.2.2-rc.1",
164
+ "@deepseek-ai/dsh-fs": "0.2.2-rc.1",
159
165
  "@deepseek-ai/dsh-invariants": "0.2.0-rc.2",
160
- "@deepseek-ai/dsh-llm": "0.2.1-rc.2",
161
- "@deepseek-ai/dsh-session": "0.2.1-rc.2",
162
- "@deepseek-ai/dsh-session-projection": "0.2.1-rc.2",
163
- "@deepseek-ai/dsh-settings": "0.2.1-rc.2",
164
- "@deepseek-ai/dsh-skill": "0.2.1-rc.2",
165
- "@deepseek-ai/dsh-subagent": "0.2.1-rc.2",
166
- "@deepseek-ai/dsh-system-prompt": "0.2.1-rc.2",
167
- "@deepseek-ai/dsh-tools": "0.2.1-rc.2",
168
- "@deepseek-ai/dsh-workflow": "0.2.1-rc.2",
169
- "@deepseek-ai/schemastery": "^3.18.5-alpha.1",
166
+ "@deepseek-ai/dsh-llm": "0.2.2-rc.1",
167
+ "@deepseek-ai/dsh-session": "0.2.2-rc.1",
168
+ "@deepseek-ai/dsh-session-projection": "0.2.2-rc.1",
169
+ "@deepseek-ai/dsh-settings": "0.2.2-rc.1",
170
+ "@deepseek-ai/dsh-skill": "0.2.2-rc.1",
171
+ "@deepseek-ai/dsh-subagent": "0.2.2-rc.1",
172
+ "@deepseek-ai/dsh-system-prompt": "0.2.2-rc.1",
173
+ "@deepseek-ai/dsh-tool-executor-native": "0.2.2-rc.1",
174
+ "@deepseek-ai/dsh-tools": "0.2.2-rc.1",
175
+ "@deepseek-ai/dsh-workflow": "0.2.2-rc.1",
176
+ "@deepseek-ai/schemastery": "~3.19.0",
170
177
  "@eslint/js": "^9.30.0",
171
178
  "@types/node": "^22.15.0",
172
179
  "@vitest/coverage-v8": "^3.2.0",
173
180
  "eslint": "^9.30.0",
174
181
  "typescript-eslint": "^8.35.0",
175
182
  "vitest": "^3.2.0",
176
- "typescript": "^5.7.0"
183
+ "typescript": "^5.7.0",
184
+ "@deepseek-ai/dsh-package-manifest": "0.2.2-rc.1"
177
185
  },
178
186
  "funding": {
179
187
  "type": "individual",
180
188
  "url": "https://github.com/sponsors/PerryLink"
181
- }
189
+ },
190
+ "icon": "icon.svg"
182
191
  }
File without changes
File without changes
File without changes
File without changes
package/strict.patch.yml CHANGED
File without changes