@lmzhen/dsh-evolution-commands 0.16.0 → 0.17.0-rc.1
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.
- package/lib/index.js +728 -188
- package/lib/types/doctor.d.ts +36 -7
- package/lib/types/index.d.ts +21 -13
- package/lib/types/migration.d.ts +104 -0
- package/lib/types/params.d.ts +4 -4
- package/lib/types/platform-view.d.ts +97 -0
- package/lib/types/preset-source.d.ts +44 -0
- package/package.json +8 -8
package/lib/types/doctor.d.ts
CHANGED
|
@@ -8,9 +8,11 @@ export declare const EVOLUTION_BUNDLE_TAILS: Set<string>;
|
|
|
8
8
|
* "absent" is the user simply not using that base (never an action); "unknown"
|
|
9
9
|
* is a comparison that could not run, kept distinct from a verified "fresh". */
|
|
10
10
|
export interface PresetFreshnessRow {
|
|
11
|
-
/**
|
|
11
|
+
/** Profile whose patch layer carries (or lacks) the row. */
|
|
12
|
+
profile: string;
|
|
13
|
+
/** Agent-preset base name — the `--base` value the row was composed for. */
|
|
12
14
|
base: string;
|
|
13
|
-
/**
|
|
15
|
+
/** The profile patch compared: `<home>/profiles/<profile>/cordis.patch.yml`. */
|
|
14
16
|
destination: string;
|
|
15
17
|
status: 'fresh' | 'differs' | 'absent' | 'unknown';
|
|
16
18
|
/** Why the comparison could not run — set on unknown rows only. */
|
|
@@ -39,6 +41,23 @@ export interface ScopedProbeCheck {
|
|
|
39
41
|
/** Scoped gate evaluations that resolved false. */
|
|
40
42
|
misses: number;
|
|
41
43
|
}
|
|
44
|
+
/** G3 (stage 8): what the family's LEGACY settings document still holds.
|
|
45
|
+
|
|
46
|
+
* Read-only: the boot migration and `/evolution migrate` write; doctor only answers whether
|
|
47
|
+
* anything is left. `none` (a document with no family section) and `absent` (no document) are
|
|
48
|
+
* different findings — the first means the values were never the family's, the second that the
|
|
49
|
+
* platform's import already took the file away.
|
|
50
|
+
*/
|
|
51
|
+
export interface LegacyMigrationRow {
|
|
52
|
+
/** `migrated` = every family value sits on its row; `pending` = some do not; `none` = the
|
|
53
|
+
* document carries no family section; `absent` = no legacy document under this home;
|
|
54
|
+
* `unavailable` = no settings seat or no IO seam to read through. */
|
|
55
|
+
readonly state: 'migrated' | 'pending' | 'none' | 'absent' | 'unavailable';
|
|
56
|
+
/** The document the verdict came from, when one was read. */
|
|
57
|
+
readonly source: string | undefined;
|
|
58
|
+
/** Keys still waiting for their row, as `rowId.key`. */
|
|
59
|
+
readonly pending: readonly string[];
|
|
60
|
+
}
|
|
42
61
|
export interface DoctorReport {
|
|
43
62
|
/** OPT-23 (2026-09): `preset-only` — the delivered Evolution preset
|
|
44
63
|
* artifact exists but NO profile carries an evolution bundle (e.g. the
|
|
@@ -101,6 +120,21 @@ export interface DoctorReport {
|
|
|
101
120
|
* whose cross-session consumers are inert for every session stops looking
|
|
102
121
|
* healthy. See {@link ScopedProbeCheck}. */
|
|
103
122
|
scopedProbe: ScopedProbeCheck;
|
|
123
|
+
/** G3 (stage 8): the legacy settings document's remaining work. */
|
|
124
|
+
legacy: LegacyMigrationRow;
|
|
125
|
+
/** G5: the family bundles the RUNNING profile selects, per the platform's `listBundles()`;
|
|
126
|
+
* null when that surface is not mounted — `bundles` then carries the cross-profile aggregate. */
|
|
127
|
+
runtimeBundles: string[] | null;
|
|
128
|
+
/** G5: where the install form came from. `aggregate` = the cross-profile scan (the surface
|
|
129
|
+
* was absent), so the form describes every profile on the machine, not this runtime. */
|
|
130
|
+
formSource: 'platform' | 'aggregate';
|
|
131
|
+
/** G5: the platform's own preset verdicts (see {@link presetIssues}). */
|
|
132
|
+
presetIssues: string[];
|
|
133
|
+
/** G5: family bundles this profile INSTALLS without selecting them (`enabled: false`) — the
|
|
134
|
+
* plugin page lists those too, so doctor names them instead of leaving a visible mismatch. */
|
|
135
|
+
dormantBundles: string[];
|
|
136
|
+
/** G5: where the review row's presence came from: the live entry, or the aggregate inference. */
|
|
137
|
+
serviceSource: 'platform' | 'bundles';
|
|
104
138
|
actions: string[];
|
|
105
139
|
}
|
|
106
140
|
/** Profile bundle rows for evolution-family packages across all profiles.
|
|
@@ -111,11 +145,6 @@ export interface DoctorReport {
|
|
|
111
145
|
* list alone, and treating it as "no bundles" is exactly the fail-open state
|
|
112
146
|
* the double-mount exclusion exists to prevent. */
|
|
113
147
|
export declare function collectEvolutionBundles(home: string, onReadError?: (error: unknown, scope: 'profiles-dir' | 'profile-manifest') => void): string[];
|
|
114
|
-
/**
|
|
115
|
-
* Diagnose the deployment. `ctx` supplies service presence (a bare stub with
|
|
116
|
-
* only `get` is enough); `home` defaults to the evolution root so tests can
|
|
117
|
-
* point doctor at a temp DSH_HOME.
|
|
118
|
-
*/
|
|
119
148
|
export declare function diagnose(ctx: {
|
|
120
149
|
get(name: string): unknown;
|
|
121
150
|
}, options?: {
|
package/lib/types/index.d.ts
CHANGED
|
@@ -4,6 +4,14 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { Context } from '@deepseek-ai/cordis';
|
|
6
6
|
import z from '@deepseek-ai/schemastery';
|
|
7
|
+
import type { ContextFormed } from '@deepseek-ai/dsh-llm';
|
|
8
|
+
declare module '@deepseek-ai/dsh-llm' {
|
|
9
|
+
interface MessageSourceMap {
|
|
10
|
+
'evolution-commands': {
|
|
11
|
+
kind: 'evolution-commands';
|
|
12
|
+
} & ContextFormed;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
7
15
|
export declare const name = "evolution-commands";
|
|
8
16
|
export interface Config {
|
|
9
17
|
/** Skill-tree root for maintain/restructure; empty uses the default tree.
|
|
@@ -37,19 +45,19 @@ export interface Config {
|
|
|
37
45
|
* widens them. */
|
|
38
46
|
threatExemptLabels?: string[] | undefined;
|
|
39
47
|
}
|
|
40
|
-
export declare const Config: z<Schemastery.ObjectS<{
|
|
41
|
-
root: z<string, string>;
|
|
42
|
-
skillsRoot: z<string, string>;
|
|
43
|
-
maintainCooldownMs: z<number, number>;
|
|
44
|
-
maintainTimeoutMs: z<number, number>;
|
|
45
|
-
threatExemptLabels: z<string[], string[]>;
|
|
46
|
-
}
|
|
47
|
-
root: z<string, string>;
|
|
48
|
-
skillsRoot: z<string, string>;
|
|
49
|
-
maintainCooldownMs: z<number, number>;
|
|
50
|
-
maintainTimeoutMs: z<number, number>;
|
|
51
|
-
threatExemptLabels: z<string[], string[]>;
|
|
52
|
-
}
|
|
48
|
+
export declare const Config: z<Schemastery.ObjectS<NoInfer<{
|
|
49
|
+
root: z<string, string, "defined">;
|
|
50
|
+
skillsRoot: z<string, string, "defined">;
|
|
51
|
+
maintainCooldownMs: z<number, number, "defined">;
|
|
52
|
+
maintainTimeoutMs: z<number, number, "defined">;
|
|
53
|
+
threatExemptLabels: z<string[], string[], "defined">;
|
|
54
|
+
}>>, Schemastery.ObjectT<NoInfer<{
|
|
55
|
+
root: z<string, string, "defined">;
|
|
56
|
+
skillsRoot: z<string, string, "defined">;
|
|
57
|
+
maintainCooldownMs: z<number, number, "defined">;
|
|
58
|
+
maintainTimeoutMs: z<number, number, "defined">;
|
|
59
|
+
threatExemptLabels: z<string[], string[], "defined">;
|
|
60
|
+
}>>, "plain">;
|
|
53
61
|
export declare function apply(ctx: Context, rawConfig?: Config): void;
|
|
54
62
|
/** F-211: the fs surface atomicWriteFiles uses — injectable so the commit-phase
|
|
55
63
|
* rename-failure path is deterministically testable. Defaults to node:fs.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { EvolutionIoLike, NamespaceMigrationPlan, NamespaceMigrationReport, SettingsProviderLike } from '@lmzhen/dsh-evolution-core';
|
|
2
|
+
/**
|
|
3
|
+
* The legacy document names the platform leaves behind, in read order.
|
|
4
|
+
* @param home - the profile home the document sits in.
|
|
5
|
+
* @returns both candidate paths, the renamed import first.
|
|
6
|
+
*/
|
|
7
|
+
export declare function legacySettingsPaths(home: string): readonly string[];
|
|
8
|
+
/** What one migration attempt found and did. */
|
|
9
|
+
export interface NamespaceMigrationOutcome {
|
|
10
|
+
/** The file the plan was read from; undefined when neither name exists. */
|
|
11
|
+
readonly source: string | undefined;
|
|
12
|
+
/** The document's plan; undefined when there was no document to read. */
|
|
13
|
+
readonly plan: NamespaceMigrationPlan | undefined;
|
|
14
|
+
/** What the run wrote; undefined when the document carried nothing to move. */
|
|
15
|
+
readonly report: NamespaceMigrationReport | undefined;
|
|
16
|
+
}
|
|
17
|
+
/** Everything {@link runNamespaceMigration} needs from its caller. */
|
|
18
|
+
export interface NamespaceMigrationRun {
|
|
19
|
+
/** The profile home the legacy document sits in. */
|
|
20
|
+
readonly home: string;
|
|
21
|
+
/** The family IO seam, for the read. */
|
|
22
|
+
readonly io: EvolutionIoLike;
|
|
23
|
+
/** The platform settings seat; undefined when the deployment has none. */
|
|
24
|
+
readonly settings: SettingsProviderLike | undefined;
|
|
25
|
+
/** Where a kept value is reported (the run always reports, never silently drops). */
|
|
26
|
+
readonly warn: (message: string) => void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Read the first legacy document that exists and merge what it holds.
|
|
30
|
+
*
|
|
31
|
+
* The write goes through the platform's own `settings.update`, so the merge semantics, the
|
|
32
|
+
* revision fence and the row's schema validation are the platform's — a row whose schema
|
|
33
|
+
* refuses a key refuses the whole patch, which is why the planner refuses unknown keys
|
|
34
|
+
* before this runs.
|
|
35
|
+
* @param run - the home, the reader, the settings seat and the warning sink.
|
|
36
|
+
* @returns the source file, its plan, and what the run did (all undefined when there was
|
|
37
|
+
* nothing to read or nowhere to write).
|
|
38
|
+
*/
|
|
39
|
+
export declare function runNamespaceMigration(run: NamespaceMigrationRun): Promise<NamespaceMigrationOutcome>;
|
|
40
|
+
/** What the legacy document still holds, and what a row already answers for. */
|
|
41
|
+
export interface LegacyDocumentState {
|
|
42
|
+
/** The document the verdict came from. */
|
|
43
|
+
readonly source: string;
|
|
44
|
+
/** How many legacy sections carried values a row can take. */
|
|
45
|
+
readonly sections: number;
|
|
46
|
+
/** Keys no row carries yet, as `rowId.key` — a run would write these. */
|
|
47
|
+
readonly pending: readonly string[];
|
|
48
|
+
/** Keys a row already answers for (equal value, or a stored value that won). */
|
|
49
|
+
readonly settled: readonly string[];
|
|
50
|
+
}
|
|
51
|
+
/** Everything {@link readLegacyDocumentState} reads: the home, the reader, the settings seat. */
|
|
52
|
+
export interface LegacyDocumentRead {
|
|
53
|
+
/** The profile home the legacy document sits in. */
|
|
54
|
+
readonly home: string;
|
|
55
|
+
/** The family IO seam, for the read. */
|
|
56
|
+
readonly io: EvolutionIoLike;
|
|
57
|
+
/** The platform settings seat; undefined when the deployment has none. */
|
|
58
|
+
readonly settings: SettingsProviderLike | undefined;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Read the legacy document and report what is still unmigrated.
|
|
62
|
+
*
|
|
63
|
+
* Read-only by construction: the answer comes from the pure classifier, never from the
|
|
64
|
+
* applier, so a doctor run cannot write. `runNamespaceMigration` and this read the SAME
|
|
65
|
+
* decision, which is what keeps the report and the next run's outcome from disagreeing.
|
|
66
|
+
* @param run - the home, the reader, the settings seat.
|
|
67
|
+
* @returns the state, or undefined when there is no legacy document or no settings seat.
|
|
68
|
+
*/
|
|
69
|
+
export declare function readLegacyDocumentState(run: LegacyDocumentRead): Promise<LegacyDocumentState | undefined>;
|
|
70
|
+
/** The context members the migration reads, structurally, so a spec needs no host. */
|
|
71
|
+
export interface MigrationHost {
|
|
72
|
+
/** The service store (`settings`, `profileContext`, `evolutionIo`). */
|
|
73
|
+
get(name: string): unknown;
|
|
74
|
+
readonly logger: {
|
|
75
|
+
warn(message: string): void;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/** Why an attempt could not run: a missing prerequisite, named for the caller's message. */
|
|
79
|
+
export type NamespaceMigrationProblem = 'settings' | 'home' | 'io';
|
|
80
|
+
/** One attempt: either an outcome, or the prerequisite that was absent. */
|
|
81
|
+
export type NamespaceMigrationAttempt = {
|
|
82
|
+
readonly ok: true;
|
|
83
|
+
readonly outcome: NamespaceMigrationOutcome;
|
|
84
|
+
} | {
|
|
85
|
+
readonly ok: false;
|
|
86
|
+
readonly problem: NamespaceMigrationProblem;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Run the migration from a plugin context: probe the settings seat, the profile home and the
|
|
90
|
+
* IO seam, then delegate to {@link runNamespaceMigration}.
|
|
91
|
+
*
|
|
92
|
+
* The command reports `problem` as its own error text; a boot-time caller skips instead — the
|
|
93
|
+
* point of naming the missing prerequisite rather than throwing is that both readers can act.
|
|
94
|
+
* @param host - the context (services + logger).
|
|
95
|
+
* @returns the outcome, or the prerequisite that is absent.
|
|
96
|
+
*/
|
|
97
|
+
export declare function migrateFromContext(host: MigrationHost): Promise<NamespaceMigrationAttempt>;
|
|
98
|
+
/**
|
|
99
|
+
* Render one outcome for the command surface.
|
|
100
|
+
* @param outcome - the run's result.
|
|
101
|
+
* @returns the report text (Chinese copy, the family's user-facing language).
|
|
102
|
+
*/
|
|
103
|
+
export declare function renderNamespaceMigration(outcome: NamespaceMigrationOutcome): string;
|
|
104
|
+
//# sourceMappingURL=migration.d.ts.map
|
package/lib/types/params.d.ts
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
* surface, so one text answers "which parameters exist, who may write them, and
|
|
4
4
|
* did I already override this one".
|
|
5
5
|
*
|
|
6
|
-
* The join key is the OWNER PACKAGE:
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* The join key is the OWNER PACKAGE: `settings.describe()` keys a section by the Loader
|
|
7
|
+
* entry id, which is the row id (core's `paramSettingsId` names that mapping), and reports
|
|
8
|
+
* that section's raw user section (a key's PRESENCE is the override) plus the resolved
|
|
9
|
+
* value. Everything here is pure; the command handler supplies the data.
|
|
10
10
|
* @module @lmzhen/dsh-evolution-commands/params
|
|
11
11
|
*/
|
|
12
12
|
import { type ParamExposure } from '@lmzhen/dsh-evolution-core';
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* G5: the platform's own view of the RUNNING profile, read through the services the platform
|
|
3
|
+
* mounts — `pluginManager` (bundles, plugin rows), `configEditor` (inherited vs override) and
|
|
4
|
+
* `pluginInventory` (live rows, agent presets).
|
|
5
|
+
*
|
|
6
|
+
* Read structurally on purpose: the family declares no dependency edge into the platform's
|
|
7
|
+
* management packages, because a plane that does not mount them must render a named line, not
|
|
8
|
+
* fail to load. Every reader answers `undefined` for an absent surface; the caller says what
|
|
9
|
+
* that means, and no caller may re-derive the same facts by scanning the profile off disk — one
|
|
10
|
+
* fact has one home.
|
|
11
|
+
* @module @lmzhen/dsh-evolution-commands/platform-view
|
|
12
|
+
*/
|
|
13
|
+
/** One installed bundle as the platform reports it (the fields the doctor reads). */
|
|
14
|
+
export interface PlatformBundle {
|
|
15
|
+
/** Package name. */
|
|
16
|
+
readonly name: string;
|
|
17
|
+
/** Selected in the profile manifest; a load error means its layer was skipped. */
|
|
18
|
+
readonly enabled: boolean;
|
|
19
|
+
/** Held by the profile's own dependencies (false = supplied by the installation). */
|
|
20
|
+
readonly installed: boolean;
|
|
21
|
+
/** Shipped for the person to switch on. */
|
|
22
|
+
readonly optional: boolean;
|
|
23
|
+
readonly removable: boolean;
|
|
24
|
+
/** Why a profile control cannot modify it, when it cannot. */
|
|
25
|
+
readonly readOnlyReason?: string;
|
|
26
|
+
/** A management failure; `code` is the platform's own discriminant. */
|
|
27
|
+
readonly error?: {
|
|
28
|
+
readonly code?: string;
|
|
29
|
+
readonly diagnostic?: string;
|
|
30
|
+
};
|
|
31
|
+
/** The rows the bundle's patch inserts. */
|
|
32
|
+
readonly rows: readonly {
|
|
33
|
+
readonly rowId: string;
|
|
34
|
+
readonly moduleName: string;
|
|
35
|
+
}[];
|
|
36
|
+
/** Ids of rows the bundle's patch changes without declaring them. */
|
|
37
|
+
readonly overrides: readonly string[];
|
|
38
|
+
}
|
|
39
|
+
/** One live Loader entry as the platform reports it. */
|
|
40
|
+
export interface PlatformPlugin {
|
|
41
|
+
/** The Loader entry id. */
|
|
42
|
+
readonly entryId: string;
|
|
43
|
+
/** The row id the entry carries, when the platform resolved one. */
|
|
44
|
+
readonly moduleName?: string;
|
|
45
|
+
readonly enabled: boolean;
|
|
46
|
+
/** The fiber's lifecycle phase, as the platform names it. */
|
|
47
|
+
readonly fiberPhase?: string;
|
|
48
|
+
}
|
|
49
|
+
/** One agent preset as the platform reports it. */
|
|
50
|
+
export interface PlatformPreset {
|
|
51
|
+
readonly id: string;
|
|
52
|
+
readonly name?: string;
|
|
53
|
+
readonly isDefault?: boolean;
|
|
54
|
+
/** The platform's own verdict on a preset it could not compose; absent when it is healthy. */
|
|
55
|
+
readonly broken?: string;
|
|
56
|
+
/** Composition rows; `entryId` is null for a row that declares none. `enabled` includes
|
|
57
|
+
* disabled ancestor groups, so a row the platform ships switched off is visible as such. */
|
|
58
|
+
readonly rows: readonly {
|
|
59
|
+
readonly entryId: string | null;
|
|
60
|
+
readonly moduleName?: string;
|
|
61
|
+
readonly enabled?: boolean | 'conditional';
|
|
62
|
+
}[];
|
|
63
|
+
}
|
|
64
|
+
/** One managed entry's two layers, as `configEditor.configuration()` reports them. */
|
|
65
|
+
export interface PlatformConfiguration {
|
|
66
|
+
/** The Loader entry the layers belong to (the platform hands over the entry itself). */
|
|
67
|
+
readonly entry: {
|
|
68
|
+
readonly options?: {
|
|
69
|
+
readonly id?: string;
|
|
70
|
+
readonly name?: string;
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
/** The value the inherited layers (bundle, preset) resolve to. */
|
|
74
|
+
readonly inherited: unknown;
|
|
75
|
+
/** The user's override, when the profile patch sets one. */
|
|
76
|
+
readonly override: unknown;
|
|
77
|
+
}
|
|
78
|
+
/** What the running profile looks like through the platform's surfaces. */
|
|
79
|
+
export interface PlatformView {
|
|
80
|
+
/** `pluginManager.listBundles()`; undefined when that service is not mounted. */
|
|
81
|
+
readonly bundles: readonly PlatformBundle[] | undefined;
|
|
82
|
+
/** `pluginManager.listPlugins()`, or the inventory's own entry list; undefined when neither. */
|
|
83
|
+
readonly plugins: readonly PlatformPlugin[] | undefined;
|
|
84
|
+
/** `configEditor.configuration()`; undefined when that service is not mounted. */
|
|
85
|
+
readonly configuration: readonly PlatformConfiguration[] | undefined;
|
|
86
|
+
/** The inventory's agent presets; undefined outside a Web composition (that row is a Web-app one). */
|
|
87
|
+
readonly presets: readonly PlatformPreset[] | undefined;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Read every platform surface the doctor uses.
|
|
91
|
+
* @param ctx - the context (services), read structurally.
|
|
92
|
+
* @returns the view; each member is undefined when its surface is not mounted or did not answer.
|
|
93
|
+
*/
|
|
94
|
+
export declare function readPlatformView(ctx: {
|
|
95
|
+
get(name: string): unknown;
|
|
96
|
+
}): Promise<PlatformView>;
|
|
97
|
+
//# sourceMappingURL=platform-view.d.ts.map
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** The launcher-owned profile facts a preset write needs. */
|
|
2
|
+
export interface PresetProfileTarget {
|
|
3
|
+
/** Profile name, e.g. `web`. */
|
|
4
|
+
readonly profile: string;
|
|
5
|
+
/** Absolute profile directory. */
|
|
6
|
+
readonly profileDir: string;
|
|
7
|
+
/** Absolute path of the profile's `cordis.patch.yml` — where a new row goes. */
|
|
8
|
+
readonly patchPath: string;
|
|
9
|
+
/** Bundle package names this process started with (`startedBundles`). */
|
|
10
|
+
readonly bundles: readonly string[];
|
|
11
|
+
}
|
|
12
|
+
/** The patch file name inside a profile directory (`packages/boot/app-boot/src/profile.ts`,
|
|
13
|
+
* `PROFILE_PATCH_FILENAME`). */
|
|
14
|
+
export declare const PROFILE_PATCH_FILENAME = "cordis.patch.yml";
|
|
15
|
+
/**
|
|
16
|
+
* The profile patch this process writes into, or undefined outside a profile.
|
|
17
|
+
*
|
|
18
|
+
* `profileContext` is registered by the profile launcher only
|
|
19
|
+
* (`packages/boot/app-boot/src/profile-context.ts`); a bare library mount — the family's own specs,
|
|
20
|
+
* or a host started without a profile — has none, and then there is no file for a row to live in.
|
|
21
|
+
* @param ctx - the plugin context (a `get(name)` view is enough).
|
|
22
|
+
* @returns the target, or undefined when no profile is mounted.
|
|
23
|
+
*/
|
|
24
|
+
export declare function presetProfileTarget(ctx: {
|
|
25
|
+
get(name: string): unknown;
|
|
26
|
+
}): PresetProfileTarget | undefined;
|
|
27
|
+
/** The family preset id stem: every shipped id starts with it (`evolution-agent/bases.json`),
|
|
28
|
+
* which is what a profile carrying a family row is recognized by when the table itself cannot be
|
|
29
|
+
* read. */
|
|
30
|
+
export declare const FAMILY_PRESET_ID_STEM = "evolution";
|
|
31
|
+
/**
|
|
32
|
+
* Resolve the platform base preset patch one `--base` composes.
|
|
33
|
+
*
|
|
34
|
+
* The module graph is probed FIRST: a desktop/Electron host resolves the bundle package inside
|
|
35
|
+
* `app.asar`, where no file walk reaches — the platform packages are not on disk at all. The file
|
|
36
|
+
* candidates (the target profile's own `node_modules`, then the unpacked Electron resource scope,
|
|
37
|
+
* then a source checkout, then a global install, then `DSH_AGENT_PRESET_ROOT`) and the loud failure
|
|
38
|
+
* live in core's `resolveBasePresetPatch`.
|
|
39
|
+
* @param base - the base name from `evolution-agent/bases.json`.
|
|
40
|
+
* @param target - the profile target, when one is mounted.
|
|
41
|
+
* @returns the patch file's absolute path.
|
|
42
|
+
*/
|
|
43
|
+
export declare function resolvePresetBasePatch(base: string, target: PresetProfileTarget | undefined): string;
|
|
44
|
+
//# sourceMappingURL=preset-source.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lmzhen/dsh-evolution-commands",
|
|
3
3
|
"description": "Human commands for the evolution family (/evolution pending|curator|maintain|doctor) (community build)",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.17.0-rc.1",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -27,19 +27,19 @@
|
|
|
27
27
|
"license": "MIT",
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@deepseek-ai/schemastery": "^3.18.1",
|
|
30
|
-
"@lmzhen/dsh-evolution-approval": "^0.
|
|
31
|
-
"@lmzhen/dsh-evolution-core": "^0.
|
|
32
|
-
"@lmzhen/dsh-evolution-maintenance": "^0.
|
|
30
|
+
"@lmzhen/dsh-evolution-approval": "^0.17.0-rc.1",
|
|
31
|
+
"@lmzhen/dsh-evolution-core": "^0.17.0-rc.1",
|
|
32
|
+
"@lmzhen/dsh-evolution-maintenance": "^0.17.0-rc.1"
|
|
33
33
|
},
|
|
34
34
|
"optionalDependencies": {
|
|
35
|
-
"@lmzhen/dsh-evolution-agent-preset": "^0.
|
|
35
|
+
"@lmzhen/dsh-evolution-agent-preset": "^0.17.0-rc.1"
|
|
36
36
|
},
|
|
37
37
|
"peerDependencies": {
|
|
38
38
|
"@deepseek-ai/cordis": "^4.0.1",
|
|
39
|
-
"@deepseek-ai/dsh-commands": "^0.
|
|
40
|
-
"@deepseek-ai/dsh-llm": "^0.
|
|
39
|
+
"@deepseek-ai/dsh-commands": "^0.2.0-rc.1",
|
|
40
|
+
"@deepseek-ai/dsh-llm": "^0.2.0-rc.1"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@deepseek-ai/dsh-commands": "^0.
|
|
43
|
+
"@deepseek-ai/dsh-commands": "^0.2.0-rc.1"
|
|
44
44
|
}
|
|
45
45
|
}
|