@dsh-workbench/shared 1.1.7 → 1.1.8
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/dist/contract/protocol/market-index.d.ts +1 -0
- package/dist/host/market-index-claim.d.ts +0 -1
- package/dist/host/market-index-claim.js +0 -3
- package/dist/host/market-index-doc.d.ts +1 -45
- package/dist/host/market-index-parse.d.ts +9 -4
- package/dist/host/market-index-parse.js +17 -92
- package/dist/host/market-index.d.ts +5 -6
- package/dist/host/market-index.js +29 -87
- package/dist/i18n/en.js +3 -1
- package/dist/i18n/index.d.ts +4 -2
- package/dist/i18n/zh.d.ts +3 -1
- package/dist/i18n/zh.js +3 -1
- package/package.json +1 -1
- package/src/contract/protocol/market-index.ts +1 -0
- package/src/host/__tests__/market-index-assemble.test.ts +26 -0
- package/src/host/__tests__/market-index.test.ts +41 -51
- package/src/host/market-index-claim.ts +0 -4
- package/src/host/market-index-doc.ts +1 -53
- package/src/host/market-index-parse.ts +21 -85
- package/src/host/market-index.ts +33 -127
- package/src/i18n/en.ts +3 -1
- package/src/i18n/zh.ts +3 -1
|
@@ -208,6 +208,7 @@ export interface PublishPreview {
|
|
|
208
208
|
readonly name: string;
|
|
209
209
|
readonly version: string;
|
|
210
210
|
readonly author?: string;
|
|
211
|
+
readonly labels?: readonly string[];
|
|
211
212
|
readonly registry?: string;
|
|
212
213
|
readonly market?: MarketPublishDestination;
|
|
213
214
|
readonly claim?: MarketClaim;
|
|
@@ -15,6 +15,5 @@ export interface MarketClaimInput {
|
|
|
15
15
|
}
|
|
16
16
|
export declare function marketArtifactPath(name: string): string;
|
|
17
17
|
export declare function marketArtifactRoot(name: string): string;
|
|
18
|
-
export declare function marketArtifactPathFor(name: string, version: string): string;
|
|
19
18
|
export declare function entryUnitOf(entry: MarketIndexEntry): string | undefined;
|
|
20
19
|
export declare function claimOf(index: MarketIndex, input: MarketClaimInput): MarketClaim;
|
|
@@ -45,9 +45,6 @@ export function marketArtifactPath(name) {
|
|
|
45
45
|
export function marketArtifactRoot(name) {
|
|
46
46
|
return `${MARKET_ARTIFACTS_DIR}/${name}`;
|
|
47
47
|
}
|
|
48
|
-
export function marketArtifactPathFor(name, version) {
|
|
49
|
-
return `${MARKET_ARTIFACTS_DIR}/${name}/${version}`;
|
|
50
|
-
}
|
|
51
48
|
export function entryUnitOf(entry) {
|
|
52
49
|
const unit = entry.metadata?.unit?.trim();
|
|
53
50
|
if (unit !== undefined && unit !== '')
|
|
@@ -1,38 +1,4 @@
|
|
|
1
|
-
import type { MarketIndex,
|
|
2
|
-
export interface MarketVersionDoc {
|
|
3
|
-
readonly name: string;
|
|
4
|
-
readonly version: string;
|
|
5
|
-
readonly source: MarketIndexSource;
|
|
6
|
-
readonly publishTimestamp?: number;
|
|
7
|
-
readonly engines?: MarketIndexEngines;
|
|
8
|
-
readonly title?: MarketLocalizedText;
|
|
9
|
-
readonly description?: MarketLocalizedText;
|
|
10
|
-
readonly author?: string;
|
|
11
|
-
readonly owner?: string;
|
|
12
|
-
readonly homepage?: string;
|
|
13
|
-
readonly icon?: string;
|
|
14
|
-
readonly metadata?: MarketIndexEntryMetadata;
|
|
15
|
-
}
|
|
16
|
-
export interface MarketMetaDoc {
|
|
17
|
-
readonly name: string;
|
|
18
|
-
readonly epoch?: number;
|
|
19
|
-
readonly publishTimestamp: number;
|
|
20
|
-
readonly title?: MarketLocalizedText;
|
|
21
|
-
readonly description?: MarketLocalizedText;
|
|
22
|
-
readonly author?: string;
|
|
23
|
-
readonly owner?: string;
|
|
24
|
-
readonly homepage?: string;
|
|
25
|
-
readonly icon?: string;
|
|
26
|
-
readonly metadata?: MarketIndexEntryMetadata;
|
|
27
|
-
}
|
|
28
|
-
export type MarketEntryDoc = MarketVersionDoc | MarketMetaDoc;
|
|
29
|
-
export type MarketEntryDocParse = {
|
|
30
|
-
readonly ok: true;
|
|
31
|
-
readonly doc: MarketEntryDoc;
|
|
32
|
-
} | {
|
|
33
|
-
readonly ok: false;
|
|
34
|
-
readonly problems: readonly MarketIndexProblem[];
|
|
35
|
-
};
|
|
1
|
+
import type { MarketIndex, MarketIndexProblem } from '../contract/protocol/market-index.js';
|
|
36
2
|
export interface MarketEntryFile {
|
|
37
3
|
readonly path: string;
|
|
38
4
|
readonly text: string;
|
|
@@ -44,13 +10,3 @@ export type MarketIndexAssemble = {
|
|
|
44
10
|
readonly ok: false;
|
|
45
11
|
readonly problems: readonly MarketIndexProblem[];
|
|
46
12
|
};
|
|
47
|
-
export interface MarketDocFields {
|
|
48
|
-
readonly name: string;
|
|
49
|
-
readonly title?: MarketLocalizedText;
|
|
50
|
-
readonly description?: MarketLocalizedText;
|
|
51
|
-
readonly author?: string;
|
|
52
|
-
readonly owner?: string;
|
|
53
|
-
readonly homepage?: string;
|
|
54
|
-
readonly icon?: string;
|
|
55
|
-
readonly metadata?: MarketIndexEntryMetadata;
|
|
56
|
-
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { DiscoverFilter, IndexSourceSpec, MarketIndex, MarketIndexEntry, MarketIndexParse, MarketIndexProblem, MarketIndexVersion, MarketSourceConfig } from '../contract/protocol/market-index.js';
|
|
2
|
-
import type { MarketEntryDocParse } from './market-index-doc.js';
|
|
3
2
|
export declare function compareSemver(left: string, right: string): number | undefined;
|
|
4
3
|
export declare function httpUrlProblem(url: string): string | undefined;
|
|
5
4
|
export declare function gitUrlOk(url: string): boolean;
|
|
@@ -18,6 +17,12 @@ export type SourceConfigParse = {
|
|
|
18
17
|
readonly problem: MarketIndexProblem;
|
|
19
18
|
};
|
|
20
19
|
export declare function parseSourceConfig(raw: unknown): SourceConfigParse;
|
|
21
|
-
export declare function
|
|
22
|
-
export
|
|
23
|
-
|
|
20
|
+
export declare function marketEntryPath(dir: string, name: string): string;
|
|
21
|
+
export type MarketEntryParse = {
|
|
22
|
+
readonly ok: true;
|
|
23
|
+
readonly entry: MarketIndexEntry;
|
|
24
|
+
} | {
|
|
25
|
+
readonly ok: false;
|
|
26
|
+
readonly problems: readonly MarketIndexProblem[];
|
|
27
|
+
};
|
|
28
|
+
export declare function parseMarketEntryJson(text: string): MarketEntryParse;
|
|
@@ -384,102 +384,27 @@ export function parseSourceConfig(raw) {
|
|
|
384
384
|
},
|
|
385
385
|
};
|
|
386
386
|
}
|
|
387
|
-
function docFieldsOf(record, at) {
|
|
388
|
-
const name = asText(record['name']);
|
|
389
|
-
if (name === '' || name.length > 214 || !NPM_NAME.test(name)) {
|
|
390
|
-
return problem('name', `不是合法 npm 包名:${JSON.stringify(name)}`, at);
|
|
391
|
-
}
|
|
392
|
-
const icon = asText(record['icon']);
|
|
393
|
-
if (icon !== '') {
|
|
394
|
-
const badIcon = iconProblem(icon);
|
|
395
|
-
if (badIcon !== undefined)
|
|
396
|
-
return badIcon;
|
|
397
|
-
}
|
|
398
|
-
const owner = asText(record['owner']);
|
|
399
|
-
if (owner !== '') {
|
|
400
|
-
const badOwner = ownerProblem(owner);
|
|
401
|
-
if (badOwner !== undefined)
|
|
402
|
-
return badOwner;
|
|
403
|
-
}
|
|
404
|
-
const metadata = metadataOf(record['metadata']);
|
|
405
|
-
if (metadata?.unit !== undefined && !UNIT_ID.test(metadata.unit)) {
|
|
406
|
-
return problem('unit', `metadata.unit 只能是小写字母开头的 a-z0-9-(现在是 ${JSON.stringify(metadata.unit)})`, at);
|
|
407
|
-
}
|
|
408
|
-
const title = asLocalized(record['title']);
|
|
409
|
-
const description = asLocalized(record['description']);
|
|
410
|
-
const author = asText(record['author']);
|
|
411
|
-
const homepage = asText(record['homepage']);
|
|
412
|
-
return {
|
|
413
|
-
name,
|
|
414
|
-
...(title === undefined ? {} : { title }),
|
|
415
|
-
...(description === undefined ? {} : { description }),
|
|
416
|
-
...(author === '' ? {} : { author }),
|
|
417
|
-
...(owner === '' ? {} : { owner }),
|
|
418
|
-
...(homepage === '' ? {} : { homepage }),
|
|
419
|
-
...(icon === '' ? {} : { icon }),
|
|
420
|
-
...(metadata === undefined ? {} : { metadata }),
|
|
421
|
-
};
|
|
422
|
-
}
|
|
423
|
-
export function parseMarketEntryDoc(raw) {
|
|
424
|
-
const record = asRecord(raw);
|
|
425
|
-
if (record === undefined)
|
|
426
|
-
return { ok: false, problems: [problem('entry', '条目文件必须是一个 JSON 对象')] };
|
|
427
|
-
const fields = docFieldsOf(record, 'entry');
|
|
428
|
-
if ('kind' in fields)
|
|
429
|
-
return { ok: false, problems: [fields] };
|
|
430
|
-
const version = asText(record['version']);
|
|
431
|
-
const timestamp = record['publishTimestamp'];
|
|
432
|
-
if (timestamp !== undefined && (!Number.isInteger(timestamp) || timestamp < 0)) {
|
|
433
|
-
return { ok: false, problems: [problem('timestamp', 'publishTimestamp 必须是 Unix 秒整数', 'entry')] };
|
|
434
|
-
}
|
|
435
|
-
if (version === '') {
|
|
436
|
-
if (timestamp === undefined) {
|
|
437
|
-
return { ok: false, problems: [problem('timestamp', '元数据文件要有 publishTimestamp', 'entry')] };
|
|
438
|
-
}
|
|
439
|
-
const epoch = record['epoch'];
|
|
440
|
-
if (epoch !== undefined && (!Number.isInteger(epoch) || epoch < 0)) {
|
|
441
|
-
return { ok: false, problems: [problem('timestamp', 'epoch 必须是非负整数', 'entry')] };
|
|
442
|
-
}
|
|
443
|
-
return {
|
|
444
|
-
ok: true,
|
|
445
|
-
doc: { ...fields, publishTimestamp: timestamp, ...(epoch === undefined ? {} : { epoch: epoch }) },
|
|
446
|
-
};
|
|
447
|
-
}
|
|
448
|
-
if (!isValidVersion(version)) {
|
|
449
|
-
return { ok: false, problems: [problem('version', `版本号不是合法 SemVer:${JSON.stringify(version)}`, 'entry')] };
|
|
450
|
-
}
|
|
451
|
-
const source = sourceOf(record['source'], 'entry.source');
|
|
452
|
-
if ('kind' in source)
|
|
453
|
-
return { ok: false, problems: [source] };
|
|
454
|
-
const engines = asRecord(record['engines']);
|
|
455
|
-
const dsh = engines === undefined ? '' : asText(engines['dsh']);
|
|
456
|
-
return {
|
|
457
|
-
ok: true,
|
|
458
|
-
doc: {
|
|
459
|
-
...fields,
|
|
460
|
-
version,
|
|
461
|
-
source,
|
|
462
|
-
...(timestamp === undefined ? {} : { publishTimestamp: timestamp }),
|
|
463
|
-
...(dsh === '' ? {} : { engines: { dsh } }),
|
|
464
|
-
},
|
|
465
|
-
};
|
|
466
|
-
}
|
|
467
387
|
function indexPathBase(dir) {
|
|
468
388
|
return dir.replace(/^\/+|\/+$/g, '') || MARKET_INDEX_DIR;
|
|
469
389
|
}
|
|
470
|
-
export function marketEntryPath(dir, name
|
|
390
|
+
export function marketEntryPath(dir, name) {
|
|
471
391
|
if (!NPM_NAME.test(name))
|
|
472
392
|
throw new Error(`不是合法包名:${JSON.stringify(name)}`);
|
|
473
|
-
|
|
474
|
-
throw new Error(`不是合法版本号:${JSON.stringify(version)}`);
|
|
475
|
-
return `${indexPathBase(dir)}/${name}/${version}.json`;
|
|
393
|
+
return `${indexPathBase(dir)}/${name}.json`;
|
|
476
394
|
}
|
|
477
|
-
export function
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
395
|
+
export function parseMarketEntryJson(text) {
|
|
396
|
+
let raw;
|
|
397
|
+
try {
|
|
398
|
+
raw = JSON.parse(text);
|
|
399
|
+
}
|
|
400
|
+
catch (error) {
|
|
401
|
+
return {
|
|
402
|
+
ok: false,
|
|
403
|
+
problems: [problem('not-json', `JSON 解析失败:${error instanceof Error ? error.message : String(error)}`, 'entry')],
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
const parsed = entryOf(raw, 'entry');
|
|
407
|
+
if ('kind' in parsed)
|
|
408
|
+
return { ok: false, problems: [parsed] };
|
|
409
|
+
return { ok: true, entry: parsed };
|
|
485
410
|
}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import type { MarketIndex, MarketIndexEntry
|
|
2
|
-
import type { MarketEntryFile, MarketIndexAssemble
|
|
1
|
+
import type { MarketIndex, MarketIndexEntry } from '../contract/protocol/market-index.js';
|
|
2
|
+
import type { MarketEntryFile, MarketIndexAssemble } from './market-index-doc.js';
|
|
3
3
|
export declare const MARKET_ENTRIES_README_LINES: readonly string[];
|
|
4
4
|
export declare const MARKET_INDEX_README_LINES: readonly string[];
|
|
5
5
|
export { marketBranchOk, marketInstallTarget, marketText } from '../lib/market-index.js';
|
|
6
|
-
export type {
|
|
7
|
-
export { compareSemver, filterMarketIndex, gitUrlOk, httpUrlProblem, marketEntryLabels, marketEntryPath,
|
|
6
|
+
export type { MarketEntryFile, MarketIndexAssemble } from './market-index-doc.js';
|
|
7
|
+
export { compareSemver, filterMarketIndex, gitUrlOk, httpUrlProblem, marketEntryLabels, marketEntryPath, marketSourceKey, parseMarketEntryJson, parseMarketIndex, parseMarketIndexJson, parseSourceConfig, sortMarketVersions, upsertMarketEntry, } from './market-index-parse.js';
|
|
8
8
|
export type { SourceConfigParse } from './market-index-parse.js';
|
|
9
|
-
export declare function marketVersionDocOf(entry: MarketIndexEntry, version: MarketIndexVersion): MarketVersionDoc;
|
|
10
|
-
export declare function marketMetaDocOf(entry: MarketIndexEntry, epoch: number, at: number): MarketMetaDoc;
|
|
11
9
|
export declare function assembleMarketIndex(files: readonly MarketEntryFile[]): MarketIndexAssemble;
|
|
10
|
+
export declare function marketEntryFileOf(entry: MarketIndexEntry, dir?: string): MarketEntryFile;
|
|
12
11
|
export declare function marketEntryFilesOf(index: MarketIndex, dir?: string): readonly MarketEntryFile[];
|
|
13
12
|
export declare function collectMarketEntryFiles(dir: string): readonly MarketEntryFile[];
|
|
14
13
|
export declare function marketEntryFilesOfLegacy(text: string, dir?: string): readonly MarketEntryFile[] | undefined;
|
|
@@ -1,18 +1,22 @@
|
|
|
1
1
|
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
2
2
|
import { join, relative, sep } from 'node:path';
|
|
3
3
|
import { MARKET_INDEX_DIR, MARKET_INDEX_FORMAT } from '../contract/protocol/market-index.js';
|
|
4
|
-
import {
|
|
4
|
+
import { entryUnitOf } from './market-index-claim.js';
|
|
5
|
+
import { marketEntryPath, parseMarketEntryJson, parseMarketIndexJson, sortMarketVersions } from './market-index-parse.js';
|
|
5
6
|
export const MARKET_ENTRIES_README_LINES = [
|
|
6
7
|
'# 索引目录',
|
|
7
8
|
'',
|
|
8
|
-
'
|
|
9
|
+
'一个包一个文件:`market/<包名>.json`,里面是这一个包的元数据与所有版本;',
|
|
9
10
|
'',
|
|
10
|
-
'`
|
|
11
|
+
'产物在 `artifacts/<包名>/`(只放最新一版,老版本按条目里的 commit 取历史)。',
|
|
12
|
+
'',
|
|
13
|
+
'发布时只改自己包的文件;包与包之间不共享文件。',
|
|
11
14
|
];
|
|
12
15
|
export const MARKET_INDEX_README_LINES = [
|
|
13
16
|
'# 模块市场索引',
|
|
14
17
|
'',
|
|
15
|
-
'这个仓库给 DeepSeek Harness
|
|
18
|
+
'这个仓库给 DeepSeek Harness 工作台当模块市场索引:一个包一个文件 `market/<包名>.json`,',
|
|
19
|
+
'产物在 `artifacts/<包名>/`;老仓库的 `market.json` 会在第一次发布时自动拆开。',
|
|
16
20
|
'',
|
|
17
21
|
'## 发布模块',
|
|
18
22
|
'',
|
|
@@ -22,8 +26,7 @@ export const MARKET_INDEX_README_LINES = [
|
|
|
22
26
|
'dsh-wb-module release --index <本仓库地址> --index-policy artifacts-in-repo',
|
|
23
27
|
'```',
|
|
24
28
|
'',
|
|
25
|
-
'
|
|
26
|
-
'发布只新增文件、不改已有文件,两台机器同时发也不会冲突;老条目的 `packages/<包名>/` 路径继续可用。',
|
|
29
|
+
'发布只会改自己包的那一个文件;包与包之间不会碰同一个文件。',
|
|
27
30
|
'',
|
|
28
31
|
'一个包名归第一次发布的人(条目文件里的 `owner`)。换一个署名发同名会被拒;要换人,先把这一条的 `owner` 改成新的人。',
|
|
29
32
|
'同一个市场里,一个模块 id(`metadata.unit`)只能被一个条目使用;另一个包名想用同一个 id / 产物目录也会被拒。',
|
|
@@ -34,107 +37,46 @@ export const MARKET_INDEX_README_LINES = [
|
|
|
34
37
|
'',
|
|
35
38
|
];
|
|
36
39
|
export { marketBranchOk, marketInstallTarget, marketText } from '../lib/market-index.js';
|
|
37
|
-
export { compareSemver, filterMarketIndex, gitUrlOk, httpUrlProblem, marketEntryLabels, marketEntryPath,
|
|
40
|
+
export { compareSemver, filterMarketIndex, gitUrlOk, httpUrlProblem, marketEntryLabels, marketEntryPath, marketSourceKey, parseMarketEntryJson, parseMarketIndex, parseMarketIndexJson, parseSourceConfig, sortMarketVersions, upsertMarketEntry, } from './market-index-parse.js';
|
|
38
41
|
function problem(kind, detail, at) {
|
|
39
42
|
return { kind, detail, ...(at === undefined ? {} : { at }) };
|
|
40
43
|
}
|
|
41
|
-
function docFieldsFromEntry(entry) {
|
|
42
|
-
return {
|
|
43
|
-
name: entry.name,
|
|
44
|
-
...(entry.title === undefined ? {} : { title: entry.title }),
|
|
45
|
-
...(entry.description === undefined ? {} : { description: entry.description }),
|
|
46
|
-
...(entry.author === undefined ? {} : { author: entry.author }),
|
|
47
|
-
...(entry.owner === undefined ? {} : { owner: entry.owner }),
|
|
48
|
-
...(entry.homepage === undefined ? {} : { homepage: entry.homepage }),
|
|
49
|
-
...(entry.icon === undefined ? {} : { icon: entry.icon }),
|
|
50
|
-
...(entry.metadata === undefined ? {} : { metadata: entry.metadata }),
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
export function marketVersionDocOf(entry, version) {
|
|
54
|
-
return { ...docFieldsFromEntry(entry), ...version };
|
|
55
|
-
}
|
|
56
|
-
export function marketMetaDocOf(entry, epoch, at) {
|
|
57
|
-
return { ...docFieldsFromEntry(entry), epoch, publishTimestamp: at };
|
|
58
|
-
}
|
|
59
44
|
export function assembleMarketIndex(files) {
|
|
60
45
|
const problems = [];
|
|
61
|
-
const
|
|
46
|
+
const entries = new Map();
|
|
62
47
|
const ordered = [...files].sort((left, right) => (left.path < right.path ? -1 : left.path > right.path ? 1 : 0));
|
|
63
48
|
for (const file of ordered) {
|
|
64
|
-
|
|
65
|
-
try {
|
|
66
|
-
raw = JSON.parse(file.text);
|
|
67
|
-
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
problems.push(problem('not-json', `JSON 解析失败:${error instanceof Error ? error.message : String(error)}`, file.path));
|
|
49
|
+
if (!file.path.endsWith('.json'))
|
|
70
50
|
continue;
|
|
71
|
-
|
|
72
|
-
const parsed = parseMarketEntryDoc(raw);
|
|
51
|
+
const parsed = parseMarketEntryJson(file.text);
|
|
73
52
|
if (!parsed.ok) {
|
|
74
53
|
for (const one of parsed.problems)
|
|
75
54
|
problems.push({ ...one, at: file.path });
|
|
76
55
|
continue;
|
|
77
56
|
}
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
if (group.versions.has(doc.version)) {
|
|
83
|
-
problems.push(problem('duplicate-version', `版本重复:${doc.version}`, file.path));
|
|
84
|
-
}
|
|
85
|
-
group.versions.set(doc.version, {
|
|
86
|
-
version: doc.version,
|
|
87
|
-
source: doc.source,
|
|
88
|
-
...(doc.publishTimestamp === undefined ? {} : { publishTimestamp: doc.publishTimestamp }),
|
|
89
|
-
...(doc.engines === undefined ? {} : { engines: doc.engines }),
|
|
90
|
-
});
|
|
91
|
-
const newerFallback = group.fallback === undefined ||
|
|
92
|
-
at > group.fallback.at ||
|
|
93
|
-
(at === group.fallback.at && file.path > group.fallback.path);
|
|
94
|
-
if (newerFallback)
|
|
95
|
-
group.fallback = { at, path: file.path, doc };
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
const epoch = doc.epoch ?? 0;
|
|
99
|
-
const newer = group.meta === undefined ||
|
|
100
|
-
epoch > group.meta.epoch ||
|
|
101
|
-
(epoch === group.meta.epoch && at > group.meta.at) ||
|
|
102
|
-
(epoch === group.meta.epoch && at === group.meta.at && file.path > group.meta.path);
|
|
103
|
-
if (newer)
|
|
104
|
-
group.meta = { epoch, at, path: file.path, doc };
|
|
57
|
+
const entry = parsed.entry;
|
|
58
|
+
if (entries.has(entry.name)) {
|
|
59
|
+
problems.push(problem('duplicate-name', `插件名重复:${entry.name}`, file.path));
|
|
60
|
+
continue;
|
|
105
61
|
}
|
|
106
|
-
|
|
62
|
+
entries.set(entry.name, { ...entry, versions: sortMarketVersions(entry.versions) });
|
|
107
63
|
}
|
|
108
64
|
if (problems.length > 0)
|
|
109
65
|
return { ok: false, problems };
|
|
110
|
-
const plugins = [...
|
|
111
|
-
const meta = group.meta?.doc ?? group.fallback?.doc;
|
|
112
|
-
return {
|
|
113
|
-
name,
|
|
114
|
-
versions: sortMarketVersions([...group.versions.values()]),
|
|
115
|
-
...(meta?.title === undefined ? {} : { title: meta.title }),
|
|
116
|
-
...(meta?.description === undefined ? {} : { description: meta.description }),
|
|
117
|
-
...(meta?.author === undefined ? {} : { author: meta.author }),
|
|
118
|
-
...(meta?.owner === undefined ? {} : { owner: meta.owner }),
|
|
119
|
-
...(meta?.homepage === undefined ? {} : { homepage: meta.homepage }),
|
|
120
|
-
...(meta?.icon === undefined ? {} : { icon: meta.icon }),
|
|
121
|
-
...(meta?.metadata === undefined ? {} : { metadata: meta.metadata }),
|
|
122
|
-
};
|
|
123
|
-
});
|
|
124
|
-
plugins.sort((left, right) => (left.name < right.name ? -1 : left.name > right.name ? 1 : 0));
|
|
66
|
+
const plugins = [...entries.values()].sort((left, right) => (left.name < right.name ? -1 : left.name > right.name ? 1 : 0));
|
|
125
67
|
return { ok: true, index: { format: MARKET_INDEX_FORMAT, plugins } };
|
|
126
68
|
}
|
|
69
|
+
export function marketEntryFileOf(entry, dir = MARKET_INDEX_DIR) {
|
|
70
|
+
return { path: marketEntryPath(dir, entry.name), text: `${JSON.stringify(entry, null, 2)}\n` };
|
|
71
|
+
}
|
|
127
72
|
export function marketEntryFilesOf(index, dir = MARKET_INDEX_DIR) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
return files;
|
|
73
|
+
return index.plugins.map((entry) => marketEntryFileOf(healedUnit(entry), dir));
|
|
74
|
+
}
|
|
75
|
+
function healedUnit(entry) {
|
|
76
|
+
if (entry.metadata?.unit !== undefined)
|
|
77
|
+
return entry;
|
|
78
|
+
const unit = entryUnitOf(entry);
|
|
79
|
+
return unit === undefined ? entry : { ...entry, metadata: { ...entry.metadata, unit } };
|
|
138
80
|
}
|
|
139
81
|
export function collectMarketEntryFiles(dir) {
|
|
140
82
|
if (!existsSync(dir))
|
package/dist/i18n/en.js
CHANGED
|
@@ -372,7 +372,7 @@ export const en = {
|
|
|
372
372
|
'panels.discover.missingIndex': 'This repository has no {path} yet.',
|
|
373
373
|
'panels.discover.initTitle': 'Initialize this repository as a module market index?',
|
|
374
374
|
'panels.discover.initCta': 'Initialize market index',
|
|
375
|
-
'panels.discover.initWhat': 'It will write the index directory market/ and README.md on {branch}, commit once, and push. Modules you publish from this workbench will commit their build files under artifacts/<package-name
|
|
375
|
+
'panels.discover.initWhat': 'It will write the index directory market/ and README.md on {branch}, commit once, and push. Modules you publish from this workbench will commit their build files under artifacts/<package-name>/ and their entry in market/<package-name>.json. The repository stays owned by its owner.',
|
|
376
376
|
'panels.discover.initBranch': 'Branch',
|
|
377
377
|
'panels.discover.initBranchHint': 'The index and build files go to this branch; an empty repository gets it created.',
|
|
378
378
|
'panels.discover.initBranchBad': 'Use only letters, digits, dots, underscores, slashes, or dashes in a branch name.',
|
|
@@ -703,6 +703,8 @@ export const en = {
|
|
|
703
703
|
'approval.publish.version': 'Version',
|
|
704
704
|
'approval.publish.author': 'Author',
|
|
705
705
|
'approval.publish.authorMissing': 'unsigned',
|
|
706
|
+
'approval.publish.labels': 'Labels',
|
|
707
|
+
'approval.publish.labelsMissing': 'none yet (1–2 picked on publish)',
|
|
706
708
|
'approval.publish.owner': 'Owner',
|
|
707
709
|
'approval.publish.ownerUnowned': 'originally unattributed',
|
|
708
710
|
'approval.publish.ownerTaken': 'Owned by {owner}',
|
package/dist/i18n/index.d.ts
CHANGED
|
@@ -382,7 +382,7 @@ export declare const dictionaries: {
|
|
|
382
382
|
readonly 'panels.discover.missingIndex': "仓库里还没有索引文件 {path}";
|
|
383
383
|
readonly 'panels.discover.initTitle': "把这个仓库初始化成模块市场索引?";
|
|
384
384
|
readonly 'panels.discover.initCta': "初始化成市场索引";
|
|
385
|
-
readonly 'panels.discover.initWhat': "会在 {branch} 分支写索引目录 market/ 与 README.md,提交一次并推上去;之后从这个工作台发布的模块会把打包好的文件提交到 artifacts
|
|
385
|
+
readonly 'panels.discover.initWhat': "会在 {branch} 分支写索引目录 market/ 与 README.md,提交一次并推上去;之后从这个工作台发布的模块会把打包好的文件提交到 artifacts/<包名>/,条目写到 market/<包名>.json。仓库的写权限归它的所有者。";
|
|
386
386
|
readonly 'panels.discover.initBranch': "分支";
|
|
387
387
|
readonly 'panels.discover.initBranchHint': "索引和打包文件都发到这个分支;空仓库会新建它。";
|
|
388
388
|
readonly 'panels.discover.initBranchBad': "分支名只能用字母、数字、点、下划线、斜杠或短横线";
|
|
@@ -713,6 +713,8 @@ export declare const dictionaries: {
|
|
|
713
713
|
readonly 'approval.publish.version': "版本";
|
|
714
714
|
readonly 'approval.publish.author': "作者";
|
|
715
715
|
readonly 'approval.publish.authorMissing': "未署名";
|
|
716
|
+
readonly 'approval.publish.labels': "标签";
|
|
717
|
+
readonly 'approval.publish.labelsMissing': "还没有(发布到市场时补 1–2 个)";
|
|
716
718
|
readonly 'approval.publish.owner': "认领人";
|
|
717
719
|
readonly 'approval.publish.ownerUnowned': "原来没署名";
|
|
718
720
|
readonly 'approval.publish.ownerTaken': "已有主人:{owner}";
|
|
@@ -803,7 +805,7 @@ export declare const dictionaries: {
|
|
|
803
805
|
readonly 'configSync.emptyProviders': "工作台还没有任何模型供应商 —— 去「配置同步」从某个 profile 把模型供应商那几行同步过来,或自己去「模型」里配。";
|
|
804
806
|
readonly 'configSync.failed': "同步没成功,再试一次。";
|
|
805
807
|
};
|
|
806
|
-
en: Record<"time.now" | "time.ago" | "time.minutes" | "time.hours" | "time.days" | "blocker.retry" | "blocker.copy" | "blocker.unknown.title" | "blocker.login.go" | "blocker.login.titleGeneric" | "blocker.login.title" | "blocker.login.manual" | "blocker.login.hint" | "blocker.forbidden.open" | "blocker.forbidden.titleGeneric" | "blocker.forbidden.title" | "blocker.forbidden.hint" | "blocker.timeout.hint" | "blocker.exec.hint" | "blocker.fix.install" | "blocker.market.open" | "env.unit.failed" | "env.unit.failedHint" | "env.unit.unsupported" | "env.unit.unsupportedHint" | "env.unit.degraded" | "env.unit.degradedHint" | "env.unit.unchecked" | "env.unit.uncheckedHint" | "profileCreate.nav" | "profileCreate.lead" | "profileCreate.name" | "profileCreate.nameHint" | "profileCreate.source" | "profileCreate.current" | "profileCreate.copy" | "profileCreate.settings" | "profileCreate.create" | "profileCreate.creating" | "profileCreate.created" | "profileCreate.command" | "profileCreate.readFailed" | "profileCreate.retry" | "profileCreate.reading" | "profileCreate.noProfiles" | "profileCreate.failed" | "configSync.nav" | "configSync.lead" | "configSync.source" | "configSync.sourceBroken" | "configSync.sourceRows" | "configSync.sourceDead" | "configSync.refresh" | "configSync.loading" | "configSync.readHint" | "configSync.tag.new" | "configSync.tag.differs" | "configSync.conflictNote" | "configSync.code.lang" | "configSync.code.copy" | "configSync.code.copied" | "configSync.code.wrap" | "configSync.code.unwrap" | "configSync.code.collapse" | "configSync.code.collapseAria" | "configSync.code.expandAria" | "configSync.code.expand" | "configSync.missing" | "configSync.apply" | "configSync.applyNone" | "configSync.applying" | "configSync.applied" | "configSync.appliedUnverified" | "configSync.appliedIds" | "configSync.skippedIds" | "configSync.nothing" | "configSync.unreadable" | "configSync.noSource" | "configSync.emptyProviders" | "configSync.failed" | "env.need.bin.missing" | "env.need.bin.hint" | "env.need.extension.missing" | "env.need.extension.outdated" | "env.need.extension.hint" | "env.need.lib.missing" | "env.need.lib.outdated" | "env.need.lib.unsatisfied" | "env.need.lib.hint" | "env.need.env.missing" | "env.need.env.hint" | "brand.name" | "toggle.open" | "toggle.collapse" | "project.label" | "workspace.section" | "project.none" | "project.empty" | "project.add" | "project.add.busy" | "project.add.failed" | "project.search.label" | "project.search.placeholder" | "project.search.empty" | "project.group.workspaces" | "project.group.defaultWorkspace" | "project.group.workshop" | "project.rename.row" | "project.rename.current" | "project.rename.title" | "project.rename.description" | "project.rename.field" | "project.rename.placeholder" | "project.rename.hint" | "project.rename.save" | "project.rename.saving" | "project.rename.cancel" | "project.rename.failed" | "session.new" | "session.new.label" | "session.empty" | "session.noProject" | "session.list.label" | "session.copy" | "session.pinned" | "session.actions" | "status.idle" | "status.running" | "status.longTask" | "status.waitingApproval" | "status.planReview" | "status.waitingAnswer" | "status.compact.approval" | "status.compact.planReview" | "status.compact.answer" | "status.completed" | "status.subagentsRunning.one" | "status.subagentsRunning.other" | "project.attention.warning.one" | "project.attention.warning.other" | "project.attention.running.one" | "project.attention.running.other" | "project.attention.longTask.one" | "project.attention.longTask.other" | "project.attention.done.one" | "project.attention.done.other" | "project.attention.state.warning" | "project.attention.state.running" | "project.attention.state.done" | "hover.copied" | "time.short.minutes" | "time.short.hours" | "time.short.days" | "time.short.months" | "time.short.years" | "panels.title" | "panels.groupBoardless" | "panels.groupPlugins" | "panels.market.defaultHint" | "panels.market.defaultLabel" | "panels.market.defaultLocked" | "panels.followAll" | "panels.followAllConfirmTitle" | "panels.followAllConfirmDetail" | "panels.followAllConfirmAck" | "panels.followAllConfirmYes" | "panels.followAllConfirmNo" | "panels.enabled" | "panels.disabled" | "panels.choose" | "panels.buildModule" | "panels.failed" | "panels.dragHint" | "panels.unknownStep" | "panels.labelWithHint" | "panels.hintJoin" | "panels.dep.failed" | "panels.dep.unchecked" | "panels.dep.missing" | "panels.dep.outdated" | "panels.dep.degraded" | "panels.dep.unsupported" | "panels.tab.modules" | "panels.tab.market" | "panels.browseMarket" | "panels.noneInstalled" | "panels.noneInstalledHint" | "panels.market.installed" | "panels.market.notActive" | "panels.market.notUsable" | "panels.market.broken" | "panels.market.hasNew" | "panels.market.hasProblem" | "panels.market.missing" | "panels.market.unchecked" | "panels.market.uncheckedHint" | "panels.market.checking" | "panels.market.sectionInstalled" | "panels.market.sectionPending" | "panels.market.sectionShared" | "panels.market.sharedUsedBy" | "panels.market.listSeparator" | "panels.market.sharedMissing" | "panels.market.sharedOutdated" | "panels.market.sharedUnsatisfied" | "panels.market.sharedOk" | "panels.market.versionArrow" | "panels.market.lead" | "panels.market.install" | "panels.market.update" | "panels.market.swapSlow" | "panels.market.removeSlow" | "panels.market.updateNoChange" | "panels.market.updateUnknownVersion" | "panels.market.updateGone" | "panels.market.updateRestored" | "panels.market.updateBehind" | "panels.market.updateStuck.title" | "panels.market.updateStuck.factNoChange" | "panels.market.updateStuck.copiedHint" | "panels.market.selfUpdateFailed" | "panels.market.selfUpdateUnknown" | "panels.market.selfUpdateRolledBack" | "panels.market.uninstall" | "panels.market.uninstallLabel" | "panels.market.installing" | "panels.market.updating" | "panels.market.uninstalling" | "panels.market.confirmUninstallTitle" | "panels.market.confirmUninstallDetail" | "panels.market.confirmUninstallAck" | "panels.market.confirmYes" | "panels.market.confirmNo" | "panels.market.noMarketSource" | "panels.market.failed" | "panels.market.askAgent" | "panels.market.askAgentCopied" | "panels.market.askAgentText" | "panels.market.failure.permission" | "panels.market.failure.diskFull" | "panels.market.failure.sandbox" | "panels.market.failure.unknown" | "panels.market.failure.factOwner" | "panels.market.failure.factMode" | "panels.market.failure.factSpace" | "panels.market.failure.factStuck" | "panels.market.failure.nowhere" | "panels.market.failure.copyFix" | "panels.market.failure.copied" | "panels.market.failure.copiedHint" | "panels.market.failure.askAgent" | "panels.market.failure.askAgentText" | "panels.market.failure.askAgentHint" | "panels.market.failure.recheck" | "panels.market.failure.showOutput" | "panels.market.failure.hideOutput" | "panels.market.failure.term.commandLine" | "panels.market.failure.term.signal" | "panels.market.failure.term.exitCode" | "panels.market.failure.term.noExitCode" | "panels.market.failure.term.running" | "panels.market.failure.term.failed" | "panels.market.failure.term.done" | "panels.market.failure.term.copy" | "panels.market.failure.term.copied" | "panels.market.failure.term.noOutput" | "panels.market.failure.term.collapse" | "panels.market.failure.term.expandAria" | "panels.market.failure.term.expand" | "panels.market.needEnv" | "panels.market.needCommands" | "panels.market.needBinary" | "panels.market.needLib" | "panels.market.localMark" | "panels.market.noSource" | "panels.market.badSource" | "panels.market.empty" | "panels.market.sectionPlugins" | "panels.market.moduleOutdated" | "panels.market.updateNeedsWorkbench" | "panels.market.updateIncompatible" | "panels.market.moduleRefused" | "panels.market.moduleRestartHint" | "panels.market.pendingRestart" | "panels.market.pendingFollowUp" | "panels.market.migrationHint" | "panels.market.migrateAction" | "panels.market.migrating" | "panels.market.migrateConfirmTitle" | "panels.market.migrateConfirmDetail" | "panels.market.migrateConfirmAck" | "panels.market.migrateConfirmYes" | "panels.market.migrateDone" | "panels.market.dismissFollowUp" | "panels.market.dismissing" | "panels.market.dismissFollowUpTitle" | "panels.market.dismissFollowUpDetail" | "panels.market.dismissFollowUpAck" | "panels.market.dismissFollowUpYes" | "panels.market.dismissed" | "panels.market.workbenchName" | "panels.market.pluginBroken" | "panels.market.restartNeeded" | "panels.market.foot" | "panels.market.checkUpdates" | "panels.market.checkAll" | "panels.market.checkingNow" | "panels.market.checkFailed" | "panels.market.checkedAt" | "panels.market.latestPartial" | "panels.market.latestNoRegistry" | "panels.market.latestProbeFailed" | "panels.market.justNow" | "panels.market.minutesAgo" | "panels.market.hoursAgo" | "panels.market.add.description" | "panels.market.add.specPlaceholder" | "panels.market.add.guideToggle" | "panels.market.add.guideHide" | "panels.market.add.guideIdTitle" | "panels.market.add.guideIdExample" | "panels.market.add.guideIdHint" | "panels.market.add.guideGitTitle" | "panels.market.add.guideGitExample" | "panels.market.add.guideGitHint" | "panels.market.add.guidePathTitle" | "panels.market.add.guidePathExample" | "panels.market.add.guidePathHint" | "panels.market.add.guideExampleLabel" | "panels.market.add.guideFill" | "panels.market.add.guideSafety" | "panels.market.add.registryLegend" | "panels.market.add.registryOfficial" | "panels.market.add.registryMirror" | "panels.market.add.registryWithHost" | "panels.market.add.registryToggle" | "panels.market.add.installVersion" | "panels.market.add.registryDefault" | "panels.market.add.registryCustom" | "panels.market.add.registryCustomPlaceholder" | "panels.market.add.registryCustomHint" | "panels.market.add.registryCustomInvalid" | "panels.market.add.run" | "panels.market.add.edit" | "panels.market.add.changeRegistry" | "panels.market.add.installingTitle" | "panels.market.add.installedTitle" | "panels.market.add.failedTitle" | "panels.market.add.cancelledTitle" | "panels.market.add.failureNetworkHost" | "panels.market.add.problemInvalid" | "panels.market.add.problemInstalled" | "panels.market.add.problemNotFound" | "panels.market.add.problemNotPackage" | "panels.market.add.problemNotBundle" | "panels.market.add.problemNotWorkbenchModule" | "panels.market.add.problemNotModuleOrPlugin" | "panels.market.add.failureNotModuleOrPlugin" | "panels.market.add.installedPlugin" | "panels.market.add.pluginPreview" | "panels.market.add.pluginAlias" | "panels.market.add.problemNetwork" | "panels.market.add.problemUnknown" | "panels.market.add.failureNetwork" | "panels.market.add.failureNotFound" | "panels.market.add.failureNoMatchingVersion" | "panels.market.add.failureDiskFull" | "panels.market.add.failurePermission" | "panels.market.add.failureBuildBlocked" | "panels.market.add.failureIntegrity" | "panels.market.add.failureStopProfile" | "panels.market.add.failureCancelled" | "panels.market.add.failureTimeout" | "panels.market.add.failurePnpmMissing" | "panels.market.add.failureInstalled" | "panels.market.add.failureGeneric" | "panels.market.add.failureCredentials" | "panels.market.add.approveTitle" | "panels.market.add.approveCaution" | "panels.market.add.approveRun" | "panels.market.add.restart" | "panels.market.add.tookEffect" | "panels.market.add.details" | "panels.market.add.open" | "panels.market.add.title" | "panels.market.add.intro" | "panels.market.add.specLabel" | "panels.market.add.specHint" | "panels.market.add.exampleTitle" | "panels.market.add.exampleFill" | "panels.market.add.registryLabel" | "panels.market.add.registryProfile" | "panels.market.add.registryPnpm" | "panels.market.add.check" | "panels.market.add.checking" | "panels.market.add.classifying" | "panels.market.add.change" | "panels.market.add.previewTitle" | "panels.market.add.fieldName" | "panels.market.add.fieldVersion" | "panels.market.add.fieldDescription" | "panels.market.add.fieldSource" | "panels.market.add.install" | "panels.market.add.installing" | "panels.market.add.cancel" | "panels.market.add.close" | "panels.market.add.retry" | "panels.market.add.changeSource" | "panels.market.tabInstalled" | "panels.market.tabs" | "panels.tab.discover" | "panels.discover.loading" | "panels.discover.slowHint" | "panels.discover.lead" | "panels.discover.addSource" | "panels.discover.addingSource" | "panels.discover.addFirstSource" | "panels.discover.removeSource" | "panels.discover.removeTitle" | "panels.discover.removeBody" | "panels.discover.sourceActions" | "panels.discover.sourceStateWritable" | "panels.discover.sourceStateReadOnly" | "panels.discover.sourceEnable" | "panels.discover.sourceDisable" | "panels.discover.sourceWorking" | "panels.discover.sourceEnabled" | "panels.discover.sourceReadOnly" | "panels.discover.refresh" | "panels.discover.search" | "panels.discover.clearSearch" | "panels.discover.all" | "panels.discover.sourceLabel" | "panels.discover.sourceKind" | "panels.discover.sourceKindHttp" | "panels.discover.sourceKindGit" | "panels.discover.sourceUrl" | "panels.discover.sourcePlaceholder" | "panels.discover.sourceRef" | "panels.discover.sourcePath" | "panels.discover.sourceLocal" | "panels.discover.sourceLocalHint" | "panels.discover.save" | "panels.discover.cancel" | "panels.discover.retry" | "panels.discover.noSource" | "panels.discover.noSourceHint" | "panels.discover.sourcesFailed" | "panels.discover.unreadable" | "panels.discover.sourceAuth" | "panels.discover.invalid" | "panels.discover.emptyRepo" | "panels.discover.missingIndex" | "panels.discover.initTitle" | "panels.discover.initCta" | "panels.discover.initWhat" | "panels.discover.initBranch" | "panels.discover.initBranchHint" | "panels.discover.initBranchBad" | "panels.discover.initOk" | "panels.discover.initBusy" | "panels.discover.initDone" | "panels.discover.stale" | "panels.discover.empty" | "panels.discover.noMatch" | "panels.discover.notInstalled" | "panels.discover.installed" | "panels.discover.installedVersion" | "panels.discover.update" | "panels.discover.badShell" | "panels.discover.badShellDetail" | "panels.discover.unverified" | "panels.discover.installing" | "panels.discover.installingNamed" | "panels.discover.cancelInstall" | "panels.discover.cancelling" | "panels.discover.installCancelled" | "panels.discover.installedDone" | "panels.discover.failed" | "panels.discover.transportTitle" | "panels.discover.transportSsh" | "panels.discover.transportHttps" | "panels.discover.transportOk" | "panels.discover.transportAuth" | "panels.discover.transportUnreachable" | "panels.discover.transportUnknown" | "panels.discover.transportChecking" | "panels.discover.transportTest" | "panels.discover.transportPlaceholder" | "panels.discover.transportNeedsAuth" | "panels.discover.transportChange" | "panels.discover.transportChangeHide" | "panels.discover.transportNone" | "panels.discover.expand" | "panels.discover.collapse" | "panels.discover.versionCount" | "panels.discover.sourceNpm" | "panels.discover.sourceNpmDefault" | "panels.discover.sourceGit" | "panels.discover.installVersion" | "panels.discover.confirmTitle" | "panels.discover.confirmDetail" | "panels.discover.confirmAck" | "panels.discover.confirmOk" | "panels.discover.confirmCancel" | "panels.discover.marketMenu" | "panels.discover.manageSources" | "panels.discover.sourcesTitle" | "panels.discover.sourcesIntro" | "panels.discover.sourcesLabel" | "panels.discover.sourceTrust" | "panels.discover.sourceDuplicate" | "panels.discover.sourceBadUrl" | "panels.discover.close" | "panels.discover.labelsMenu" | "panels.discover.labelsCount" | "panels.discover.tagsAll" | "panels.discover.sort" | "panels.discover.sortWith" | "panels.discover.sortRelevance" | "panels.discover.sortDefault" | "panels.discover.sortPublished" | "panels.discover.categoriesLabel" | "panels.discover.showMore" | "panels.discover.entryMeta" | "panels.discover.entryMetaAuthor" | "panels.discover.openEntry" | "panels.discover.cardInstall" | "panels.discover.cardInstalled" | "panels.discover.cardUpdate" | "panels.discover.cardBlocked" | "panels.discover.installTitle" | "panels.discover.installVersionTitle" | "panels.discover.openInstalled" | "panels.discover.noCompatibleVersion" | "panels.discover.detailBack" | "panels.discover.publishedAt" | "panels.discover.detailMarket" | "panels.discover.detailIncompatible" | "panels.discover.detailUnknown" | "panels.discover.detailSource" | "panels.discover.authorUnknown" | "panels.discover.tabOverview" | "panels.discover.tabReadme" | "panels.discover.tabChangelog" | "panels.discover.docReadme" | "panels.discover.docChangelog" | "panels.discover.docLoading" | "panels.discover.docMissing" | "panels.discover.docUnavailable" | "panels.discover.docUnknownReason" | "panels.discover.detailTabs" | "panels.discover.factPackage" | "panels.discover.factRegistry" | "panels.discover.factRepository" | "panels.discover.factCommit" | "panels.discover.factDirectory" | "panels.discover.factPublished" | "panels.discover.factAuthor" | "panels.discover.factHomepage" | "panels.discover.factCategory" | "panels.discover.factLabels" | "panels.discover.factMarket" | "panels.discover.detailVersions" | "panels.discover.versionsLabel" | "panels.discover.tagRecommended" | "panels.discover.tagPrerelease" | "panels.discover.tagInstalled" | "panels.discover.tagIncompatible" | "panels.discover.tagUnknown" | "panels.discover.selected" | "panels.discover.done" | "panels.discover.installTrust" | "panels.discover.progress" | "panels.market.add.approveBuilds" | "panels.market.add.approveHint" | "panels.market.add.doneApplied" | "panels.market.add.doneRestart" | "panels.market.add.restartWhy" | "panels.market.add.restartWhy.no-hmr" | "panels.market.add.restartWhy.package-moved" | "panels.market.add.restartWhy.host-module" | "panels.market.add.restartWhy.unmanaged-plugin" | "panels.market.add.restartWhy.module-comparison" | "panels.market.add.cancelled" | "panels.market.add.failed" | "panels.market.add.removed" | "panels.market.add.supplyPending" | "panels.market.add.supplyFailed" | "panels.market.add.notModule" | "panels.market.add.removedRestart" | "panels.market.add.remove" | "panels.market.add.problem.invalidSpec" | "panels.market.add.problem.alreadyInstalled" | "panels.market.add.problem.notFound" | "panels.market.add.problem.notAPackage" | "panels.market.add.problem.notABundle" | "panels.market.add.problem.network" | "panels.market.add.problem.unknown" | "panels.market.add.reason.invalidSpec" | "panels.market.add.reason.incompatible" | "panels.market.add.reason.notBundle" | "panels.market.add.reason.notRemovable" | "panels.market.add.reason.bundleInUse" | "panels.market.add.reason.stopProfile" | "panels.market.add.reason.staleApproval" | "panels.market.add.reason.operationError" | "panels.market.add.reason.buildBlocked" | "panels.market.add.reason.pnpmMissing" | "panels.market.add.reason.noMatchingVersion" | "panels.market.add.reason.diskFull" | "panels.market.add.reason.permission" | "panels.market.add.reason.integrity" | "panels.market.add.reason.timeout" | "panels.market.add.reason.network" | "panels.market.add.reason.notFound" | "panels.market.add.reason.unknown" | "blocker.fix.update" | "blocker.fix.running" | "blocker.fix.failed" | "blocker.retry.running" | "panels.reading" | "panels.cardBroken" | "panels.cardRetry" | "panels.empty" | "panels.emptyHint" | "env.title" | "env.checking" | "env.installing" | "env.failed" | "env.elapsed" | "env.stepFailed.install" | "env.stepFailed.path" | "env.stepFailed.shell" | "env.toolchain.ok" | "env.toolchain.warn" | "env.opencli.ok" | "env.bridge.ok" | "env.bridge.short" | "env.bridge.why" | "env.bridge.hold" | "env.bridge.daemon" | "env.bridge.extension" | "env.bridge.extensionLink" | "env.bridge.profile" | "env.bridge.stale" | "env.bridge.unknown" | "env.fix.title" | "env.fix.why" | "env.fix.whyPath" | "env.fix.whyShell" | "env.fix.step" | "env.fix.stepPath" | "env.fix.stepShell" | "env.fix.permission" | "env.fix.network" | "env.fix.details" | "env.retry" | "env.wake" | "env.wake.opening" | "env.wake.browserOpen" | "env.wake.noBrowser" | "env.wake.failed" | "env.bridge.continue" | "env.diy.ok" | "env.diy.short" | "env.diy.hold" | "env.diy.why" | "env.diy.rows" | "env.diy.noRow" | "env.diy.step" | "env.diy.continue" | "env.copyCommand" | "env.copied" | "env.step.toolchain" | "env.step.opencli" | "env.step.bridge" | "env.step.diy" | "env.step.warm" | "env.warm.done" | "env.warm.short" | "adapterSet.not-configured" | "adapterSet.no-profile" | "adapterSet.malformed" | "adapterSet.not-resolvable" | "adapterSet.import-failed" | "adapterSet.bad-export" | "adapterSet.factory-failed" | "adapterSet.incompatible-version" | "adapterSet.missing-member" | "env.unit.hint" | "rightbar.label" | "rightbar.expand" | "rightbar.collapse" | "rightbar.column.label" | "rightbar.column.workbench" | "rightbar.column.dsh" | "rightbar.refresh" | "rightbar.refreshing" | "rightbar.updatedAt" | "rightbar.noProject" | "rightbar.openPlatform" | "error.unknown" | "board.title" | "panel.conversation" | "panels.label" | "adapterSet.title" | "adapterSet.lead" | "adapterSet.active" | "adapterSet.defaults" | "adapterSet.failed" | "adapterSet.healthUnreadable" | "workbenchSettings.nav" | "workbenchSettings.lead" | "sidebarEdition.nav" | "sidebarEdition.lead" | "sidebarEdition.official" | "sidebarEdition.officialHint" | "sidebarEdition.custom" | "sidebarEdition.customHint" | "sidebarEdition.saving" | "sidebarEdition.reloadRequired" | "sidebarEdition.reload" | "sidebarEdition.failed" | "debug.workspace" | "debug.status" | "debug.status.trouble" | "debug.stalled" | "debug.act.pause" | "debug.act.resume" | "debug.act.stop" | "debug.act.stop.ask" | "debug.card.here.title" | "debug.card.here.note" | "debug.card.away.note" | "debug.card.paused.note" | "debug.card.hidden.note" | "record.waiting" | "record.waiting.note" | "record.recording" | "record.recording.note" | "record.recording.shots" | "record.finished" | "record.finished.note" | "record.act.cancel" | "record.act.halt" | "approval.record.site" | "approval.record.what" | "approval.record.lands" | "approval.record.noUrl" | "approval.record.oneAction" | "approval.record.noSwitch" | "approval.longTask.what" | "approval.longTask.signal" | "approval.plugin.name" | "approval.plugin.command" | "approval.plugin.note" | "approval.publish.module" | "approval.publish.target" | "approval.publish.version" | "approval.publish.author" | "approval.publish.authorMissing" | "approval.publish.owner" | "approval.publish.ownerUnowned" | "approval.publish.ownerTaken" | "approval.publish.unit" | "approval.publish.unitTaken" | "approval.publish.path" | "approval.publish.pathTaken" | "approval.publish.registry" | "approval.publish.repo" | "approval.publish.branch" | "approval.publish.defaultBranch" | "approval.publish.artifacts" | "approval.publish.index" | "approval.publish.commits" | "approval.publish.twoCommits" | "approval.publish.reading" | "approval.publish.changelog" | "approval.publish.changelogPending" | "approval.publish.changelogMissing" | "approval.publish.targetAuto" | "approval.publish.targetTeam" | "approval.publish.targetPublic" | "approval.publish.targetTarball" | "approval.publish.targetGit" | "approval.publish.targetMarket" | "approval.publish.targetLocal" | "approval.market.source" | "approval.market.url" | "approval.market.action" | "approval.market.policy" | "approval.market.enable" | "approval.market.disable" | "approval.market.writable" | "approval.market.readOnly" | "approval.market.reading" | "markdown.copy" | "markdown.copied" | "markdown.footnotes", string>;
|
|
808
|
+
en: Record<"time.now" | "time.ago" | "time.minutes" | "time.hours" | "time.days" | "blocker.retry" | "blocker.copy" | "blocker.unknown.title" | "blocker.login.go" | "blocker.login.titleGeneric" | "blocker.login.title" | "blocker.login.manual" | "blocker.login.hint" | "blocker.forbidden.open" | "blocker.forbidden.titleGeneric" | "blocker.forbidden.title" | "blocker.forbidden.hint" | "blocker.timeout.hint" | "blocker.exec.hint" | "blocker.fix.install" | "blocker.market.open" | "env.unit.failed" | "env.unit.failedHint" | "env.unit.unsupported" | "env.unit.unsupportedHint" | "env.unit.degraded" | "env.unit.degradedHint" | "env.unit.unchecked" | "env.unit.uncheckedHint" | "profileCreate.nav" | "profileCreate.lead" | "profileCreate.name" | "profileCreate.nameHint" | "profileCreate.source" | "profileCreate.current" | "profileCreate.copy" | "profileCreate.settings" | "profileCreate.create" | "profileCreate.creating" | "profileCreate.created" | "profileCreate.command" | "profileCreate.readFailed" | "profileCreate.retry" | "profileCreate.reading" | "profileCreate.noProfiles" | "profileCreate.failed" | "configSync.nav" | "configSync.lead" | "configSync.source" | "configSync.sourceBroken" | "configSync.sourceRows" | "configSync.sourceDead" | "configSync.refresh" | "configSync.loading" | "configSync.readHint" | "configSync.tag.new" | "configSync.tag.differs" | "configSync.conflictNote" | "configSync.code.lang" | "configSync.code.copy" | "configSync.code.copied" | "configSync.code.wrap" | "configSync.code.unwrap" | "configSync.code.collapse" | "configSync.code.collapseAria" | "configSync.code.expandAria" | "configSync.code.expand" | "configSync.missing" | "configSync.apply" | "configSync.applyNone" | "configSync.applying" | "configSync.applied" | "configSync.appliedUnverified" | "configSync.appliedIds" | "configSync.skippedIds" | "configSync.nothing" | "configSync.unreadable" | "configSync.noSource" | "configSync.emptyProviders" | "configSync.failed" | "env.need.bin.missing" | "env.need.bin.hint" | "env.need.extension.missing" | "env.need.extension.outdated" | "env.need.extension.hint" | "env.need.lib.missing" | "env.need.lib.outdated" | "env.need.lib.unsatisfied" | "env.need.lib.hint" | "env.need.env.missing" | "env.need.env.hint" | "brand.name" | "toggle.open" | "toggle.collapse" | "project.label" | "workspace.section" | "project.none" | "project.empty" | "project.add" | "project.add.busy" | "project.add.failed" | "project.search.label" | "project.search.placeholder" | "project.search.empty" | "project.group.workspaces" | "project.group.defaultWorkspace" | "project.group.workshop" | "project.rename.row" | "project.rename.current" | "project.rename.title" | "project.rename.description" | "project.rename.field" | "project.rename.placeholder" | "project.rename.hint" | "project.rename.save" | "project.rename.saving" | "project.rename.cancel" | "project.rename.failed" | "session.new" | "session.new.label" | "session.empty" | "session.noProject" | "session.list.label" | "session.copy" | "session.pinned" | "session.actions" | "status.idle" | "status.running" | "status.longTask" | "status.waitingApproval" | "status.planReview" | "status.waitingAnswer" | "status.compact.approval" | "status.compact.planReview" | "status.compact.answer" | "status.completed" | "status.subagentsRunning.one" | "status.subagentsRunning.other" | "project.attention.warning.one" | "project.attention.warning.other" | "project.attention.running.one" | "project.attention.running.other" | "project.attention.longTask.one" | "project.attention.longTask.other" | "project.attention.done.one" | "project.attention.done.other" | "project.attention.state.warning" | "project.attention.state.running" | "project.attention.state.done" | "hover.copied" | "time.short.minutes" | "time.short.hours" | "time.short.days" | "time.short.months" | "time.short.years" | "panels.title" | "panels.groupBoardless" | "panels.groupPlugins" | "panels.market.defaultHint" | "panels.market.defaultLabel" | "panels.market.defaultLocked" | "panels.followAll" | "panels.followAllConfirmTitle" | "panels.followAllConfirmDetail" | "panels.followAllConfirmAck" | "panels.followAllConfirmYes" | "panels.followAllConfirmNo" | "panels.enabled" | "panels.disabled" | "panels.choose" | "panels.buildModule" | "panels.failed" | "panels.dragHint" | "panels.unknownStep" | "panels.labelWithHint" | "panels.hintJoin" | "panels.dep.failed" | "panels.dep.unchecked" | "panels.dep.missing" | "panels.dep.outdated" | "panels.dep.degraded" | "panels.dep.unsupported" | "panels.tab.modules" | "panels.tab.market" | "panels.browseMarket" | "panels.noneInstalled" | "panels.noneInstalledHint" | "panels.market.installed" | "panels.market.notActive" | "panels.market.notUsable" | "panels.market.broken" | "panels.market.hasNew" | "panels.market.hasProblem" | "panels.market.missing" | "panels.market.unchecked" | "panels.market.uncheckedHint" | "panels.market.checking" | "panels.market.sectionInstalled" | "panels.market.sectionPending" | "panels.market.sectionShared" | "panels.market.sharedUsedBy" | "panels.market.listSeparator" | "panels.market.sharedMissing" | "panels.market.sharedOutdated" | "panels.market.sharedUnsatisfied" | "panels.market.sharedOk" | "panels.market.versionArrow" | "panels.market.lead" | "panels.market.install" | "panels.market.update" | "panels.market.swapSlow" | "panels.market.removeSlow" | "panels.market.updateNoChange" | "panels.market.updateUnknownVersion" | "panels.market.updateGone" | "panels.market.updateRestored" | "panels.market.updateBehind" | "panels.market.updateStuck.title" | "panels.market.updateStuck.factNoChange" | "panels.market.updateStuck.copiedHint" | "panels.market.selfUpdateFailed" | "panels.market.selfUpdateUnknown" | "panels.market.selfUpdateRolledBack" | "panels.market.uninstall" | "panels.market.uninstallLabel" | "panels.market.installing" | "panels.market.updating" | "panels.market.uninstalling" | "panels.market.confirmUninstallTitle" | "panels.market.confirmUninstallDetail" | "panels.market.confirmUninstallAck" | "panels.market.confirmYes" | "panels.market.confirmNo" | "panels.market.noMarketSource" | "panels.market.failed" | "panels.market.askAgent" | "panels.market.askAgentCopied" | "panels.market.askAgentText" | "panels.market.failure.permission" | "panels.market.failure.diskFull" | "panels.market.failure.sandbox" | "panels.market.failure.unknown" | "panels.market.failure.factOwner" | "panels.market.failure.factMode" | "panels.market.failure.factSpace" | "panels.market.failure.factStuck" | "panels.market.failure.nowhere" | "panels.market.failure.copyFix" | "panels.market.failure.copied" | "panels.market.failure.copiedHint" | "panels.market.failure.askAgent" | "panels.market.failure.askAgentText" | "panels.market.failure.askAgentHint" | "panels.market.failure.recheck" | "panels.market.failure.showOutput" | "panels.market.failure.hideOutput" | "panels.market.failure.term.commandLine" | "panels.market.failure.term.signal" | "panels.market.failure.term.exitCode" | "panels.market.failure.term.noExitCode" | "panels.market.failure.term.running" | "panels.market.failure.term.failed" | "panels.market.failure.term.done" | "panels.market.failure.term.copy" | "panels.market.failure.term.copied" | "panels.market.failure.term.noOutput" | "panels.market.failure.term.collapse" | "panels.market.failure.term.expandAria" | "panels.market.failure.term.expand" | "panels.market.needEnv" | "panels.market.needCommands" | "panels.market.needBinary" | "panels.market.needLib" | "panels.market.localMark" | "panels.market.noSource" | "panels.market.badSource" | "panels.market.empty" | "panels.market.sectionPlugins" | "panels.market.moduleOutdated" | "panels.market.updateNeedsWorkbench" | "panels.market.updateIncompatible" | "panels.market.moduleRefused" | "panels.market.moduleRestartHint" | "panels.market.pendingRestart" | "panels.market.pendingFollowUp" | "panels.market.migrationHint" | "panels.market.migrateAction" | "panels.market.migrating" | "panels.market.migrateConfirmTitle" | "panels.market.migrateConfirmDetail" | "panels.market.migrateConfirmAck" | "panels.market.migrateConfirmYes" | "panels.market.migrateDone" | "panels.market.dismissFollowUp" | "panels.market.dismissing" | "panels.market.dismissFollowUpTitle" | "panels.market.dismissFollowUpDetail" | "panels.market.dismissFollowUpAck" | "panels.market.dismissFollowUpYes" | "panels.market.dismissed" | "panels.market.workbenchName" | "panels.market.pluginBroken" | "panels.market.restartNeeded" | "panels.market.foot" | "panels.market.checkUpdates" | "panels.market.checkAll" | "panels.market.checkingNow" | "panels.market.checkFailed" | "panels.market.checkedAt" | "panels.market.latestPartial" | "panels.market.latestNoRegistry" | "panels.market.latestProbeFailed" | "panels.market.justNow" | "panels.market.minutesAgo" | "panels.market.hoursAgo" | "panels.market.add.description" | "panels.market.add.specPlaceholder" | "panels.market.add.guideToggle" | "panels.market.add.guideHide" | "panels.market.add.guideIdTitle" | "panels.market.add.guideIdExample" | "panels.market.add.guideIdHint" | "panels.market.add.guideGitTitle" | "panels.market.add.guideGitExample" | "panels.market.add.guideGitHint" | "panels.market.add.guidePathTitle" | "panels.market.add.guidePathExample" | "panels.market.add.guidePathHint" | "panels.market.add.guideExampleLabel" | "panels.market.add.guideFill" | "panels.market.add.guideSafety" | "panels.market.add.registryLegend" | "panels.market.add.registryOfficial" | "panels.market.add.registryMirror" | "panels.market.add.registryWithHost" | "panels.market.add.registryToggle" | "panels.market.add.installVersion" | "panels.market.add.registryDefault" | "panels.market.add.registryCustom" | "panels.market.add.registryCustomPlaceholder" | "panels.market.add.registryCustomHint" | "panels.market.add.registryCustomInvalid" | "panels.market.add.run" | "panels.market.add.edit" | "panels.market.add.changeRegistry" | "panels.market.add.installingTitle" | "panels.market.add.installedTitle" | "panels.market.add.failedTitle" | "panels.market.add.cancelledTitle" | "panels.market.add.failureNetworkHost" | "panels.market.add.problemInvalid" | "panels.market.add.problemInstalled" | "panels.market.add.problemNotFound" | "panels.market.add.problemNotPackage" | "panels.market.add.problemNotBundle" | "panels.market.add.problemNotWorkbenchModule" | "panels.market.add.problemNotModuleOrPlugin" | "panels.market.add.failureNotModuleOrPlugin" | "panels.market.add.installedPlugin" | "panels.market.add.pluginPreview" | "panels.market.add.pluginAlias" | "panels.market.add.problemNetwork" | "panels.market.add.problemUnknown" | "panels.market.add.failureNetwork" | "panels.market.add.failureNotFound" | "panels.market.add.failureNoMatchingVersion" | "panels.market.add.failureDiskFull" | "panels.market.add.failurePermission" | "panels.market.add.failureBuildBlocked" | "panels.market.add.failureIntegrity" | "panels.market.add.failureStopProfile" | "panels.market.add.failureCancelled" | "panels.market.add.failureTimeout" | "panels.market.add.failurePnpmMissing" | "panels.market.add.failureInstalled" | "panels.market.add.failureGeneric" | "panels.market.add.failureCredentials" | "panels.market.add.approveTitle" | "panels.market.add.approveCaution" | "panels.market.add.approveRun" | "panels.market.add.restart" | "panels.market.add.tookEffect" | "panels.market.add.details" | "panels.market.add.open" | "panels.market.add.title" | "panels.market.add.intro" | "panels.market.add.specLabel" | "panels.market.add.specHint" | "panels.market.add.exampleTitle" | "panels.market.add.exampleFill" | "panels.market.add.registryLabel" | "panels.market.add.registryProfile" | "panels.market.add.registryPnpm" | "panels.market.add.check" | "panels.market.add.checking" | "panels.market.add.classifying" | "panels.market.add.change" | "panels.market.add.previewTitle" | "panels.market.add.fieldName" | "panels.market.add.fieldVersion" | "panels.market.add.fieldDescription" | "panels.market.add.fieldSource" | "panels.market.add.install" | "panels.market.add.installing" | "panels.market.add.cancel" | "panels.market.add.close" | "panels.market.add.retry" | "panels.market.add.changeSource" | "panels.market.tabInstalled" | "panels.market.tabs" | "panels.tab.discover" | "panels.discover.loading" | "panels.discover.slowHint" | "panels.discover.lead" | "panels.discover.addSource" | "panels.discover.addingSource" | "panels.discover.addFirstSource" | "panels.discover.removeSource" | "panels.discover.removeTitle" | "panels.discover.removeBody" | "panels.discover.sourceActions" | "panels.discover.sourceStateWritable" | "panels.discover.sourceStateReadOnly" | "panels.discover.sourceEnable" | "panels.discover.sourceDisable" | "panels.discover.sourceWorking" | "panels.discover.sourceEnabled" | "panels.discover.sourceReadOnly" | "panels.discover.refresh" | "panels.discover.search" | "panels.discover.clearSearch" | "panels.discover.all" | "panels.discover.sourceLabel" | "panels.discover.sourceKind" | "panels.discover.sourceKindHttp" | "panels.discover.sourceKindGit" | "panels.discover.sourceUrl" | "panels.discover.sourcePlaceholder" | "panels.discover.sourceRef" | "panels.discover.sourcePath" | "panels.discover.sourceLocal" | "panels.discover.sourceLocalHint" | "panels.discover.save" | "panels.discover.cancel" | "panels.discover.retry" | "panels.discover.noSource" | "panels.discover.noSourceHint" | "panels.discover.sourcesFailed" | "panels.discover.unreadable" | "panels.discover.sourceAuth" | "panels.discover.invalid" | "panels.discover.emptyRepo" | "panels.discover.missingIndex" | "panels.discover.initTitle" | "panels.discover.initCta" | "panels.discover.initWhat" | "panels.discover.initBranch" | "panels.discover.initBranchHint" | "panels.discover.initBranchBad" | "panels.discover.initOk" | "panels.discover.initBusy" | "panels.discover.initDone" | "panels.discover.stale" | "panels.discover.empty" | "panels.discover.noMatch" | "panels.discover.notInstalled" | "panels.discover.installed" | "panels.discover.installedVersion" | "panels.discover.update" | "panels.discover.badShell" | "panels.discover.badShellDetail" | "panels.discover.unverified" | "panels.discover.installing" | "panels.discover.installingNamed" | "panels.discover.cancelInstall" | "panels.discover.cancelling" | "panels.discover.installCancelled" | "panels.discover.installedDone" | "panels.discover.failed" | "panels.discover.transportTitle" | "panels.discover.transportSsh" | "panels.discover.transportHttps" | "panels.discover.transportOk" | "panels.discover.transportAuth" | "panels.discover.transportUnreachable" | "panels.discover.transportUnknown" | "panels.discover.transportChecking" | "panels.discover.transportTest" | "panels.discover.transportPlaceholder" | "panels.discover.transportNeedsAuth" | "panels.discover.transportChange" | "panels.discover.transportChangeHide" | "panels.discover.transportNone" | "panels.discover.expand" | "panels.discover.collapse" | "panels.discover.versionCount" | "panels.discover.sourceNpm" | "panels.discover.sourceNpmDefault" | "panels.discover.sourceGit" | "panels.discover.installVersion" | "panels.discover.confirmTitle" | "panels.discover.confirmDetail" | "panels.discover.confirmAck" | "panels.discover.confirmOk" | "panels.discover.confirmCancel" | "panels.discover.marketMenu" | "panels.discover.manageSources" | "panels.discover.sourcesTitle" | "panels.discover.sourcesIntro" | "panels.discover.sourcesLabel" | "panels.discover.sourceTrust" | "panels.discover.sourceDuplicate" | "panels.discover.sourceBadUrl" | "panels.discover.close" | "panels.discover.labelsMenu" | "panels.discover.labelsCount" | "panels.discover.tagsAll" | "panels.discover.sort" | "panels.discover.sortWith" | "panels.discover.sortRelevance" | "panels.discover.sortDefault" | "panels.discover.sortPublished" | "panels.discover.categoriesLabel" | "panels.discover.showMore" | "panels.discover.entryMeta" | "panels.discover.entryMetaAuthor" | "panels.discover.openEntry" | "panels.discover.cardInstall" | "panels.discover.cardInstalled" | "panels.discover.cardUpdate" | "panels.discover.cardBlocked" | "panels.discover.installTitle" | "panels.discover.installVersionTitle" | "panels.discover.openInstalled" | "panels.discover.noCompatibleVersion" | "panels.discover.detailBack" | "panels.discover.publishedAt" | "panels.discover.detailMarket" | "panels.discover.detailIncompatible" | "panels.discover.detailUnknown" | "panels.discover.detailSource" | "panels.discover.authorUnknown" | "panels.discover.tabOverview" | "panels.discover.tabReadme" | "panels.discover.tabChangelog" | "panels.discover.docReadme" | "panels.discover.docChangelog" | "panels.discover.docLoading" | "panels.discover.docMissing" | "panels.discover.docUnavailable" | "panels.discover.docUnknownReason" | "panels.discover.detailTabs" | "panels.discover.factPackage" | "panels.discover.factRegistry" | "panels.discover.factRepository" | "panels.discover.factCommit" | "panels.discover.factDirectory" | "panels.discover.factPublished" | "panels.discover.factAuthor" | "panels.discover.factHomepage" | "panels.discover.factCategory" | "panels.discover.factLabels" | "panels.discover.factMarket" | "panels.discover.detailVersions" | "panels.discover.versionsLabel" | "panels.discover.tagRecommended" | "panels.discover.tagPrerelease" | "panels.discover.tagInstalled" | "panels.discover.tagIncompatible" | "panels.discover.tagUnknown" | "panels.discover.selected" | "panels.discover.done" | "panels.discover.installTrust" | "panels.discover.progress" | "panels.market.add.approveBuilds" | "panels.market.add.approveHint" | "panels.market.add.doneApplied" | "panels.market.add.doneRestart" | "panels.market.add.restartWhy" | "panels.market.add.restartWhy.no-hmr" | "panels.market.add.restartWhy.package-moved" | "panels.market.add.restartWhy.host-module" | "panels.market.add.restartWhy.unmanaged-plugin" | "panels.market.add.restartWhy.module-comparison" | "panels.market.add.cancelled" | "panels.market.add.failed" | "panels.market.add.removed" | "panels.market.add.supplyPending" | "panels.market.add.supplyFailed" | "panels.market.add.notModule" | "panels.market.add.removedRestart" | "panels.market.add.remove" | "panels.market.add.problem.invalidSpec" | "panels.market.add.problem.alreadyInstalled" | "panels.market.add.problem.notFound" | "panels.market.add.problem.notAPackage" | "panels.market.add.problem.notABundle" | "panels.market.add.problem.network" | "panels.market.add.problem.unknown" | "panels.market.add.reason.invalidSpec" | "panels.market.add.reason.incompatible" | "panels.market.add.reason.notBundle" | "panels.market.add.reason.notRemovable" | "panels.market.add.reason.bundleInUse" | "panels.market.add.reason.stopProfile" | "panels.market.add.reason.staleApproval" | "panels.market.add.reason.operationError" | "panels.market.add.reason.buildBlocked" | "panels.market.add.reason.pnpmMissing" | "panels.market.add.reason.noMatchingVersion" | "panels.market.add.reason.diskFull" | "panels.market.add.reason.permission" | "panels.market.add.reason.integrity" | "panels.market.add.reason.timeout" | "panels.market.add.reason.network" | "panels.market.add.reason.notFound" | "panels.market.add.reason.unknown" | "blocker.fix.update" | "blocker.fix.running" | "blocker.fix.failed" | "blocker.retry.running" | "panels.reading" | "panels.cardBroken" | "panels.cardRetry" | "panels.empty" | "panels.emptyHint" | "env.title" | "env.checking" | "env.installing" | "env.failed" | "env.elapsed" | "env.stepFailed.install" | "env.stepFailed.path" | "env.stepFailed.shell" | "env.toolchain.ok" | "env.toolchain.warn" | "env.opencli.ok" | "env.bridge.ok" | "env.bridge.short" | "env.bridge.why" | "env.bridge.hold" | "env.bridge.daemon" | "env.bridge.extension" | "env.bridge.extensionLink" | "env.bridge.profile" | "env.bridge.stale" | "env.bridge.unknown" | "env.fix.title" | "env.fix.why" | "env.fix.whyPath" | "env.fix.whyShell" | "env.fix.step" | "env.fix.stepPath" | "env.fix.stepShell" | "env.fix.permission" | "env.fix.network" | "env.fix.details" | "env.retry" | "env.wake" | "env.wake.opening" | "env.wake.browserOpen" | "env.wake.noBrowser" | "env.wake.failed" | "env.bridge.continue" | "env.diy.ok" | "env.diy.short" | "env.diy.hold" | "env.diy.why" | "env.diy.rows" | "env.diy.noRow" | "env.diy.step" | "env.diy.continue" | "env.copyCommand" | "env.copied" | "env.step.toolchain" | "env.step.opencli" | "env.step.bridge" | "env.step.diy" | "env.step.warm" | "env.warm.done" | "env.warm.short" | "adapterSet.not-configured" | "adapterSet.no-profile" | "adapterSet.malformed" | "adapterSet.not-resolvable" | "adapterSet.import-failed" | "adapterSet.bad-export" | "adapterSet.factory-failed" | "adapterSet.incompatible-version" | "adapterSet.missing-member" | "env.unit.hint" | "rightbar.label" | "rightbar.expand" | "rightbar.collapse" | "rightbar.column.label" | "rightbar.column.workbench" | "rightbar.column.dsh" | "rightbar.refresh" | "rightbar.refreshing" | "rightbar.updatedAt" | "rightbar.noProject" | "rightbar.openPlatform" | "error.unknown" | "board.title" | "panel.conversation" | "panels.label" | "adapterSet.title" | "adapterSet.lead" | "adapterSet.active" | "adapterSet.defaults" | "adapterSet.failed" | "adapterSet.healthUnreadable" | "workbenchSettings.nav" | "workbenchSettings.lead" | "sidebarEdition.nav" | "sidebarEdition.lead" | "sidebarEdition.official" | "sidebarEdition.officialHint" | "sidebarEdition.custom" | "sidebarEdition.customHint" | "sidebarEdition.saving" | "sidebarEdition.reloadRequired" | "sidebarEdition.reload" | "sidebarEdition.failed" | "debug.workspace" | "debug.status" | "debug.status.trouble" | "debug.stalled" | "debug.act.pause" | "debug.act.resume" | "debug.act.stop" | "debug.act.stop.ask" | "debug.card.here.title" | "debug.card.here.note" | "debug.card.away.note" | "debug.card.paused.note" | "debug.card.hidden.note" | "record.waiting" | "record.waiting.note" | "record.recording" | "record.recording.note" | "record.recording.shots" | "record.finished" | "record.finished.note" | "record.act.cancel" | "record.act.halt" | "approval.record.site" | "approval.record.what" | "approval.record.lands" | "approval.record.noUrl" | "approval.record.oneAction" | "approval.record.noSwitch" | "approval.longTask.what" | "approval.longTask.signal" | "approval.plugin.name" | "approval.plugin.command" | "approval.plugin.note" | "approval.publish.module" | "approval.publish.target" | "approval.publish.version" | "approval.publish.author" | "approval.publish.authorMissing" | "approval.publish.labels" | "approval.publish.labelsMissing" | "approval.publish.owner" | "approval.publish.ownerUnowned" | "approval.publish.ownerTaken" | "approval.publish.unit" | "approval.publish.unitTaken" | "approval.publish.path" | "approval.publish.pathTaken" | "approval.publish.registry" | "approval.publish.repo" | "approval.publish.branch" | "approval.publish.defaultBranch" | "approval.publish.artifacts" | "approval.publish.index" | "approval.publish.commits" | "approval.publish.twoCommits" | "approval.publish.reading" | "approval.publish.changelog" | "approval.publish.changelogPending" | "approval.publish.changelogMissing" | "approval.publish.targetAuto" | "approval.publish.targetTeam" | "approval.publish.targetPublic" | "approval.publish.targetTarball" | "approval.publish.targetGit" | "approval.publish.targetMarket" | "approval.publish.targetLocal" | "approval.market.source" | "approval.market.url" | "approval.market.action" | "approval.market.policy" | "approval.market.enable" | "approval.market.disable" | "approval.market.writable" | "approval.market.readOnly" | "approval.market.reading" | "markdown.copy" | "markdown.copied" | "markdown.footnotes", string>;
|
|
807
809
|
};
|
|
808
810
|
/** 中文词表的键类型(从 `zh.ts` 转出):`en` 与模块词表都得覆盖同一批键。 */
|
|
809
811
|
export type { WorkbenchMessages };
|
package/dist/i18n/zh.d.ts
CHANGED
|
@@ -380,7 +380,7 @@ export declare const zh: {
|
|
|
380
380
|
readonly 'panels.discover.missingIndex': "仓库里还没有索引文件 {path}";
|
|
381
381
|
readonly 'panels.discover.initTitle': "把这个仓库初始化成模块市场索引?";
|
|
382
382
|
readonly 'panels.discover.initCta': "初始化成市场索引";
|
|
383
|
-
readonly 'panels.discover.initWhat': "会在 {branch} 分支写索引目录 market/ 与 README.md,提交一次并推上去;之后从这个工作台发布的模块会把打包好的文件提交到 artifacts
|
|
383
|
+
readonly 'panels.discover.initWhat': "会在 {branch} 分支写索引目录 market/ 与 README.md,提交一次并推上去;之后从这个工作台发布的模块会把打包好的文件提交到 artifacts/<包名>/,条目写到 market/<包名>.json。仓库的写权限归它的所有者。";
|
|
384
384
|
readonly 'panels.discover.initBranch': "分支";
|
|
385
385
|
readonly 'panels.discover.initBranchHint': "索引和打包文件都发到这个分支;空仓库会新建它。";
|
|
386
386
|
readonly 'panels.discover.initBranchBad': "分支名只能用字母、数字、点、下划线、斜杠或短横线";
|
|
@@ -711,6 +711,8 @@ export declare const zh: {
|
|
|
711
711
|
readonly 'approval.publish.version': "版本";
|
|
712
712
|
readonly 'approval.publish.author': "作者";
|
|
713
713
|
readonly 'approval.publish.authorMissing': "未署名";
|
|
714
|
+
readonly 'approval.publish.labels': "标签";
|
|
715
|
+
readonly 'approval.publish.labelsMissing': "还没有(发布到市场时补 1–2 个)";
|
|
714
716
|
readonly 'approval.publish.owner': "认领人";
|
|
715
717
|
readonly 'approval.publish.ownerUnowned': "原来没署名";
|
|
716
718
|
readonly 'approval.publish.ownerTaken': "已有主人:{owner}";
|