@dsh-workbench/core 1.1.1 → 1.1.2

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 (32) hide show
  1. package/README.md +14 -5
  2. package/bin/dsh-workbench +7 -1
  3. package/client.js +678 -382
  4. package/dist/client/client.body.js +678 -382
  5. package/dist/client/index.js +545 -249
  6. package/dist/host/index.js +710 -380
  7. package/dist/types/app/layouts/approval-detail.d.ts +2 -1
  8. package/dist/types/app/layouts/market/discover-source-item.d.ts +26 -0
  9. package/dist/types/app/layouts/market/discover-sources-dialog.d.ts +4 -0
  10. package/dist/types/app/layouts/market/discover-view.d.ts +2 -0
  11. package/dist/types/app/layouts/market/use-discover.d.ts +3 -0
  12. package/dist/types/kernel/contract/market-index.d.ts +1 -1
  13. package/dist/types/modules/panels/client.d.ts +1 -1
  14. package/dist/types/modules/panels/model/approval.d.ts +4 -2
  15. package/dist/types/modules/panels/model/diy-publish.d.ts +10 -0
  16. package/dist/types/modules/panels/model/diy-tools.d.ts +0 -1
  17. package/dist/types/modules/panels/model/market-sources-act.d.ts +2 -1
  18. package/dist/types/modules/panels/model/market-sources-tool.d.ts +3 -0
  19. package/dist/types/modules/panels/model/market-sources-tool.test.d.ts +1 -0
  20. package/dist/types/modules/panels/model/market-tools.d.ts +8 -1
  21. package/dist/types/modules/panels/model/publish-claim.d.ts +2 -0
  22. package/dist/types/modules/panels/unit.d.ts +7 -5
  23. package/dist/types/shared/api/host/diy-publish-preview.d.ts +2 -0
  24. package/dist/types/shared/api/host/market-source-init.d.ts +1 -0
  25. package/dist/types/shared/api/host/market-sources-store.d.ts +2 -0
  26. package/dist/types/shared/hooks/market-queries.d.ts +1 -1
  27. package/package.json +3 -3
  28. package/skills/workbench-module-diy/FAMILY.md +3 -4
  29. package/skills/workbench-module-diy/SKILL.md +4 -1
  30. package/skills/workbench-module-diy/WIRING.md +9 -2
  31. package/dist/types/modules/panels/model/diy-changelog.d.ts +0 -2
  32. package/dist/types/shared/api/host/diy-changelog.d.ts +0 -13
@@ -1,5 +1,5 @@
1
1
  import type { ApprovalInput, ReactNode, Translate } from '@dsh-workbench/shared';
2
- import type { PublishPreview } from '../../kernel/contract/market-index';
2
+ import type { MarketSourcesPayload, PublishPreview } from '../../kernel/contract/market-index';
3
3
  export interface ApprovalRow {
4
4
  readonly label: string;
5
5
  readonly value: string;
@@ -11,6 +11,7 @@ export interface ApprovalPlanView {
11
11
  readonly rows: readonly ApprovalRow[];
12
12
  readonly warn?: string | undefined;
13
13
  }
14
+ export declare function marketSourceRows(tool: string, args: Readonly<Record<string, unknown>>, payload: MarketSourcesPayload | null | undefined, t: Translate): readonly ApprovalRow[];
14
15
  export declare function shellClaimsApprovalDetail(tool: string): boolean;
15
16
  export declare function shellApprovalPlan(input: ApprovalInput, t: Translate): ApprovalPlanView | undefined;
16
17
  export declare function shellApprovalDetail(input: ApprovalInput, t: Translate): ReactNode;
@@ -0,0 +1,26 @@
1
+ import type { Translate } from '@dsh-workbench/shared';
2
+ import type { DiscoverSourceRow } from '../../../kernel/contract/market-index';
3
+ export interface DiscoverSourceItemProps {
4
+ readonly t: Translate;
5
+ readonly source: DiscoverSourceRow;
6
+ readonly selected: boolean;
7
+ readonly loading: boolean;
8
+ readonly slow: boolean;
9
+ readonly problem: string | null;
10
+ readonly pending: boolean;
11
+ readonly enable: boolean;
12
+ readonly disable: boolean;
13
+ readonly working: boolean;
14
+ readonly onSelect: () => void;
15
+ readonly onRemove: () => void;
16
+ readonly onEnable: () => void;
17
+ readonly onReadOnly: () => void;
18
+ }
19
+ export declare function DiscoverSourceItem(props: DiscoverSourceItemProps): JSX.Element;
20
+ export interface DiscoverSourceConfirmProps {
21
+ readonly t: Translate;
22
+ readonly label: string;
23
+ readonly onCancel: () => void;
24
+ readonly onConfirm: () => void;
25
+ }
26
+ export declare function DiscoverSourceConfirm(props: DiscoverSourceConfirmProps): JSX.Element;
@@ -11,11 +11,15 @@ export interface DiscoverSourcesDialogProps {
11
11
  readonly id: string;
12
12
  readonly detail: string;
13
13
  } | null;
14
+ readonly failure: string | null;
14
15
  readonly busy: boolean;
15
16
  readonly adding: boolean;
17
+ readonly pendingSourceId: string | null;
16
18
  readonly onClose: () => void;
17
19
  readonly onAdd: (url: string) => void;
18
20
  readonly onRemove: (id: string) => void;
19
21
  readonly onSelect: (id: string) => void;
22
+ readonly onEnable: (id: string) => void;
23
+ readonly onReadOnly: (id: string) => void;
20
24
  }
21
25
  export declare function DiscoverSourcesDialog(props: DiscoverSourcesDialogProps): JSX.Element;
@@ -35,4 +35,6 @@ export type SourceFromUrl = {
35
35
  };
36
36
  export declare function sourceFromUrl(raw: string): SourceFromUrl;
37
37
  export declare function sameSourceUrl(left: string, right: string): boolean;
38
+ export type DiscoverSourceState = 'writable' | 'read-only';
39
+ export declare function sourceStateOf(source: DiscoverSourceRow): DiscoverSourceState;
38
40
  export declare function sourceLabelsOf(sources: readonly DiscoverSourceRow[]): ReadonlyMap<string, string>;
@@ -49,6 +49,7 @@ export interface DiscoverController {
49
49
  readonly empty: boolean;
50
50
  } | null;
51
51
  readonly defaultBranch: string;
52
+ readonly pendingSourceId: string | null;
52
53
  readonly initOpen: boolean;
53
54
  readonly reload: () => void;
54
55
  readonly setQuery: (value: string) => void;
@@ -64,6 +65,8 @@ export interface DiscoverController {
64
65
  readonly setManageOpen: (open: boolean) => void;
65
66
  readonly setInitOpen: (open: boolean) => void;
66
67
  readonly initialize: (branch: string) => void;
68
+ readonly enableSource: (id: string) => void;
69
+ readonly readOnlySource: (id: string) => void;
67
70
  readonly addSource: (url: string) => void;
68
71
  readonly removeSourceById: (id: string) => void;
69
72
  readonly selectSource: (id: string) => void;
@@ -1,2 +1,2 @@
1
1
  export { MARKET_DISCOVER_ROUTE, MARKET_DOC_ROUTE, MARKET_INDEX_FORMAT, MARKET_INDEX_PATH, MARKET_PUBLISH_PREVIEW_ROUTE, MARKET_SOURCES_RESOURCE, MARKET_SOURCES_ROUTE, MARKET_WORKBENCH_LABEL, } from '@dsh-workbench/shared/contract/protocol/market-index';
2
- export type { DiscoverCompat, DiscoverDoc, DiscoverDocKind, DiscoverEntry, DiscoverFilter, DiscoverInstallState, DiscoverPayload, DiscoverProblem, DiscoverSourceRow, DiscoverState, DiscoverVersionRow, IndexSourceSpec, MarketIndex, MarketIndexCategory, MarketIndexEngines, MarketIndexEntry, MarketIndexEntryMetadata, MarketIndexGitSource, MarketIndexLabel, MarketIndexMetadata, MarketIndexNpmSource, MarketIndexParse, MarketIndexProblem, MarketIndexProblemKind, MarketIndexSortKey, MarketIndexSource, MarketIndexVersion, MarketLocalizedText, MarketPublishDestination, MarketSourceConfig, MarketSourceKind, MarketSourcePolicy, MarketSourcesAction, MarketSourcesPayload, PublishChangelog, PublishPreview, } from '@dsh-workbench/shared/contract/protocol/market-index';
2
+ export type { DiscoverCompat, DiscoverDoc, DiscoverDocKind, DiscoverEntry, DiscoverFilter, DiscoverInstallState, DiscoverPayload, DiscoverProblem, DiscoverSourceRow, DiscoverState, DiscoverVersionRow, IndexSourceSpec, MarketClaim, MarketIndex, MarketIndexCategory, MarketIndexEngines, MarketIndexEntry, MarketIndexEntryMetadata, MarketIndexGitSource, MarketIndexLabel, MarketIndexMetadata, MarketIndexNpmSource, MarketIndexParse, MarketIndexProblem, MarketIndexProblemKind, MarketIndexSortKey, MarketIndexSource, MarketIndexVersion, MarketLocalizedText, MarketPublishDestination, MarketSourceConfig, MarketSourceKind, MarketSourcePolicy, MarketSourcesAction, MarketSourcesPayload, PublishChangelog, PublishPreview, } from '@dsh-workbench/shared/contract/protocol/market-index';
@@ -1 +1 @@
1
- export { ALL_TOOLS, DIY_PUBLISH_TOOL, DIY_RECORD_PREPARE_TOOL, DIY_RECORD_READ_TOOL, LONG_TASKS_STOP_TOOL } from './unit';
1
+ export { ALL_TOOLS, DIY_PUBLISH_TOOL, DIY_RECORD_PREPARE_TOOL, DIY_RECORD_READ_TOOL, LONG_TASKS_STOP_TOOL, MARKET_DISABLE_TOOL, MARKET_ENABLE_TOOL, } from './unit';
@@ -1,6 +1,8 @@
1
1
  import type { ApprovalPolicy, RecordState } from '@dsh-workbench/shared/host';
2
- import type { PublishPreview } from '@dsh-workbench/shared/contract/protocol/market-index';
2
+ import type { MarketSourceConfig, PublishPreview } from '@dsh-workbench/shared/contract/protocol/market-index';
3
+ import type { MarketSourcesStore } from '../../../shared/api/host/market-sources-store';
3
4
  import type { LongTaskRunsLookup } from './long-task-tools';
4
5
  export type PublishApprovalPreview = PublishPreview;
6
+ export type MarketSourceLookup = (id: string | undefined) => MarketSourceConfig | undefined;
5
7
  export declare const panelsApproval: ApprovalPolicy;
6
- export declare function panelsApprovalFor(longTaskRuns?: LongTaskRunsLookup | undefined, recording?: (() => RecordState | null) | undefined, publishPreview?: ((unit: string) => PublishApprovalPreview | null) | undefined): ApprovalPolicy;
8
+ export declare function panelsApprovalFor(longTaskRuns?: LongTaskRunsLookup | undefined, recording?: (() => RecordState | null) | undefined, publishPreview?: ((unit: string, author?: string) => PublishApprovalPreview | null) | undefined, marketSources?: MarketSourcesStore | undefined): ApprovalPolicy;
@@ -0,0 +1,10 @@
1
+ import type { DshHostContext, DshToolRegistry } from '@dsh-workbench/shared';
2
+ import type { PublishPreview } from '@dsh-workbench/shared/contract/protocol/market-index';
3
+ import type { DiyModule } from '../../../shared/api/host/diy-modules';
4
+ export declare const PUBLISH_TIMEOUT_MS: number;
5
+ export interface PublishToolDeps {
6
+ readonly resolve: (root: string, raw: unknown) => DiyModule;
7
+ readonly previewOf: (unit: string) => PublishPreview | null;
8
+ readonly inferredAuthorOf: (unit: string) => Promise<string | undefined>;
9
+ }
10
+ export declare function registerPublishTool(ctx: DshHostContext, tools: DshToolRegistry, deps: PublishToolDeps): () => void;
@@ -3,5 +3,4 @@ import type { DebugStore } from '@dsh-workbench/shared/host';
3
3
  import type { PublishPreview } from '@dsh-workbench/shared/contract/protocol/market-index';
4
4
  import type { MarketService } from './market';
5
5
  import type { PanelsService } from './service';
6
- export declare const PUBLISH_TIMEOUT_MS: number;
7
6
  export declare function registerDiyTools(ctx: DshHostContext, market: MarketService, panels: PanelsService, debug: DebugStore, previewOf?: (unit: string) => PublishPreview | null, inferredAuthorOf?: (unit: string) => Promise<string | undefined>): Array<() => void>;
@@ -1,10 +1,11 @@
1
- import type { MarketSourcesAction } from '@dsh-workbench/shared/contract/protocol/market-index';
1
+ import type { MarketSourceConfig, MarketSourcesAction } from '@dsh-workbench/shared/contract/protocol/market-index';
2
2
  import type { RouteTable } from '@dsh-workbench/shared/host';
3
3
  import type { MarketSourceInitializer } from '../../../shared/api/host/market-source-init';
4
4
  import type { MarketSourcesStore } from '../../../shared/api/host/market-sources-store';
5
5
  export declare const MARKET_SOURCES_ACTION_RESOURCE = "market-sources";
6
6
  export declare function marketSourcesRoutes(store: MarketSourcesStore): RouteTable;
7
7
  export declare function parseMarketSourcesAction(payload: unknown): MarketSourcesAction;
8
+ export declare function markSourceReadOnly(store: MarketSourcesStore, id: string): Promise<MarketSourceConfig>;
8
9
  export declare function marketSourcesAction(store: MarketSourcesStore, init?: MarketSourceInitializer | undefined): {
9
10
  readonly resource: string;
10
11
  handle(payload: unknown): Promise<unknown>;
@@ -0,0 +1,3 @@
1
+ import type { DshToolDefinition } from '@dsh-workbench/shared';
2
+ import type { MarketSourcesPayload } from '@dsh-workbench/shared/contract/protocol/market-index';
3
+ export declare function marketSourcesTool(read: (() => MarketSourcesPayload) | undefined): DshToolDefinition;
@@ -1,3 +1,10 @@
1
1
  import type { DshHostContext } from '@dsh-workbench/shared';
2
+ import type { MarketSourceConfig, MarketSourcesPayload } from '@dsh-workbench/shared/contract/protocol/market-index';
3
+ import type { MarketSourceInitializer } from '../../../shared/api/host/market-source-init';
2
4
  import type { MarketService } from './market';
3
- export declare function registerMarketTools(ctx: DshHostContext, market: MarketService): Array<() => void>;
5
+ export interface MarketSourceGateway {
6
+ readonly read: () => MarketSourcesPayload;
7
+ readonly init: MarketSourceInitializer;
8
+ readonly readOnly: (id: string) => Promise<MarketSourceConfig>;
9
+ }
10
+ export declare function registerMarketTools(ctx: DshHostContext, market: MarketService, sources?: MarketSourceGateway): Array<() => void>;
@@ -0,0 +1,2 @@
1
+ import type { MarketClaim } from '@dsh-workbench/shared/contract/protocol/market-index';
2
+ export declare function publishClaimDenyOf(claim: MarketClaim | undefined, name: string): string | undefined;
@@ -14,12 +14,14 @@ export declare const MODULES_UPDATE_DEPENDENCY_TOOL = "workbench_modules_update_
14
14
  export declare const MODULES_UPDATE_PLUGIN_TOOL = "workbench_modules_update_plugin";
15
15
  export declare const MODULES_UNINSTALL_PLUGIN_TOOL = "workbench_modules_uninstall_plugin";
16
16
  export declare const MODULES_UPDATE_WORKBENCH_TOOL = "workbench_modules_update_workbench";
17
+ export declare const MARKET_SOURCES_TOOL = "workbench_market_sources";
18
+ export declare const MARKET_ENABLE_TOOL = "workbench_market_enable";
19
+ export declare const MARKET_DISABLE_TOOL = "workbench_market_disable";
17
20
  export declare const DIY_STATUS_TOOL = "workbench_diy_status";
18
21
  export declare const DIY_PANEL_TOOL = "workbench_diy_panel";
19
22
  export declare const DIY_COMPONENTS_TOOL = "workbench_diy_components";
20
23
  export declare const DIY_RECON_TOOL = "workbench_diy_recon";
21
24
  export declare const DIY_SPEC_TOOL = "workbench_diy_spec";
22
- export declare const DIY_CHANGELOG_TOOL = "workbench_diy_changelog";
23
25
  export declare const DIY_INSTALL_TOOL = "workbench_diy_install";
24
26
  export declare const DIY_PUBLISH_TOOL = "workbench_diy_publish";
25
27
  export declare const DIY_SHOW_TOOL = "workbench_diy_show";
@@ -50,11 +52,11 @@ export declare const DIY_DEBUG_START_TOOL = "workbench_diy_debug_start";
50
52
  export declare const DIY_DEBUG_PAUSE_TOOL = "workbench_diy_debug_pause";
51
53
  export declare const DIY_DEBUG_RESUME_TOOL = "workbench_diy_debug_resume";
52
54
  export declare const DIY_DEBUG_STOP_TOOL = "workbench_diy_debug_stop";
53
- export declare const ALL_TOOLS: readonly ["workbench_panels_list", "workbench_panels_show", "workbench_panels_hide", "workbench_panels_move", "workbench_panels_reset", "workbench_panels_follow", "workbench_modules_list", "workbench_modules_install", "workbench_modules_update", "workbench_modules_uninstall", "workbench_modules_install_bundle", "workbench_modules_update_dependency", "workbench_modules_update_plugin", "workbench_modules_uninstall_plugin", "workbench_modules_update_workbench", "workbench_diy_status", "workbench_diy_panel", "workbench_diy_components", "workbench_diy_recon", "workbench_diy_spec", "workbench_diy_changelog", "workbench_diy_install", "workbench_diy_publish", "workbench_diy_show", "workbench_diy_state", "workbench_diy_html", "workbench_diy_find", "workbench_diy_click", "workbench_diy_hover", "workbench_diy_type", "workbench_diy_fill", "workbench_diy_keys", "workbench_diy_scroll", "workbench_diy_wait", "workbench_diy_eval", "workbench_diy_screenshot", "workbench_diy_network", "workbench_diy_dialog", "workbench_diy_logs_watch", "workbench_diy_logs_read", "workbench_diy_logs_stop", "workbench_diy_record_prepare", "workbench_diy_record_read", "workbench_diy_record_detail", "workbench_diy_record_stop", "workbench_diy_debug_start", "workbench_diy_debug_pause", "workbench_diy_debug_resume", "workbench_diy_debug_stop", "workbench_long_tasks_list", "workbench_long_tasks_stop"];
55
+ export declare const ALL_TOOLS: readonly ["workbench_panels_list", "workbench_panels_show", "workbench_panels_hide", "workbench_panels_move", "workbench_panels_reset", "workbench_panels_follow", "workbench_modules_list", "workbench_modules_install", "workbench_modules_update", "workbench_modules_uninstall", "workbench_modules_install_bundle", "workbench_modules_update_dependency", "workbench_modules_update_plugin", "workbench_modules_uninstall_plugin", "workbench_modules_update_workbench", "workbench_market_sources", "workbench_market_enable", "workbench_market_disable", "workbench_diy_status", "workbench_diy_panel", "workbench_diy_components", "workbench_diy_recon", "workbench_diy_spec", "workbench_diy_install", "workbench_diy_publish", "workbench_diy_show", "workbench_diy_state", "workbench_diy_html", "workbench_diy_find", "workbench_diy_click", "workbench_diy_hover", "workbench_diy_type", "workbench_diy_fill", "workbench_diy_keys", "workbench_diy_scroll", "workbench_diy_wait", "workbench_diy_eval", "workbench_diy_screenshot", "workbench_diy_network", "workbench_diy_dialog", "workbench_diy_logs_watch", "workbench_diy_logs_read", "workbench_diy_logs_stop", "workbench_diy_record_prepare", "workbench_diy_record_read", "workbench_diy_record_detail", "workbench_diy_record_stop", "workbench_diy_debug_start", "workbench_diy_debug_pause", "workbench_diy_debug_resume", "workbench_diy_debug_stop", "workbench_long_tasks_list", "workbench_long_tasks_stop"];
54
56
  export type PanelsToolName = (typeof ALL_TOOLS)[number];
55
- export declare const READ_TOOLS: readonly ["workbench_panels_list", "workbench_modules_list", "workbench_diy_status", "workbench_diy_panel", "workbench_diy_components", "workbench_diy_recon", "workbench_diy_spec", "workbench_diy_state", "workbench_diy_html", "workbench_diy_find", "workbench_diy_click", "workbench_diy_hover", "workbench_diy_type", "workbench_diy_fill", "workbench_diy_keys", "workbench_diy_scroll", "workbench_diy_wait", "workbench_diy_eval", "workbench_diy_screenshot", "workbench_diy_network", "workbench_diy_dialog", "workbench_diy_logs_watch", "workbench_diy_logs_read", "workbench_diy_logs_stop", "workbench_diy_record_read", "workbench_diy_record_detail", "workbench_diy_record_stop", "workbench_long_tasks_list"];
56
- export declare const WRITE_TOOLS: readonly ["workbench_panels_show", "workbench_panels_hide", "workbench_panels_move", "workbench_panels_reset", "workbench_panels_follow", "workbench_modules_install", "workbench_modules_update", "workbench_modules_uninstall", "workbench_modules_install_bundle", "workbench_modules_update_dependency", "workbench_modules_update_plugin", "workbench_modules_uninstall_plugin", "workbench_modules_update_workbench", "workbench_diy_changelog", "workbench_diy_install", "workbench_diy_publish", "workbench_diy_show", "workbench_diy_record_prepare", "workbench_diy_debug_start", "workbench_diy_debug_pause", "workbench_diy_debug_resume", "workbench_diy_debug_stop", "workbench_long_tasks_stop"];
57
- export declare const DIY_TOOLS: readonly ["workbench_diy_status", "workbench_diy_panel", "workbench_diy_components", "workbench_diy_recon", "workbench_diy_spec", "workbench_diy_changelog", "workbench_diy_install", "workbench_diy_publish", "workbench_diy_show", "workbench_diy_state", "workbench_diy_html", "workbench_diy_find", "workbench_diy_click", "workbench_diy_hover", "workbench_diy_type", "workbench_diy_fill", "workbench_diy_keys", "workbench_diy_scroll", "workbench_diy_wait", "workbench_diy_eval", "workbench_diy_screenshot", "workbench_diy_network", "workbench_diy_dialog", "workbench_diy_logs_watch", "workbench_diy_logs_read", "workbench_diy_logs_stop"];
57
+ export declare const READ_TOOLS: readonly ["workbench_panels_list", "workbench_modules_list", "workbench_market_sources", "workbench_diy_status", "workbench_diy_panel", "workbench_diy_components", "workbench_diy_recon", "workbench_diy_spec", "workbench_diy_state", "workbench_diy_html", "workbench_diy_find", "workbench_diy_click", "workbench_diy_hover", "workbench_diy_type", "workbench_diy_fill", "workbench_diy_keys", "workbench_diy_scroll", "workbench_diy_wait", "workbench_diy_eval", "workbench_diy_screenshot", "workbench_diy_network", "workbench_diy_dialog", "workbench_diy_logs_watch", "workbench_diy_logs_read", "workbench_diy_logs_stop", "workbench_diy_record_read", "workbench_diy_record_detail", "workbench_diy_record_stop", "workbench_long_tasks_list"];
58
+ export declare const WRITE_TOOLS: readonly ["workbench_panels_show", "workbench_panels_hide", "workbench_panels_move", "workbench_panels_reset", "workbench_panels_follow", "workbench_modules_install", "workbench_modules_update", "workbench_modules_uninstall", "workbench_modules_install_bundle", "workbench_modules_update_dependency", "workbench_modules_update_plugin", "workbench_modules_uninstall_plugin", "workbench_modules_update_workbench", "workbench_market_enable", "workbench_market_disable", "workbench_diy_install", "workbench_diy_publish", "workbench_diy_show", "workbench_diy_record_prepare", "workbench_diy_debug_start", "workbench_diy_debug_pause", "workbench_diy_debug_resume", "workbench_diy_debug_stop", "workbench_long_tasks_stop"];
59
+ export declare const DIY_TOOLS: readonly ["workbench_diy_status", "workbench_diy_panel", "workbench_diy_components", "workbench_diy_recon", "workbench_diy_spec", "workbench_diy_install", "workbench_diy_publish", "workbench_diy_show", "workbench_diy_state", "workbench_diy_html", "workbench_diy_find", "workbench_diy_click", "workbench_diy_hover", "workbench_diy_type", "workbench_diy_fill", "workbench_diy_keys", "workbench_diy_scroll", "workbench_diy_wait", "workbench_diy_eval", "workbench_diy_screenshot", "workbench_diy_network", "workbench_diy_dialog", "workbench_diy_logs_watch", "workbench_diy_logs_read", "workbench_diy_logs_stop"];
58
60
  export declare const DIY_RECORD_TOOLS: readonly ["workbench_diy_record_prepare", "workbench_diy_record_read", "workbench_diy_record_detail", "workbench_diy_record_stop"];
59
61
  export declare const DIY_DEBUG_TOOLS: readonly ["workbench_diy_debug_start", "workbench_diy_debug_pause", "workbench_diy_debug_resume", "workbench_diy_debug_stop"];
60
62
  export declare const DIY_LOGS_TOOLS: readonly ["workbench_diy_logs_watch", "workbench_diy_logs_read", "workbench_diy_logs_stop"];
@@ -12,4 +12,6 @@ export declare function inferredAuthorOf(root: string | null | undefined, unit:
12
12
  export declare function publishPreviewOf(root: string | null | undefined, unit: string, options?: {
13
13
  readonly version?: string | undefined;
14
14
  readonly author?: string | undefined;
15
+ readonly changelog?: string | undefined;
16
+ readonly changelogType?: string | undefined;
15
17
  }): PublishPreview | null;
@@ -4,6 +4,7 @@ import type { MarketSourcesStore } from './market-sources-store';
4
4
  export interface MarketSourceInitRequest {
5
5
  readonly id: string;
6
6
  readonly ref?: string;
7
+ readonly stampOnly?: boolean;
7
8
  }
8
9
  export interface MarketSourceInitResult {
9
10
  readonly source: MarketSourceConfig;
@@ -1,6 +1,8 @@
1
1
  import type { MarketSourcesAction, MarketSourcesPayload } from '@dsh-workbench/shared/contract/protocol/market-index';
2
2
  export type MarketSourcesWrite = Exclude<MarketSourcesAction, {
3
3
  readonly action: 'init';
4
+ } | {
5
+ readonly action: 'read-only';
4
6
  }>;
5
7
  export interface MarketSourcesStore {
6
8
  read(): MarketSourcesPayload;
@@ -7,6 +7,6 @@ export declare function readMarketSources(): Promise<ApiResponse<MarketSourcesPa
7
7
  export declare function readMarketDoc(name: string, version: string, kind: DiscoverDocKind): Promise<ApiResponse<{
8
8
  readonly doc: DiscoverDoc;
9
9
  }>>;
10
- export declare function readPublishPreview(unit: string, version?: string, author?: string): Promise<ApiResponse<{
10
+ export declare function readPublishPreview(unit: string, version?: string, author?: string, changelog?: string, changelogType?: string): Promise<ApiResponse<{
11
11
  readonly preview: PublishPreview | null;
12
12
  }>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dsh-workbench/core",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "description": "个人工作台:Agent 工作台(左栏 + 常驻对话 + 自研右侧数据面板)。",
5
5
  "type": "module",
6
6
  "icon": "./icon.svg",
@@ -100,8 +100,8 @@
100
100
  "proper-lockfile": "^4.1.2",
101
101
  "which": "^7.0.0",
102
102
  "write-file-atomic": "^8.0.0",
103
- "@dsh-workbench/shared": "1.1.1",
104
- "@dsh-workbench/adapters-default": "1.1.1"
103
+ "@dsh-workbench/shared": "1.1.2",
104
+ "@dsh-workbench/adapters-default": "1.1.2"
105
105
  },
106
106
  "license": "MIT",
107
107
  "repository": {
@@ -12,8 +12,7 @@
12
12
  | 找 opencli 命令、看命令形状 | `_recon` → `_spec`(`--help -f json` 原样) |
13
13
  | kit 有什么 / 令牌叫什么 | `_components`(`bucket` / `name` 取声明;`scope: tokens` 现读 `--dsw-*` / `--wb-*`) |
14
14
  | 装一次 / 只上板 | `_install` / `_show` |
15
- | 发布前记这一版改了什么 | `_changelog`(`note` 必填;文件不在就先建) |
16
- | 发布 | `_publish`,只在用户说「帮我发布」之后 |
15
+ | 发布(顺带记这一版改了什么) | `_publish`,只在用户说「帮我发布」之后;这一版还没有更新日志时带 `changelogNote` |
17
16
  | 看 / 动当前页 | `_state` · `_html` · `_find` · `_screenshot` · `_click` · `_hover` · `_type` · `_fill` · `_keys` · `_scroll` · `_wait` · `_network` · `_dialog` |
18
17
  | 控制台 | `_logs_watch` → 操作 → `_logs_read` → `_logs_stop` |
19
18
  | 抓「用户点了之后发了什么」 | `_record_prepare` → 用户操作 → `_record_read` → `_record_detail` → `_record_stop` |
@@ -23,7 +22,7 @@
23
22
  - 只在 DIY 模式的会话出现;面板得画在屏上。
24
23
  - 看 / 动 / 网络 / 日志族先 `_debug_start`(审批一次),否则整族拒、零命令;收工 `_debug_stop`。
25
24
  `_pause` 只暂停看屏。不碰屏的:`_status` / `_panel` / `_components` / `_recon` / `_spec` /
26
- `_install` / `_show` / `_changelog` / `_publish`;`_find` / `_eval` 带 `read=` 时也不碰。
25
+ `_install` / `_show` / `_publish`;`_find` / `_eval` 带 `read=` 时也不碰。
27
26
  - 录制独立:`_record_prepare` 审批一次,其余不问;同时只有一场,要重来先 `_record_stop`。
28
27
 
29
28
  ## 3 参数之外的坑
@@ -45,6 +44,6 @@
45
44
 
46
45
  ## 4 发布
47
46
 
48
- 只在用户明确说「帮我发布」后调;先 `_changelog` 把这一版写进 `CHANGELOG.md`。
47
+ 只在用户明确说「帮我发布」后调。这一版还没有更新日志(`_status` 会说)时,把改了什么写进 `changelogNote`(一行一条,`changelogType` 选分类,缺省 changed):审批屏会展示将写进 `CHANGELOG.md` 的那一段,用户点了头才落盘,文件不在会先建。这一版已有内容就不用传,带了也不追加。
49
48
  出口、署名、标题、安装命令由工具与审批屏处理,不用问、不用补;没写作者时审批屏显示推断的署名(市集里上次的 / 同工坊的 / 本机 git 身份),用户觉得不对就拒绝后再说,他点名了才传 `author=…`。
50
49
  需要用户接管时返回 `needsUser: { step, text, command? }`:把 `text` 说给用户,等「好了」再跑;不向用户要 token。
@@ -45,9 +45,12 @@ description: 在工作台里把当前面板调明白,或者给它造一块新
45
45
  看 / 动屏前 `workbench_diy_debug_start`(否则整族拒;Desktop 跳过,改用 `read=` / 录制);`_panel` / `_status` / `read=` 档不用。
46
46
  工具全表 [FAMILY.md](FAMILY.md)。走通才 `dsh-wb-module design accept`;走不通如实记"未验"。
47
47
  审批项标注「要你真用一次」,不打勾。结论只报:已装、在面板哪一格。
48
- 8. **发布** —— 只在用户说「帮我发布」之后:`workbench_diy_changelog`(`note=…`)记这一版 → `workbench_diy_publish`(`unit=…`)。
48
+ 8. **发布** —— 只在用户说「帮我发布」之后:`workbench_diy_publish`(`unit=…`);这一版还没有更新日志就带上 `changelogNote`(一行一条),
49
+ 发布时一起写进 `CHANGELOG.md` 并随包发,审批屏会展示将写入的那一段。
49
50
  不手改 `package.json`、不补标题/署名、不问出口:工具与审批屏已经处理;他明确点名安装包 / 公开 / git 才传 target。
50
51
  他说要换作者才传 `author="姓名 <邮箱>"`,别自己编一个;没写作者时审批屏显示推断的署名,他拒绝后再说。
52
+ 市场里一个包名归第一次发布的人:换署名发同名会被拒;真是接手,让维护者先改那一条的 `owner`。
53
+ 一个 unit 在同一个市场里只能有一个条目:换包名时把 unit 也换掉,别沿用旧的。
51
54
  验收没过先 `design accept`;`needsUser` 照 `text` 转述。细节见 [WIRING.md](WIRING.md) §5。
52
55
 
53
56
  ## 索引
@@ -63,9 +63,16 @@ DIY 族仅在选了 DIY 模式的会话出现(按模式,不按工作区)
63
63
  默认 `private: true`,不发任何源。用户说「帮我发布」时,**不要手改 `package.json`、不要让他看 npm**,
64
64
  走 `workbench_diy_publish`(`unit=…`):
65
65
 
66
- 1. 先把这一版写进 `CHANGELOG.md`(`workbench_diy_changelog`,`note=…`),真卡片验收过(`design accept`)。
66
+ 1. 这一版还没有更新日志时(`workbench_diy_status` 会说),把改了什么放进 `changelogNote`(一行一条;`changelogType` 选分类,缺省 changed),
67
+ 发布时一起写进 `CHANGELOG.md`(文件不在先建);审批屏展示将写入的那一段,用户点头才落盘。已有内容就不用传。
68
+ 真卡片验收过(`design accept`)。
67
69
  出口、署名、标题、安装命令都由工具与审批屏处理:不用问、不用补;用户没点名出口就不传 target。
70
+ 索引源跟当前选中无关:只有一个可发布源就用它;有多个时传 `source=<id>`(`workbench_market_sources` 会给)。
68
71
  用户要换署名(或在审批屏上说作者不对):传 `author="姓名 <邮箱>"`(或只给姓名),别手改 `package.json`,也别自己编。
69
72
  没写作者时审批屏显示推断的署名;他拒绝后说换成谁,再用 `author` 重发。
73
+ 市场里一个包名归第一次发布的人(`market.json` 的 `owner`):换署名发同名会被拒,审批也放不过去;
74
+ 用户真是接手的人,让他先找索引维护者改那一条的 `owner`,别自己改成对方的署名去绕。
75
+ 一个模块 id(`dsh.workbench.unit`)在同一个市场里只能有一个条目:换包名、沿用旧 unit 会被拒 ——
76
+ 换包名时把 unit 也换掉,别为了保留 id 去改别人的条目。
70
77
  2. 工具回 `needsUser` 时照 `text` 转述,不在对话里要 token / OTP;`otp` 交接后 `verify=true` 只核不发。
71
- 3. 只改市集元数据(标题 / 作者 / 说明)不升版本:`refresh=true`(换作者时同时传 `author`)。
78
+ 3. 只改市集元数据(标题 / 作者 / 说明)不升版本:`refresh=true`(换作者时同时传 `author`,仍要过 `owner` 检查)。
@@ -1,2 +0,0 @@
1
- import type { DshHostContext, DshToolRegistry } from '@dsh-workbench/shared';
2
- export declare function registerChangelogTool(ctx: DshHostContext, tools: DshToolRegistry): readonly (() => void)[];
@@ -1,13 +0,0 @@
1
- import type { ChangelogKind } from '@dsh-workbench/shared/host';
2
- export interface ChangelogWrite {
3
- readonly file: string;
4
- readonly section: string;
5
- readonly text: string;
6
- }
7
- export declare function moduleVersionOf(dir: string): string;
8
- export declare function writeChangelogEntry(dir: string, input: {
9
- readonly version: string;
10
- readonly kind: ChangelogKind;
11
- readonly note: string;
12
- readonly date?: string;
13
- }): ChangelogWrite;