@usejunior/docx-mcp 0.2.0 → 0.3.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/dist/.tsbuildinfo +1 -1
- package/dist/cli/commands/edit.d.ts +24 -0
- package/dist/cli/commands/edit.d.ts.map +1 -0
- package/dist/cli/commands/edit.js +145 -0
- package/dist/cli/commands/edit.js.map +1 -0
- package/dist/cli/flag_parser.d.ts +7 -0
- package/dist/cli/flag_parser.d.ts.map +1 -0
- package/dist/cli/flag_parser.js +235 -0
- package/dist/cli/flag_parser.js.map +1 -0
- package/dist/cli/help.d.ts +3 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +62 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +29 -32
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/parse_utils.d.ts +7 -0
- package/dist/cli/parse_utils.d.ts.map +1 -0
- package/dist/cli/parse_utils.js +18 -0
- package/dist/cli/parse_utils.js.map +1 -0
- package/dist/cli/tool_runner.d.ts +6 -0
- package/dist/cli/tool_runner.d.ts.map +1 -0
- package/dist/cli/tool_runner.js +17 -0
- package/dist/cli/tool_runner.js.map +1 -0
- package/dist/server.d.ts +1 -1
- package/dist/session/manager.d.ts +14 -0
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +22 -0
- package/dist/session/manager.js.map +1 -1
- package/dist/tool_catalog.d.ts +4 -3
- package/dist/tool_catalog.d.ts.map +1 -1
- package/dist/tool_catalog.js +5 -4
- package/dist/tool_catalog.js.map +1 -1
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +8 -1
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/open_document.d.ts.map +1 -1
- package/dist/tools/open_document.js +4 -17
- package/dist/tools/open_document.js.map +1 -1
- package/dist/tools/pagination.d.ts +9 -0
- package/dist/tools/pagination.d.ts.map +1 -0
- package/dist/tools/pagination.js +16 -0
- package/dist/tools/pagination.js.map +1 -0
- package/dist/tools/read_file.d.ts.map +1 -1
- package/dist/tools/read_file.js +96 -17
- package/dist/tools/read_file.js.map +1 -1
- package/dist/tools/replace_text.d.ts +9 -0
- package/dist/tools/replace_text.d.ts.map +1 -1
- package/dist/tools/replace_text.js +49 -49
- package/dist/tools/replace_text.js.map +1 -1
- package/dist/tools/session_resolution.d.ts.map +1 -1
- package/dist/tools/session_resolution.js +68 -18
- package/dist/tools/session_resolution.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batched edit command. Converts repeatable --replace/--insert-after/--insert-before
|
|
3
|
+
* flags into apply_plan steps, then calls dispatchToolCall.
|
|
4
|
+
*/
|
|
5
|
+
import { SessionManager } from '../../session/manager.js';
|
|
6
|
+
import { dispatchToolCall } from '../../server.js';
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Argv parser
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
export function parseEditArgs(argv) {
|
|
11
|
+
const replaces = [];
|
|
12
|
+
const inserts = [];
|
|
13
|
+
let file_path;
|
|
14
|
+
let instruction;
|
|
15
|
+
let output_path;
|
|
16
|
+
let i = 0;
|
|
17
|
+
while (i < argv.length) {
|
|
18
|
+
const token = argv[i];
|
|
19
|
+
if (!token.startsWith('-') && file_path === undefined) {
|
|
20
|
+
file_path = token;
|
|
21
|
+
i++;
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
switch (token) {
|
|
25
|
+
case '--replace': {
|
|
26
|
+
const paraId = argv[i + 1];
|
|
27
|
+
const oldStr = argv[i + 2];
|
|
28
|
+
const newStr = argv[i + 3];
|
|
29
|
+
if (!paraId || !oldStr || newStr === undefined) {
|
|
30
|
+
throw new Error('--replace requires 3 arguments: <paragraph_id> <old_string> <new_string>');
|
|
31
|
+
}
|
|
32
|
+
replaces.push({ paragraph_id: paraId, old_string: oldStr, new_string: newStr });
|
|
33
|
+
i += 4;
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
case '--insert-after': {
|
|
37
|
+
const anchorId = argv[i + 1];
|
|
38
|
+
const text = argv[i + 2];
|
|
39
|
+
if (!anchorId || text === undefined) {
|
|
40
|
+
throw new Error('--insert-after requires 2 arguments: <anchor_id> <text>');
|
|
41
|
+
}
|
|
42
|
+
inserts.push({ anchor_id: anchorId, text, position: 'AFTER' });
|
|
43
|
+
i += 3;
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
case '--insert-before': {
|
|
47
|
+
const anchorId = argv[i + 1];
|
|
48
|
+
const text = argv[i + 2];
|
|
49
|
+
if (!anchorId || text === undefined) {
|
|
50
|
+
throw new Error('--insert-before requires 2 arguments: <anchor_id> <text>');
|
|
51
|
+
}
|
|
52
|
+
inserts.push({ anchor_id: anchorId, text, position: 'BEFORE' });
|
|
53
|
+
i += 3;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
case '--instruction': {
|
|
57
|
+
const val = argv[i + 1];
|
|
58
|
+
if (!val)
|
|
59
|
+
throw new Error('--instruction requires a value');
|
|
60
|
+
instruction = val;
|
|
61
|
+
i += 2;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
case '-o':
|
|
65
|
+
case '--output': {
|
|
66
|
+
const val = argv[i + 1];
|
|
67
|
+
if (!val)
|
|
68
|
+
throw new Error(`${token} requires a value`);
|
|
69
|
+
output_path = val;
|
|
70
|
+
i += 2;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
case '--help':
|
|
74
|
+
case '-h':
|
|
75
|
+
// Handled by caller — just skip
|
|
76
|
+
i++;
|
|
77
|
+
break;
|
|
78
|
+
default:
|
|
79
|
+
throw new Error(`Unknown edit flag: ${token}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (!file_path) {
|
|
83
|
+
throw new Error('edit requires a file path as the first positional argument');
|
|
84
|
+
}
|
|
85
|
+
if (replaces.length === 0 && inserts.length === 0) {
|
|
86
|
+
throw new Error('edit requires at least one --replace, --insert-after, or --insert-before');
|
|
87
|
+
}
|
|
88
|
+
return { file_path, replaces, inserts, instruction, output_path };
|
|
89
|
+
}
|
|
90
|
+
export async function runEditCommand(args, opts) {
|
|
91
|
+
const mgr = new SessionManager();
|
|
92
|
+
const defaultInstruction = args.instruction ?? 'CLI batch edit';
|
|
93
|
+
// Build apply_plan steps
|
|
94
|
+
let stepCounter = 0;
|
|
95
|
+
const steps = [];
|
|
96
|
+
for (const r of args.replaces) {
|
|
97
|
+
stepCounter++;
|
|
98
|
+
steps.push({
|
|
99
|
+
step_id: `cli_replace_${stepCounter}`,
|
|
100
|
+
operation: 'replace_text',
|
|
101
|
+
target_paragraph_id: r.paragraph_id,
|
|
102
|
+
old_string: r.old_string,
|
|
103
|
+
new_string: r.new_string,
|
|
104
|
+
instruction: defaultInstruction,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
for (const ins of args.inserts) {
|
|
108
|
+
stepCounter++;
|
|
109
|
+
steps.push({
|
|
110
|
+
step_id: `cli_insert_${stepCounter}`,
|
|
111
|
+
operation: 'insert_paragraph',
|
|
112
|
+
positional_anchor_node_id: ins.anchor_id,
|
|
113
|
+
new_string: ins.text,
|
|
114
|
+
instruction: defaultInstruction,
|
|
115
|
+
position: ins.position,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// Apply plan
|
|
119
|
+
const applyResult = await dispatchToolCall(mgr, 'apply_plan', {
|
|
120
|
+
file_path: args.file_path,
|
|
121
|
+
steps,
|
|
122
|
+
});
|
|
123
|
+
const applySuccess = applyResult.success;
|
|
124
|
+
if (applySuccess === false) {
|
|
125
|
+
opts.writeError(JSON.stringify(applyResult, null, 2));
|
|
126
|
+
throw new Error('Edit apply_plan failed');
|
|
127
|
+
}
|
|
128
|
+
// Save if output path specified
|
|
129
|
+
if (args.output_path) {
|
|
130
|
+
const saveResult = await dispatchToolCall(mgr, 'save', {
|
|
131
|
+
file_path: args.file_path,
|
|
132
|
+
save_to_local_path: args.output_path,
|
|
133
|
+
});
|
|
134
|
+
const saveSuccess = saveResult.success;
|
|
135
|
+
if (saveSuccess === false) {
|
|
136
|
+
opts.writeError(JSON.stringify(saveResult, null, 2));
|
|
137
|
+
throw new Error('Edit save failed');
|
|
138
|
+
}
|
|
139
|
+
opts.write(JSON.stringify({ apply: applyResult, save: saveResult }, null, 2));
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
opts.write(JSON.stringify(applyResult, null, 2));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=edit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../src/cli/commands/edit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AA0BnD,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,IAAI,SAA6B,CAAC;IAClC,IAAI,WAA+B,CAAC;IACpC,IAAI,WAA+B,CAAC;IAEpC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QAEvB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YACtD,SAAS,GAAG,KAAK,CAAC;YAClB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3B,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC/C,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;gBAC9F,CAAC;gBACD,QAAQ,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;gBAChF,CAAC,IAAI,CAAC,CAAC;gBACP,MAAM;YACR,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACpC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;gBAC7E,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC/D,CAAC,IAAI,CAAC,CAAC;gBACP,MAAM;YACR,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACpC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;gBAC9E,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAChE,CAAC,IAAI,CAAC,CAAC;gBACP,MAAM;YACR,CAAC;YACD,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACxB,IAAI,CAAC,GAAG;oBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBAC5D,WAAW,GAAG,GAAG,CAAC;gBAClB,CAAC,IAAI,CAAC,CAAC;gBACP,MAAM;YACR,CAAC;YACD,KAAK,IAAI,CAAC;YACV,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACxB,IAAI,CAAC,GAAG;oBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,mBAAmB,CAAC,CAAC;gBACvD,WAAW,GAAG,GAAG,CAAC;gBAClB,CAAC,IAAI,CAAC,CAAC;gBACP,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,gCAAgC;gBAChC,CAAC,EAAE,CAAC;gBACJ,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;IAC9F,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AACpE,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAqB,EAAE,IAAmB;IAC7E,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC;IACjC,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,IAAI,gBAAgB,CAAC;IAEhE,yBAAyB;IACzB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,KAAK,GAA8B,EAAE,CAAC;IAE5C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,WAAW,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC;YACT,OAAO,EAAE,eAAe,WAAW,EAAE;YACrC,SAAS,EAAE,cAAc;YACzB,mBAAmB,EAAE,CAAC,CAAC,YAAY;YACnC,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,WAAW,EAAE,kBAAkB;SAChC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,WAAW,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC;YACT,OAAO,EAAE,cAAc,WAAW,EAAE;YACpC,SAAS,EAAE,kBAAkB;YAC7B,yBAAyB,EAAE,GAAG,CAAC,SAAS;YACxC,UAAU,EAAE,GAAG,CAAC,IAAI;YACpB,WAAW,EAAE,kBAAkB;YAC/B,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACvB,CAAC,CAAC;IACL,CAAC;IAED,aAAa;IACb,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,YAAY,EAAE;QAC5D,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,KAAK;KACN,CAAC,CAAC;IAEH,MAAM,YAAY,GAAI,WAAqC,CAAC,OAAO,CAAC;IACpE,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,gCAAgC;IAChC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE;YACrD,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,kBAAkB,EAAE,IAAI,CAAC,WAAW;SACrC,CAAC,CAAC;QAEH,MAAM,WAAW,GAAI,UAAoC,CAAC,OAAO,CAAC;QAClE,IAAI,WAAW,KAAK,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type ParsedFlags = {
|
|
2
|
+
args: Record<string, unknown>;
|
|
3
|
+
help: boolean;
|
|
4
|
+
};
|
|
5
|
+
export declare function parseToolFlags(argv: string[], toolName: string): ParsedFlags;
|
|
6
|
+
export declare function generateToolHelp(toolName: string): string;
|
|
7
|
+
//# sourceMappingURL=flag_parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flag_parser.d.ts","sourceRoot":"","sources":["../../src/cli/flag_parser.ts"],"names":[],"mappings":"AA0BA,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AA6EF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAuG5E;AAqBD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAuCzD"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema-driven flag parser. Converts tool Zod schemas into CLI flag definitions
|
|
3
|
+
* and parses argv into the Record<string, unknown> that dispatchToolCall expects.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { SAFE_DOCX_TOOL_CATALOG } from '../tool_catalog.js';
|
|
7
|
+
import { parseBoolean, toKebabCase } from './parse_utils.js';
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Short aliases — keyed by tool name, values map alias → snake_case param
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
const FLAG_ALIASES = {
|
|
12
|
+
_global: { '--session': 'session_id', '--file': 'file_path' },
|
|
13
|
+
replace_text: { '--para': 'target_paragraph_id', '--old': 'old_string', '--new': 'new_string' },
|
|
14
|
+
save: { '-o': 'save_to_local_path', '--output': 'save_to_local_path' },
|
|
15
|
+
insert_paragraph: { '--anchor': 'positional_anchor_node_id', '--pos': 'position' },
|
|
16
|
+
add_comment: { '--para': 'target_paragraph_id' },
|
|
17
|
+
add_footnote: { '--para': 'target_paragraph_id' },
|
|
18
|
+
};
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Schema introspection
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
function getToolSchema(toolName) {
|
|
23
|
+
const entry = SAFE_DOCX_TOOL_CATALOG.find((t) => t.name === toolName);
|
|
24
|
+
if (!entry)
|
|
25
|
+
throw new Error(`Unknown tool: ${toolName}`);
|
|
26
|
+
const schema = z.toJSONSchema(entry.input);
|
|
27
|
+
return { schema, catalogEntry: entry };
|
|
28
|
+
}
|
|
29
|
+
function hasFilePathParam(schema) {
|
|
30
|
+
return schema.properties !== undefined && 'file_path' in schema.properties;
|
|
31
|
+
}
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Alias resolution
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
function resolveAlias(flag, toolName) {
|
|
36
|
+
const toolAliases = FLAG_ALIASES[toolName];
|
|
37
|
+
if (toolAliases?.[flag])
|
|
38
|
+
return toolAliases[flag];
|
|
39
|
+
const globalAliases = FLAG_ALIASES._global;
|
|
40
|
+
if (globalAliases?.[flag])
|
|
41
|
+
return globalAliases[flag];
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Type coercion
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
function coerceValue(raw, propSchema, flagName) {
|
|
48
|
+
const t = propSchema.type;
|
|
49
|
+
if (t === 'string') {
|
|
50
|
+
if (propSchema.enum && !propSchema.enum.includes(raw)) {
|
|
51
|
+
throw new Error(`Invalid value for ${flagName}: "${raw}". Must be one of: ${propSchema.enum.join(', ')}`);
|
|
52
|
+
}
|
|
53
|
+
return raw;
|
|
54
|
+
}
|
|
55
|
+
if (t === 'number') {
|
|
56
|
+
const n = parseFloat(raw);
|
|
57
|
+
if (Number.isNaN(n))
|
|
58
|
+
throw new Error(`Invalid number for ${flagName}: "${raw}"`);
|
|
59
|
+
return n;
|
|
60
|
+
}
|
|
61
|
+
if (t === 'boolean') {
|
|
62
|
+
return parseBoolean(raw, flagName);
|
|
63
|
+
}
|
|
64
|
+
if (t === 'object') {
|
|
65
|
+
try {
|
|
66
|
+
return JSON.parse(raw);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
throw new Error(`Invalid JSON for ${flagName}: ${raw}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Fallback: return as string
|
|
73
|
+
return raw;
|
|
74
|
+
}
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Main parser
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
export function parseToolFlags(argv, toolName) {
|
|
79
|
+
const { schema } = getToolSchema(toolName);
|
|
80
|
+
const properties = schema.properties ?? {};
|
|
81
|
+
const required = new Set(schema.required ?? []);
|
|
82
|
+
// Build lookup from kebab-case flag → snake_case property name
|
|
83
|
+
const flagToProperty = new Map();
|
|
84
|
+
for (const propName of Object.keys(properties)) {
|
|
85
|
+
flagToProperty.set(`--${toKebabCase(propName)}`, propName);
|
|
86
|
+
}
|
|
87
|
+
const result = {};
|
|
88
|
+
let help = false;
|
|
89
|
+
let firstPositionalConsumed = false;
|
|
90
|
+
const acceptsFilePath = hasFilePathParam(schema);
|
|
91
|
+
for (let i = 0; i < argv.length; i++) {
|
|
92
|
+
const token = argv[i];
|
|
93
|
+
// Help flag
|
|
94
|
+
if (token === '--help' || token === '-h') {
|
|
95
|
+
help = true;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
// Positional arg → file_path (only first positional, only if tool has file_path param)
|
|
99
|
+
if (!token.startsWith('-') && !firstPositionalConsumed && acceptsFilePath) {
|
|
100
|
+
result.file_path = token;
|
|
101
|
+
firstPositionalConsumed = true;
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
// Must be a flag
|
|
105
|
+
if (!token.startsWith('-')) {
|
|
106
|
+
throw new Error(`Unexpected positional argument: "${token}". Use flags to pass parameters.`);
|
|
107
|
+
}
|
|
108
|
+
// Resolve alias first
|
|
109
|
+
const aliasResolved = resolveAlias(token, toolName);
|
|
110
|
+
let propName;
|
|
111
|
+
if (aliasResolved) {
|
|
112
|
+
propName = aliasResolved;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
const mapped = flagToProperty.get(token);
|
|
116
|
+
if (!mapped) {
|
|
117
|
+
throw new Error(`Unknown flag: ${token}. Use --help to see available flags for "${toolName}".`);
|
|
118
|
+
}
|
|
119
|
+
propName = mapped;
|
|
120
|
+
}
|
|
121
|
+
const propSchema = properties[propName];
|
|
122
|
+
if (!propSchema) {
|
|
123
|
+
throw new Error(`Unknown parameter: ${propName}`);
|
|
124
|
+
}
|
|
125
|
+
// Array type: collect repeatable flags
|
|
126
|
+
if (propSchema.type === 'array') {
|
|
127
|
+
const next = argv[i + 1];
|
|
128
|
+
if (next === undefined || next.startsWith('-')) {
|
|
129
|
+
throw new Error(`Missing value for ${token}`);
|
|
130
|
+
}
|
|
131
|
+
i += 1;
|
|
132
|
+
const existing = result[propName];
|
|
133
|
+
if (Array.isArray(existing)) {
|
|
134
|
+
existing.push(coerceArrayItem(next, propSchema, token));
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
result[propName] = [coerceArrayItem(next, propSchema, token)];
|
|
138
|
+
}
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
// Boolean: if next token looks like a boolean value, consume it; otherwise treat as bare flag (true)
|
|
142
|
+
if (propSchema.type === 'boolean') {
|
|
143
|
+
const next = argv[i + 1];
|
|
144
|
+
if (next !== undefined && !next.startsWith('-') && isBooleanLike(next)) {
|
|
145
|
+
result[propName] = parseBoolean(next, token);
|
|
146
|
+
i += 1;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
result[propName] = true;
|
|
150
|
+
}
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
// All other types: consume next token as value
|
|
154
|
+
const next = argv[i + 1];
|
|
155
|
+
if (next === undefined || (next.startsWith('-') && propSchema.type !== 'number')) {
|
|
156
|
+
throw new Error(`Missing value for ${token}`);
|
|
157
|
+
}
|
|
158
|
+
i += 1;
|
|
159
|
+
result[propName] = coerceValue(next, propSchema, token);
|
|
160
|
+
}
|
|
161
|
+
// Validate required fields (unless help is requested)
|
|
162
|
+
if (!help) {
|
|
163
|
+
for (const req of required) {
|
|
164
|
+
if (result[req] === undefined) {
|
|
165
|
+
throw new Error(`Missing required parameter: --${toKebabCase(req)}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return { args: result, help };
|
|
170
|
+
}
|
|
171
|
+
function coerceArrayItem(raw, propSchema, flagName) {
|
|
172
|
+
const itemType = propSchema.items?.type;
|
|
173
|
+
if (itemType === 'number') {
|
|
174
|
+
const n = parseFloat(raw);
|
|
175
|
+
if (Number.isNaN(n))
|
|
176
|
+
throw new Error(`Invalid number for ${flagName}: "${raw}"`);
|
|
177
|
+
return n;
|
|
178
|
+
}
|
|
179
|
+
return raw;
|
|
180
|
+
}
|
|
181
|
+
function isBooleanLike(s) {
|
|
182
|
+
const lower = s.toLowerCase();
|
|
183
|
+
return ['true', 'false', 'yes', 'no', 'on', 'off', '1', '0'].includes(lower);
|
|
184
|
+
}
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
// Help generation
|
|
187
|
+
// ---------------------------------------------------------------------------
|
|
188
|
+
export function generateToolHelp(toolName) {
|
|
189
|
+
const { schema, catalogEntry } = getToolSchema(toolName);
|
|
190
|
+
const properties = schema.properties ?? {};
|
|
191
|
+
const required = new Set(schema.required ?? []);
|
|
192
|
+
const lines = [];
|
|
193
|
+
lines.push(`safe-docx ${toKebabCase(toolName)}`);
|
|
194
|
+
lines.push('');
|
|
195
|
+
lines.push(catalogEntry.description);
|
|
196
|
+
lines.push('');
|
|
197
|
+
if (hasFilePathParam(schema)) {
|
|
198
|
+
lines.push('Usage:');
|
|
199
|
+
lines.push(` safe-docx ${toKebabCase(toolName)} <file> [options]`);
|
|
200
|
+
lines.push('');
|
|
201
|
+
}
|
|
202
|
+
lines.push('Options:');
|
|
203
|
+
for (const [propName, propSchema] of Object.entries(properties)) {
|
|
204
|
+
const flag = `--${toKebabCase(propName)}`;
|
|
205
|
+
const req = required.has(propName) ? ' (required)' : '';
|
|
206
|
+
const typeStr = formatType(propSchema);
|
|
207
|
+
const desc = propSchema.description ?? '';
|
|
208
|
+
lines.push(` ${flag} ${typeStr}${req}`);
|
|
209
|
+
if (desc)
|
|
210
|
+
lines.push(` ${desc}`);
|
|
211
|
+
}
|
|
212
|
+
// Show aliases if any
|
|
213
|
+
const aliases = { ...FLAG_ALIASES._global, ...FLAG_ALIASES[toolName] };
|
|
214
|
+
const aliasEntries = Object.entries(aliases);
|
|
215
|
+
if (aliasEntries.length > 0) {
|
|
216
|
+
lines.push('');
|
|
217
|
+
lines.push('Aliases:');
|
|
218
|
+
for (const [alias, target] of aliasEntries) {
|
|
219
|
+
lines.push(` ${alias} → --${toKebabCase(target)}`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return lines.join('\n');
|
|
223
|
+
}
|
|
224
|
+
function formatType(prop) {
|
|
225
|
+
if (prop.enum)
|
|
226
|
+
return `<${prop.enum.join('|')}>`;
|
|
227
|
+
if (prop.type === 'array')
|
|
228
|
+
return `<${prop.items?.type ?? 'string'}> (repeatable)`;
|
|
229
|
+
if (prop.type === 'object')
|
|
230
|
+
return '<json>';
|
|
231
|
+
if (prop.type)
|
|
232
|
+
return `<${prop.type}>`;
|
|
233
|
+
return '<value>';
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=flag_parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flag_parser.js","sourceRoot":"","sources":["../../src/cli/flag_parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAmCA,wBAAgB,kBAAkB,IAAI,MAAM,CAgC3C;AAMD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
package/dist/cli/help.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI help rendering — top-level and per-tool.
|
|
3
|
+
*/
|
|
4
|
+
import { SAFE_DOCX_TOOL_CATALOG } from '../tool_catalog.js';
|
|
5
|
+
import { generateToolHelp } from './flag_parser.js';
|
|
6
|
+
import { toKebabCase } from './parse_utils.js';
|
|
7
|
+
function groupTools() {
|
|
8
|
+
const readOnly = [];
|
|
9
|
+
const mutating = [];
|
|
10
|
+
for (const tool of SAFE_DOCX_TOOL_CATALOG) {
|
|
11
|
+
if (tool.annotations.readOnlyHint) {
|
|
12
|
+
readOnly.push(tool.name);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
mutating.push(tool.name);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return [
|
|
19
|
+
{ label: 'Read-only tools', names: readOnly },
|
|
20
|
+
{ label: 'Editing tools', names: mutating },
|
|
21
|
+
];
|
|
22
|
+
}
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Top-level help
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
export function renderTopLevelHelp() {
|
|
27
|
+
const lines = [];
|
|
28
|
+
lines.push('safe-docx CLI');
|
|
29
|
+
lines.push('');
|
|
30
|
+
lines.push('Usage:');
|
|
31
|
+
lines.push(' safe-docx [command] [options]');
|
|
32
|
+
lines.push(' safedocx [command] [options]');
|
|
33
|
+
lines.push('');
|
|
34
|
+
lines.push('Built-in commands:');
|
|
35
|
+
lines.push(' serve Start the MCP server (default)');
|
|
36
|
+
lines.push(' compare <original> <revised> [output] Compare two DOCX files and write redline output');
|
|
37
|
+
lines.push(' edit <file> [--replace ...] [-o output] Batch edit a DOCX file');
|
|
38
|
+
lines.push('');
|
|
39
|
+
for (const group of groupTools()) {
|
|
40
|
+
lines.push(`${group.label}:`);
|
|
41
|
+
for (const name of group.names) {
|
|
42
|
+
const entry = SAFE_DOCX_TOOL_CATALOG.find((t) => t.name === name);
|
|
43
|
+
const kebab = toKebabCase(name);
|
|
44
|
+
const desc = entry.description.split('.')[0];
|
|
45
|
+
lines.push(` ${kebab.padEnd(42)}${desc}`);
|
|
46
|
+
}
|
|
47
|
+
lines.push('');
|
|
48
|
+
}
|
|
49
|
+
lines.push('Global options:');
|
|
50
|
+
lines.push(' -h, --help Show help');
|
|
51
|
+
lines.push(' -v, --version Show version');
|
|
52
|
+
lines.push('');
|
|
53
|
+
lines.push('Use safe-docx <command> --help for detailed options on any command.');
|
|
54
|
+
return lines.join('\n');
|
|
55
|
+
}
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// Per-tool help (delegates to flag_parser)
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
export function renderToolHelp(toolName) {
|
|
60
|
+
return generateToolHelp(toolName);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { type CompareCommandArgs, type CompareCommandResult } from './commands/compare.js';
|
|
2
|
-
interface CliHandlers {
|
|
2
|
+
export interface CliHandlers {
|
|
3
3
|
serve: () => Promise<void>;
|
|
4
4
|
compare: (args: CompareCommandArgs) => Promise<CompareCommandResult>;
|
|
5
5
|
write: (line: string) => void;
|
|
6
|
+
writeError: (line: string) => void;
|
|
6
7
|
}
|
|
7
8
|
export interface CliProgram {
|
|
8
9
|
parseAsync(argv?: string[]): Promise<void>;
|
|
9
10
|
}
|
|
10
11
|
export declare function createProgram(overrides?: Partial<CliHandlers>): CliProgram;
|
|
11
12
|
export declare function runCli(argv?: string[]): Promise<void>;
|
|
12
|
-
export {};
|
|
13
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAqB,KAAK,kBAAkB,EAAE,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAqB,KAAK,kBAAkB,EAAE,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAQ9G,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAqED,wBAAgB,aAAa,CAAC,SAAS,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,UAAU,CA4E9E;AAED,wBAAsB,MAAM,CAAC,IAAI,WAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/D"}
|
package/dist/cli/index.js
CHANGED
|
@@ -2,6 +2,12 @@ import { readFileSync } from 'node:fs';
|
|
|
2
2
|
import { fileURLToPath } from 'node:url';
|
|
3
3
|
import { runServeCommand } from './commands/serve.js';
|
|
4
4
|
import { runCompareCommand } from './commands/compare.js';
|
|
5
|
+
import { parseEditArgs, runEditCommand } from './commands/edit.js';
|
|
6
|
+
import { parseBoolean, toSnakeCase } from './parse_utils.js';
|
|
7
|
+
import { parseToolFlags, generateToolHelp } from './flag_parser.js';
|
|
8
|
+
import { renderTopLevelHelp } from './help.js';
|
|
9
|
+
import { runToolCommand } from './tool_runner.js';
|
|
10
|
+
import { SAFE_DOCX_TOOL_CATALOG } from '../tool_catalog.js';
|
|
5
11
|
function packageVersion() {
|
|
6
12
|
try {
|
|
7
13
|
const packageJsonPath = fileURLToPath(new URL('../../package.json', import.meta.url));
|
|
@@ -12,37 +18,6 @@ function packageVersion() {
|
|
|
12
18
|
return '0.0.0';
|
|
13
19
|
}
|
|
14
20
|
}
|
|
15
|
-
function renderHelp() {
|
|
16
|
-
return [
|
|
17
|
-
'safe-docx CLI',
|
|
18
|
-
'',
|
|
19
|
-
'Usage:',
|
|
20
|
-
' safe-docx [command] [options]',
|
|
21
|
-
' safedocx [command] [options]',
|
|
22
|
-
'',
|
|
23
|
-
'Commands:',
|
|
24
|
-
' serve Start the MCP server (default)',
|
|
25
|
-
' compare <original> <revised> [output] Compare two DOCX files and write redline output',
|
|
26
|
-
'',
|
|
27
|
-
'Compare options:',
|
|
28
|
-
' --engine <auto|atomizer|diffmatch> Comparison engine (default: atomizer)',
|
|
29
|
-
' --mode <inplace|rebuild> Reconstruction mode (default: rebuild)',
|
|
30
|
-
' --author <name> Track-changes author label (default: Comparison)',
|
|
31
|
-
' --premerge-runs <true|false> Enable run premerge optimization',
|
|
32
|
-
'',
|
|
33
|
-
'Global options:',
|
|
34
|
-
' -h, --help Show help',
|
|
35
|
-
' -v, --version Show version',
|
|
36
|
-
].join('\n');
|
|
37
|
-
}
|
|
38
|
-
function parseBoolean(raw, flagName) {
|
|
39
|
-
const normalized = raw.trim().toLowerCase();
|
|
40
|
-
if (['1', 'true', 'yes', 'on'].includes(normalized))
|
|
41
|
-
return true;
|
|
42
|
-
if (['0', 'false', 'no', 'off'].includes(normalized))
|
|
43
|
-
return false;
|
|
44
|
-
throw new Error(`Invalid value for ${flagName}: ${raw}. Use true or false.`);
|
|
45
|
-
}
|
|
46
21
|
function parseCompareArgs(args) {
|
|
47
22
|
const positional = [];
|
|
48
23
|
const options = {};
|
|
@@ -101,6 +76,10 @@ export function createProgram(overrides = {}) {
|
|
|
101
76
|
// eslint-disable-next-line no-console
|
|
102
77
|
console.log(line);
|
|
103
78
|
},
|
|
79
|
+
writeError: (line) => {
|
|
80
|
+
// eslint-disable-next-line no-console
|
|
81
|
+
console.error(line);
|
|
82
|
+
},
|
|
104
83
|
...overrides,
|
|
105
84
|
};
|
|
106
85
|
return {
|
|
@@ -117,7 +96,7 @@ export function createProgram(overrides = {}) {
|
|
|
117
96
|
}
|
|
118
97
|
const rest = args.slice(1);
|
|
119
98
|
if (command === '--help' || command === '-h' || command === 'help') {
|
|
120
|
-
handlers.write(
|
|
99
|
+
handlers.write(renderTopLevelHelp());
|
|
121
100
|
return;
|
|
122
101
|
}
|
|
123
102
|
if (command === '--version' || command === '-v') {
|
|
@@ -134,6 +113,24 @@ export function createProgram(overrides = {}) {
|
|
|
134
113
|
handlers.write(JSON.stringify(result));
|
|
135
114
|
return;
|
|
136
115
|
}
|
|
116
|
+
// Edit command — batched apply_plan wrapper
|
|
117
|
+
if (command === 'edit') {
|
|
118
|
+
const editArgs = parseEditArgs(rest);
|
|
119
|
+
await runEditCommand(editArgs, { write: handlers.write, writeError: handlers.writeError });
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
// Generic tool dispatch — kebab-case command → snake_case tool name
|
|
123
|
+
const toolName = toSnakeCase(command);
|
|
124
|
+
const catalogEntry = SAFE_DOCX_TOOL_CATALOG.find((t) => t.name === toolName);
|
|
125
|
+
if (catalogEntry) {
|
|
126
|
+
const { args: toolArgs, help } = parseToolFlags(rest, toolName);
|
|
127
|
+
if (help) {
|
|
128
|
+
handlers.write(generateToolHelp(toolName));
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
await runToolCommand(toolName, toolArgs, { write: handlers.write, writeError: handlers.writeError });
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
137
134
|
throw new Error(`Unknown command: ${command}. Use --help to see available commands.`);
|
|
138
135
|
},
|
|
139
136
|
};
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAsD,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAsD,MAAM,uBAAuB,CAAC;AAC9G,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAa5D,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACtF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAyB,CAAC;QAC/F,OAAO,WAAW,CAAC,OAAO,IAAI,OAAO,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAc;IACtC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,OAAO,GAA4E,EAAE,CAAC;IAE5F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAU,EAAE;YAChD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,GAAG,CAAC,CAAC;YACpD,CAAC;YACD,CAAC,IAAI,CAAC,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,UAAU;gBACb,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;gBACrC,MAAM;YACR,KAAK,QAAQ;gBACX,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;gBACrC,MAAM;YACR,KAAK,iBAAiB;gBACpB,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;gBAChE,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,UAAU,CAAC,GAAG,UAAU,CAAC;IAC3D,IAAI,CAAC,YAAY,IAAI,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,OAAO;QACL,YAAY;QACZ,WAAW;QACX,UAAU;QACV,GAAG,OAAO;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,YAAkC,EAAE;IAChE,MAAM,QAAQ,GAAgB;QAC5B,KAAK,EAAE,eAAe;QACtB,OAAO,EAAE,iBAAiB;QAC1B,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;YACd,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;YACnB,sCAAsC;YACtC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QACD,GAAG,SAAS;KACb,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,UAAU,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;YAClC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAE3B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAE3B,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;gBACnE,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBAChD,QAAQ,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;gBACjC,OAAO;YACT,CAAC;YAED,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;gBACxB,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBACtC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC9C,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBACvC,OAAO;YACT,CAAC;YAED,4CAA4C;YAC5C,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;gBACrC,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC3F,OAAO;YACT,CAAC;YAED,oEAAoE;YACpE,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,YAAY,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAC7E,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAChE,IAAI,IAAI,EAAE,CAAC;oBACT,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;oBAC3C,OAAO;gBACT,CAAC;gBACD,MAAM,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;gBACrG,OAAO;YACT,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,yCAAyC,CAAC,CAAC;QACxF,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;IAC9C,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared parsing utilities for the CLI layer.
|
|
3
|
+
*/
|
|
4
|
+
export declare function parseBoolean(raw: string, flagName: string): boolean;
|
|
5
|
+
export declare function toSnakeCase(kebab: string): string;
|
|
6
|
+
export declare function toKebabCase(snake: string): string;
|
|
7
|
+
//# sourceMappingURL=parse_utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse_utils.d.ts","sourceRoot":"","sources":["../../src/cli/parse_utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAKnE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD"}
|