@hpmicro-tools/hpmmfgctl 0.0.0-stage → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +197 -2
- package/README.zh-CN.md +197 -0
- package/dist/command/arguments.d.ts +3 -0
- package/dist/command/arguments.js +18 -0
- package/dist/command/arguments.js.map +1 -0
- package/dist/command/runner.d.ts +22 -0
- package/dist/command/runner.js +119 -0
- package/dist/command/runner.js.map +1 -0
- package/dist/command/types.d.ts +37 -0
- package/dist/command/types.js +2 -0
- package/dist/command/types.js.map +1 -0
- package/dist/command/validate.d.ts +4 -0
- package/dist/command/validate.js +48 -0
- package/dist/command/validate.js.map +1 -0
- package/dist/config/config-path.d.ts +8 -0
- package/dist/config/config-path.js +27 -0
- package/dist/config/config-path.js.map +1 -0
- package/dist/config/config-store.d.ts +13 -0
- package/dist/config/config-store.js +61 -0
- package/dist/config/config-store.js.map +1 -0
- package/dist/config/config-type.d.ts +5 -0
- package/dist/config/config-type.js +2 -0
- package/dist/config/config-type.js.map +1 -0
- package/dist/device/enumerator.d.ts +12 -0
- package/dist/device/enumerator.js +65 -0
- package/dist/device/enumerator.js.map +1 -0
- package/dist/device/types.d.ts +22 -0
- package/dist/device/types.js +2 -0
- package/dist/device/types.js.map +1 -0
- package/dist/hpm-mfg-service.d.ts +37 -0
- package/dist/hpm-mfg-service.js +155 -0
- package/dist/hpm-mfg-service.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +23 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/configuration.d.ts +4 -0
- package/dist/mcp/configuration.js +30 -0
- package/dist/mcp/configuration.js.map +1 -0
- package/dist/mcp/discovery.d.ts +4 -0
- package/dist/mcp/discovery.js +30 -0
- package/dist/mcp/discovery.js.map +1 -0
- package/dist/mcp/mcp-type.d.ts +11 -0
- package/dist/mcp/mcp-type.js +2 -0
- package/dist/mcp/mcp-type.js.map +1 -0
- package/dist/mcp/operations.d.ts +4 -0
- package/dist/mcp/operations.js +17 -0
- package/dist/mcp/operations.js.map +1 -0
- package/dist/mcp/registration.d.ts +15 -0
- package/dist/mcp/registration.js +23 -0
- package/dist/mcp/registration.js.map +1 -0
- package/dist/mcp/responses.d.ts +5 -0
- package/dist/mcp/responses.js +20 -0
- package/dist/mcp/responses.js.map +1 -0
- package/dist/mcp/schemas.d.ts +155 -0
- package/dist/mcp/schemas.js +253 -0
- package/dist/mcp/schemas.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.js +16 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/operations/rom.d.ts +5 -0
- package/dist/operations/rom.js +81 -0
- package/dist/operations/rom.js.map +1 -0
- package/dist/service-type.d.ts +13 -0
- package/dist/service-type.js +2 -0
- package/dist/service-type.js.map +1 -0
- package/package.json +51 -4
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { stat } from "node:fs/promises";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { romSchemas } from "../mcp/schemas.js";
|
|
4
|
+
/** Selects default CMD deadlines for query, transfer, and erase operations. */
|
|
5
|
+
export function defaultTimeout(name) {
|
|
6
|
+
if (name === "erase_chip") {
|
|
7
|
+
return 1800000;
|
|
8
|
+
}
|
|
9
|
+
return /erase|write|read_memory_to_file|load/.test(name) ? 600000 : 30000;
|
|
10
|
+
}
|
|
11
|
+
/** Validates a ROM request and file preconditions before constructing CMD text. */
|
|
12
|
+
export async function buildROM(name, raw) {
|
|
13
|
+
const input = romSchemas[name].parse(raw);
|
|
14
|
+
const value = input;
|
|
15
|
+
const hex = (field) => `0x${Number(value[field]).toString(16)}`;
|
|
16
|
+
if ("filePath" in input) {
|
|
17
|
+
if (name === "read_memory_to_file") {
|
|
18
|
+
try {
|
|
19
|
+
await stat(input.filePath);
|
|
20
|
+
if (!value.overwrite) {
|
|
21
|
+
throw new Error("Output file already exists; set overwrite=true");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (error.code !== "ENOENT") {
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (!(await stat(dirname(input.filePath))).isDirectory()) {
|
|
30
|
+
throw new Error("Output parent must be a directory");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else if (!(await stat(input.filePath)).isFile()) {
|
|
34
|
+
throw new Error("Input must be a regular file");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
let command;
|
|
38
|
+
switch (name) {
|
|
39
|
+
case "query_rte":
|
|
40
|
+
if ((value.rteId === 4) !== (value.argument !== undefined)) {
|
|
41
|
+
throw new Error("argument is required only when rteId=4");
|
|
42
|
+
}
|
|
43
|
+
command = `query-rte ${value.rteId}${value.argument === undefined ? "" : ` ${hex("argument")}`}`;
|
|
44
|
+
break;
|
|
45
|
+
case "config_rte":
|
|
46
|
+
command = `config-rte ${hex("peripheralMask")} ${value.baudRate}`;
|
|
47
|
+
break;
|
|
48
|
+
case "config_memory":
|
|
49
|
+
command = `config-memory ${hex("memoryId")} ${hex("address")}`;
|
|
50
|
+
break;
|
|
51
|
+
case "read_memory":
|
|
52
|
+
case "read_memory_to_file":
|
|
53
|
+
command = `read-memory ${hex("memoryId")} ${hex("address")} ${value.length}${value.filePath ? ` ${value.filePath}` : ""}`;
|
|
54
|
+
break;
|
|
55
|
+
case "write_memory":
|
|
56
|
+
case "write_memory_from_file":
|
|
57
|
+
case "verify_checksum":
|
|
58
|
+
case "verify_checksum_from_file": {
|
|
59
|
+
const payload = value.filePath ?? `[[${String(value.data).replace(/^\[\[|\]\]$/g, "")}]]`;
|
|
60
|
+
command = `${name.startsWith("write") ? "write-memory" : "verify-checksum"} ${hex("memoryId")} ${hex("address")} ${payload}`;
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case "erase_region":
|
|
64
|
+
command = `erase-region ${hex("memoryId")} ${hex("address")} ${value.length}`;
|
|
65
|
+
break;
|
|
66
|
+
case "erase_chip":
|
|
67
|
+
command = `erase-chip ${hex("memoryId")}`;
|
|
68
|
+
break;
|
|
69
|
+
case "load_image":
|
|
70
|
+
command = `load-image ${value.filePath}`;
|
|
71
|
+
break;
|
|
72
|
+
case "load_bootloader_firmware":
|
|
73
|
+
command = `load-blfw ${value.series} ${value.signed ? 1 : 0}`;
|
|
74
|
+
break;
|
|
75
|
+
case "reset":
|
|
76
|
+
command = `reset ${value.resetType}`;
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
return { input, command };
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=rom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rom.js","sourceRoot":"","sources":["../../src/operations/rom.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Target, Validation } from "./command/types.js";
|
|
2
|
+
/** Connection settings and deadline used when probing a new ROM target. */
|
|
3
|
+
export interface TargetCreateInput extends Target {
|
|
4
|
+
/** Probe timeout in milliseconds; defaults to 10000. */
|
|
5
|
+
timeoutMs?: number;
|
|
6
|
+
}
|
|
7
|
+
/** Successful compatibility result cached for one installed executable identity. */
|
|
8
|
+
export interface CachedValidation {
|
|
9
|
+
/** Normalized path, size, and modification metadata used to detect replacement. */
|
|
10
|
+
key: string;
|
|
11
|
+
/** Successful executable compatibility checks. */
|
|
12
|
+
validation: Validation;
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-type.js","sourceRoot":"","sources":["../src/service-type.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,53 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hpmicro-tools/hpmmfgctl",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "HPM Manufacturing Tool stdio MCP server",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/hpmicro/hpmicro-ai-tools.git",
|
|
9
|
+
"directory": "mcp-servers/hpmmfgctl"
|
|
10
|
+
},
|
|
11
|
+
"type": "module",
|
|
12
|
+
"bin": {
|
|
13
|
+
"hpmmfgctl": "dist/main.js"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md",
|
|
18
|
+
"README.zh-CN.md"
|
|
19
|
+
],
|
|
20
|
+
"engines": {
|
|
21
|
+
"node": ">=22.15.0"
|
|
22
|
+
},
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"registry": "https://registry.npmjs.org/",
|
|
25
|
+
"access": "public"
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsc",
|
|
29
|
+
"typecheck": "tsc --noEmit && tsc -p tsconfig.test.json",
|
|
30
|
+
"lint": "eslint .",
|
|
31
|
+
"test": "vitest run",
|
|
32
|
+
"format": "prettier --write .",
|
|
33
|
+
"format:check": "prettier --check .",
|
|
34
|
+
"prepublishOnly": "npm run lint && npm run format:check && npm run typecheck && npm run build && npm test"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@modelcontextprotocol/server": "2.0.0",
|
|
38
|
+
"@serialport/bindings-cpp": "^13.0.0",
|
|
39
|
+
"iconv-lite": "^0.7.0",
|
|
40
|
+
"node-hid": "^3.2.0",
|
|
41
|
+
"zod": "^4.1.0"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@eslint/js": "^10.0.1",
|
|
45
|
+
"@modelcontextprotocol/client": "2.0.0",
|
|
46
|
+
"@types/node": "^22.18.0",
|
|
47
|
+
"eslint": "^10.10.0",
|
|
48
|
+
"prettier": "^3.6.2",
|
|
49
|
+
"typescript": "^5.9.2",
|
|
50
|
+
"typescript-eslint": "^8.70.0",
|
|
51
|
+
"vitest": "5.0.1"
|
|
52
|
+
}
|
|
53
|
+
}
|