hybridtm 0.7.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -11
- package/dist/backupHandler.d.ts +60 -0
- package/dist/backupHandler.js +335 -0
- package/dist/backupHandler.js.map +1 -0
- package/dist/backupReader.d.ts +26 -0
- package/dist/backupReader.js +55 -0
- package/dist/backupReader.js.map +1 -0
- package/dist/batchImporter.d.ts +1 -1
- package/dist/batchImporter.js +4 -3
- package/dist/batchImporter.js.map +1 -1
- package/dist/cli/backupCommand.d.ts +15 -0
- package/dist/cli/backupCommand.js +49 -0
- package/dist/cli/backupCommand.js.map +1 -0
- package/dist/cli/cliUtils.d.ts +2 -1
- package/dist/cli/cliUtils.js +23 -10
- package/dist/cli/cliUtils.js.map +1 -1
- package/dist/cli/createCommand.d.ts +5 -3
- package/dist/cli/createCommand.js +33 -28
- package/dist/cli/createCommand.js.map +1 -1
- package/dist/cli/hybridtmCli.d.ts +1 -1
- package/dist/cli/hybridtmCli.js +35 -15
- package/dist/cli/hybridtmCli.js.map +1 -1
- package/dist/cli/importCommand.d.ts +11 -3
- package/dist/cli/importCommand.js +75 -78
- package/dist/cli/importCommand.js.map +1 -1
- package/dist/cli/matchCommand.d.ts +17 -3
- package/dist/cli/matchCommand.js +99 -129
- package/dist/cli/matchCommand.js.map +1 -1
- package/dist/cli/registryCommands.d.ts +8 -5
- package/dist/cli/registryCommands.js +63 -61
- package/dist/cli/registryCommands.js.map +1 -1
- package/dist/cli/restoreCommand.d.ts +18 -0
- package/dist/cli/restoreCommand.js +100 -0
- package/dist/cli/restoreCommand.js.map +1 -0
- package/dist/cli/serveCommand.d.ts +17 -0
- package/dist/cli/serveCommand.js +87 -0
- package/dist/cli/serveCommand.js.map +1 -0
- package/dist/cli/stopCommand.d.ts +15 -0
- package/dist/cli/stopCommand.js +73 -0
- package/dist/cli/stopCommand.js.map +1 -0
- package/dist/hybridtm.d.ts +11 -4
- package/dist/hybridtm.js +308 -89
- package/dist/hybridtm.js.map +1 -1
- package/dist/hybridtmFactory.d.ts +1 -1
- package/dist/hybridtmFactory.js +6 -1
- package/dist/hybridtmFactory.js.map +1 -1
- package/dist/importOptions.d.ts +5 -5
- package/dist/importOptions.js +11 -11
- package/dist/importOptions.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/langEntry.d.ts +1 -1
- package/dist/langEntry.js +1 -1
- package/dist/match.d.ts +1 -1
- package/dist/match.js +1 -1
- package/dist/matchQuality.d.ts +1 -1
- package/dist/matchQuality.js +1 -1
- package/dist/pendingEntry.d.ts +1 -1
- package/dist/pendingEntry.js +1 -1
- package/dist/searchFilters.d.ts +1 -1
- package/dist/searchFilters.js +1 -1
- package/dist/server/hybridtmServer.d.ts +40 -0
- package/dist/server/hybridtmServer.js +527 -0
- package/dist/server/hybridtmServer.js.map +1 -0
- package/dist/server/hybridtmServerMain.d.ts +12 -0
- package/dist/server/hybridtmServerMain.js +18 -0
- package/dist/server/hybridtmServerMain.js.map +1 -0
- package/dist/tmxHandler.d.ts +2 -1
- package/dist/tmxHandler.js +13 -7
- package/dist/tmxHandler.js.map +1 -1
- package/dist/tmxReader.d.ts +1 -1
- package/dist/tmxReader.js +4 -4
- package/dist/tmxReader.js.map +1 -1
- package/dist/utils.d.ts +28 -2
- package/dist/utils.js +163 -2
- package/dist/utils.js.map +1 -1
- package/dist/xliffHandler.d.ts +1 -2
- package/dist/xliffHandler.js +34 -30
- package/dist/xliffHandler.js.map +1 -1
- package/dist/xliffReader.d.ts +1 -1
- package/dist/xliffReader.js +4 -4
- package/dist/xliffReader.js.map +1 -1
- package/package.json +5 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"importCommand.js","sourceRoot":"","sources":["../../ts/cli/importCommand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;iFAUiF;AAEjF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAY,eAAe,EAAmC,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAIzC,MAAM,
|
|
1
|
+
{"version":3,"file":"importCommand.js","sourceRoot":"","sources":["../../ts/cli/importCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,12 +2,26 @@
|
|
|
2
2
|
* Copyright (c) 2025-2026 Maxprograms.
|
|
3
3
|
*
|
|
4
4
|
* This program and the accompanying materials
|
|
5
|
-
* are made available under the terms of the Eclipse
|
|
5
|
+
* are made available under the terms of the Eclipse Public License v1.0
|
|
6
6
|
* which accompanies this distribution, and is available at
|
|
7
7
|
* https://www.eclipse.org/org/documents/epl-v10.html
|
|
8
8
|
*
|
|
9
9
|
* Contributors:
|
|
10
10
|
* Maxprograms - initial API and implementation
|
|
11
11
|
*******************************************************************************/
|
|
12
|
-
|
|
13
|
-
export
|
|
12
|
+
import { HybridTM } from '../index.js';
|
|
13
|
+
export interface MatchResult {
|
|
14
|
+
segmentsProcessed: number;
|
|
15
|
+
segmentsWithMatches: number;
|
|
16
|
+
totalMatches: number;
|
|
17
|
+
outputPath: string;
|
|
18
|
+
}
|
|
19
|
+
export declare class MatchCommand {
|
|
20
|
+
static usage(): void;
|
|
21
|
+
static run(args: string[]): Promise<void>;
|
|
22
|
+
static matchXliffFile(tm: HybridTM, filePath: string, outputPath: string, similarity: number, limit?: number): Promise<MatchResult>;
|
|
23
|
+
static resolveOutputPath(explicit: string | undefined, inputPath: string): string;
|
|
24
|
+
private static collectUnits;
|
|
25
|
+
private static declareMatchesNamespace;
|
|
26
|
+
private static parseIntOption;
|
|
27
|
+
}
|
package/dist/cli/matchCommand.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright (c) 2025-2026 Maxprograms.
|
|
3
3
|
*
|
|
4
4
|
* This program and the accompanying materials
|
|
5
|
-
* are made available under the terms of the Eclipse
|
|
5
|
+
* are made available under the terms of the Eclipse Public License v1.0
|
|
6
6
|
* which accompanies this distribution, and is available at
|
|
7
7
|
* https://www.eclipse.org/org/documents/epl-v10.html
|
|
8
8
|
*
|
|
@@ -10,58 +10,75 @@
|
|
|
10
10
|
* Maxprograms - initial API and implementation
|
|
11
11
|
*******************************************************************************/
|
|
12
12
|
import { basename, dirname, extname, join } from "node:path";
|
|
13
|
-
import { XliffGroup,
|
|
13
|
+
import { XliffGroup, XliffMatches, XliffParser, XliffSegment } from 'typesxliff';
|
|
14
14
|
import { HybridTMFactory, Utils } from '../index.js';
|
|
15
15
|
import { CliUtils } from './cliUtils.js';
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
console.log(' -limit Max candidates per segment (default: ' + DEFAULT_LIMIT + ')');
|
|
28
|
-
console.log(' -similarity Minimum hybrid match score 0-100 (default: ' + DEFAULT_SIMILARITY + ')');
|
|
29
|
-
console.log(' -all Consider every segment, not just untranslated ones');
|
|
30
|
-
console.log();
|
|
31
|
-
console.log('Never modifies <target>. Adds spec Translation Candidates module');
|
|
32
|
-
console.log('(<mtc:matches>/<mtc:match>) entries and writes the result to a new file.');
|
|
33
|
-
}
|
|
34
|
-
export async function runMatchCommand(args) {
|
|
35
|
-
if (CliUtils.hasFlag(args, '-help')) {
|
|
36
|
-
usage();
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
const name = CliUtils.getFlag(args, '-name');
|
|
40
|
-
const rawFile = CliUtils.getFlag(args, '-file');
|
|
41
|
-
if (!name || !rawFile) {
|
|
42
|
-
usage();
|
|
43
|
-
CliUtils.fail('Missing required -name or -file.');
|
|
16
|
+
export class MatchCommand {
|
|
17
|
+
static usage() {
|
|
18
|
+
console.log('Usage: hybridtm match -name <name> -file <path> -similarity N [-output <path>]');
|
|
19
|
+
console.log(' [-limit N]');
|
|
20
|
+
console.log();
|
|
21
|
+
console.log(' -name TM instance to search against (required)');
|
|
22
|
+
console.log(' -file XLIFF file to enrich with match candidates (required)');
|
|
23
|
+
console.log(' -similarity Minimum hybrid match score 0-100 (required)');
|
|
24
|
+
console.log(' -output Output path (default: <file-without-ext>.matches.xlf)');
|
|
25
|
+
console.log(' -limit Max candidates per segment (default: HybridTM.semanticTranslationSearch\'s own default)');
|
|
26
|
+
console.log();
|
|
44
27
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
CliUtils.
|
|
28
|
+
static async run(args) {
|
|
29
|
+
if (CliUtils.hasFlag(args, '-help')) {
|
|
30
|
+
MatchCommand.usage();
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const name = CliUtils.getFlag(args, '-name');
|
|
34
|
+
const rawFile = CliUtils.getFlag(args, '-file');
|
|
35
|
+
const rawSimilarity = CliUtils.getFlag(args, '-similarity');
|
|
36
|
+
if (!name || !rawFile || !rawSimilarity) {
|
|
37
|
+
MatchCommand.usage();
|
|
38
|
+
CliUtils.fail('Missing required -name, -file, or -similarity.');
|
|
39
|
+
}
|
|
40
|
+
const filePath = CliUtils.requireExistingFile(rawFile, 'XLIFF file');
|
|
41
|
+
const rawLimit = CliUtils.getFlag(args, '-limit');
|
|
42
|
+
const limit = rawLimit !== undefined ? MatchCommand.parseIntOption(rawLimit, '-limit', 1) : undefined;
|
|
43
|
+
const similarity = MatchCommand.parseIntOption(rawSimilarity, '-similarity', 0, 100);
|
|
44
|
+
const outputPath = MatchCommand.resolveOutputPath(CliUtils.getFlag(args, '-output'), filePath);
|
|
45
|
+
const tm = HybridTMFactory.getInstance(name);
|
|
46
|
+
if (!tm) {
|
|
47
|
+
CliUtils.fail('No instance named "' + name + '". Run "hybridtm create" or "hybridtm list" first.');
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const result = await MatchCommand.matchXliffFile(tm, filePath, outputPath, similarity, limit);
|
|
51
|
+
console.log('Segments processed: ' + result.segmentsProcessed);
|
|
52
|
+
console.log('Segments with matches: ' + result.segmentsWithMatches);
|
|
53
|
+
console.log('Total match candidates: ' + result.totalMatches);
|
|
54
|
+
console.log('Output: ' + result.outputPath);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
CliUtils.fail(error instanceof Error ? error.message : String(error));
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
await tm.close();
|
|
61
|
+
}
|
|
53
62
|
}
|
|
54
|
-
|
|
63
|
+
static async matchXliffFile(tm, filePath, outputPath, similarity, limit) {
|
|
55
64
|
const parser = new XliffParser();
|
|
56
65
|
parser.parseFile(filePath);
|
|
57
66
|
const document = parser.getXliffDocument();
|
|
58
67
|
if (!document) {
|
|
59
|
-
|
|
68
|
+
throw new Error('Unable to parse "' + filePath + '".');
|
|
69
|
+
}
|
|
70
|
+
const rawSrcLang = document.getSrcLang();
|
|
71
|
+
const srcLang = Utils.normalizeLanguage(rawSrcLang);
|
|
72
|
+
if (!srcLang) {
|
|
73
|
+
throw new Error('"' + filePath + '" has an invalid @srcLang value "' + rawSrcLang + '".');
|
|
60
74
|
}
|
|
61
|
-
const
|
|
62
|
-
|
|
75
|
+
const rawTgtLang = document.getTrgLang();
|
|
76
|
+
if (!rawTgtLang) {
|
|
77
|
+
throw new Error('"' + filePath + '" is missing @trgLang; nothing to match against.');
|
|
78
|
+
}
|
|
79
|
+
const tgtLang = Utils.normalizeLanguage(rawTgtLang);
|
|
63
80
|
if (!tgtLang) {
|
|
64
|
-
|
|
81
|
+
throw new Error('"' + filePath + '" has an invalid @trgLang value "' + rawTgtLang + '".');
|
|
65
82
|
}
|
|
66
83
|
let segmentsProcessed = 0;
|
|
67
84
|
let segmentsWithMatches = 0;
|
|
@@ -69,34 +86,36 @@ export async function runMatchCommand(args) {
|
|
|
69
86
|
let usedModule = false;
|
|
70
87
|
for (const file of document.getFiles()) {
|
|
71
88
|
const fileId = file.getId();
|
|
72
|
-
for (const unit of collectUnits(file.getEntries())) {
|
|
89
|
+
for (const unit of MatchCommand.collectUnits(file.getEntries())) {
|
|
73
90
|
const unitMatches = [];
|
|
74
91
|
const unitId = unit.getId();
|
|
92
|
+
// shared so <ph>/<data> ids stay unique across the whole unit
|
|
93
|
+
const dataCounter = { value: 0 };
|
|
75
94
|
for (const item of unit.getItems()) {
|
|
76
95
|
if (!(item instanceof XliffSegment)) {
|
|
77
96
|
continue;
|
|
78
97
|
}
|
|
79
|
-
if (
|
|
98
|
+
if (item.getState() === 'final') {
|
|
80
99
|
continue;
|
|
81
100
|
}
|
|
82
101
|
const source = item.getSource();
|
|
83
|
-
const pureSource = source ? getPureText(source.
|
|
102
|
+
const pureSource = source ? Utils.getPureText(source.toElement()) : '';
|
|
84
103
|
if (pureSource.trim().length === 0) {
|
|
85
104
|
continue;
|
|
86
105
|
}
|
|
87
106
|
segmentsProcessed++;
|
|
88
|
-
const results = await tm.semanticTranslationSearch(pureSource, srcLang, tgtLang, similarity, limit);
|
|
107
|
+
const results = Utils.dedupeMatches(await tm.semanticTranslationSearch(pureSource, srcLang, tgtLang, similarity, limit));
|
|
89
108
|
if (results.length === 0) {
|
|
90
109
|
continue;
|
|
91
110
|
}
|
|
92
111
|
segmentsWithMatches++;
|
|
93
112
|
totalMatches += results.length;
|
|
94
|
-
const ref =
|
|
95
|
-
results.forEach((match) => unitMatches.push(buildXliffMatch(ref, match)));
|
|
113
|
+
const ref = item.getId() ? '#' + item.getId() : '#/f=' + fileId + '/u=' + unitId;
|
|
114
|
+
results.forEach((match) => unitMatches.push(Utils.buildXliffMatch(ref, match, dataCounter)));
|
|
96
115
|
}
|
|
97
116
|
if (unitMatches.length > 0) {
|
|
98
117
|
const matches = new XliffMatches();
|
|
99
|
-
matches.setNamespacePrefix(
|
|
118
|
+
matches.setNamespacePrefix(Utils.MTC_PREFIX);
|
|
100
119
|
unitMatches.forEach((match) => matches.addMatch(match));
|
|
101
120
|
unit.setMatches(matches);
|
|
102
121
|
usedModule = true;
|
|
@@ -104,92 +123,43 @@ export async function runMatchCommand(args) {
|
|
|
104
123
|
}
|
|
105
124
|
}
|
|
106
125
|
if (usedModule) {
|
|
107
|
-
declareMatchesNamespace(document);
|
|
126
|
+
MatchCommand.declareMatchesNamespace(document);
|
|
108
127
|
}
|
|
109
128
|
document.writeDocument(outputPath, true);
|
|
110
|
-
|
|
111
|
-
console.log('Segments with matches: ' + segmentsWithMatches);
|
|
112
|
-
console.log('Total match candidates: ' + totalMatches);
|
|
113
|
-
console.log('Output: ' + outputPath);
|
|
114
|
-
}
|
|
115
|
-
catch (error) {
|
|
116
|
-
CliUtils.fail(error instanceof Error ? error.message : String(error));
|
|
129
|
+
return { segmentsProcessed, segmentsWithMatches, totalMatches, outputPath };
|
|
117
130
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
function collectUnits(entries) {
|
|
123
|
-
const units = [];
|
|
124
|
-
entries.forEach((entry) => {
|
|
125
|
-
if (entry instanceof XliffGroup) {
|
|
126
|
-
units.push(...collectUnits(entry.getEntries()));
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
units.push(entry);
|
|
131
|
+
static resolveOutputPath(explicit, inputPath) {
|
|
132
|
+
if (explicit) {
|
|
133
|
+
return CliUtils.resolvePath(explicit);
|
|
130
134
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
function needsMatches(segment) {
|
|
135
|
-
const state = segment.getState();
|
|
136
|
-
if (state === undefined || state === 'initial') {
|
|
137
|
-
return true;
|
|
138
|
-
}
|
|
139
|
-
const target = segment.getTarget();
|
|
140
|
-
if (!target) {
|
|
141
|
-
return true;
|
|
142
|
-
}
|
|
143
|
-
return getPureText(target.getContent()).trim().length === 0;
|
|
144
|
-
}
|
|
145
|
-
function buildXliffMatch(ref, match) {
|
|
146
|
-
const xliffMatch = new XliffMatch(ref);
|
|
147
|
-
xliffMatch.setNamespacePrefix(DEFAULT_PREFIX);
|
|
148
|
-
xliffMatch.setType('tm');
|
|
149
|
-
xliffMatch.setOrigin(match.origin);
|
|
150
|
-
xliffMatch.setSimilarity(String(match.similarity));
|
|
151
|
-
const source = new XliffSource();
|
|
152
|
-
source.addText(Utils.getPureText(match.source));
|
|
153
|
-
xliffMatch.setSource(source);
|
|
154
|
-
const target = new XliffTarget();
|
|
155
|
-
target.addText(Utils.getPureText(match.target));
|
|
156
|
-
xliffMatch.setTarget(target);
|
|
157
|
-
return xliffMatch;
|
|
158
|
-
}
|
|
159
|
-
function declareMatchesNamespace(document) {
|
|
160
|
-
const alreadyDeclared = document.getOtherAttributes().some((attribute) => attribute.getName().startsWith('xmlns:') && attribute.getValue() === MATCHES_NAMESPACE);
|
|
161
|
-
if (!alreadyDeclared) {
|
|
162
|
-
document.setOtherAttribute('xmlns:' + DEFAULT_PREFIX, MATCHES_NAMESPACE);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
function resolveOutputPath(explicit, inputPath) {
|
|
166
|
-
if (explicit) {
|
|
167
|
-
return CliUtils.resolvePath(explicit);
|
|
135
|
+
const ext = extname(inputPath);
|
|
136
|
+
const stem = basename(inputPath, ext);
|
|
137
|
+
return join(dirname(inputPath), stem + '.matches.xlf');
|
|
168
138
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
139
|
+
static collectUnits(entries) {
|
|
140
|
+
const units = [];
|
|
141
|
+
entries.forEach((entry) => {
|
|
142
|
+
if (entry instanceof XliffGroup) {
|
|
143
|
+
units.push(...MatchCommand.collectUnits(entry.getEntries()));
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
units.push(entry);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
return units;
|
|
180
150
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
let text = '';
|
|
185
|
-
content.forEach((item) => {
|
|
186
|
-
if (typeof item === 'string') {
|
|
187
|
-
text += item;
|
|
151
|
+
static declareMatchesNamespace(document) {
|
|
152
|
+
if (!Utils.isNamespaceDeclared(document.getOtherAttributes(), Utils.MATCHES_NAMESPACE)) {
|
|
153
|
+
document.setOtherAttribute('xmlns:' + Utils.MTC_PREFIX, Utils.MATCHES_NAMESPACE);
|
|
188
154
|
}
|
|
189
|
-
|
|
190
|
-
|
|
155
|
+
}
|
|
156
|
+
static parseIntOption(raw, flag, min, max) {
|
|
157
|
+
const parsed = Number(raw);
|
|
158
|
+
if (!Number.isInteger(parsed) || parsed < min || (max !== undefined && parsed > max)) {
|
|
159
|
+
const range = max !== undefined ? 'an integer between ' + min + ' and ' + max : 'an integer of at least ' + min;
|
|
160
|
+
CliUtils.fail('Invalid ' + flag + ' value "' + raw + '"; expected ' + range + '.');
|
|
191
161
|
}
|
|
192
|
-
|
|
193
|
-
|
|
162
|
+
return parsed;
|
|
163
|
+
}
|
|
194
164
|
}
|
|
195
165
|
//# sourceMappingURL=matchCommand.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matchCommand.js","sourceRoot":"","sources":["../../ts/cli/matchCommand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;iFAUiF;AAEjF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"matchCommand.js","sourceRoot":"","sources":["../../ts/cli/matchCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,14 +2,17 @@
|
|
|
2
2
|
* Copyright (c) 2025-2026 Maxprograms.
|
|
3
3
|
*
|
|
4
4
|
* This program and the accompanying materials
|
|
5
|
-
* are made available under the terms of the Eclipse
|
|
5
|
+
* are made available under the terms of the Eclipse Public License v1.0
|
|
6
6
|
* which accompanies this distribution, and is available at
|
|
7
7
|
* https://www.eclipse.org/org/documents/epl-v10.html
|
|
8
8
|
*
|
|
9
9
|
* Contributors:
|
|
10
10
|
* Maxprograms - initial API and implementation
|
|
11
11
|
*******************************************************************************/
|
|
12
|
-
export declare
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
export declare class RegistryCommands {
|
|
13
|
+
static listUsage(): void;
|
|
14
|
+
static runList(args: string[]): Promise<void>;
|
|
15
|
+
static removeUsage(): void;
|
|
16
|
+
static runRemove(args: string[]): Promise<void>;
|
|
17
|
+
private static confirm;
|
|
18
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright (c) 2025-2026 Maxprograms.
|
|
3
3
|
*
|
|
4
4
|
* This program and the accompanying materials
|
|
5
|
-
* are made available under the terms of the Eclipse
|
|
5
|
+
* are made available under the terms of the Eclipse Public License v1.0
|
|
6
6
|
* which accompanies this distribution, and is available at
|
|
7
7
|
* https://www.eclipse.org/org/documents/epl-v10.html
|
|
8
8
|
*
|
|
@@ -12,72 +12,74 @@
|
|
|
12
12
|
import { createInterface } from 'node:readline/promises';
|
|
13
13
|
import { HybridTMFactory } from '../index.js';
|
|
14
14
|
import { CliUtils } from './cliUtils.js';
|
|
15
|
-
export
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
export async function runListCommand(args) {
|
|
19
|
-
if (CliUtils.hasFlag(args, '-help')) {
|
|
20
|
-
listUsage();
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
const instances = HybridTMFactory.listInstances();
|
|
24
|
-
if (instances.length === 0) {
|
|
25
|
-
console.log('No instances registered. Run "hybridtm create" to make one.');
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
instances.forEach((instance) => {
|
|
29
|
-
console.log(instance.name + '\t' + instance.filePath + '\t' + instance.modelName + '\t' + instance.createdAt);
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
export function removeUsage() {
|
|
33
|
-
console.log('Usage: hybridtm remove -name <name> [-force]');
|
|
34
|
-
console.log();
|
|
35
|
-
console.log(' -name Instance to remove (required)');
|
|
36
|
-
console.log(' -force Skip the interactive confirmation prompt (for scripts/automation)');
|
|
37
|
-
}
|
|
38
|
-
export async function runRemoveCommand(args) {
|
|
39
|
-
if (CliUtils.hasFlag(args, '-help')) {
|
|
40
|
-
removeUsage();
|
|
41
|
-
return;
|
|
15
|
+
export class RegistryCommands {
|
|
16
|
+
static listUsage() {
|
|
17
|
+
console.log('Usage: hybridtm list');
|
|
42
18
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
CliUtils.fail('Missing required -name.');
|
|
47
|
-
}
|
|
48
|
-
const instances = HybridTMFactory.listInstances();
|
|
49
|
-
const metadata = instances.find((instance) => instance.name === name);
|
|
50
|
-
if (!metadata) {
|
|
51
|
-
const hint = instances.length > 0
|
|
52
|
-
? ' Registered instances: ' + instances.map((instance) => '"' + instance.name + '"').join(', ') + '.'
|
|
53
|
-
: ' No instances are registered yet.';
|
|
54
|
-
CliUtils.fail('No instance named "' + name + '".' + hint);
|
|
55
|
-
}
|
|
56
|
-
if (!CliUtils.hasFlag(args, '-force')) {
|
|
57
|
-
console.log('About to permanently delete instance "' + name + '" at ' + metadata.filePath + ' (model: ' + metadata.modelName + ').');
|
|
58
|
-
console.log('This cannot be undone.');
|
|
59
|
-
const confirmed = await confirm('Type "yes" to confirm: ');
|
|
60
|
-
if (!confirmed) {
|
|
61
|
-
console.log('Aborted; no changes made.');
|
|
19
|
+
static async runList(args) {
|
|
20
|
+
if (CliUtils.hasFlag(args, '-help')) {
|
|
21
|
+
RegistryCommands.listUsage();
|
|
62
22
|
return;
|
|
63
23
|
}
|
|
24
|
+
const instances = HybridTMFactory.listInstances();
|
|
25
|
+
if (instances.length === 0) {
|
|
26
|
+
console.log('No instances registered. Run "hybridtm create" to make one.');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
instances.forEach((instance) => {
|
|
30
|
+
console.log(instance.name + '\t' + instance.filePath + '\t' + instance.modelName + '\t' + instance.createdAt);
|
|
31
|
+
});
|
|
64
32
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
console.log(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
CliUtils.fail(error instanceof Error ? error.message : String(error));
|
|
33
|
+
static removeUsage() {
|
|
34
|
+
console.log('Usage: hybridtm remove -name <name> [-force]');
|
|
35
|
+
console.log();
|
|
36
|
+
console.log(' -name Instance to remove (required)');
|
|
37
|
+
console.log(' -force Skip the interactive confirmation prompt (for scripts/automation)');
|
|
71
38
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
39
|
+
static async runRemove(args) {
|
|
40
|
+
if (CliUtils.hasFlag(args, '-help')) {
|
|
41
|
+
RegistryCommands.removeUsage();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const name = CliUtils.getFlag(args, '-name');
|
|
45
|
+
if (!name) {
|
|
46
|
+
RegistryCommands.removeUsage();
|
|
47
|
+
CliUtils.fail('Missing required -name.');
|
|
48
|
+
}
|
|
49
|
+
const instances = HybridTMFactory.listInstances();
|
|
50
|
+
const metadata = instances.find((instance) => instance.name === name);
|
|
51
|
+
if (!metadata) {
|
|
52
|
+
const hint = instances.length > 0
|
|
53
|
+
? ' Registered instances: ' + instances.map((instance) => '"' + instance.name + '"').join(', ') + '.'
|
|
54
|
+
: ' No instances are registered yet.';
|
|
55
|
+
CliUtils.fail('No instance named "' + name + '".' + hint);
|
|
56
|
+
}
|
|
57
|
+
if (!CliUtils.hasFlag(args, '-force')) {
|
|
58
|
+
console.log('About to permanently delete instance "' + name + '" at ' + metadata.filePath + ' (model: ' + metadata.modelName + ').');
|
|
59
|
+
console.log('This cannot be undone.');
|
|
60
|
+
const confirmed = await RegistryCommands.confirm('Type "yes" to confirm: ');
|
|
61
|
+
if (!confirmed) {
|
|
62
|
+
console.log('Aborted; no changes made.');
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
HybridTMFactory.removeInstance(name);
|
|
68
|
+
console.log('Removed instance "' + name + '".');
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
CliUtils.fail(error instanceof Error ? error.message : String(error));
|
|
72
|
+
}
|
|
78
73
|
}
|
|
79
|
-
|
|
80
|
-
rl.
|
|
74
|
+
static async confirm(promptText) {
|
|
75
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
76
|
+
try {
|
|
77
|
+
const answer = await rl.question(promptText);
|
|
78
|
+
return answer.trim().toLowerCase() === 'yes';
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
rl.close();
|
|
82
|
+
}
|
|
81
83
|
}
|
|
82
84
|
}
|
|
83
85
|
//# sourceMappingURL=registryCommands.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registryCommands.js","sourceRoot":"","sources":["../../ts/cli/registryCommands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;iFAUiF;AAEjF,OAAO,EAAE,eAAe,EAAa,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,eAAe,EAA4B,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,
|
|
1
|
+
{"version":3,"file":"registryCommands.js","sourceRoot":"","sources":["../../ts/cli/registryCommands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/*******************************************************************************
|
|
2
|
+
* Copyright (c) 2025-2026 Maxprograms.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials
|
|
5
|
+
* are made available under the terms of the Eclipse Public License v1.0
|
|
6
|
+
* which accompanies this distribution, and is available at
|
|
7
|
+
* https://www.eclipse.org/org/documents/epl-v10.html
|
|
8
|
+
*
|
|
9
|
+
* Contributors:
|
|
10
|
+
* Maxprograms - initial API and implementation
|
|
11
|
+
*******************************************************************************/
|
|
12
|
+
export declare class RestoreCommand {
|
|
13
|
+
static usage(): void;
|
|
14
|
+
static run(args: string[]): Promise<void>;
|
|
15
|
+
private static getExistingTargetInstance;
|
|
16
|
+
private static createTargetInstance;
|
|
17
|
+
private static peekBackupHeader;
|
|
18
|
+
}
|